diff options
Diffstat (limited to 'java')
880 files changed, 33140 insertions, 22413 deletions
diff --git a/java/Android.mk b/java/Android.mk index 03d48aaa7..60c321ab2 100644 --- a/java/Android.mk +++ b/java/Android.mk @@ -13,7 +13,11 @@ LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime LOCAL_STATIC_JAVA_LIBRARIES := android-common -#LOCAL_AAPT_FLAGS := -0 .dict +# Do not compress dictionary files to mmap dict data runtime +LOCAL_AAPT_FLAGS := -0 .dict + +# Include all the resources regardless of system supported locales +LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true LOCAL_SDK_VERSION := current diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index b1e5ec6f6..cb0a9a2e1 100755..100644 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -2,13 +2,14 @@ package="com.android.inputmethod.latin"> <uses-permission android:name="android.permission.VIBRATE"/> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_USER_DICTIONARY" /> <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <application android:label="@string/english_ime_name" - android:backupAgent="LatinIMEBackupAgent" + android:backupAgent="BackupAgent" android:killAfterRestore="false"> <service android:name="LatinIME" @@ -20,19 +21,19 @@ <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> </activity> - <activity android:name="InputLanguageSelection" + <activity android:name="com.android.inputmethod.deprecated.languageswitcher.InputLanguageSelection" android:label="@string/language_selection_title"> <intent-filter> <action android:name="android.intent.action.MAIN"/> @@ -40,5 +41,11 @@ <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> + + <receiver android:name="SuggestionSpanPickedNotificationReceiver" android:enabled="true"> + <intent-filter> + <action android:name="android.text.style.SUGGESTION_PICKED" /> + </intent-filter> + </receiver> </application> </manifest> diff --git a/java/proguard.flags b/java/proguard.flags index 829a096c0..9094be401 100644 --- a/java/proguard.flags +++ b/java/proguard.flags @@ -5,4 +5,24 @@ -keep class com.android.inputmethod.latin.Suggest { <init>(...); + com.android.inputmethod.latin.SuggestedWords getSuggestions(...); +} + +-keep class com.android.inputmethod.latin.UserBigramDictionary { + void setDatabaseMax(int); + void setDatabaseDelete(int); + void waitUntilUpdateDBDone(); + void waitForDictionaryLoading(); +} + +-keep class com.android.inputmethod.latin.AutoCorrection { + java.lang.CharSequence getAutoCorrectionWord(); +} + +-keep class com.android.inputmethod.latin.Utils { + boolean equalsIgnoreCase(...); +} + +-keep class com.android.inputmethod.latin.spellcheck.SpellChecker { + *; } diff --git a/java/res/anim/mini_keyboard_fadein.xml b/java/res/anim/mini_keyboard_fadein.xml index 9fad7b9a7..f80e8b8de 100644 --- a/java/res/anim/mini_keyboard_fadein.xml +++ b/java/res/anim/mini_keyboard_fadein.xml @@ -25,5 +25,5 @@ <alpha android:fromAlpha="0.5" android:toAlpha="1.0" - android:duration="@integer/config_preview_fadein_anim_time" /> + android:duration="@integer/config_mini_keyboard_fadein_anim_time" /> </set> diff --git a/java/res/anim/mini_keyboard_fadeout.xml b/java/res/anim/mini_keyboard_fadeout.xml index 7de5123cd..535b100ae 100644 --- a/java/res/anim/mini_keyboard_fadeout.xml +++ b/java/res/anim/mini_keyboard_fadeout.xml @@ -25,5 +25,5 @@ <alpha android:fromAlpha="1.0" android:toAlpha="0.0" - android:duration="@integer/config_preview_fadeout_anim_time" /> + android:duration="@integer/config_mini_keyboard_fadeout_anim_time" /> </set> diff --git a/java/res/drawable-hdpi/btn_candidate_pressed.9.png b/java/res/drawable-hdpi/btn_candidate_pressed.9.png Binary files differnew file mode 100644 index 000000000..7acceaee7 --- /dev/null +++ b/java/res/drawable-hdpi/btn_candidate_pressed.9.png diff --git a/java/res/drawable-hdpi/btn_center_default.9.png b/java/res/drawable-hdpi/btn_center_default.9.png Binary files differnew file mode 100644 index 000000000..4f5f01cb8 --- /dev/null +++ b/java/res/drawable-hdpi/btn_center_default.9.png diff --git a/java/res/drawable-hdpi/btn_center_pressed.9.png b/java/res/drawable-hdpi/btn_center_pressed.9.png Binary files differnew file mode 100644 index 000000000..213b482d4 --- /dev/null +++ b/java/res/drawable-hdpi/btn_center_pressed.9.png diff --git a/java/res/drawable-hdpi/btn_center_selected.9.png b/java/res/drawable-hdpi/btn_center_selected.9.png Binary files differnew file mode 100644 index 000000000..213b482d4 --- /dev/null +++ b/java/res/drawable-hdpi/btn_center_selected.9.png diff --git a/java/res/drawable-hdpi/btn_close_candidates_pane.9.png b/java/res/drawable-hdpi/btn_close_candidates_pane.9.png Binary files differnew file mode 100644 index 000000000..bdd949577 --- /dev/null +++ b/java/res/drawable-hdpi/btn_close_candidates_pane.9.png diff --git a/java/res/drawable-hdpi/btn_expand_candidates_pane.9.png b/java/res/drawable-hdpi/btn_expand_candidates_pane.9.png Binary files differnew file mode 100644 index 000000000..63015ec5b --- /dev/null +++ b/java/res/drawable-hdpi/btn_expand_candidates_pane.9.png 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 Binary files differindex 01fc8ca78..50cc49fdb 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png 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 Binary files differnew file mode 100644 index 000000000..2dc1bed5d --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png 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 Binary files differindex af4017e2c..dabf77ec6 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png 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 Binary files differnew file mode 100644 index 000000000..575781f07 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.png 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 Binary files differindex 4c35aca95..6e7d74c88 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png 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 Binary files differnew file mode 100644 index 000000000..6c5b42e5c --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_holo.9.png 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 Binary files differindex 174f3452c..ddb77c224 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png 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 Binary files differnew file mode 100644 index 000000000..8c999f655 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_holo.9.png 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 Binary files differindex 1fcbd9a88..1e9227e1c 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png 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 Binary files differnew file mode 100644 index 000000000..8c7c2f3bc --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_holo.9.png 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 Binary files differindex 072753f37..7207b2ece 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png 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 Binary files differnew file mode 100644 index 000000000..02497b472 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_holo.9.png 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 Binary files differindex b6c234c04..a524168c9 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png 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 Binary files differindex 73a8cd1c3..4395e978a 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png 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 Binary files differindex 1ad746053..9d85c7b74 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png 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 Binary files differnew file mode 100644 index 000000000..a13b2003f --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.png 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 Binary files differindex e3a77d61b..2ed1b3447 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png 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 Binary files differindex 431c44967..77e17dbae 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png 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 Binary files differindex ccd59d5fa..a409639e7 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png 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 Binary files differnew file mode 100644 index 000000000..0b76855e6 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_holo.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png Binary files differindex 42c7c146d..6ec7e6592 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png 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 Binary files differindex 01e2506b0..995780cbf 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png 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 Binary files differindex fad0ec458..1388b6694 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png 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 Binary files differindex 83c6eb3fc..7215782eb 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png 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 Binary files differindex 215f8157c..5a94cb6ac 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png 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 Binary files differindex 88acdd748..c6373a8af 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_popup_background_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_popup_background_holo.9.png Binary files differnew file mode 100644 index 000000000..0b2758925 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_popup_background_holo.9.png 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 Binary files differnew file mode 100644 index 000000000..166de2a03 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png Binary files differindex e047eaff1..0bd49a0e7 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png 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 Binary files differindex 218a2d29e..634419f1b 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png 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 Binary files differindex afe49512e..8474f9f42 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png diff --git a/java/res/drawable-hdpi/cancel.png b/java/res/drawable-hdpi/cancel.png Binary files differdeleted file mode 100644 index 506cf99d0..000000000 --- a/java/res/drawable-hdpi/cancel.png +++ /dev/null diff --git a/java/res/drawable-hdpi/candidate_feedback_background.9.png b/java/res/drawable-hdpi/candidate_feedback_background.9.png Binary files differindex 203c4e640..16499002e 100644 --- a/java/res/drawable-hdpi/candidate_feedback_background.9.png +++ b/java/res/drawable-hdpi/candidate_feedback_background.9.png diff --git a/java/res/drawable-hdpi/caution.png b/java/res/drawable-hdpi/caution.png Binary files differindex 5cb6c54b9..61eb4dd62 100644 --- a/java/res/drawable-hdpi/caution.png +++ b/java/res/drawable-hdpi/caution.png diff --git a/java/res/drawable-hdpi/dialog_bubble_step02.9.png b/java/res/drawable-hdpi/dialog_bubble_step02.9.png Binary files differdeleted file mode 100644 index b338364c5..000000000 --- a/java/res/drawable-hdpi/dialog_bubble_step02.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/dialog_bubble_step07.9.png b/java/res/drawable-hdpi/dialog_bubble_step07.9.png Binary files differdeleted file mode 100644 index 94b915432..000000000 --- a/java/res/drawable-hdpi/dialog_bubble_step07.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/highlight_pressed.png b/java/res/drawable-hdpi/highlight_pressed.png Binary files differdeleted file mode 100644 index ae04901a0..000000000 --- a/java/res/drawable-hdpi/highlight_pressed.png +++ /dev/null diff --git a/java/res/drawable-hdpi/hint_popup.9.png b/java/res/drawable-hdpi/hint_popup.9.png Binary files differindex b5ec003e6..5b2ad5388 100644 --- a/java/res/drawable-hdpi/hint_popup.9.png +++ b/java/res/drawable-hdpi/hint_popup.9.png diff --git a/java/res/drawable-hdpi/hint_popup_holo.9.png b/java/res/drawable-hdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..c44af8883 --- /dev/null +++ b/java/res/drawable-hdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-hdpi/ic_dialog_keyboard.png b/java/res/drawable-hdpi/ic_dialog_keyboard.png Binary files differindex c7729566c..305441633 100644 --- a/java/res/drawable-hdpi/ic_dialog_keyboard.png +++ b/java/res/drawable-hdpi/ic_dialog_keyboard.png diff --git a/java/res/drawable-hdpi/ic_mic_dialog.png b/java/res/drawable-hdpi/ic_mic_dialog.png Binary files differindex 349dc4b37..6107f876e 100644 --- a/java/res/drawable-hdpi/ic_mic_dialog.png +++ b/java/res/drawable-hdpi/ic_mic_dialog.png diff --git a/java/res/drawable-hdpi/ic_subtype_keyboard.png b/java/res/drawable-hdpi/ic_subtype_keyboard.png Binary files differindex 7015e266a..484305655 100644 --- a/java/res/drawable-hdpi/ic_subtype_keyboard.png +++ b/java/res/drawable-hdpi/ic_subtype_keyboard.png diff --git a/java/res/drawable-hdpi/ic_subtype_mic.png b/java/res/drawable-hdpi/ic_subtype_mic.png Binary files differindex cb86a5598..25c9ee2ab 100644 --- a/java/res/drawable-hdpi/ic_subtype_mic.png +++ b/java/res/drawable-hdpi/ic_subtype_mic.png diff --git a/java/res/drawable-hdpi/ic_suggest_strip_microphone.png b/java/res/drawable-hdpi/ic_suggest_strip_microphone.png Binary files differindex c00b4aaa6..189a861fb 100644 --- a/java/res/drawable-hdpi/ic_suggest_strip_microphone.png +++ b/java/res/drawable-hdpi/ic_suggest_strip_microphone.png diff --git a/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png b/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png Binary files differindex 256dc3d61..b4a6e373b 100644 --- a/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png +++ b/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png diff --git a/java/res/drawable-hdpi/keyboard_background.9.png b/java/res/drawable-hdpi/keyboard_background.9.png Binary files differindex edffac5b8..d57463fb6 100644 --- a/java/res/drawable-hdpi/keyboard_background.9.png +++ b/java/res/drawable-hdpi/keyboard_background.9.png diff --git a/java/res/drawable-hdpi/keyboard_background_holo.9.png b/java/res/drawable-hdpi/keyboard_background_holo.9.png Binary files differnew file mode 100644 index 000000000..39746ffd2 --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_background_holo.9.png diff --git a/java/res/drawable-hdpi/keyboard_dark_background.9.png b/java/res/drawable-hdpi/keyboard_dark_background.9.png Binary files differindex f315cbdd4..fa3d449f7 100644 --- a/java/res/drawable-hdpi/keyboard_dark_background.9.png +++ b/java/res/drawable-hdpi/keyboard_dark_background.9.png diff --git a/java/res/drawable-hdpi/keyboard_hint_0.9.png b/java/res/drawable-hdpi/keyboard_hint_0.9.png Binary files differdeleted file mode 100644 index 271264e92..000000000 --- a/java/res/drawable-hdpi/keyboard_hint_0.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_hint_1.9.png b/java/res/drawable-hdpi/keyboard_hint_1.9.png Binary files differdeleted file mode 100644 index eaf374262..000000000 --- a/java/res/drawable-hdpi/keyboard_hint_1.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_hint_2.9.png b/java/res/drawable-hdpi/keyboard_hint_2.9.png Binary files differdeleted file mode 100644 index 8a1657117..000000000 --- a/java/res/drawable-hdpi/keyboard_hint_2.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_hint_3.9.png b/java/res/drawable-hdpi/keyboard_hint_3.9.png Binary files differdeleted file mode 100644 index 34b501109..000000000 --- a/java/res/drawable-hdpi/keyboard_hint_3.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_hint_4.9.png b/java/res/drawable-hdpi/keyboard_hint_4.9.png Binary files differdeleted file mode 100644 index d4cc250dd..000000000 --- a/java/res/drawable-hdpi/keyboard_hint_4.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_hint_5.9.png b/java/res/drawable-hdpi/keyboard_hint_5.9.png Binary files differdeleted file mode 100644 index 6a054b42f..000000000 --- a/java/res/drawable-hdpi/keyboard_hint_5.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_hint_6.9.png b/java/res/drawable-hdpi/keyboard_hint_6.9.png Binary files differdeleted file mode 100644 index 66e91400a..000000000 --- a/java/res/drawable-hdpi/keyboard_hint_6.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_hint_7.9.png b/java/res/drawable-hdpi/keyboard_hint_7.9.png Binary files differdeleted file mode 100644 index 5eae24f4f..000000000 --- a/java/res/drawable-hdpi/keyboard_hint_7.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_hint_8.9.png b/java/res/drawable-hdpi/keyboard_hint_8.9.png Binary files differdeleted file mode 100644 index ea7f512fd..000000000 --- a/java/res/drawable-hdpi/keyboard_hint_8.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_hint_9.9.png b/java/res/drawable-hdpi/keyboard_hint_9.9.png Binary files differdeleted file mode 100644 index 0bf85de93..000000000 --- a/java/res/drawable-hdpi/keyboard_hint_9.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png Binary files differindex 762a25704..27d992375 100644 --- a/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png +++ b/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png 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 Binary files differnew file mode 100644 index 000000000..fd7a56e17 --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_key_feedback_background_holo.9.png diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_left_background_holo.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_left_background_holo.9.png Binary files differnew file mode 100644 index 000000000..60d920315 --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_key_feedback_left_background_holo.9.png diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_left_more_background_holo.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_left_more_background_holo.9.png Binary files differnew file mode 100644 index 000000000..f694b796c --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_key_feedback_left_more_background_holo.9.png 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 Binary files differindex 141d2d6be..33263b9d7 100644 --- a/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png +++ b/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_more_background_holo.9.png Binary files differnew file mode 100644 index 000000000..3165d08aa --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_key_feedback_more_background_holo.9.png diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_right_background_holo.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_right_background_holo.9.png Binary files differnew file mode 100644 index 000000000..3136073a2 --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_key_feedback_right_background_holo.9.png diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_right_more_background_holo.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_right_more_background_holo.9.png Binary files differnew file mode 100644 index 000000000..13d5af9cb --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_key_feedback_right_more_background_holo.9.png diff --git a/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png Binary files differindex d6b2c7936..baff80950 100644 --- a/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png +++ b/java/res/drawable-hdpi/keyboard_popup_panel_background.9.png 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 Binary files differnew file mode 100644 index 000000000..4002dbe65 --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_popup_panel_background_holo.9.png diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip.9.png b/java/res/drawable-hdpi/keyboard_suggest_strip.9.png Binary files differindex 0ccdb6ab2..7cab5a899 100644 --- a/java/res/drawable-hdpi/keyboard_suggest_strip.9.png +++ b/java/res/drawable-hdpi/keyboard_suggest_strip.9.png diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png Binary files differindex 7ca3e6131..a62daf90c 100644 --- a/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png +++ b/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.png Binary files differnew file mode 100644 index 000000000..f25003405 --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_suggest_strip_holo.9.png diff --git a/java/res/drawable-hdpi/list_selector_background_pressed.9.png b/java/res/drawable-hdpi/list_selector_background_pressed.9.png Binary files differdeleted file mode 100644 index ba79cf7f8..000000000 --- a/java/res/drawable-hdpi/list_selector_background_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/mic_base.png b/java/res/drawable-hdpi/mic_base.png Binary files differnew file mode 100644 index 000000000..504a1aa2a --- /dev/null +++ b/java/res/drawable-hdpi/mic_base.png diff --git a/java/res/drawable-hdpi/mic_full.png b/java/res/drawable-hdpi/mic_full.png Binary files differnew file mode 100644 index 000000000..3f4a67657 --- /dev/null +++ b/java/res/drawable-hdpi/mic_full.png diff --git a/java/res/drawable-hdpi/mic_slash.png b/java/res/drawable-hdpi/mic_slash.png Binary files differindex dc8da6252..c3b10929b 100644 --- a/java/res/drawable-hdpi/mic_slash.png +++ b/java/res/drawable-hdpi/mic_slash.png diff --git a/java/res/drawable-hdpi/ok_cancel.png b/java/res/drawable-hdpi/ok_cancel.png Binary files differdeleted file mode 100644 index f11e57a38..000000000 --- a/java/res/drawable-hdpi/ok_cancel.png +++ /dev/null diff --git a/java/res/drawable-hdpi/speak_now_level0.png b/java/res/drawable-hdpi/speak_now_level0.png Binary files differdeleted file mode 100644 index 342849cfe..000000000 --- a/java/res/drawable-hdpi/speak_now_level0.png +++ /dev/null diff --git a/java/res/drawable-hdpi/speak_now_level1.png b/java/res/drawable-hdpi/speak_now_level1.png Binary files differdeleted file mode 100644 index 8947a4306..000000000 --- a/java/res/drawable-hdpi/speak_now_level1.png +++ /dev/null diff --git a/java/res/drawable-hdpi/speak_now_level2.png b/java/res/drawable-hdpi/speak_now_level2.png Binary files differdeleted file mode 100644 index 44fc58c4e..000000000 --- a/java/res/drawable-hdpi/speak_now_level2.png +++ /dev/null diff --git a/java/res/drawable-hdpi/speak_now_level3.png b/java/res/drawable-hdpi/speak_now_level3.png Binary files differdeleted file mode 100644 index cfa5c1b87..000000000 --- a/java/res/drawable-hdpi/speak_now_level3.png +++ /dev/null diff --git a/java/res/drawable-hdpi/speak_now_level4.png b/java/res/drawable-hdpi/speak_now_level4.png Binary files differdeleted file mode 100644 index a050d8836..000000000 --- a/java/res/drawable-hdpi/speak_now_level4.png +++ /dev/null diff --git a/java/res/drawable-hdpi/speak_now_level5.png b/java/res/drawable-hdpi/speak_now_level5.png Binary files differdeleted file mode 100644 index 8cd5ae7ad..000000000 --- a/java/res/drawable-hdpi/speak_now_level5.png +++ /dev/null diff --git a/java/res/drawable-hdpi/speak_now_level6.png b/java/res/drawable-hdpi/speak_now_level6.png Binary files differdeleted file mode 100644 index 9f4481eb4..000000000 --- a/java/res/drawable-hdpi/speak_now_level6.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png b/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png Binary files differindex 3e4eff698..af6082d04 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_delete.png b/java/res/drawable-hdpi/sym_bkeyboard_delete.png Binary files differindex 1d24cc85c..999a182f4 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_delete.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_delete.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_done.png b/java/res/drawable-hdpi/sym_bkeyboard_done.png Binary files differdeleted file mode 100644 index b77803d21..000000000 --- a/java/res/drawable-hdpi/sym_bkeyboard_done.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_bkeyboard_mic.png b/java/res/drawable-hdpi/sym_bkeyboard_mic.png Binary files differindex 512f46080..5c73600d9 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_mic.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_mic.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num0.png b/java/res/drawable-hdpi/sym_bkeyboard_num0.png Binary files differindex 678a790de..02f281166 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_num0.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_num0.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num1.png b/java/res/drawable-hdpi/sym_bkeyboard_num1.png Binary files differindex 4e68e35b3..304acfd31 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_num1.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_num1.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num2.png b/java/res/drawable-hdpi/sym_bkeyboard_num2.png Binary files differindex 546663fda..295eba1e4 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_num2.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_num2.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num3.png b/java/res/drawable-hdpi/sym_bkeyboard_num3.png Binary files differindex 57f9a8d8e..9ee6e4437 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_num3.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_num3.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num4.png b/java/res/drawable-hdpi/sym_bkeyboard_num4.png Binary files differindex de504388f..ab4392dcb 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_num4.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_num4.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num5.png b/java/res/drawable-hdpi/sym_bkeyboard_num5.png Binary files differindex 1d2e1ef89..004ecd72e 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_num5.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_num5.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num6.png b/java/res/drawable-hdpi/sym_bkeyboard_num6.png Binary files differindex 39788b727..2aa317d77 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_num6.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_num6.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num7.png b/java/res/drawable-hdpi/sym_bkeyboard_num7.png Binary files differindex fff6f27bf..721361c29 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_num7.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_num7.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num8.png b/java/res/drawable-hdpi/sym_bkeyboard_num8.png Binary files differindex 8cc1a955e..941359f6b 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_num8.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_num8.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num9.png b/java/res/drawable-hdpi/sym_bkeyboard_num9.png Binary files differindex 021742509..74e08a087 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_num9.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_num9.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numalt.png b/java/res/drawable-hdpi/sym_bkeyboard_numalt.png Binary files differdeleted file mode 100644 index 200714f66..000000000 --- a/java/res/drawable-hdpi/sym_bkeyboard_numalt.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numpound.png b/java/res/drawable-hdpi/sym_bkeyboard_numpound.png Binary files differdeleted file mode 100644 index 0a46122b2..000000000 --- a/java/res/drawable-hdpi/sym_bkeyboard_numpound.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numstar.png b/java/res/drawable-hdpi/sym_bkeyboard_numstar.png Binary files differdeleted file mode 100644 index ca22bd535..000000000 --- a/java/res/drawable-hdpi/sym_bkeyboard_numstar.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_bkeyboard_return.png b/java/res/drawable-hdpi/sym_bkeyboard_return.png Binary files differindex 426e1599e..91bb397ff 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_return.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_return.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_search.png b/java/res/drawable-hdpi/sym_bkeyboard_search.png Binary files differindex 1b6f884fa..0ac08145b 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_search.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_search.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_settings.png b/java/res/drawable-hdpi/sym_bkeyboard_settings.png Binary files differindex 08ba18f28..5b6217aa0 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_settings.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_settings.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_shift.png b/java/res/drawable-hdpi/sym_bkeyboard_shift.png Binary files differindex 5a22dd309..5ef01b8bd 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_shift.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_shift.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png b/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png Binary files differindex 566449126..7d36dcb34 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_space.png b/java/res/drawable-hdpi/sym_bkeyboard_space.png Binary files differindex cd0ebe2f4..77518cc93 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_space.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_space.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_tab.png b/java/res/drawable-hdpi/sym_bkeyboard_tab.png Binary files differindex 3466e1271..5db4cef2b 100644 --- a/java/res/drawable-hdpi/sym_bkeyboard_tab.png +++ b/java/res/drawable-hdpi/sym_bkeyboard_tab.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_voice_off.png b/java/res/drawable-hdpi/sym_bkeyboard_voice_off.png Binary files differnew file mode 100644 index 000000000..081a13096 --- /dev/null +++ b/java/res/drawable-hdpi/sym_bkeyboard_voice_off.png diff --git a/java/res/drawable-hdpi/sym_keyboard_123_mic.png b/java/res/drawable-hdpi/sym_keyboard_123_mic.png Binary files differindex 62669803d..6f0aec24c 100644 --- a/java/res/drawable-hdpi/sym_keyboard_123_mic.png +++ b/java/res/drawable-hdpi/sym_keyboard_123_mic.png diff --git a/java/res/drawable-hdpi/sym_keyboard_delete.png b/java/res/drawable-hdpi/sym_keyboard_delete.png Binary files differindex 459ebcff8..0591b82cd 100644 --- a/java/res/drawable-hdpi/sym_keyboard_delete.png +++ b/java/res/drawable-hdpi/sym_keyboard_delete.png diff --git a/java/res/drawable-hdpi/sym_keyboard_delete_holo.png b/java/res/drawable-hdpi/sym_keyboard_delete_holo.png Binary files differnew file mode 100644 index 000000000..9d87ba619 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_delete_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_done.png b/java/res/drawable-hdpi/sym_keyboard_done.png Binary files differdeleted file mode 100644 index 471c5021b..000000000 --- a/java/res/drawable-hdpi/sym_keyboard_done.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png b/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png Binary files differindex eef789680..e56799cdb 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png b/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png Binary files differindex 8322e8e1d..960bb4e8e 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_done.png b/java/res/drawable-hdpi/sym_keyboard_feedback_done.png Binary files differdeleted file mode 100644 index 7015e266a..000000000 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_done.png +++ /dev/null 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 Binary files differindex 889477cfb..5d1cb7833 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png 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 Binary files differindex b0f6d7feb..3a56d4745 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png b/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png Binary files differindex f82c33ae3..a88a19d0d 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png b/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png Binary files differindex 819236c8e..7d418d91d 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_return.png b/java/res/drawable-hdpi/sym_keyboard_feedback_return.png Binary files differindex f038d3abe..f73ff3cd9 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_return.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_return.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_search.png b/java/res/drawable-hdpi/sym_keyboard_feedback_search.png Binary files differindex 337f9e4fe..0e69157d6 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_search.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_search.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png b/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png Binary files differindex 8a02be07e..6304b00ed 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_settings.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png b/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png Binary files differindex abf15f8f9..fc858f220 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png b/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png Binary files differdeleted file mode 100644 index 1fd822ea6..000000000 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_space.png b/java/res/drawable-hdpi/sym_keyboard_feedback_space.png Binary files differindex 70debca9b..67311fc8f 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_space.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_space.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png b/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png Binary files differindex d2efb1619..d75fcacd5 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png diff --git a/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png b/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png Binary files differindex dcc4bd59b..79f235f25 100644 --- a/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png +++ b/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png diff --git a/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png b/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png Binary files differindex ecf61a98e..e1444e85b 100644 --- a/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png +++ b/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png diff --git a/java/res/drawable-hdpi/sym_keyboard_mic.png b/java/res/drawable-hdpi/sym_keyboard_mic.png Binary files differindex c8dca62a0..520a40f09 100644 --- a/java/res/drawable-hdpi/sym_keyboard_mic.png +++ b/java/res/drawable-hdpi/sym_keyboard_mic.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num0.png b/java/res/drawable-hdpi/sym_keyboard_num0.png Binary files differindex 10ac70b9d..2024f416b 100644 --- a/java/res/drawable-hdpi/sym_keyboard_num0.png +++ b/java/res/drawable-hdpi/sym_keyboard_num0.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num0_holo.png b/java/res/drawable-hdpi/sym_keyboard_num0_holo.png Binary files differnew file mode 100644 index 000000000..fbd55d68d --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_num0_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num1.png b/java/res/drawable-hdpi/sym_keyboard_num1.png Binary files differindex 0fc03efa5..5e66b9a31 100644 --- a/java/res/drawable-hdpi/sym_keyboard_num1.png +++ b/java/res/drawable-hdpi/sym_keyboard_num1.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num1_holo.png b/java/res/drawable-hdpi/sym_keyboard_num1_holo.png Binary files differnew file mode 100644 index 000000000..e651c3e85 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_num1_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num2.png b/java/res/drawable-hdpi/sym_keyboard_num2.png Binary files differindex 283560b35..3933270dc 100644 --- a/java/res/drawable-hdpi/sym_keyboard_num2.png +++ b/java/res/drawable-hdpi/sym_keyboard_num2.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num2_holo.png b/java/res/drawable-hdpi/sym_keyboard_num2_holo.png Binary files differnew file mode 100644 index 000000000..8458f5313 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_num2_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num3.png b/java/res/drawable-hdpi/sym_keyboard_num3.png Binary files differindex 9a3b3294b..c69548345 100644 --- a/java/res/drawable-hdpi/sym_keyboard_num3.png +++ b/java/res/drawable-hdpi/sym_keyboard_num3.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num3_holo.png b/java/res/drawable-hdpi/sym_keyboard_num3_holo.png Binary files differnew file mode 100644 index 000000000..81025c635 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_num3_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num4.png b/java/res/drawable-hdpi/sym_keyboard_num4.png Binary files differindex f13ff1ae9..ef20add54 100644 --- a/java/res/drawable-hdpi/sym_keyboard_num4.png +++ b/java/res/drawable-hdpi/sym_keyboard_num4.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num4_holo.png b/java/res/drawable-hdpi/sym_keyboard_num4_holo.png Binary files differnew file mode 100644 index 000000000..30a0c77c7 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_num4_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num5.png b/java/res/drawable-hdpi/sym_keyboard_num5.png Binary files differindex c251329fa..9a2f51f8d 100644 --- a/java/res/drawable-hdpi/sym_keyboard_num5.png +++ b/java/res/drawable-hdpi/sym_keyboard_num5.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num5_holo.png b/java/res/drawable-hdpi/sym_keyboard_num5_holo.png Binary files differnew file mode 100644 index 000000000..147f056fc --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_num5_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num6.png b/java/res/drawable-hdpi/sym_keyboard_num6.png Binary files differindex 4acba4c91..6829f81d1 100644 --- a/java/res/drawable-hdpi/sym_keyboard_num6.png +++ b/java/res/drawable-hdpi/sym_keyboard_num6.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num6_holo.png b/java/res/drawable-hdpi/sym_keyboard_num6_holo.png Binary files differnew file mode 100644 index 000000000..b96830844 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_num6_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num7.png b/java/res/drawable-hdpi/sym_keyboard_num7.png Binary files differindex 14931c18c..dc608d4e1 100644 --- a/java/res/drawable-hdpi/sym_keyboard_num7.png +++ b/java/res/drawable-hdpi/sym_keyboard_num7.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num7_holo.png b/java/res/drawable-hdpi/sym_keyboard_num7_holo.png Binary files differnew file mode 100644 index 000000000..7d44bfb45 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_num7_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num8.png b/java/res/drawable-hdpi/sym_keyboard_num8.png Binary files differindex d4973fdc9..f0978c611 100644 --- a/java/res/drawable-hdpi/sym_keyboard_num8.png +++ b/java/res/drawable-hdpi/sym_keyboard_num8.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num8_holo.png b/java/res/drawable-hdpi/sym_keyboard_num8_holo.png Binary files differnew file mode 100644 index 000000000..093cd743a --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_num8_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num9.png b/java/res/drawable-hdpi/sym_keyboard_num9.png Binary files differindex 49cec66f4..4b8328d1f 100644 --- a/java/res/drawable-hdpi/sym_keyboard_num9.png +++ b/java/res/drawable-hdpi/sym_keyboard_num9.png diff --git a/java/res/drawable-hdpi/sym_keyboard_num9_holo.png b/java/res/drawable-hdpi/sym_keyboard_num9_holo.png Binary files differnew file mode 100644 index 000000000..f35e80dab --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_num9_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_numalt.png b/java/res/drawable-hdpi/sym_keyboard_numalt.png Binary files differdeleted file mode 100644 index 3cc5311cd..000000000 --- a/java/res/drawable-hdpi/sym_keyboard_numalt.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_keyboard_numpound.png b/java/res/drawable-hdpi/sym_keyboard_numpound.png Binary files differdeleted file mode 100644 index d09133929..000000000 --- a/java/res/drawable-hdpi/sym_keyboard_numpound.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_keyboard_numstar.png b/java/res/drawable-hdpi/sym_keyboard_numstar.png Binary files differdeleted file mode 100644 index e838e169f..000000000 --- a/java/res/drawable-hdpi/sym_keyboard_numstar.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_keyboard_return.png b/java/res/drawable-hdpi/sym_keyboard_return.png Binary files differindex 9d97e1efd..9743c7f2f 100644 --- a/java/res/drawable-hdpi/sym_keyboard_return.png +++ b/java/res/drawable-hdpi/sym_keyboard_return.png diff --git a/java/res/drawable-hdpi/sym_keyboard_return_holo.png b/java/res/drawable-hdpi/sym_keyboard_return_holo.png Binary files differnew file mode 100644 index 000000000..ef04d6767 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_return_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_search.png b/java/res/drawable-hdpi/sym_keyboard_search.png Binary files differindex 1aa22d7e2..8cd28c64a 100644 --- a/java/res/drawable-hdpi/sym_keyboard_search.png +++ b/java/res/drawable-hdpi/sym_keyboard_search.png diff --git a/java/res/drawable-hdpi/sym_keyboard_settings.png b/java/res/drawable-hdpi/sym_keyboard_settings.png Binary files differindex 35d1ed6e6..1e5bf939e 100644 --- a/java/res/drawable-hdpi/sym_keyboard_settings.png +++ b/java/res/drawable-hdpi/sym_keyboard_settings.png diff --git a/java/res/drawable-hdpi/sym_keyboard_settings_holo.png b/java/res/drawable-hdpi/sym_keyboard_settings_holo.png Binary files differnew file mode 100644 index 000000000..29085e5ea --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_settings_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_shift.png b/java/res/drawable-hdpi/sym_keyboard_shift.png Binary files differindex bf217d147..8e3d0320c 100644 --- a/java/res/drawable-hdpi/sym_keyboard_shift.png +++ b/java/res/drawable-hdpi/sym_keyboard_shift.png diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_holo.png b/java/res/drawable-hdpi/sym_keyboard_shift_holo.png Binary files differnew file mode 100644 index 000000000..1e074a716 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_shift_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_locked.png b/java/res/drawable-hdpi/sym_keyboard_shift_locked.png Binary files differindex d11b39712..d345634a6 100644 --- a/java/res/drawable-hdpi/sym_keyboard_shift_locked.png +++ b/java/res/drawable-hdpi/sym_keyboard_shift_locked.png diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.png Binary files differnew file mode 100644 index 000000000..ab77b9542 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_shift_locked_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_space.png b/java/res/drawable-hdpi/sym_keyboard_space.png Binary files differindex fcd20de7d..780733ec5 100644 --- a/java/res/drawable-hdpi/sym_keyboard_space.png +++ b/java/res/drawable-hdpi/sym_keyboard_space.png diff --git a/java/res/drawable-hdpi/sym_keyboard_space_holo.png b/java/res/drawable-hdpi/sym_keyboard_space_holo.png Binary files differnew file mode 100644 index 000000000..143a89964 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_space_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_space_led.9.png b/java/res/drawable-hdpi/sym_keyboard_space_led.9.png Binary files differindex 2c6f4a925..c76f64b94 100644 --- a/java/res/drawable-hdpi/sym_keyboard_space_led.9.png +++ b/java/res/drawable-hdpi/sym_keyboard_space_led.9.png diff --git a/java/res/drawable-hdpi/sym_keyboard_tab.png b/java/res/drawable-hdpi/sym_keyboard_tab.png Binary files differindex 51d17d989..3d1c5c0ea 100644 --- a/java/res/drawable-hdpi/sym_keyboard_tab.png +++ b/java/res/drawable-hdpi/sym_keyboard_tab.png diff --git a/java/res/drawable-hdpi/sym_keyboard_tab_holo.png b/java/res/drawable-hdpi/sym_keyboard_tab_holo.png Binary files differnew file mode 100644 index 000000000..321c541cc --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_tab_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_voice_holo.png b/java/res/drawable-hdpi/sym_keyboard_voice_holo.png Binary files differnew file mode 100644 index 000000000..d3cb46e0d --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_voice_holo.png diff --git a/java/res/drawable-hdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-hdpi/sym_keyboard_voice_off_holo.png Binary files differnew file mode 100644 index 000000000..45e3e79c5 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_voice_off_holo.png diff --git a/java/res/drawable-hdpi/voice_ime_background.9.png b/java/res/drawable-hdpi/voice_ime_background.9.png Binary files differdeleted file mode 100644 index 42868522f..000000000 --- a/java/res/drawable-hdpi/voice_ime_background.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/voice_swipe_hint.png b/java/res/drawable-hdpi/voice_swipe_hint.png Binary files differdeleted file mode 100644 index 130f83a9c..000000000 --- a/java/res/drawable-hdpi/voice_swipe_hint.png +++ /dev/null diff --git a/java/res/drawable-hdpi/vs_dialog_blue.9.png b/java/res/drawable-hdpi/vs_dialog_blue.9.png Binary files differnew file mode 100644 index 000000000..4f813ead3 --- /dev/null +++ b/java/res/drawable-hdpi/vs_dialog_blue.9.png diff --git a/java/res/drawable-hdpi/vs_dialog_red.9.png b/java/res/drawable-hdpi/vs_dialog_red.9.png Binary files differnew file mode 100644 index 000000000..a2055600e --- /dev/null +++ b/java/res/drawable-hdpi/vs_dialog_red.9.png diff --git a/java/res/drawable-hdpi/vs_dialog_yellow.9.png b/java/res/drawable-hdpi/vs_dialog_yellow.9.png Binary files differnew file mode 100644 index 000000000..ce664b676 --- /dev/null +++ b/java/res/drawable-hdpi/vs_dialog_yellow.9.png diff --git a/java/res/drawable-hdpi/vs_popup_mic_edge.png b/java/res/drawable-hdpi/vs_popup_mic_edge.png Binary files differnew file mode 100644 index 000000000..4ff6337a2 --- /dev/null +++ b/java/res/drawable-hdpi/vs_popup_mic_edge.png diff --git a/java/res/drawable-hdpi/working.png b/java/res/drawable-hdpi/working.png Binary files differdeleted file mode 100755 index 5ea702307..000000000 --- a/java/res/drawable-hdpi/working.png +++ /dev/null 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 Binary files differnew file mode 100644 index 000000000..603bf0e15 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png 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 Binary files differnew file mode 100644 index 000000000..6ddd516e7 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png 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 Binary files differnew file mode 100644 index 000000000..67a204f85 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png 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 Binary files differnew file mode 100644 index 000000000..65fdeb353 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png 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 Binary files differnew file mode 100644 index 000000000..63cbe60a3 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png 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 Binary files differnew file mode 100644 index 000000000..0dd33b429 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png 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 Binary files differnew file mode 100644 index 000000000..7ec915fe8 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png 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 Binary files differnew file mode 100644 index 000000000..439271723 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png 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 Binary files differnew file mode 100644 index 000000000..c2cc32044 --- /dev/null +++ b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png diff --git a/java/res/drawable-land-hdpi/hint_popup_holo.9.png b/java/res/drawable-land-hdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..2b93014e1 --- /dev/null +++ b/java/res/drawable-land-hdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-land-mdpi/hint_popup_holo.9.png b/java/res/drawable-land-mdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..c409cea00 --- /dev/null +++ b/java/res/drawable-land-mdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-land-xhdpi/hint_popup_holo.9.png b/java/res/drawable-land-xhdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..3cd20d34f --- /dev/null +++ b/java/res/drawable-land-xhdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-mdpi/list_selector_background_pressed.9.png b/java/res/drawable-mdpi/btn_candidate_pressed.9.png Binary files differindex 02b4e9a53..02b4e9a53 100644 --- a/java/res/drawable-mdpi/list_selector_background_pressed.9.png +++ b/java/res/drawable-mdpi/btn_candidate_pressed.9.png diff --git a/java/res/drawable-mdpi/btn_center_default.9.png b/java/res/drawable-mdpi/btn_center_default.9.png Binary files differnew file mode 100644 index 000000000..d5ec36ba4 --- /dev/null +++ b/java/res/drawable-mdpi/btn_center_default.9.png diff --git a/java/res/drawable-mdpi/btn_center_pressed.9.png b/java/res/drawable-mdpi/btn_center_pressed.9.png Binary files differnew file mode 100644 index 000000000..593a679d0 --- /dev/null +++ b/java/res/drawable-mdpi/btn_center_pressed.9.png diff --git a/java/res/drawable-mdpi/btn_center_selected.9.png b/java/res/drawable-mdpi/btn_center_selected.9.png Binary files differnew file mode 100644 index 000000000..f1914a886 --- /dev/null +++ b/java/res/drawable-mdpi/btn_center_selected.9.png diff --git a/java/res/drawable-mdpi/btn_close_candidates_pane.9.png b/java/res/drawable-mdpi/btn_close_candidates_pane.9.png Binary files differnew file mode 100644 index 000000000..5ea56925d --- /dev/null +++ b/java/res/drawable-mdpi/btn_close_candidates_pane.9.png diff --git a/java/res/drawable-mdpi/btn_expand_candidates_pane.9.png b/java/res/drawable-mdpi/btn_expand_candidates_pane.9.png Binary files differnew file mode 100644 index 000000000..83cb65305 --- /dev/null +++ b/java/res/drawable-mdpi/btn_expand_candidates_pane.9.png 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 Binary files differnew file mode 100644 index 000000000..034d63870 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png 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 Binary files differnew file mode 100644 index 000000000..0cb53d506 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png 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 Binary files differnew file mode 100644 index 000000000..0050a0110 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png 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 Binary files differnew file mode 100644 index 000000000..27f8fdac6 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_holo.9.png 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 Binary files differnew file mode 100644 index 000000000..b8ce95235 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png 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 Binary files differnew file mode 100644 index 000000000..4d4d1a748 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png 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 Binary files differnew file mode 100644 index 000000000..90f471f48 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_light_normal_holo.9.png 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 Binary files differindex 02d0fcf93..0e828a6cf 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png 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 Binary files differnew file mode 100644 index 000000000..c850768cd --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_holo.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_popup_background_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_popup_background_holo.9.png Binary files differnew file mode 100644 index 000000000..e9186b7bb --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_popup_background_holo.9.png 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 Binary files differnew file mode 100644 index 000000000..e96c8c5db --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-mdpi/cancel.png b/java/res/drawable-mdpi/cancel.png Binary files differdeleted file mode 100644 index 713a37875..000000000 --- a/java/res/drawable-mdpi/cancel.png +++ /dev/null diff --git a/java/res/drawable-mdpi/dialog_bubble_step02.9.png b/java/res/drawable-mdpi/dialog_bubble_step02.9.png Binary files differdeleted file mode 100644 index d77f85fe2..000000000 --- a/java/res/drawable-mdpi/dialog_bubble_step02.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/dialog_bubble_step07.9.png b/java/res/drawable-mdpi/dialog_bubble_step07.9.png Binary files differdeleted file mode 100644 index 80f4a0eaa..000000000 --- a/java/res/drawable-mdpi/dialog_bubble_step07.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/highlight_pressed.png b/java/res/drawable-mdpi/highlight_pressed.png Binary files differdeleted file mode 100644 index d27f1061a..000000000 --- a/java/res/drawable-mdpi/highlight_pressed.png +++ /dev/null diff --git a/java/res/drawable-mdpi/hint_popup_holo.9.png b/java/res/drawable-mdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..e9e131c54 --- /dev/null +++ b/java/res/drawable-mdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-mdpi/ic_subtype_keyboard.png b/java/res/drawable-mdpi/ic_subtype_keyboard.png Binary files differindex 0d7ebd4e5..d28efc106 100644 --- a/java/res/drawable-mdpi/ic_subtype_keyboard.png +++ b/java/res/drawable-mdpi/ic_subtype_keyboard.png diff --git a/java/res/drawable-mdpi/ic_subtype_mic.png b/java/res/drawable-mdpi/ic_subtype_mic.png Binary files differindex 247d5b3a9..0b6aca802 100644 --- a/java/res/drawable-mdpi/ic_subtype_mic.png +++ b/java/res/drawable-mdpi/ic_subtype_mic.png diff --git a/java/res/drawable-mdpi/keyboard_background_holo.9.png b/java/res/drawable-mdpi/keyboard_background_holo.9.png Binary files differnew file mode 100644 index 000000000..f1d55c6dd --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_background_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_hint_0.9.png b/java/res/drawable-mdpi/keyboard_hint_0.9.png Binary files differdeleted file mode 100644 index 61ad1b50a..000000000 --- a/java/res/drawable-mdpi/keyboard_hint_0.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_hint_1.9.png b/java/res/drawable-mdpi/keyboard_hint_1.9.png Binary files differdeleted file mode 100644 index cd7772e71..000000000 --- a/java/res/drawable-mdpi/keyboard_hint_1.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_hint_2.9.png b/java/res/drawable-mdpi/keyboard_hint_2.9.png Binary files differdeleted file mode 100644 index fa5f8b79c..000000000 --- a/java/res/drawable-mdpi/keyboard_hint_2.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_hint_3.9.png b/java/res/drawable-mdpi/keyboard_hint_3.9.png Binary files differdeleted file mode 100644 index 0c7336cb7..000000000 --- a/java/res/drawable-mdpi/keyboard_hint_3.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_hint_4.9.png b/java/res/drawable-mdpi/keyboard_hint_4.9.png Binary files differdeleted file mode 100644 index 73ef06c0e..000000000 --- a/java/res/drawable-mdpi/keyboard_hint_4.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_hint_5.9.png b/java/res/drawable-mdpi/keyboard_hint_5.9.png Binary files differdeleted file mode 100644 index aea460e1c..000000000 --- a/java/res/drawable-mdpi/keyboard_hint_5.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_hint_6.9.png b/java/res/drawable-mdpi/keyboard_hint_6.9.png Binary files differdeleted file mode 100644 index 16a9237e3..000000000 --- a/java/res/drawable-mdpi/keyboard_hint_6.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_hint_7.9.png b/java/res/drawable-mdpi/keyboard_hint_7.9.png Binary files differdeleted file mode 100644 index 6747a19c0..000000000 --- a/java/res/drawable-mdpi/keyboard_hint_7.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_hint_8.9.png b/java/res/drawable-mdpi/keyboard_hint_8.9.png Binary files differdeleted file mode 100644 index 28be2fb86..000000000 --- a/java/res/drawable-mdpi/keyboard_hint_8.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_hint_9.9.png b/java/res/drawable-mdpi/keyboard_hint_9.9.png Binary files differdeleted file mode 100644 index 731d63b1b..000000000 --- a/java/res/drawable-mdpi/keyboard_hint_9.9.png +++ /dev/null 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 Binary files differnew file mode 100644 index 000000000..9a1b7aadd --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_key_feedback_background_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_left_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_left_background_holo.9.png Binary files differnew file mode 100644 index 000000000..cb222b0f9 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_key_feedback_left_background_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_left_more_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_left_more_background_holo.9.png Binary files differnew file mode 100644 index 000000000..07d980083 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_key_feedback_left_more_background_holo.9.png 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 Binary files differnew file mode 100644 index 000000000..05a332b8e --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_right_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_right_background_holo.9.png Binary files differnew file mode 100644 index 000000000..fd1675512 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_key_feedback_right_background_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_right_more_background_holo.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_right_more_background_holo.9.png Binary files differnew file mode 100644 index 000000000..1acbd8268 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_key_feedback_right_more_background_holo.9.png 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 Binary files differnew file mode 100644 index 000000000..7be7ab7e2 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_popup_panel_background_holo.9.png diff --git a/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png Binary files differnew file mode 100644 index 000000000..17faf86d0 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_suggest_strip_holo.9.png diff --git a/java/res/drawable-mdpi/mic_base.png b/java/res/drawable-mdpi/mic_base.png Binary files differnew file mode 100644 index 000000000..53e29ff4b --- /dev/null +++ b/java/res/drawable-mdpi/mic_base.png diff --git a/java/res/drawable-mdpi/mic_full.png b/java/res/drawable-mdpi/mic_full.png Binary files differnew file mode 100644 index 000000000..e3e3dfac3 --- /dev/null +++ b/java/res/drawable-mdpi/mic_full.png diff --git a/java/res/drawable-mdpi/ok_cancel.png b/java/res/drawable-mdpi/ok_cancel.png Binary files differdeleted file mode 100644 index 20d10f986..000000000 --- a/java/res/drawable-mdpi/ok_cancel.png +++ /dev/null diff --git a/java/res/drawable-mdpi/speak_now_level0.png b/java/res/drawable-mdpi/speak_now_level0.png Binary files differdeleted file mode 100644 index 5bd13603e..000000000 --- a/java/res/drawable-mdpi/speak_now_level0.png +++ /dev/null diff --git a/java/res/drawable-mdpi/speak_now_level1.png b/java/res/drawable-mdpi/speak_now_level1.png Binary files differdeleted file mode 100644 index ccb76b879..000000000 --- a/java/res/drawable-mdpi/speak_now_level1.png +++ /dev/null diff --git a/java/res/drawable-mdpi/speak_now_level2.png b/java/res/drawable-mdpi/speak_now_level2.png Binary files differdeleted file mode 100644 index 715f90081..000000000 --- a/java/res/drawable-mdpi/speak_now_level2.png +++ /dev/null diff --git a/java/res/drawable-mdpi/speak_now_level3.png b/java/res/drawable-mdpi/speak_now_level3.png Binary files differdeleted file mode 100644 index 725248a25..000000000 --- a/java/res/drawable-mdpi/speak_now_level3.png +++ /dev/null diff --git a/java/res/drawable-mdpi/speak_now_level4.png b/java/res/drawable-mdpi/speak_now_level4.png Binary files differdeleted file mode 100644 index ff6c50b40..000000000 --- a/java/res/drawable-mdpi/speak_now_level4.png +++ /dev/null diff --git a/java/res/drawable-mdpi/speak_now_level5.png b/java/res/drawable-mdpi/speak_now_level5.png Binary files differdeleted file mode 100644 index a5d6b89d6..000000000 --- a/java/res/drawable-mdpi/speak_now_level5.png +++ /dev/null diff --git a/java/res/drawable-mdpi/speak_now_level6.png b/java/res/drawable-mdpi/speak_now_level6.png Binary files differdeleted file mode 100644 index dcdb48d08..000000000 --- a/java/res/drawable-mdpi/speak_now_level6.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_bkeyboard_done.png b/java/res/drawable-mdpi/sym_bkeyboard_done.png Binary files differdeleted file mode 100644 index 05ce7c643..000000000 --- a/java/res/drawable-mdpi/sym_bkeyboard_done.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_bkeyboard_numalt.png b/java/res/drawable-mdpi/sym_bkeyboard_numalt.png Binary files differdeleted file mode 100644 index 4fa410b62..000000000 --- a/java/res/drawable-mdpi/sym_bkeyboard_numalt.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_bkeyboard_numpound.png b/java/res/drawable-mdpi/sym_bkeyboard_numpound.png Binary files differdeleted file mode 100644 index 9126eed0d..000000000 --- a/java/res/drawable-mdpi/sym_bkeyboard_numpound.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_bkeyboard_numstar.png b/java/res/drawable-mdpi/sym_bkeyboard_numstar.png Binary files differdeleted file mode 100644 index 9b9f1b986..000000000 --- a/java/res/drawable-mdpi/sym_bkeyboard_numstar.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_bkeyboard_voice_off.png b/java/res/drawable-mdpi/sym_bkeyboard_voice_off.png Binary files differnew file mode 100644 index 000000000..081a13096 --- /dev/null +++ b/java/res/drawable-mdpi/sym_bkeyboard_voice_off.png diff --git a/java/res/drawable-mdpi/sym_keyboard_delete_holo.png b/java/res/drawable-mdpi/sym_keyboard_delete_holo.png Binary files differnew file mode 100644 index 000000000..f8f6e6a80 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_delete_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_done.png b/java/res/drawable-mdpi/sym_keyboard_done.png Binary files differdeleted file mode 100644 index c0d6d1394..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_done.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_feedback_done.png b/java/res/drawable-mdpi/sym_keyboard_feedback_done.png Binary files differdeleted file mode 100644 index 0d7ebd4e5..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_feedback_done.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png b/java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png Binary files differdeleted file mode 100644 index 494524a66..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_num0_holo.png b/java/res/drawable-mdpi/sym_keyboard_num0_holo.png Binary files differnew file mode 100644 index 000000000..2c57adf8b --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num0_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num1_holo.png b/java/res/drawable-mdpi/sym_keyboard_num1_holo.png Binary files differnew file mode 100644 index 000000000..509e28f9b --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num1_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num2_holo.png b/java/res/drawable-mdpi/sym_keyboard_num2_holo.png Binary files differnew file mode 100644 index 000000000..0da18e772 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num2_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num3_holo.png b/java/res/drawable-mdpi/sym_keyboard_num3_holo.png Binary files differnew file mode 100644 index 000000000..e8470586f --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num3_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num4_holo.png b/java/res/drawable-mdpi/sym_keyboard_num4_holo.png Binary files differnew file mode 100644 index 000000000..13c216d3a --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num4_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num5_holo.png b/java/res/drawable-mdpi/sym_keyboard_num5_holo.png Binary files differnew file mode 100644 index 000000000..0065153fc --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num5_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num6_holo.png b/java/res/drawable-mdpi/sym_keyboard_num6_holo.png Binary files differnew file mode 100644 index 000000000..09fab76a1 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num6_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num7_holo.png b/java/res/drawable-mdpi/sym_keyboard_num7_holo.png Binary files differnew file mode 100644 index 000000000..d350fddc8 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num7_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num8_holo.png b/java/res/drawable-mdpi/sym_keyboard_num8_holo.png Binary files differnew file mode 100644 index 000000000..c40cb89a5 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num8_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_num9_holo.png b/java/res/drawable-mdpi/sym_keyboard_num9_holo.png Binary files differnew file mode 100644 index 000000000..73526939d --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_num9_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_numalt.png b/java/res/drawable-mdpi/sym_keyboard_numalt.png Binary files differdeleted file mode 100644 index 32a2cf3ca..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_numalt.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_numpound.png b/java/res/drawable-mdpi/sym_keyboard_numpound.png Binary files differdeleted file mode 100644 index b2419d9ab..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_numpound.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_numstar.png b/java/res/drawable-mdpi/sym_keyboard_numstar.png Binary files differdeleted file mode 100644 index cb66f968f..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_numstar.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_return_holo.png b/java/res/drawable-mdpi/sym_keyboard_return_holo.png Binary files differnew file mode 100644 index 000000000..abbce5234 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_return_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_settings_holo.png b/java/res/drawable-mdpi/sym_keyboard_settings_holo.png Binary files differnew file mode 100644 index 000000000..82df90376 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_settings_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_holo.png b/java/res/drawable-mdpi/sym_keyboard_shift_holo.png Binary files differnew file mode 100644 index 000000000..49b9fc088 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_shift_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_lock.png b/java/res/drawable-mdpi/sym_keyboard_shift_lock.png Binary files differdeleted file mode 100644 index 244179c2d..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_shift_lock.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-mdpi/sym_keyboard_shift_locked_holo.png Binary files differnew file mode 100644 index 000000000..5375beb4e --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_shift_locked_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_space_holo.png b/java/res/drawable-mdpi/sym_keyboard_space_holo.png Binary files differnew file mode 100644 index 000000000..e413ddf2e --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_space_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_tab_holo.png b/java/res/drawable-mdpi/sym_keyboard_tab_holo.png Binary files differnew file mode 100644 index 000000000..c41af7b89 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_tab_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_holo.png b/java/res/drawable-mdpi/sym_keyboard_voice_holo.png Binary files differnew file mode 100644 index 000000000..158439a9f --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_voice_holo.png diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-mdpi/sym_keyboard_voice_off_holo.png Binary files differnew file mode 100644 index 000000000..79026f1ab --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_voice_off_holo.png diff --git a/java/res/drawable-mdpi/voice_ime_background.9.png b/java/res/drawable-mdpi/voice_ime_background.9.png Binary files differdeleted file mode 100644 index 9b15bc25f..000000000 --- a/java/res/drawable-mdpi/voice_ime_background.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/voice_swipe_hint.png b/java/res/drawable-mdpi/voice_swipe_hint.png Binary files differdeleted file mode 100644 index bb8873251..000000000 --- a/java/res/drawable-mdpi/voice_swipe_hint.png +++ /dev/null diff --git a/java/res/drawable-mdpi/vs_dialog_blue.9.png b/java/res/drawable-mdpi/vs_dialog_blue.9.png Binary files differnew file mode 100644 index 000000000..cf27e8f43 --- /dev/null +++ b/java/res/drawable-mdpi/vs_dialog_blue.9.png diff --git a/java/res/drawable-mdpi/vs_dialog_red.9.png b/java/res/drawable-mdpi/vs_dialog_red.9.png Binary files differnew file mode 100644 index 000000000..6c08d5a30 --- /dev/null +++ b/java/res/drawable-mdpi/vs_dialog_red.9.png diff --git a/java/res/drawable-mdpi/vs_dialog_yellow.9.png b/java/res/drawable-mdpi/vs_dialog_yellow.9.png Binary files differnew file mode 100644 index 000000000..2fb06c263 --- /dev/null +++ b/java/res/drawable-mdpi/vs_dialog_yellow.9.png diff --git a/java/res/drawable-mdpi/vs_popup_mic_edge.png b/java/res/drawable-mdpi/vs_popup_mic_edge.png Binary files differnew file mode 100644 index 000000000..4ff6337a2 --- /dev/null +++ b/java/res/drawable-mdpi/vs_popup_mic_edge.png diff --git a/java/res/drawable-mdpi/working.png b/java/res/drawable-mdpi/working.png Binary files differdeleted file mode 100644 index 4a930c52d..000000000 --- a/java/res/drawable-mdpi/working.png +++ /dev/null diff --git a/java/res/drawable-sw600dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw600dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png Binary files differnew file mode 100644 index 000000000..544ed7f78 --- /dev/null +++ b/java/res/drawable-sw600dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-sw600dp-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-hdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..2ffc6ea2b --- /dev/null +++ b/java/res/drawable-sw600dp-hdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw600dp-hdpi/sym_keyboard_numsymbol_holo.png b/java/res/drawable-sw600dp-hdpi/sym_keyboard_numsymbol_holo.png Binary files differnew file mode 100644 index 000000000..398eaea12 --- /dev/null +++ b/java/res/drawable-sw600dp-hdpi/sym_keyboard_numsymbol_holo.png diff --git a/java/res/drawable-sw600dp-hdpi/sym_keyboard_tab_holo.png b/java/res/drawable-sw600dp-hdpi/sym_keyboard_tab_holo.png Binary files differnew file mode 100644 index 000000000..1780f682b --- /dev/null +++ b/java/res/drawable-sw600dp-hdpi/sym_keyboard_tab_holo.png diff --git a/java/res/drawable-sw600dp-land-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-land-hdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..2ffc6ea2b --- /dev/null +++ b/java/res/drawable-sw600dp-land-hdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw600dp-land-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-land-mdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..f5d15b728 --- /dev/null +++ b/java/res/drawable-sw600dp-land-mdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw600dp-land-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-land-xhdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..bc37fa844 --- /dev/null +++ b/java/res/drawable-sw600dp-land-xhdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png Binary files differnew file mode 100644 index 000000000..2ad73041e --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png Binary files differnew file mode 100644 index 000000000..fc21e79c4 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png Binary files differnew file mode 100644 index 000000000..76cfbb221 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png Binary files differnew file mode 100644 index 000000000..73748c2fb --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png Binary files differnew file mode 100644 index 000000000..059d4ac2e --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png Binary files differnew file mode 100644 index 000000000..e5cfdec88 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_normal_holo.9.png Binary files differnew file mode 100644 index 000000000..060524a53 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_normal_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png Binary files differnew file mode 100644 index 000000000..f4b061e07 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png Binary files differnew file mode 100644 index 000000000..ffa7386df --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-mdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..f5d15b728 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_background_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_background_holo.9.png Binary files differnew file mode 100644 index 000000000..a93966c92 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/keyboard_background_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_popup_panel_background_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_popup_panel_background_holo.9.png Binary files differnew file mode 100644 index 000000000..7be7ab7e2 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/keyboard_popup_panel_background_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-sw600dp-mdpi/keyboard_suggest_strip_holo.9.png Binary files differnew file mode 100644 index 000000000..1f87a68e9 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/keyboard_suggest_strip_holo.9.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_holo.png Binary files differnew file mode 100644 index 000000000..155579169 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_delete_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num0_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num0_holo.png Binary files differnew file mode 100644 index 000000000..e1d395b45 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num0_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num1_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num1_holo.png Binary files differnew file mode 100644 index 000000000..225436ac2 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num1_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num2_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num2_holo.png Binary files differnew file mode 100644 index 000000000..e513fa4a0 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num2_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num3_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num3_holo.png Binary files differnew file mode 100644 index 000000000..b91e005fc --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num3_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num4_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num4_holo.png Binary files differnew file mode 100644 index 000000000..65f88245b --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num4_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num5_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num5_holo.png Binary files differnew file mode 100644 index 000000000..b89ef07eb --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num5_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num6_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num6_holo.png Binary files differnew file mode 100644 index 000000000..931275a9e --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num6_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num7_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num7_holo.png Binary files differnew file mode 100644 index 000000000..9396c4c8f --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num7_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num8_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num8_holo.png Binary files differnew file mode 100644 index 000000000..12e3eef45 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num8_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_num9_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num9_holo.png Binary files differnew file mode 100644 index 000000000..6911c2b4f --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_num9_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbpound_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbpound_holo.png Binary files differnew file mode 100644 index 000000000..e3a8b4900 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbpound_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbstar_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbstar_holo.png Binary files differnew file mode 100644 index 000000000..e80e9345f --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numbstar_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_numsymbol_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numsymbol_holo.png Binary files differnew file mode 100644 index 000000000..73153849c --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_numsymbol_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_return_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_return_holo.png Binary files differnew file mode 100644 index 000000000..d519ccecf --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_return_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_settings_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_settings_holo.png Binary files differnew file mode 100644 index 000000000..784a45054 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_settings_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_holo.png Binary files differnew file mode 100644 index 000000000..91d6e32f9 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_locked_holo.png Binary files differnew file mode 100644 index 000000000..2bd053656 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_shift_locked_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_space_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_space_holo.png Binary files differnew file mode 100644 index 000000000..25e655d96 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_space_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_tab_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_tab_holo.png Binary files differnew file mode 100644 index 000000000..5acd12cc4 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_tab_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_holo.png Binary files differnew file mode 100644 index 000000000..c1116dc17 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_holo.png diff --git a/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_off_holo.png Binary files differnew file mode 100644 index 000000000..081a13096 --- /dev/null +++ b/java/res/drawable-sw600dp-mdpi/sym_keyboard_voice_off_holo.png diff --git a/java/res/drawable-sw600dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw600dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png Binary files differnew file mode 100644 index 000000000..8b5d1b098 --- /dev/null +++ b/java/res/drawable-sw600dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-sw600dp-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw600dp-xhdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..bc37fa844 --- /dev/null +++ b/java/res/drawable-sw600dp-xhdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw600dp-xhdpi/sym_keyboard_numsymbol_holo.png b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_numsymbol_holo.png Binary files differnew file mode 100644 index 000000000..c7a8b286a --- /dev/null +++ b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_numsymbol_holo.png diff --git a/java/res/drawable-sw600dp-xhdpi/sym_keyboard_tab_holo.png b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_tab_holo.png Binary files differnew file mode 100644 index 000000000..fd9f8cce6 --- /dev/null +++ b/java/res/drawable-sw600dp-xhdpi/sym_keyboard_tab_holo.png diff --git a/java/res/drawable-sw768dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw768dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png Binary files differnew file mode 100644 index 000000000..544ed7f78 --- /dev/null +++ b/java/res/drawable-sw768dp-hdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-sw768dp-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-hdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..2ffc6ea2b --- /dev/null +++ b/java/res/drawable-sw768dp-hdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw768dp-land-hdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-land-hdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..2b93014e1 --- /dev/null +++ b/java/res/drawable-sw768dp-land-hdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw768dp-land-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-land-mdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..c409cea00 --- /dev/null +++ b/java/res/drawable-sw768dp-land-mdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw768dp-land-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-land-xhdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..3cd20d34f --- /dev/null +++ b/java/res/drawable-sw768dp-land-xhdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png Binary files differnew file mode 100644 index 000000000..2ad73041e --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png Binary files differnew file mode 100644 index 000000000..fc21e79c4 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png Binary files differnew file mode 100644 index 000000000..76cfbb221 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_normal_on_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png Binary files differnew file mode 100644 index 000000000..73748c2fb --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png Binary files differnew file mode 100644 index 000000000..059d4ac2e --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_off_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png Binary files differnew file mode 100644 index 000000000..e5cfdec88 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_dark_pressed_on_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_normal_holo.9.png Binary files differnew file mode 100644 index 000000000..060524a53 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_normal_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png Binary files differnew file mode 100644 index 000000000..f4b061e07 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_light_pressed_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png Binary files differnew file mode 100644 index 000000000..ffa7386df --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-mdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..01d1139d8 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_background_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_background_holo.9.png Binary files differnew file mode 100644 index 000000000..a93966c92 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/keyboard_background_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_popup_panel_background_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_popup_panel_background_holo.9.png Binary files differnew file mode 100644 index 000000000..7be7ab7e2 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/keyboard_popup_panel_background_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-sw768dp-mdpi/keyboard_suggest_strip_holo.9.png Binary files differnew file mode 100644 index 000000000..1f87a68e9 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/keyboard_suggest_strip_holo.9.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_delete_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_delete_holo.png Binary files differnew file mode 100644 index 000000000..155579169 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_delete_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num0_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num0_holo.png Binary files differnew file mode 100644 index 000000000..e1d395b45 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num0_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num1_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num1_holo.png Binary files differnew file mode 100644 index 000000000..225436ac2 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num1_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num2_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num2_holo.png Binary files differnew file mode 100644 index 000000000..e513fa4a0 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num2_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num3_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num3_holo.png Binary files differnew file mode 100644 index 000000000..b91e005fc --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num3_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num4_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num4_holo.png Binary files differnew file mode 100644 index 000000000..65f88245b --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num4_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num5_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num5_holo.png Binary files differnew file mode 100644 index 000000000..b89ef07eb --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num5_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num6_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num6_holo.png Binary files differnew file mode 100644 index 000000000..931275a9e --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num6_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num7_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num7_holo.png Binary files differnew file mode 100644 index 000000000..9396c4c8f --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num7_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num8_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num8_holo.png Binary files differnew file mode 100644 index 000000000..12e3eef45 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num8_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_num9_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num9_holo.png Binary files differnew file mode 100644 index 000000000..6911c2b4f --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_num9_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbpound_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbpound_holo.png Binary files differnew file mode 100644 index 000000000..e3a8b4900 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbpound_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbstar_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbstar_holo.png Binary files differnew file mode 100644 index 000000000..e80e9345f --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_numbstar_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_return_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_return_holo.png Binary files differnew file mode 100644 index 000000000..d519ccecf --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_return_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_settings_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_settings_holo.png Binary files differnew file mode 100644 index 000000000..784a45054 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_settings_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_holo.png Binary files differnew file mode 100644 index 000000000..91d6e32f9 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_locked_holo.png Binary files differnew file mode 100644 index 000000000..2bd053656 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_shift_locked_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_space_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_space_holo.png Binary files differnew file mode 100644 index 000000000..25e655d96 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_space_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_holo.png Binary files differnew file mode 100644 index 000000000..c1116dc17 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_holo.png diff --git a/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_off_holo.png Binary files differnew file mode 100644 index 000000000..081a13096 --- /dev/null +++ b/java/res/drawable-sw768dp-mdpi/sym_keyboard_voice_off_holo.png diff --git a/java/res/drawable-sw768dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-sw768dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png Binary files differnew file mode 100644 index 000000000..8b5d1b098 --- /dev/null +++ b/java/res/drawable-sw768dp-xhdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-sw768dp-xhdpi/hint_popup_holo.9.png b/java/res/drawable-sw768dp-xhdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..bc37fa844 --- /dev/null +++ b/java/res/drawable-sw768dp-xhdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_candidate_pressed.9.png b/java/res/drawable-xhdpi/btn_candidate_pressed.9.png Binary files differnew file mode 100644 index 000000000..41e126a73 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_candidate_pressed.9.png diff --git a/java/res/drawable-xhdpi/btn_center_default.9.png b/java/res/drawable-xhdpi/btn_center_default.9.png Binary files differnew file mode 100644 index 000000000..e847425f8 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_center_default.9.png diff --git a/java/res/drawable-xhdpi/btn_center_pressed.9.png b/java/res/drawable-xhdpi/btn_center_pressed.9.png Binary files differnew file mode 100644 index 000000000..facfd4323 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_center_pressed.9.png diff --git a/java/res/drawable-xhdpi/btn_center_selected.9.png b/java/res/drawable-xhdpi/btn_center_selected.9.png Binary files differnew file mode 100644 index 000000000..facfd4323 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_center_selected.9.png diff --git a/java/res/drawable-xhdpi/btn_close_candidates_pane.9.png b/java/res/drawable-xhdpi/btn_close_candidates_pane.9.png Binary files differnew file mode 100644 index 000000000..9d797ed0d --- /dev/null +++ b/java/res/drawable-xhdpi/btn_close_candidates_pane.9.png diff --git a/java/res/drawable-xhdpi/btn_expand_candidates_pane.9.png b/java/res/drawable-xhdpi/btn_expand_candidates_pane.9.png Binary files differnew file mode 100644 index 000000000..88d01c9c8 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_expand_candidates_pane.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png Binary files differnew file mode 100644 index 000000000..eae1e3a54 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png Binary files differnew file mode 100644 index 000000000..b9667be13 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png Binary files differnew file mode 100644 index 000000000..13bad8f1a --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png Binary files differnew file mode 100644 index 000000000..1719992e1 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png Binary files differnew file mode 100644 index 000000000..853b8bc6e --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_holo.9.png Binary files differnew file mode 100644 index 000000000..0eb9c9f93 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png Binary files differnew file mode 100644 index 000000000..1edfd64fe --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_holo.9.png Binary files differnew file mode 100644 index 000000000..5114bf5f1 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png Binary files differnew file mode 100644 index 000000000..dfdbfadd3 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_holo.9.png Binary files differnew file mode 100644 index 000000000..992395039 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png Binary files differnew file mode 100644 index 000000000..0e2733e17 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_holo.9.png Binary files differnew file mode 100644 index 000000000..474951c1d --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png Binary files differnew file mode 100644 index 000000000..f7e32f764 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png Binary files differnew file mode 100644 index 000000000..00c447604 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png Binary files differnew file mode 100644 index 000000000..ea13a7fdf --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png Binary files differnew file mode 100644 index 000000000..4a255f7fb --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png Binary files differnew file mode 100644 index 000000000..2ed1b3447 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png Binary files differnew file mode 100644 index 000000000..057c5716e --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png Binary files differnew file mode 100644 index 000000000..5d8e46de0 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_holo.9.png Binary files differnew file mode 100644 index 000000000..5bcd1c9c2 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal.9.png Binary files differnew file mode 100644 index 000000000..f53b40419 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png Binary files differnew file mode 100644 index 000000000..3c6ae6be8 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_stone.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_stone.9.png Binary files differnew file mode 100644 index 000000000..eebe7d391 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_stone.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png Binary files differnew file mode 100644 index 000000000..655bfb2c6 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_stone.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_stone.9.png Binary files differnew file mode 100644 index 000000000..336248aae --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_stone.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_stone.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_stone.9.png Binary files differnew file mode 100644 index 000000000..bb1c72bb3 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_stone.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_popup_background_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_popup_background_holo.9.png Binary files differnew file mode 100644 index 000000000..10d788dfb --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_popup_background_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_holo.9.png Binary files differnew file mode 100644 index 000000000..0a9a9e44d --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_popup_selected_holo.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png Binary files differnew file mode 100644 index 000000000..f73911674 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png Binary files differnew file mode 100644 index 000000000..34a948f4e --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png Binary files differnew file mode 100644 index 000000000..520f12d3f --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png diff --git a/java/res/drawable-xhdpi/candidate_feedback_background.9.png b/java/res/drawable-xhdpi/candidate_feedback_background.9.png Binary files differnew file mode 100644 index 000000000..0ec90e5ea --- /dev/null +++ b/java/res/drawable-xhdpi/candidate_feedback_background.9.png diff --git a/java/res/drawable-xhdpi/caution.png b/java/res/drawable-xhdpi/caution.png Binary files differnew file mode 100644 index 000000000..cfc3f7547 --- /dev/null +++ b/java/res/drawable-xhdpi/caution.png diff --git a/java/res/drawable-xhdpi/hint_popup.9.png b/java/res/drawable-xhdpi/hint_popup.9.png Binary files differnew file mode 100644 index 000000000..add474337 --- /dev/null +++ b/java/res/drawable-xhdpi/hint_popup.9.png diff --git a/java/res/drawable-xhdpi/hint_popup_holo.9.png b/java/res/drawable-xhdpi/hint_popup_holo.9.png Binary files differnew file mode 100644 index 000000000..a2b114e14 --- /dev/null +++ b/java/res/drawable-xhdpi/hint_popup_holo.9.png diff --git a/java/res/drawable-xhdpi/ic_dialog_keyboard.png b/java/res/drawable-xhdpi/ic_dialog_keyboard.png Binary files differnew file mode 100644 index 000000000..f114c93b6 --- /dev/null +++ b/java/res/drawable-xhdpi/ic_dialog_keyboard.png diff --git a/java/res/drawable-xhdpi/ic_mic_dialog.png b/java/res/drawable-xhdpi/ic_mic_dialog.png Binary files differnew file mode 100644 index 000000000..5d6399c0a --- /dev/null +++ b/java/res/drawable-xhdpi/ic_mic_dialog.png diff --git a/java/res/drawable-xhdpi/ic_subtype_keyboard.png b/java/res/drawable-xhdpi/ic_subtype_keyboard.png Binary files differnew file mode 100644 index 000000000..a79bb3458 --- /dev/null +++ b/java/res/drawable-xhdpi/ic_subtype_keyboard.png diff --git a/java/res/drawable-xhdpi/ic_subtype_mic.png b/java/res/drawable-xhdpi/ic_subtype_mic.png Binary files differnew file mode 100644 index 000000000..fc8d18cc2 --- /dev/null +++ b/java/res/drawable-xhdpi/ic_subtype_mic.png diff --git a/java/res/drawable-xhdpi/ic_suggest_strip_microphone.png b/java/res/drawable-xhdpi/ic_suggest_strip_microphone.png Binary files differnew file mode 100644 index 000000000..d65d28708 --- /dev/null +++ b/java/res/drawable-xhdpi/ic_suggest_strip_microphone.png diff --git a/java/res/drawable-xhdpi/ic_suggest_strip_microphone_swipe.png b/java/res/drawable-xhdpi/ic_suggest_strip_microphone_swipe.png Binary files differnew file mode 100644 index 000000000..889378a6a --- /dev/null +++ b/java/res/drawable-xhdpi/ic_suggest_strip_microphone_swipe.png diff --git a/java/res/drawable-xhdpi/keyboard_background.9.png b/java/res/drawable-xhdpi/keyboard_background.9.png Binary files differnew file mode 100644 index 000000000..263996322 --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_background.9.png diff --git a/java/res/drawable-xhdpi/keyboard_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_background_holo.9.png Binary files differnew file mode 100644 index 000000000..58d15142b --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_background_holo.9.png diff --git a/java/res/drawable-xhdpi/keyboard_dark_background.9.png b/java/res/drawable-xhdpi/keyboard_dark_background.9.png Binary files differnew file mode 100644 index 000000000..27b7a108c --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_dark_background.9.png diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_background.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_background.9.png Binary files differnew file mode 100644 index 000000000..16c76106c --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_background.9.png diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_background_holo.9.png Binary files differnew file mode 100644 index 000000000..44675ba00 --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_background_holo.9.png diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_left_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_left_background_holo.9.png Binary files differnew file mode 100644 index 000000000..cfd1f5242 --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_left_background_holo.9.png diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_left_more_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_left_more_background_holo.9.png Binary files differnew file mode 100644 index 000000000..a01c1733d --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_left_more_background_holo.9.png diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_more_background.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background.9.png Binary files differnew file mode 100644 index 000000000..e020e34b1 --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background.9.png diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_holo.9.png Binary files differnew file mode 100644 index 000000000..1d2abc26b --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_holo.9.png diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_right_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_right_background_holo.9.png Binary files differnew file mode 100644 index 000000000..5616d1988 --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_right_background_holo.9.png diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_right_more_background_holo.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_right_more_background_holo.9.png Binary files differnew file mode 100644 index 000000000..ecf9c2cbc --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_right_more_background_holo.9.png diff --git a/java/res/drawable-xhdpi/keyboard_popup_panel_background.9.png b/java/res/drawable-xhdpi/keyboard_popup_panel_background.9.png Binary files differnew file mode 100644 index 000000000..79f7ab00a --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_popup_panel_background.9.png diff --git a/java/res/drawable-xhdpi/keyboard_suggest_strip.9.png b/java/res/drawable-xhdpi/keyboard_suggest_strip.9.png Binary files differnew file mode 100644 index 000000000..1b568df03 --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_suggest_strip.9.png diff --git a/java/res/drawable-xhdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-xhdpi/keyboard_suggest_strip_divider.png Binary files differnew file mode 100644 index 000000000..cd7c2c7a2 --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_suggest_strip_divider.png diff --git a/java/res/drawable-xhdpi/keyboard_suggest_strip_holo.9.png b/java/res/drawable-xhdpi/keyboard_suggest_strip_holo.9.png Binary files differnew file mode 100644 index 000000000..f4ff7dc1c --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_suggest_strip_holo.9.png diff --git a/java/res/drawable-xhdpi/mic_base.png b/java/res/drawable-xhdpi/mic_base.png Binary files differnew file mode 100644 index 000000000..5c060bec9 --- /dev/null +++ b/java/res/drawable-xhdpi/mic_base.png diff --git a/java/res/drawable-xhdpi/mic_full.png b/java/res/drawable-xhdpi/mic_full.png Binary files differnew file mode 100644 index 000000000..32ffe124e --- /dev/null +++ b/java/res/drawable-xhdpi/mic_full.png diff --git a/java/res/drawable-xhdpi/mic_slash.png b/java/res/drawable-xhdpi/mic_slash.png Binary files differnew file mode 100644 index 000000000..18b22542b --- /dev/null +++ b/java/res/drawable-xhdpi/mic_slash.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_123_mic.png b/java/res/drawable-xhdpi/sym_bkeyboard_123_mic.png Binary files differnew file mode 100644 index 000000000..0aefaa1c3 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_123_mic.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_delete.png b/java/res/drawable-xhdpi/sym_bkeyboard_delete.png Binary files differnew file mode 100644 index 000000000..b84ee76dc --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_delete.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_mic.png b/java/res/drawable-xhdpi/sym_bkeyboard_mic.png Binary files differnew file mode 100644 index 000000000..8c3f11dd4 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_mic.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_num0.png b/java/res/drawable-xhdpi/sym_bkeyboard_num0.png Binary files differnew file mode 100644 index 000000000..da8d50a8c --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_num0.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_num1.png b/java/res/drawable-xhdpi/sym_bkeyboard_num1.png Binary files differnew file mode 100644 index 000000000..62443eb1c --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_num1.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_num2.png b/java/res/drawable-xhdpi/sym_bkeyboard_num2.png Binary files differnew file mode 100644 index 000000000..4b3ef7ecc --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_num2.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_num3.png b/java/res/drawable-xhdpi/sym_bkeyboard_num3.png Binary files differnew file mode 100644 index 000000000..48315e499 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_num3.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_num4.png b/java/res/drawable-xhdpi/sym_bkeyboard_num4.png Binary files differnew file mode 100644 index 000000000..17958d7cc --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_num4.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_num5.png b/java/res/drawable-xhdpi/sym_bkeyboard_num5.png Binary files differnew file mode 100644 index 000000000..43716c424 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_num5.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_num6.png b/java/res/drawable-xhdpi/sym_bkeyboard_num6.png Binary files differnew file mode 100644 index 000000000..09f2b428d --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_num6.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_num7.png b/java/res/drawable-xhdpi/sym_bkeyboard_num7.png Binary files differnew file mode 100644 index 000000000..72438ec0f --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_num7.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_num8.png b/java/res/drawable-xhdpi/sym_bkeyboard_num8.png Binary files differnew file mode 100644 index 000000000..403b53f71 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_num8.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_num9.png b/java/res/drawable-xhdpi/sym_bkeyboard_num9.png Binary files differnew file mode 100644 index 000000000..644c2a4df --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_num9.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_return.png b/java/res/drawable-xhdpi/sym_bkeyboard_return.png Binary files differnew file mode 100644 index 000000000..1632ecd8e --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_return.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_search.png b/java/res/drawable-xhdpi/sym_bkeyboard_search.png Binary files differnew file mode 100644 index 000000000..69d8b22d1 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_search.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_settings.png b/java/res/drawable-xhdpi/sym_bkeyboard_settings.png Binary files differnew file mode 100644 index 000000000..050154a3a --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_settings.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_shift.png b/java/res/drawable-xhdpi/sym_bkeyboard_shift.png Binary files differnew file mode 100644 index 000000000..d15d11a50 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_shift.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_shift_locked.png b/java/res/drawable-xhdpi/sym_bkeyboard_shift_locked.png Binary files differnew file mode 100644 index 000000000..83b287fea --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_shift_locked.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_space.png b/java/res/drawable-xhdpi/sym_bkeyboard_space.png Binary files differnew file mode 100644 index 000000000..5ca62c7b7 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_space.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_tab.png b/java/res/drawable-xhdpi/sym_bkeyboard_tab.png Binary files differnew file mode 100644 index 000000000..6ca199755 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_tab.png diff --git a/java/res/drawable-xhdpi/sym_bkeyboard_voice_off.png b/java/res/drawable-xhdpi/sym_bkeyboard_voice_off.png Binary files differnew file mode 100644 index 000000000..fc6a4eb59 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_bkeyboard_voice_off.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_123_mic.png b/java/res/drawable-xhdpi/sym_keyboard_123_mic.png Binary files differnew file mode 100644 index 000000000..bcb097967 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_123_mic.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_delete.png b/java/res/drawable-xhdpi/sym_keyboard_delete.png Binary files differnew file mode 100644 index 000000000..3c0b8b186 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_delete.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_delete_holo.png b/java/res/drawable-xhdpi/sym_keyboard_delete_holo.png Binary files differnew file mode 100644 index 000000000..5150073b8 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_delete_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_123_mic.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_123_mic.png Binary files differnew file mode 100644 index 000000000..5238c16d2 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_123_mic.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_delete.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_delete.png Binary files differnew file mode 100644 index 000000000..f0c29e7c8 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_delete.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_language_arrows_left.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_language_arrows_left.png Binary files differnew file mode 100644 index 000000000..a90b8dacf --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_language_arrows_left.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_language_arrows_right.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_language_arrows_right.png Binary files differnew file mode 100644 index 000000000..1123bf36e --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_language_arrows_right.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_mic.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_mic.png Binary files differnew file mode 100644 index 000000000..5ac27ebad --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_mic.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_numalt.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_numalt.png Binary files differnew file mode 100644 index 000000000..b68e6066a --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_numalt.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_return.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_return.png Binary files differnew file mode 100644 index 000000000..c777d00d6 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_return.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_search.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_search.png Binary files differnew file mode 100644 index 000000000..32e0789dd --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_search.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_settings.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_settings.png Binary files differnew file mode 100644 index 000000000..021cafacb --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_settings.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_shift.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_shift.png Binary files differnew file mode 100644 index 000000000..d8c0325c4 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_shift.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_space.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_space.png Binary files differnew file mode 100644 index 000000000..cee10568d --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_space.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_tab.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_tab.png Binary files differnew file mode 100644 index 000000000..0650e01cb --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_tab.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_language_arrows_left.png b/java/res/drawable-xhdpi/sym_keyboard_language_arrows_left.png Binary files differnew file mode 100644 index 000000000..226f2e617 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_language_arrows_left.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_language_arrows_right.png b/java/res/drawable-xhdpi/sym_keyboard_language_arrows_right.png Binary files differnew file mode 100644 index 000000000..1e02e7e46 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_language_arrows_right.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_mic.png b/java/res/drawable-xhdpi/sym_keyboard_mic.png Binary files differnew file mode 100644 index 000000000..1323b6d1e --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_mic.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num0.png b/java/res/drawable-xhdpi/sym_keyboard_num0.png Binary files differnew file mode 100644 index 000000000..06bd3bfc7 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num0.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num0_holo.png b/java/res/drawable-xhdpi/sym_keyboard_num0_holo.png Binary files differnew file mode 100644 index 000000000..33e80bdc3 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num0_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num1.png b/java/res/drawable-xhdpi/sym_keyboard_num1.png Binary files differnew file mode 100644 index 000000000..dfa0cfe78 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num1.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num1_holo.png b/java/res/drawable-xhdpi/sym_keyboard_num1_holo.png Binary files differnew file mode 100644 index 000000000..dce3ee801 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num1_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num2.png b/java/res/drawable-xhdpi/sym_keyboard_num2.png Binary files differnew file mode 100644 index 000000000..4bd2ead08 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num2.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num2_holo.png b/java/res/drawable-xhdpi/sym_keyboard_num2_holo.png Binary files differnew file mode 100644 index 000000000..e776efb33 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num2_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num3.png b/java/res/drawable-xhdpi/sym_keyboard_num3.png Binary files differnew file mode 100644 index 000000000..39db11228 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num3.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num3_holo.png b/java/res/drawable-xhdpi/sym_keyboard_num3_holo.png Binary files differnew file mode 100644 index 000000000..66e7b3735 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num3_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num4.png b/java/res/drawable-xhdpi/sym_keyboard_num4.png Binary files differnew file mode 100644 index 000000000..60356947e --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num4.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num4_holo.png b/java/res/drawable-xhdpi/sym_keyboard_num4_holo.png Binary files differnew file mode 100644 index 000000000..bf70e2890 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num4_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num5.png b/java/res/drawable-xhdpi/sym_keyboard_num5.png Binary files differnew file mode 100644 index 000000000..3238b3f40 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num5.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num5_holo.png b/java/res/drawable-xhdpi/sym_keyboard_num5_holo.png Binary files differnew file mode 100644 index 000000000..98d0b5cc9 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num5_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num6.png b/java/res/drawable-xhdpi/sym_keyboard_num6.png Binary files differnew file mode 100644 index 000000000..c8da5a9d0 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num6.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num6_holo.png b/java/res/drawable-xhdpi/sym_keyboard_num6_holo.png Binary files differnew file mode 100644 index 000000000..67340ef6a --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num6_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num7.png b/java/res/drawable-xhdpi/sym_keyboard_num7.png Binary files differnew file mode 100644 index 000000000..553cf5f0d --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num7.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num7_holo.png b/java/res/drawable-xhdpi/sym_keyboard_num7_holo.png Binary files differnew file mode 100644 index 000000000..843224954 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num7_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num8.png b/java/res/drawable-xhdpi/sym_keyboard_num8.png Binary files differnew file mode 100644 index 000000000..eaaf53390 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num8.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num8_holo.png b/java/res/drawable-xhdpi/sym_keyboard_num8_holo.png Binary files differnew file mode 100644 index 000000000..6d520bca9 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num8_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num9.png b/java/res/drawable-xhdpi/sym_keyboard_num9.png Binary files differnew file mode 100644 index 000000000..b510d3774 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num9.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_num9_holo.png b/java/res/drawable-xhdpi/sym_keyboard_num9_holo.png Binary files differnew file mode 100644 index 000000000..158c87957 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_num9_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_return.png b/java/res/drawable-xhdpi/sym_keyboard_return.png Binary files differnew file mode 100644 index 000000000..ad061227e --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_return.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_return_holo.png b/java/res/drawable-xhdpi/sym_keyboard_return_holo.png Binary files differnew file mode 100644 index 000000000..6e2e1c0b9 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_return_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_search.png b/java/res/drawable-xhdpi/sym_keyboard_search.png Binary files differnew file mode 100644 index 000000000..aa785a221 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_search.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_settings.png b/java/res/drawable-xhdpi/sym_keyboard_settings.png Binary files differnew file mode 100644 index 000000000..50704255d --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_settings.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_settings_holo.png b/java/res/drawable-xhdpi/sym_keyboard_settings_holo.png Binary files differnew file mode 100644 index 000000000..018e45d9e --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_settings_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_shift.png b/java/res/drawable-xhdpi/sym_keyboard_shift.png Binary files differnew file mode 100644 index 000000000..290170619 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_shift.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_shift_holo.png b/java/res/drawable-xhdpi/sym_keyboard_shift_holo.png Binary files differnew file mode 100644 index 000000000..41d4ca176 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_shift_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_shift_locked.png b/java/res/drawable-xhdpi/sym_keyboard_shift_locked.png Binary files differnew file mode 100644 index 000000000..a5deb60e9 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_shift_locked.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_shift_locked_holo.png b/java/res/drawable-xhdpi/sym_keyboard_shift_locked_holo.png Binary files differnew file mode 100644 index 000000000..b811b7464 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_shift_locked_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_space.png b/java/res/drawable-xhdpi/sym_keyboard_space.png Binary files differnew file mode 100644 index 000000000..66fc3e9d3 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_space.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_space_holo.png b/java/res/drawable-xhdpi/sym_keyboard_space_holo.png Binary files differnew file mode 100644 index 000000000..da8926496 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_space_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_space_led.9.png b/java/res/drawable-xhdpi/sym_keyboard_space_led.9.png Binary files differnew file mode 100644 index 000000000..6525fefab --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_space_led.9.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_tab.png b/java/res/drawable-xhdpi/sym_keyboard_tab.png Binary files differnew file mode 100644 index 000000000..0ef2ab5b9 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_tab.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_tab_holo.png b/java/res/drawable-xhdpi/sym_keyboard_tab_holo.png Binary files differnew file mode 100644 index 000000000..dd207ca3f --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_tab_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_voice_holo.png b/java/res/drawable-xhdpi/sym_keyboard_voice_holo.png Binary files differnew file mode 100644 index 000000000..d73e49910 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_voice_holo.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_voice_off_holo.png b/java/res/drawable-xhdpi/sym_keyboard_voice_off_holo.png Binary files differnew file mode 100644 index 000000000..8d34a5ada --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_voice_off_holo.png diff --git a/java/res/drawable-xhdpi/vs_dialog_blue.9.png b/java/res/drawable-xhdpi/vs_dialog_blue.9.png Binary files differnew file mode 100644 index 000000000..3284d78ef --- /dev/null +++ b/java/res/drawable-xhdpi/vs_dialog_blue.9.png diff --git a/java/res/drawable-xhdpi/vs_dialog_red.9.png b/java/res/drawable-xhdpi/vs_dialog_red.9.png Binary files differnew file mode 100644 index 000000000..5af2465b5 --- /dev/null +++ b/java/res/drawable-xhdpi/vs_dialog_red.9.png diff --git a/java/res/drawable-xhdpi/vs_dialog_yellow.9.png b/java/res/drawable-xhdpi/vs_dialog_yellow.9.png Binary files differnew file mode 100644 index 000000000..4f50439de --- /dev/null +++ b/java/res/drawable-xhdpi/vs_dialog_yellow.9.png diff --git a/java/res/drawable-xhdpi/vs_popup_mic_edge.png b/java/res/drawable-xhdpi/vs_popup_mic_edge.png Binary files differnew file mode 100644 index 000000000..1063cb464 --- /dev/null +++ b/java/res/drawable-xhdpi/vs_popup_mic_edge.png diff --git a/java/res/drawable/background_voice.xml b/java/res/drawable/background_voice.xml new file mode 100644 index 000000000..3b6137df3 --- /dev/null +++ b/java/res/drawable/background_voice.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <gradient + android:startColor="#ff000000" + android:endColor="#ff000e29" + android:angle="90" /> +</shape>
\ No newline at end of file diff --git a/java/res/anim/key_preview_fadein.xml b/java/res/drawable/btn_candidate.xml index 9fad7b9a7..efcee9f54 100644 --- a/java/res/anim/key_preview_fadein.xml +++ b/java/res/drawable/btn_candidate.xml @@ -18,12 +18,10 @@ */ --> -<set +<selector xmlns:android="http://schemas.android.com/apk/res/android" - android:interpolator="@android:anim/decelerate_interpolator" > - <alpha - android:fromAlpha="0.5" - android:toAlpha="1.0" - android:duration="@integer/config_preview_fadein_anim_time" /> -</set> + <item + android:state_pressed="true" + android:drawable="@drawable/btn_candidate_pressed" /> +</selector> diff --git a/java/res/drawable/btn_candidate_ics.xml b/java/res/drawable/btn_candidate_ics.xml new file mode 100644 index 000000000..e4257e327 --- /dev/null +++ b/java/res/drawable/btn_candidate_ics.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<selector + xmlns:android="http://schemas.android.com/apk/res/android" +> + <item + android:state_pressed="true" + android:drawable="@drawable/btn_keyboard_key_popup_selected_holo" /> +</selector> diff --git a/java/res/drawable/btn_center.xml b/java/res/drawable/btn_center.xml new file mode 100644 index 000000000..9998b56e2 --- /dev/null +++ b/java/res/drawable/btn_center.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<selector + xmlns:android="http://schemas.android.com/apk/res/android" + android:exitFadeDuration="@android:integer/config_mediumAnimTime"> + <item + android:state_window_focused="false" + android:state_enabled="true" + android:drawable="@drawable/btn_center_default" /> + <item + android:state_pressed="true" + android:drawable="@drawable/btn_center_pressed" /> + <item + android:state_focused="true" + android:state_enabled="true" + android:drawable="@drawable/btn_center_selected" /> + <item + android:state_enabled="true" + android:drawable="@drawable/btn_center_default" /> + <item + android:drawable="@drawable/btn_center_default" /> +</selector>
\ No newline at end of file diff --git a/java/res/drawable/btn_keyboard_key2.xml b/java/res/drawable/btn_keyboard_key_ics.xml index bd745b76e..7335cc299 100644 --- a/java/res/drawable/btn_keyboard_key2.xml +++ b/java/res/drawable/btn_keyboard_key_ics.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project +<!-- Copyright (C) 2011 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,21 +16,27 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- Functional keys. --> + + <item android:state_single="true" android:state_pressed="true" + android:drawable="@drawable/btn_keyboard_key_dark_pressed_holo" /> + <item android:state_single="true" + android:drawable="@drawable/btn_keyboard_key_dark_normal_holo" /> + <!-- Toggle keys. Use checkable/checked state. --> - <item android:state_checkable="true" android:state_checked="true" - android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_pressed_on" /> + <item android:state_checkable="true" android:state_checked="true" android:state_pressed="true" + android:drawable="@drawable/btn_keyboard_key_dark_pressed_on_holo" /> <item android:state_checkable="true" android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_fulltrans_pressed" /> + android:drawable="@drawable/btn_keyboard_key_dark_pressed_off_holo" /> <item android:state_checkable="true" android:state_checked="true" - android:drawable="@drawable/btn_keyboard_key_normal_on" /> + android:drawable="@drawable/btn_keyboard_key_dark_normal_on_holo" /> <item android:state_checkable="true" - android:drawable="@drawable/btn_keyboard_key_fulltrans_normal" /> + android:drawable="@drawable/btn_keyboard_key_dark_normal_off_holo" /> <!-- Normal keys --> <item android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_fulltrans_pressed" /> - <item android:drawable="@drawable/btn_keyboard_key_fulltrans_normal" /> + android:drawable="@drawable/btn_keyboard_key_light_pressed_holo" /> + <item android:drawable="@drawable/btn_keyboard_key_light_normal_holo" /> </selector> diff --git a/java/res/drawable/btn_keyboard_key_gingerbread_popup.xml b/java/res/drawable/btn_keyboard_key_popup.xml index 9b6d23beb..860cfd5d5 100644 --- a/java/res/drawable/btn_keyboard_key_gingerbread_popup.xml +++ b/java/res/drawable/btn_keyboard_key_popup.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project +<!-- Copyright (C) 2011 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/java/res/drawable/ic_suggest_scroll_background.xml b/java/res/drawable/btn_keyboard_key_popup_ics.xml index 9d246e40e..8f797ac3c 100644 --- a/java/res/drawable/ic_suggest_scroll_background.xml +++ b/java/res/drawable/btn_keyboard_key_popup_ics.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2008 The Android Open Source Project +<!-- Copyright (C) 2011 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,11 +15,7 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - - <item android:state_pressed="false" - android:drawable="@android:color/transparent" /> - <item android:state_pressed="true" - android:drawable="@drawable/highlight_pressed" /> - -</selector>
\ No newline at end of file + android:drawable="@drawable/btn_keyboard_key_popup_selected_holo" /> + <item android:drawable="@drawable/btn_keyboard_key_popup_background_holo" /> +</selector> diff --git a/java/res/drawable/btn_keyboard_key_stone.xml b/java/res/drawable/btn_keyboard_key_stone.xml index a6040a04e..27932e8da 100644 --- a/java/res/drawable/btn_keyboard_key_stone.xml +++ b/java/res/drawable/btn_keyboard_key_stone.xml @@ -16,6 +16,13 @@ <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_fulltrans_pressed" /> + <item android:state_single="true" + android:drawable="@drawable/btn_keyboard_key_normal_stone" /> + <!-- Toggle keys. Use checkable/checked state. --> <item android:state_checkable="true" android:state_checked="true" diff --git a/java/res/drawable/keyboard_key_feedback_ics.xml b/java/res/drawable/keyboard_key_feedback_ics.xml new file mode 100644 index 000000000..04c86794f --- /dev/null +++ b/java/res/drawable/keyboard_key_feedback_ics.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_long_pressable="true" + android:drawable="@drawable/keyboard_key_feedback_more_background_holo" /> + <item android:drawable="@drawable/keyboard_key_feedback_background_holo" /> +</selector> diff --git a/java/res/drawable/transparent.xml b/java/res/drawable/transparent.xml new file mode 100644 index 000000000..855cf2ad5 --- /dev/null +++ b/java/res/drawable/transparent.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<shape + xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle" +> + <solid + android:color="@android:color/transparent" /> + <size + android:width="50dp" + android:height="40dp" /> +</shape> diff --git a/java/res/layout-sw768dp/recognition_status.xml b/java/res/layout-sw768dp/recognition_status.xml new file mode 100644 index 000000000..40bc09823 --- /dev/null +++ b/java/res/layout-sw768dp/recognition_status.xml @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:background="@drawable/background_voice"> + <LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/popup_layout" + android:orientation="vertical" + android:layout_height="371dip" + android:layout_width="500dip" + android:layout_centerInParent="true" + android:background="@drawable/vs_dialog_red"> + <TextView + android:id="@+id/text" + android:text="@string/voice_error" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:singleLine="true" + android:layout_marginTop="10dip" + android:textSize="28sp" + android:textColor="#ffffff" + android:layout_gravity="center" + android:visibility="invisible"/> + <RelativeLayout + android:layout_height="0dip" + android:layout_width="match_parent" + android:layout_weight="1.0"> + <com.android.inputmethod.deprecated.voice.SoundIndicator + android:id="@+id/sound_indicator" + android:src="@drawable/mic_full" + android:background="@drawable/mic_base" + android:adjustViewBounds="true" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_centerInParent="true" + android:visibility="gone"/> + <ImageView + android:id="@+id/image" + android:src="@drawable/mic_slash" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_centerInParent="true" + android:visibility="visible"/> + <ProgressBar + android:id="@+id/progress" + android:indeterminate="true" + android:indeterminateOnly="false" + android:layout_height="60dip" + android:layout_width="60dip" + android:layout_centerInParent="true" + android:visibility="gone"/> + </RelativeLayout> + <!-- + The text is set by the code. We specify a random text (voice_error), so the + text view does not have a zero height. This is necessary to keep the slash + mic and the recording mic is the same position + --> + <TextView + android:id="@+id/language" + android:text="@string/voice_error" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:singleLine="true" + android:textSize="14sp" + android:layout_marginBottom="3dip" + android:layout_gravity="center" + android:textColor="#ffffff" + android:visibility="invisible"/> + <Button + android:id="@+id/button" + android:layout_width="match_parent" + android:layout_height="54dip" + android:singleLine="true" + android:focusable="true" + android:text="@string/cancel" + android:layout_gravity="center_horizontal" + android:background="@drawable/btn_center" + android:textColor="#ffffff" + android:textSize="19sp" /> + </LinearLayout> +</RelativeLayout> diff --git a/java/res/layout/bubble_text.xml b/java/res/layout/bubble_text.xml deleted file mode 100644 index c3957b65e..000000000 --- a/java/res/layout/bubble_text.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textSize="14sp" - android:textColor="?android:attr/textColorPrimary" - android:minWidth="32dip" - android:gravity="center" - android:shadowRadius="2.75" - android:shadowColor="#BB000000" - /> diff --git a/java/res/layout/candidate_divider.xml b/java/res/layout/candidate_divider.xml new file mode 100644 index 000000000..1d75e52b3 --- /dev/null +++ b/java/res/layout/candidate_divider.xml @@ -0,0 +1,30 @@ +<?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. +*/ +--> + +<ImageView + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:src="@drawable/keyboard_suggest_strip_divider" + android:paddingRight="@dimen/candidate_padding" + android:paddingLeft="@dimen/candidate_padding" + android:focusable="false" + android:clickable="false" + android:gravity="center_vertical|center_horizontal" /> diff --git a/java/res/layout/candidate_info.xml b/java/res/layout/candidate_info.xml new file mode 100644 index 000000000..f3557289c --- /dev/null +++ b/java/res/layout/candidate_info.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<TextView + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="6sp" + android:textColor="@android:color/white" + android:visibility="gone" + style="?attr/suggestionBackgroundStyle" /> diff --git a/java/res/layout/candidate_preview.xml b/java/res/layout/candidate_preview.xml index fe2002d46..32705c996 100644 --- a/java/res/layout/candidate_preview.xml +++ b/java/res/layout/candidate_preview.xml @@ -19,11 +19,10 @@ --> <TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" + 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/candidate_feedback_background" - /> + style="?attr/suggestionPreviewBackgroundStyle" /> diff --git a/java/res/anim/key_preview_fadeout.xml b/java/res/layout/candidate_word.xml index 7de5123cd..94ae2b44e 100644 --- a/java/res/anim/key_preview_fadeout.xml +++ b/java/res/layout/candidate_word.xml @@ -18,12 +18,10 @@ */ --> -<set +<Button xmlns:android="http://schemas.android.com/apk/res/android" - android:interpolator="@android:anim/accelerate_interpolator" -> - <alpha - android:fromAlpha="1.0" - android:toAlpha="0.0" - android:duration="@integer/config_preview_fadeout_anim_time" /> -</set> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minWidth="@dimen/candidate_min_width" + android:textSize="@dimen/candidate_text_size" + style="?attr/suggestionBackgroundStyle" /> diff --git a/java/res/layout/candidates.xml b/java/res/layout/candidates.xml deleted file mode 100644 index b89d44290..000000000 --- a/java/res/layout/candidates.xml +++ /dev/null @@ -1,38 +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. -*/ ---> - -<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" - 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" - /> - -</LinearLayout> diff --git a/java/res/layout/candidates_strip.xml b/java/res/layout/candidates_strip.xml new file mode 100644 index 000000000..c23c29cbe --- /dev/null +++ b/java/res/layout/candidates_strip.xml @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <RelativeLayout + android:layout_weight="1.0" + android:layout_width="0dp" + android:layout_height="match_parent" + android:gravity="center" + > + <include + android:id="@+id/word_left" + layout="@layout/candidate_word" /> + <include + android:id="@+id/info_left" + layout="@layout/candidate_info" /> + </RelativeLayout> + <include + layout="@layout/candidate_divider" /> + <RelativeLayout + android:layout_weight="1.0" + android:layout_width="0dp" + android:layout_height="match_parent" + android:gravity="center" + > + <include + android:id="@+id/word_center" + layout="@layout/candidate_word" /> + <include + android:id="@+id/info_center" + layout="@layout/candidate_info" /> + </RelativeLayout> + <include + layout="@layout/candidate_divider" /> + <LinearLayout + android:orientation="horizontal" + android:layout_weight="1.0" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:gravity="center_vertical" + > + <RelativeLayout + android:layout_weight="1.0" + android:layout_width="0dp" + android:layout_height="match_parent" + android:gravity="center" + > + <include + android:id="@+id/word_right" + layout="@layout/candidate_word" /> + <include + android:id="@+id/info_right" + layout="@layout/candidate_info" /> + </RelativeLayout> + <!-- Image drawables are set in CandidateView constructor --> + <ImageButton + android:id="@+id/expand_candidates_pane" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:visibility="gone" + style="?attr/suggestionsStripBackgroundStyle" /> + <ImageButton + android:id="@+id/close_candidates_pane" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:visibility="gone" + style="?attr/suggestionsStripBackgroundStyle" /> + </LinearLayout> +</merge> diff --git a/java/res/layout/input_basic.xml b/java/res/layout/input_basic.xml deleted file mode 100644 index 168eba691..000000000 --- a/java/res/layout/input_basic.xml +++ /dev/null @@ -1,31 +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. -*/ ---> - -<com.android.inputmethod.latin.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:background="@drawable/keyboard_background" - - latin:keyBackground="@drawable/btn_keyboard_key" - /> diff --git a/java/res/layout/input_basic_highcontrast.xml b/java/res/layout/input_basic_highcontrast.xml deleted file mode 100644 index 19ff1db11..000000000 --- a/java/res/layout/input_basic_highcontrast.xml +++ /dev/null @@ -1,32 +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. -*/ ---> - -<com.android.inputmethod.latin.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:background="@android:color/black" - - latin:keyBackground="@drawable/btn_keyboard_key3" - /> diff --git a/java/res/layout/input_gingerbread.xml b/java/res/layout/input_gingerbread.xml deleted file mode 100644 index 73cf0a3fa..000000000 --- a/java/res/layout/input_gingerbread.xml +++ /dev/null @@ -1,34 +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. -*/ ---> - -<com.android.inputmethod.latin.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:paddingBottom="@dimen/keyboard_bottom_padding" - android:background="@drawable/keyboard_dark_background" - android:textStyle="bold" - - latin:keyBackground="@drawable/btn_keyboard_key_gingerbread" - latin:keyTextStyle="bold" - /> diff --git a/java/res/layout/input_stone_bold.xml b/java/res/layout/input_stone_bold.xml deleted file mode 100644 index e3588bb22..000000000 --- a/java/res/layout/input_stone_bold.xml +++ /dev/null @@ -1,37 +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. -*/ ---> - -<com.android.inputmethod.latin.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: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:popupLayout="@layout/input_stone_popup" - /> diff --git a/java/res/layout/input_stone_normal.xml b/java/res/layout/input_stone_normal.xml deleted file mode 100644 index fd7bf85fc..000000000 --- a/java/res/layout/input_stone_normal.xml +++ /dev/null @@ -1,35 +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. -*/ ---> - -<com.android.inputmethod.latin.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:background="@drawable/keyboard_background" - - 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:popupLayout="@layout/input_stone_popup" - /> diff --git a/java/res/layout/input_stone_popup.xml b/java/res/layout/input_stone_popup.xml deleted file mode 100644 index f159625f7..000000000 --- a/java/res/layout/input_stone_popup.xml +++ /dev/null @@ -1,41 +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. -*/ ---> - -<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" - > - <com.android.inputmethod.latin.LatinKeyboardBaseView - 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:background="@drawable/keyboard_background" - - latin:keyBackground="@drawable/btn_keyboard_key_stone" - latin:keyTextColor="@color/latinkeyboard_key_color_black" - latin:shadowColor="@color/latinkeyboard_key_color_white" - latin:popupLayout="@layout/input_stone_popup" - /> -</LinearLayout> diff --git a/java/res/layout/input_view.xml b/java/res/layout/input_view.xml new file mode 100644 index 000000000..821082f91 --- /dev/null +++ b/java/res/layout/input_view.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" +> + <!-- On tablets, the candidate strip is centered with horizontal paddings on both sides because + width of the landscape mode is too long for the candidate strip. This LinearLayout is + required to hold the paddings. --> + <LinearLayout + android:id="@+id/candidates_container" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/candidate_strip_minimum_height" + android:gravity="bottom" + > + <View + android:layout_width="@dimen/candidate_strip_padding" + android:layout_height="@dimen/candidate_strip_height" + style="?attr/suggestionsStripBackgroundStyle" /> + <com.android.inputmethod.latin.CandidateView + android:id="@+id/candidates" + android:layout_weight="1.0" + android:layout_width="0dp" + android:layout_height="@dimen/candidate_strip_height" + android:gravity="center_vertical" + style="?attr/candidateViewStyle" /> + <View + android:layout_width="@dimen/candidate_strip_padding" + android:layout_height="@dimen/candidate_strip_height" + style="?attr/suggestionsStripBackgroundStyle" /> + </LinearLayout> + + <LinearLayout + android:id="@+id/candidates_pane_container" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + style="?attr/suggestionsStripBackgroundStyle" + > + <View + android:layout_width="@dimen/candidate_strip_padding" + android:layout_height="@dimen/candidate_strip_height" /> + <FrameLayout + android:id="@+id/candidates_pane" + android:layout_weight="1.0" + android:layout_width="0dp" + android:layout_height="match_parent" /> + <View + android:layout_width="@dimen/candidate_strip_padding" + android:layout_height="@dimen/candidate_strip_height" /> + </LinearLayout> + + <com.android.inputmethod.keyboard.LatinKeyboardView + android:id="@+id/keyboard_view" + android:layout_alignParentBottom="true" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> +</LinearLayout> diff --git a/java/res/layout/key_preview.xml b/java/res/layout/key_preview.xml index de03506ad..5332d15c6 100644 --- a/java/res/layout/key_preview.xml +++ b/java/res/layout/key_preview.xml @@ -22,8 +22,7 @@ android:layout_width="wrap_content" android:layout_height="80sp" android:textSize="40sp" - android:textColor="@color/latinkeyboard_key_color_white" android:minWidth="32dip" android:gravity="center" - android:background="@drawable/keyboard_key_feedback" + style="?attr/keyPreviewStyle" /> diff --git a/java/res/layout/keyboard_popup.xml b/java/res/layout/keyboard_popup.xml index 9ecbcd4e9..e2508da78 100644 --- a/java/res/layout/keyboard_popup.xml +++ b/java/res/layout/keyboard_popup.xml @@ -19,23 +19,16 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" + android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" - android:background="@drawable/keyboard_popup_panel_background" - android:paddingLeft="16dip" - android:paddingRight="16dip" + style="?attr/popupMiniKeyboardPanelStyle" > - <com.android.inputmethod.latin.LatinKeyboardBaseView + <com.android.inputmethod.keyboard.PopupMiniKeyboardView xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - android:id="@+id/LatinKeyboardBaseView" + android:id="@+id/mini_keyboard_view" android:layout_alignParentBottom="true" - android:layout_width="match_parent" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@color/latinkeyboard_transparent" - - latin:keyBackground="@drawable/btn_keyboard_key_gingerbread_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..a2ddb7c50 100644 --- a/java/res/layout/recognition_status.xml +++ b/java/res/layout/recognition_status.xml @@ -1,98 +1,102 @@ <?xml version="1.0" encoding="utf-8"?> <!-- -/* +/* ** ** Copyright 2009, The Android Open Source Project ** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of 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="vertical" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:background="@android:color/black" - android:paddingBottom="0dip" - android:paddingLeft="0dip" - android:paddingRight="0dip" -> - - <LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/main_image" - android:orientation="vertical" - android:background="@drawable/voice_ime_background" - android:scaleType="fitXY" - android:layout_width="match_parent" - android:layout_height="180dip" - android:paddingBottom="2dip" - android:paddingTop="2dip" - > - - <TextView android:id="@+id/text" - android:text="@string/voice_initializing" +--> +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_marginTop="15dip" - android:textSize="28sp" - android:textColor="#ffffff" - android:layout_gravity="center_horizontal" - /> - - <ImageView android:id="@+id/image" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_marginTop="20dip" - android:layout_gravity="center_horizontal" - android:src="@drawable/mic_slash" - /> - - <ProgressBar android:id="@+id/progress" - android:layout_height="60dip" - android:layout_width="60dip" - android:layout_gravity="center" - android:visibility="gone" - android:indeterminate="true" - android:indeterminateOnly="false" - /> - - - - </LinearLayout> - - <LinearLayout android:id="@+id/button" - android:orientation="vertical" - android:background="@drawable/ok_cancel" - android:scaleType="fitXY" android:layout_width="match_parent" - android:layout_height="42dip" - android:paddingLeft="1dip" - android:paddingRight="1dip" - > - - <TextView android:id="@+id/button_text" - android:text="@string/cancel" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_marginTop="7dip" - android:textSize="19sp" - android:textColor="#ffffff" - android:layout_gravity="center_horizontal" - /> + android:background="@drawable/background_voice"> + <LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/popup_layout" + android:orientation="vertical" + android:layout_height="371dip" + android:layout_width="500dip" + android:layout_centerInParent="true" + android:background="@drawable/vs_dialog_red"> + <TextView + android:id="@+id/text" + android:text="@string/voice_error" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:singleLine="true" + android:layout_marginTop="10dip" + android:textSize="20sp" + android:textColor="#ffffff" + android:layout_gravity="center" + android:visibility="invisible"/> + <RelativeLayout + android:layout_height="0dip" + android:layout_width="match_parent" + android:layout_weight="1.0"> + <com.android.inputmethod.deprecated.voice.SoundIndicator + android:id="@+id/sound_indicator" + android:src="@drawable/mic_full" + android:background="@drawable/mic_base" + android:adjustViewBounds="true" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_centerInParent="true" + android:visibility="gone"/> + <ImageView + android:id="@+id/image" + android:src="@drawable/mic_slash" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_centerInParent="true" + android:visibility="visible"/> + <ProgressBar + android:id="@+id/progress" + android:indeterminate="true" + android:indeterminateOnly="false" + android:layout_height="60dip" + android:layout_width="60dip" + android:layout_centerInParent="true" + android:visibility="gone"/> + </RelativeLayout> + <!-- + The text is set by the code. We specify a random text (voice_error), so the + text view does not have a zero height. This is necessary to keep the slash + mic and the recording mic is the same position + --> + <TextView + android:id="@+id/language" + android:text="@string/voice_error" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:singleLine="true" + android:textSize="15sp" + android:layout_marginTop="3dip" + android:layout_marginBottom="3dip" + android:layout_gravity="center" + android:textColor="#ffffff" + android:visibility="invisible"/> + <Button + android:id="@+id/button" + android:layout_width="match_parent" + android:layout_height="30dip" + android:singleLine="true" + android:focusable="true" + android:text="@string/cancel" + android:layout_gravity="center_horizontal" + android:background="@drawable/btn_center" + android:textColor="#ffffff" + android:textSize="15sp" /> </LinearLayout> - -</LinearLayout> - +</RelativeLayout> diff --git a/java/res/raw/main.dict b/java/res/raw/main.dict Binary files differindex a456cf3d3..a456cf3d3 100755..100644 --- a/java/res/raw/main.dict +++ b/java/res/raw/main.dict diff --git a/java/res/raw/type3.ogg b/java/res/raw/type3.ogg Binary files differdeleted file mode 100755 index 20e670807..000000000 --- a/java/res/raw/type3.ogg +++ /dev/null diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml new file mode 100644 index 000000000..db6217315 --- /dev/null +++ b/java/res/values-af/strings.xml @@ -0,0 +1,177 @@ +<?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-sleutelbord"</string> + <string name="english_ime_settings" msgid="6661589557206947774">"Android-sleutelbordinstellings"</string> + <string name="english_ime_input_options" msgid="3909945612939668554">"Invoeropsies"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibreer met sleuteldruk"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Klank met sleuteldruk"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Opspring by druk van sleutel"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- no translation found for correction_category (2236750915056607613) --> + <skip /> + <!-- no translation found for ngram_category (5337109164339320257) --> + <skip /> + <!-- no translation found for misc_category (6894192814868233453) --> + <skip /> + <!-- no translation found for advanced_settings (362895144495591463) --> + <skip /> + <!-- no translation found for advanced_settings_summary (5193513161106637254) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <string name="auto_cap" msgid="1719746674854628252">"Outohoofletters"</string> + <string name="quick_fixes" msgid="5353213327680897927">"Vinnige oplossings"</string> + <string name="quick_fixes_summary" msgid="3405028402510332373">"Korrigeer algemene tikfoute"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Wys voorgestelde woorde terwyl jy tik"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Wys altyd"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Wys in portretmodus"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Versteek altyd"</string> + <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) --> + <skip /> + <string name="prefs_settings_key" msgid="4623341240804046498">"Wys instellingsleutel"</string> + <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Outomaties"</string> + <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Wys altyd"</string> + <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Versteek altyd"</string> + <string name="auto_correction" msgid="4979925752001319458">"Outokorrigering"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Korrigeer outomaties die vorige woord"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Af"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Nederig"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressief"</string> + <!-- outdated translation 1323347224043514969 --> <string name="bigram_suggestion" msgid="2636414079905220518">"Bigram-voorstelle"</string> + <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Gebruik vorige woord om voorstel te verbeter"</string> + <!-- no translation found for bigram_prediction (8914273444762259739) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (1747261921174300098) --> + <skip /> + <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Gestoor"</string> + <string name="label_go_key" msgid="1635148082137219148">"Gaan"</string> + <string name="label_next_key" msgid="362972844525672568">"Volgende"</string> + <string name="label_done_key" msgid="2441578748772529288">"Klaar"</string> + <string name="label_send_key" msgid="2815056534433717444">"Stuur"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Meer"</string> + <string name="label_pause_key" msgid="181098308428035340">"Laat wag"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Wag"</string> + <string name="voice_warning_title" msgid="4419354150908395008">"Steminvoering"</string> + <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Steminvoering vir jou taal word nie tans ondersteun nie, maar werk wel in Engels."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Steminvoer gebruik Google se spraakherkenning. "<a href="http://m.google.com/privacy">"Die Mobiel-privaatheidsbeleid"</a>" is van toepassing."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Om steminvoer af te skakel, gaan na invoermetode-instellings."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Om steminvoer te gebruik, druk die mikrofoonknoppie."</string> + <string name="voice_listening" msgid="467518160751321844">"Praat nou"</string> + <string name="voice_working" msgid="6666937792815731889">"Werkend"</string> + <string name="voice_initializing" msgid="661962047129906646"></string> + <string name="voice_error" msgid="5140896300312186162">"Fout. Probeer asseblief weer."</string> + <string name="voice_network_error" msgid="6649556447401862563">"Kon nie koppel nie"</string> + <string name="voice_too_much_speech" msgid="5746973620134227376">"Fout, te veel spraak."</string> + <string name="voice_audio_error" msgid="5072707727016414454">"Oudioprobleem"</string> + <string name="voice_server_error" msgid="7807129913977261644">"Bedienerfout"</string> + <string name="voice_speech_timeout" msgid="8461817525075498795">"Geen spraak gehoor nie"</string> + <string name="voice_no_match" msgid="4285117547030179174">"Geen passings gevind nie"</string> + <string name="voice_not_installed" msgid="5552450909753842415">"Stemsoek nie geïnstalleer nie"</string> + <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Wenk:"</b>" Sleep oor die sleutelbord om te praat"</string> + <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Wenk:"</b>" Probeer volgende keer om leestekens soos \"punt\", \"komma\" of \"vraagteken\" hardop te sê."</string> + <string name="cancel" msgid="6830980399865683324">"Kanselleer"</string> + <string name="ok" msgid="7898366843681727667">"OK"</string> + <string name="voice_input" msgid="2466640768843347841">"Steminvoering"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Op hoofsleutelbord"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Op simbolesleutelbord"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Af"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofoon op hoofsleutelbord"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofoon op simbolesleutelbord"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Steminvoer is gedeaktiveer"</string> + <string name="selectInputMethod" msgid="315076553378705821">"Kies invoermetode"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Invoertale"</string> + <string name="language_selection_summary" msgid="187110938289512256">"Gly vinger op spasiebalk om taal te verander"</string> + <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Raak weer om te stoor"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Woordeboek beskikbaar"</string> + <string name="prefs_enable_log" msgid="6620424505072963557">"Aktiveer gebruikerterugvoer"</string> + <string name="prefs_description_log" msgid="5827825607258246003">"Help hierdie invoermetode-redigeerder te verbeter deur gebruikstatistiek en omvalverslae outomaties na Google te stuur."</string> + <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Raak om woorde reg te maak"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Raak ingevoerde woorde om hulle te korrigeer, net wanneer voorstelle sigbaar is"</string> + <string name="keyboard_layout" msgid="437433231038683666">"Sleutelbordtema"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tsjeggiese sleutelbord"</string> + <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) --> + <skip /> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Deense sleutelbord"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Duitse sleutelbord"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelse (VK) sleutelbord"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelse (VS) sleutelbord"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spaanse sleutelbord"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franse sleutelbord"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franse (Kanada) sleutelbord"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franse (Switserland) sleutelbord"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) --> + <skip /> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiaanse sleutelbord"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Noorweegse sleutelbord"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlandse sleutelbord"</string> + <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) --> + <skip /> + <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) --> + <skip /> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russiese sleutelbord"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serwiese sleutelbord"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Sweedse sleutelbord"</string> + <!-- no translation found for subtype_mode_af_voice (7542487489657902699) --> + <skip /> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tsjeggiese stem"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Duitse stem"</string> + <!-- no translation found for subtype_mode_en_voice (6643420989651848728) --> + <skip /> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spaanse stem"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Franse stem"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japannese stem"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreaanse stem"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Poolse stem"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugese stem"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russiese stem"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkse stem"</string> + <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) --> + <skip /> + <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) --> + <skip /> + <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) --> + <skip /> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Bruikbaarheidsmodus"</string> +</resources> diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml new file mode 100644 index 000000000..740aefc2a --- /dev/null +++ b/java/res/values-am/strings.xml @@ -0,0 +1,177 @@ +<?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> + <string name="english_ime_input_options" msgid="3909945612939668554">"ግቤት አማራጮች"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"በቁልፍመጫንጊዜ አንዝር"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"በቁልፍ መጫን ላይ የሚወጣ ድምፅ"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"ቁልፍ ጫን ላይ ብቅ ባይ"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- no translation found for correction_category (2236750915056607613) --> + <skip /> + <!-- no translation found for ngram_category (5337109164339320257) --> + <skip /> + <!-- no translation found for misc_category (6894192814868233453) --> + <skip /> + <!-- no translation found for advanced_settings (362895144495591463) --> + <skip /> + <!-- no translation found for advanced_settings_summary (5193513161106637254) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <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 (8026799663445531637) --> + <skip /> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"እየተየብክ ተመራጭ ቃላትን አሳይ"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"ሁልጊዜ አሳይ"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"በቁመት ሁነታ አሳይ"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ሁልጊዜ ደብቅ"</string> + <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) --> + <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> + <string name="auto_correction" msgid="4979925752001319458">"በራስ ማስተካከል"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"የቀደመውን ቃል በራስሰር አስተካክል"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ውጪ"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"መጠነኛ"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"ኃይለኛ"</string> + <!-- outdated translation 1323347224043514969 --> <string name="bigram_suggestion" msgid="2636414079905220518">"ቢግራም ምክሮች"</string> + <string name="bigram_suggestion_summary" msgid="4383845146070101531">"ምክርን ለማሻሻል የቀደመ ቃልን ተጠቀም"</string> + <!-- no translation found for bigram_prediction (8914273444762259739) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (1747261921174300098) --> + <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> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"ተጨማሪ"</string> + <string name="label_pause_key" msgid="181098308428035340">"ላፍታ አቁም"</string> + <string name="label_wait_key" msgid="6402152600878093134">"ቆይ"</string> + <string name="voice_warning_title" msgid="4419354150908395008">"የድምፅ ግቤ ት"</string> + <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"የድምፅ ግቤት በአሁኑ ጊዜ ለእርስዎን ቋንቋ አይደግፍም፣ ግን በእንግሊዘኛ ይሰራል።"</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"የድምፅ ግቤት የGoogleን ንግግር ለይቶ ማወቂያ ይጠቀማል።"<a href="http://m.google.com/privacy">"የተንቀሳቃሽ ስልክ ግላዊ ፖሊሲ"</a>" ይተገበራል።"</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"የድምፅ ግቤት ለማጥፋት፣ወደ ግቤት ሜተድ ቅንብሮች ሂድ።"</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"የድምፅግቤት ለመጠቀም፣ የማይክራፎንየድምፅ ማጉያ አዝራር ተጫን።"</string> + <string name="voice_listening" msgid="467518160751321844">"አሁን ተናገር"</string> + <string name="voice_working" msgid="6666937792815731889">"ሥራ ላይ"</string> + <string name="voice_initializing" msgid="661962047129906646"></string> + <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>" ሌላ ጊዜ፣ እንደ \"period\", \"comma\", ወይም \"question mark\" ያሉ ስርዓተ ነጥቦችን ለመናገር ሞክር።"</string> + <string name="cancel" msgid="6830980399865683324">"ይቅር"</string> + <string name="ok" msgid="7898366843681727667">"እሺ"</string> + <string name="voice_input" msgid="2466640768843347841">"የድምፅ ግቤት"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"በዋናቁልፍ ሰሌዳ ላይ"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"በምልክቶች ቁልፍ ሰሌዳ ላይ"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"ውጪ"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"ድምፅ ማጉያ በዋናው ቁልፍሰሌዳው ላይ"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"የድምፅ ማጉያ ምልክትበቁልፍ ሰሌዳላይ"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"የድምፅ ግቤት ቦዝኗል"</string> + <string name="selectInputMethod" msgid="315076553378705821">"የግቤት ሜተድ ምረጥ"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ቋንቋዎች አግቤት"</string> + <string name="language_selection_summary" msgid="187110938289512256">"ቋንቋ ለመለወጥ የቦታ ቁልፍ ላይ ጣትዎን ያንሸራቱ"</string> + <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← ለማስቀመጥ ድጋሚ ንካ"</string> + <string name="has_dictionary" msgid="6071847973466625007">"መዝገበ ቃላት አለ"</string> + <string name="prefs_enable_log" msgid="6620424505072963557">"የተጠቃሚ ግብረ ምላሽ አንቃ"</string> + <string name="prefs_description_log" msgid="5827825607258246003">"ወደ Google የተሰናከለ ሪፖርቶች እና አጠቃቀም ስታስቲክስ በራስ ሰር በመላክ ይህን ግቤት ሜተድ አርትኢ እገዛ ያሻሽላል።"</string> + <string name="prefs_enable_recorrection" msgid="4588408906649533582">"ቃላትን ለማስተካከል ንካ"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"የገቡ ቃላትን ለማስተካከል ንካ፣ አማራጮች ሲታዩብቻ"</string> + <string name="keyboard_layout" msgid="437433231038683666">"የቁልፍ ሰሌዳ ገጽታ"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"የቼክ ቁልፍሰሌዳ"</string> + <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) --> + <skip /> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"የዳኒሽኛ ቁልፍሰሌዳ"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"የጀርመንኛ ቁልፍሰሌዳ"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"የእንግሊዘኛ(ዩኬ) ቁልፍሰሌዳ"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"የእንግሊዘኛ(ዩኤስ) ቁልፍሰሌዳ"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"የስፖኒሽኛቁልፍ ሰሌዳ"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"የፈረንሳይኛ ቁልፍሰሌዳ"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"የፈረንሳይኛ(ካናዳ) ቁልፍሰሌዳ"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"የፈረንሳይኛ(ስዊዘርላንድ) ቁልፍሰሌዳ"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) --> + <skip /> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"የጣሊያንኛ ቁልፍ ሰሌዳ"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"የኖርዌጂኛ ቁልፍሰሌዳ"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"የደች ቁልፍሰሌዳ"</string> + <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) --> + <skip /> + <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) --> + <skip /> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"የራሽኛቁልፍ ሰሌዳ"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"የሩሲኪኛቁልፍ ሰሌዳ"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"የሲውድናዊ ቁልፍሰሌዳ"</string> + <!-- no translation found for subtype_mode_af_voice (7542487489657902699) --> + <skip /> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"የቼክ ድምፅ"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"የጀርመናዊ ድምፅ"</string> + <!-- no translation found for subtype_mode_en_voice (6643420989651848728) --> + <skip /> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"የስፔናዊ ድምፅ"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"የፈረንሳዊ ድምፅ"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"የጃፓናዊ ድምፅ"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"የኮሪያዊ ድምፅ"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"የፖሊሽኛ ድምፅ"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"የፖርቹጊኛ ድምፅ"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"የራሽኛድምፅ"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"የቱርካዊ ድምፅ"</string> + <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) --> + <skip /> + <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) --> + <skip /> + <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) --> + <skip /> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"የተገልጋይነት ጥናት ሁነታ"</string> +</resources> diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml index 89b5ef365..455e9f5f2 100644 --- a/java/res/values-ar/strings.xml +++ b/java/res/values-ar/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"اهتزاز عند الضغط على مفتاح"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"صوت عند الضغط على مفتاح"</string> <string name="popup_on_keypress" msgid="123894815723512944">"انبثاق عند الضغط على المفاتيح"</string> - <string name="hit_correction" msgid="4855351009261318389">"تصحيح أخطاء الكتابة"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"تمكين تصحيح خطأ الإدخال"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"أخطاء في الإدخال الأفقي"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"تمكين تصحيح خطأ الإدخال"</string> - <string name="auto_correction" msgid="7911639788808958255">"اقتراحات الكلمات"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"تصحيح الكلمة السابقة تلقائيًا"</string> - <string name="prediction" msgid="466220283138359837">"اقتراحات الكلمات"</string> - <string name="prediction_category" msgid="7027100625580696660">"إعدادات اقتراحات الكلمات"</string> - <string name="prediction_summary" msgid="459788228830873110">"تمكين الإكمال التلقائي أثناء الكتابة"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"إكمال تلقائي"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"زيادة حجم الحقل النصي"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"إخفاء اقتراحات الكلمات في طريقة العرض الأفقية"</string> + <string name="general_category" msgid="1859088467017573195">"عام"</string> + <string name="correction_category" msgid="2236750915056607613">"تصحيح النص"</string> + <string name="ngram_category" msgid="5337109164339320257">"الاقتراحات بناءً على الكلمات السابقة"</string> + <string name="misc_category" msgid="6894192814868233453">"خيارات أخرى"</string> + <string name="advanced_settings" msgid="362895144495591463">"الإعدادات المتقدمة"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"خيارات للمستخدمين الخبراء"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"تأخير إزالة النافذة المنبثقة الأساسية"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"بلا تأخير"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"افتراضي"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"استخدام الأحرف الكبيرة تلقائيًا"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"استخدام الأحرف الكبيرة في بداية الجملة"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"ترقيم تلقائي"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"إصلاحات سريعة"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"تصحيح الأخطاء المكتوبة الشائعة"</string> - <string name="show_suggestions" msgid="507074425254289133">"عرض الاقتراحات"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"عرض الكلمات المقترحة أثناء الكتابة"</string> - <string name="auto_complete" msgid="1103196318775486023">"إكمال تلقائي"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"مفتاح المسافة والترقيم لإدخال كلمة محددة تلقائيًا"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"عرض اقتراحات التصحيح"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"عرض الكلمات المقترحة أثناء الكتابة"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"عرض دومًا"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"عرض في وضع رأسي"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"إخفاء دومًا"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"استخدام مفتاح المسافة لتبديل اللغة"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"عرض مفتاح الإعدادات"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"تلقائي"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"إظهار بشكل دائم"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"إخفاء دومًا"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"اقتراحات ثنائية"</string> + <string name="auto_correction" msgid="4979925752001319458">"التصحيح التلقائي"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"تؤدي المسافة والترقيم إلى تصحيح الكلمات المكتوبة بشكل غير صحيح"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"إيقاف"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"معتدل"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"حاد"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"اقتراحات ثنائية"</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="bigram_prediction" msgid="8914273444762259739">"التنبؤ الثنائي"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"استخدام الكلمة السابقة أيضًا للتنبؤ"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : تم الحفظ"</string> - <string name="tip_long_press" msgid="6101270866284343344">"اضغط باستمرار على أحد المفاتيح لأسفل لمشاهدة علامات التشكيل"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"اضغط على مفتاح الرجوع ↶ لإغلاق لوحة المفاتيح في أي نقطة"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"الدخول إلى الأرقام والرموز"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"اضغط مع الاستمرار على أقصى يمين الكلمة لإضافتها إلى القاموس"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"المس هذا التلميح للمتابعة »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"المس هنا لإغلاق هذا التلميح وبدء الكتابة!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"تفتح لوحة المفاتيح في أي وقت تلمس فيه حقلًا نصيًا"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"المس مع الاستمرار أحد المفاتيح لعرض علامات التشكيل"\n"(ø, ö, ô, ó, وهكذا)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"التبديل إلى الأرقام والرموز من خلال لمس هذا الزر"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"يمكنك الرجوع إلى الأحرف من خلال لمس هذا المفتاح مرة أخرى"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"المس هذا المفتاح مع الاستمرار لتغيير إعدادات لوحة المفاتيح، مثل الإكمال التلقائي"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"جربه!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"تنفيذ"</string> <string name="label_next_key" msgid="362972844525672568">"التالي"</string> <string name="label_done_key" msgid="2441578748772529288">"تم"</string> <string name="label_send_key" msgid="2815056534433717444">"إرسال"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ب ت ث"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"أ ب ج د"</string> + <string name="label_more_key" msgid="3760239494604948502">"المزيد"</string> + <string name="label_pause_key" msgid="181098308428035340">"توقف مؤقت"</string> + <string name="label_wait_key" msgid="6402152600878093134">"انتظار"</string> <string name="voice_warning_title" msgid="4419354150908395008">"الإدخال الصوتي"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"الإدخال الصوتي غير معتمد حاليًا للغتك، ولكنه يعمل باللغة الإنجليزية."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"الإدخال الصوتي هو ميزة تجريبية تستخدم التعرف على الكلام المتصل في Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"لتشغيل الإدخال الصوتي، انتقل إلى إعدادات لوحة المفاتيح."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"لاستخدام الإدخال الصوتي، اضغط على زر الميكروفون أو مرر إصبعك عبر لوحة المفاتيح على الشاشة."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"يستخدم الإدخال الصوتي خاصية التعرف على الكلام من Google. تنطبق "<a href="http://m.google.com/privacy">"سياسة خصوصية الجوال"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"لإيقاف الإدخال الصوتي، انتقل إلى إعدادات طريقة الإدخال."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"لاستخدام الإدخال الصوتي، اضغط على زر الميكروفون."</string> <string name="voice_listening" msgid="467518160751321844">"تحدث الآن"</string> <string name="voice_working" msgid="6666937792815731889">"العمل"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"إلغاء"</string> <string name="ok" msgid="7898366843681727667">"موافق"</string> <string name="voice_input" msgid="2466640768843347841">"الإدخال الصوتي"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"في لوحة المفاتيح الرئيسية"</item> - <item msgid="8529385602829095903">"على لوحة مفاتيح الرموز"</item> - <item msgid="7283103513488381103">"إيقاف"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"الميكروفون في لوحة المفاتيح الرئيسية"</item> - <item msgid="6907837061058876770">"الميكروفون على لوحة مفاتيح الرموز"</item> - <item msgid="3664304608587798036">"تم تعطيل الإدخال الصوتي"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"إرسال تلقائي بعد الصوت"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"الضغط تلقائيًا على المفتاح enter عند البحث أو الانتقال إلى الحقل التالي."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"افتح لوحة المفاتيح"\n</b></font><font size="3">\n</font>"المس أي حقل نصي."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"إغلاق لوحة المفاتيح"\n</b></font><font size="3">\n</font>"اضغط على المفتاح \"رجوع\"."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"المس أحد مفاتيح الخيارات مع الاستمرار"\n</b></font><font size="3">\n</font>"الدخول إلى الترقيم والحركات."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"إعدادات لوحة المفاتيح"\n</b></font><font size="3">\n</font>"المس مع الاستمرار المفتاح "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">"com."</string> - <string name="popular_domain_1" msgid="1370572248164278467">"net."</string> - <string name="popular_domain_2" msgid="3036812463748402878">"org."</string> - <string name="popular_domain_3" msgid="8718639560809452028">"gov."</string> - <string name="popular_domain_4" msgid="35359437471311470">"edu."</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"لوحة مفاتيح رئيسية"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"لوحة مفاتيح الرموز"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"إيقاف"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"ميكروفون على لوحة مفاتيح رئيسية"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"ميكروفون على لوحة مفاتيح الرموز"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"الإدخال الصوتي مُعطل"</string> <string name="selectInputMethod" msgid="315076553378705821">"تحديد طريقة الإرسال"</string> <string name="language_selection_title" msgid="1651299598555326750">"لغات الإدخال"</string> <string name="language_selection_summary" msgid="187110938289512256">"مرر إصبعك على مفتاح المسافة لتغيير اللغة"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"تمكين ملاحظات المستخدم"</string> <string name="prefs_description_log" msgid="5827825607258246003">"المساعدة في تحسين محرر طريقة الإرسال هذا من خلال إرسال إحصاءات الاستخدام وتقارير الأعطال تلقائيًا إلى Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"المس لتصحيح الكلمات"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"المس الكلمات المدخلة لتصحيحها"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"المس الكلمات التي تم إدخالها لتصحيحها، وذلك فقط عندما تكون الاقتراحات مرئية."</string> <string name="keyboard_layout" msgid="437433231038683666">"مظهر لوحة المفاتيح"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"لوحة مفاتيح"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"صوت"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"لوحة مفاتيح تشيكية"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"لوحة المفاتيح العربية"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"لوحة مفاتيح دانماركية"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"لوحة مفاتيح ألمانية"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"لوحة مفاتيح إنجليزية (بريطانيا)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"لوحة مفاتيح إنجليزية (الولايات المتحدة)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"لوحة مفاتيح إسبانية"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"لوحة مفاتيح فرنسية"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"لوحة مفاتيح فرنسية (كندا)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"لوحة مفاتيح فرنسية (سويسرا)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"لوحة المفاتيح العبرية"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"لوحة مفاتيح إيطالية"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"لوحة مفاتيح نرويجية"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"لوحة مفاتيح بولندية"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"لوحة المفاتيح البولندية"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"لوحة المفاتيح البرتغالية"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"لوحة مفاتيح روسية"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"لوحة مفاتيح صربية"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"لوحة مفاتيح سويدية"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"صوت أفريقاني"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"صوت تشيكي"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"صوت ألماني"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"صوت إنجليزي"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"صوت إسباني"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"صوت فرنسي"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"صوت إيطالي"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"صوت ياباني"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"صوت كوري"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"صوت هولندي"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"صوت بولندي"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"صوت برتغالي"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"صوت روسي"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"صوت تركي"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"صوت صيني، يوي"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"صوت صيني، الماندارين"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"صوت زولوي"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"وضع دراسة الاستخدام"</string> </resources> diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml index 83cfaac3a..05af01668 100644 --- a/java/res/values-bg/strings.xml +++ b/java/res/values-bg/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Да вибрира при натискане на клавиш"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натискане на клавиш"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Изскачащ прозорец при натискане на клавиш"</string> - <string name="hit_correction" msgid="4855351009261318389">"Коригиране на грешките при въвеждане"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Активиране на корекция на грешки при въвеждане"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Грешки при въвеждане в хоризонтален изглед"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Активиране на корекция на грешки при въвеждане"</string> - <string name="auto_correction" msgid="7911639788808958255">"Предложения на думи"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Автоматично коригиране на предишната дума"</string> - <string name="prediction" msgid="466220283138359837">"Предложения на думи"</string> - <string name="prediction_category" msgid="7027100625580696660">"Настройки за предложения на думи"</string> - <string name="prediction_summary" msgid="459788228830873110">"Активиране на автодовършване, докато пишете"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Автодовършване"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Размерът на текстовото поле да се увеличи"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Скриване на предложенията на думи в хоризонтален изглед"</string> + <string name="general_category" msgid="1859088467017573195">"Общи"</string> + <string name="correction_category" msgid="2236750915056607613">"Корекция на текста"</string> + <string name="ngram_category" msgid="5337109164339320257">"Предложения въз основа на предишни думи"</string> + <string name="misc_category" msgid="6894192814868233453">"Други опции"</string> + <string name="advanced_settings" msgid="362895144495591463">"Разширени настройки"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Опции за потребителите експерти"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Отхвърляне на подсказката"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Без задържане"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"По подразбиране"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Автоматично поставяне на главни букви"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Поставя главна буква в началото на изреченията"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Автоматично поставяне на пунктуация"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Бързи корекции"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Коригира най-честите грешки при въвеждане"</string> - <string name="show_suggestions" msgid="507074425254289133">"Показване на предложения"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Показване на предложения, докато пишете"</string> - <string name="auto_complete" msgid="1103196318775486023">"Автоматично завършване"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Клавишът за интервал и пунктуация поставя автоматично откроена дума"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Показване на предложения за поправка"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Показване на предложения, докато пишете"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Винаги да се показва"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показване с вертикална ориентация"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Винаги да се скрива"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Смяна на езика с клавиша за интервал"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Показване на клавиша за настройки"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Автоматично"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Да се показва винаги"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Да се скрива винаги"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Предложения за биграми"</string> + <string name="auto_correction" msgid="4979925752001319458">"Автоко"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Клавишът за интервал и пунктуация авт. поправя сгрешени думи"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Изкл."</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умерено"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Агресивно"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Предложения за биграми"</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="bigram_prediction" msgid="8914273444762259739">"Предвиждане за биграми"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Използване на предишната дума и за предвиждане"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Запазено"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Задръжте клавиша, за да видите ударенията (ø, ö и т.н.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Натиснете клавиша „Назад“ ↶, за да затворите клавиатурата във всяка една точка"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Достъп до номера и символи"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Натиснете и задръжте върху най-лявата дума, за да я добавите към речника"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Докоснете съвета, за да продължите »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Докоснете тук, за да затворите този съвет и да започнете да пишете!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Клавиатурата се отваря при всяко докосване на текстово поле"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Докоснете и задръжте клавиша, за да видите ударенията"\n"(ø, ö, ô, ó и т.н.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Докосването на този клавиш води до преминаване към цифри и символи"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Върнете се към използване на букви чрез повторно докосване на този клавиш"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Докоснете и задръжте клавиша за промяна на настройките на клавиатурата, напр. автодовършване"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Пробвайте!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Старт"</string> <string name="label_next_key" msgid="362972844525672568">"Напред"</string> <string name="label_done_key" msgid="2441578748772529288">"Готово"</string> <string name="label_send_key" msgid="2815056534433717444">"Изпращане"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"АБВГ"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string> + <string name="label_more_key" msgid="3760239494604948502">"Още"</string> + <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Чака"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Гласово въвеждане"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"За вашия език понастоящем не се поддържа гласово въвеждане, но можете да го използвате на английски."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Гласовото въвеждане е експериментална функция, използваща разпознаването на реч в мрежата на Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"За да изключите гласовото въвеждане, отворете настройките на клавиатурата."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"За да използвате гласово въвеждане, натиснете бутона на микрофона или плъзнете пръст през екранната клавиатура."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовото въвеждане използва функцията на Google за разпознаване на говор. В сила е "<a href="http://m.google.com/privacy">"Декларацията за поверителност за мобилни устройства"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"За да изключите гласовото въвеждане, отворете настройките за метода за въвеждане."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"За да използвате гласово въвеждане, натиснете бутона на микрофона."</string> <string name="voice_listening" msgid="467518160751321844">"Говорете сега"</string> <string name="voice_working" msgid="6666937792815731889">"Обработва се"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Отказ"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Гласово въвеждане"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"На основната клавиатура"</item> - <item msgid="8529385602829095903">"На клавиатурата на символите"</item> - <item msgid="7283103513488381103">"Изкл."</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Микрофон на основната клавиатура"</item> - <item msgid="6907837061058876770">"Микрофон на клавиатурата на символите"</item> - <item msgid="3664304608587798036">"Гласовото въвеждане е деактивирано"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Автоматично изпращане след глас"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Да се натиска автоматично „Enter“ при търсене или преминаване към следващото поле."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Отворете клавиатурата"\n</b></font><font size="3">\n</font>"Докоснете текстово поле."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Затваряне на клавиатурата"\n</b></font><font size="3">\n</font>"Натиснете клавиша „Назад“."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Докоснете и задръжте клавиш за опции"\n</b></font><font size="3">\n</font>"Използвайте пунктуация и акценти."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Настройки на клавиатурата"\n</b></font><font size="3">\n</font>"Докоснете и задръжте клавиша "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На осн. клавиатура"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На клав. на симв."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Изкл."</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Микр. на осн. клав."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Микр. на клав. на симв."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Глас. въвежд. е деакт."</string> <string name="selectInputMethod" msgid="315076553378705821">"Избор на метод на въвеждане"</string> <string name="language_selection_title" msgid="1651299598555326750">"Входни езици"</string> <string name="language_selection_summary" msgid="187110938289512256">"Плъзнете пръст по клавиша за интервал за промяна на езика"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Активиране на отзивите от потребителите"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Помогнете за подобряването на този редактор за въвеждане чрез автоматично изпращане до Google на статистически данни за употребата и сигнали за сривове."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Докоснете, за да поправите думите"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Докоснете въведените думи, за да ги поправите"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Докоснете въведените думи, за да ги поправите – само когато предложенията са видими"</string> <string name="keyboard_layout" msgid="437433231038683666">"Тема на клавиатурата"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"клавиатура"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"гласово"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"чешка клавиатура"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"клавиатура на арабски"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"датска клавиатура"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"немска клавиатура"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"английска (Великобрит.) клавиатура"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"английска (САЩ) клавиатура"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"испанска клавиатура"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"френска клавиатура"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"френска (Канада) клавиатура"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"френска (Швейцария) клавиатура"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"клавиатура на иврит"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"италианска клавиатура"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"норвежка клавиатура"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"нидерландска клавиатура"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Полска клавиатура"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Португалска клавиатура"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"руска клавиатура"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"сръбска клавиатура"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"шведска клавиатура"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"африкаанс, гласово"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"чешки, гласово"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"немски, гласово"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"английски, гласово"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"испански, гласово"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"френски, гласово"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"италиански, гласово"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"японски, гласово"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"корейски, гласово"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"нидерландски, гласово"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"полски, гласово"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"португалски, гласово"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"руски, гласово"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"турски, гласово"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"китайски, кантонски, гласово"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"китайски, мандарин, гласово"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"зулуски, гласово"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Режим за изследване на използваемостта"</string> </resources> diff --git a/java/res/values-ja/donottranslate-altchars.xml b/java/res/values-ca/donottranslate-altchars.xml index d3beafade..336057be0 100644 --- a/java/res/values-ja/donottranslate-altchars.xml +++ b/java/res/values-ca/donottranslate-altchars.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,13 +18,12 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">à,á,ä,â,ã,å,ą,æ,ā,ª</string> + <string name="alternates_for_e">3,è,é,ë,ê,ę,ė,ē</string> + <string name="alternates_for_i">8,í,ï,ì,î,į,ī</string> + <string name="alternates_for_o">9,ò,ó,ö,ô,õ,ø,œ,ō,º</string> + <string name="alternates_for_u">7,ú,ü,ù,û,ū</string> + <string name="alternates_for_n">ñ,ń</string> + <string name="alternates_for_c">ç,ć,č</string> + <string name="alternates_for_l">ŀ,ł</string> </resources> diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml index f551d7b80..01de93372 100644 --- a/java/res/values-ca/strings.xml +++ b/java/res/values-ca/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibra en prémer tecles"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"So en prémer una tecla"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Finestra emergent en prémer un botó"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corregeix els errors ortogràfics"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Activa la correcció d\'errors d\'entrada"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Errors d\'entrada en horitzontal"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activa la correcció d\'errors d\'entrada"</string> - <string name="auto_correction" msgid="7911639788808958255">"Suggeriments de paraules"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corregeix automàticament la paraula anterior"</string> - <string name="prediction" msgid="466220283138359837">"Suggeriments de paraules"</string> - <string name="prediction_category" msgid="7027100625580696660">"Configuració de suggeriment de paraules"</string> - <string name="prediction_summary" msgid="459788228830873110">"Activa l\'emplenament automàtic mentre s\'escriu"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Emplenament automàtic"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Augmenta la mida del camp de text"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Amaga els suggeriments de paraules en visualització horitzontal"</string> + <string name="general_category" msgid="1859088467017573195">"General"</string> + <string name="correction_category" msgid="2236750915056607613">"Correcció de text"</string> + <string name="ngram_category" msgid="5337109164339320257">"Suggeriments basats en paraules anteriors"</string> + <string name="misc_category" msgid="6894192814868233453">"Altres opcions"</string> + <string name="advanced_settings" msgid="362895144495591463">"Configuració avançada"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opcions per a usuaris experts"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Retard d\'om. em. de tecla"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sense retard"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predeterminat"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Majúscules automàtiques"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Posa l\'inici d\'una frase en majúscula"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Puntuació automàtica"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Correccions ràpides"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Corregeix els errors d\'ortografia habituals"</string> - <string name="show_suggestions" msgid="507074425254289133">"Mostra els suggeriments"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Visualitza paraules suggerides mentre s\'escriu"</string> - <string name="auto_complete" msgid="1103196318775486023">"Emplenament automàtic"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"La barra espaiadora i la puntuació insereixen automàticament la paraula ressaltada"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostra els suggeriments de correcció"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostra paraules suggerides mentre s\'escriu"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostra sempre"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostra en mode vertical"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Amaga sempre"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Canvi d\'idioma amb la barra espaiadora"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Mostra la tecla de configuració"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automàtic"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostra sempre"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Amaga sempre"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Suggeriments Bigram"</string> + <string name="auto_correction" msgid="4979925752001319458">"Correcció automàtica"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Barra espaiadora i punt. correg. autom. paraules mal escrites"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactiva"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderada"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Total"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Suggeriments Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilitza la paraula anterior per millorar el suggeriment"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Cap"</item> - <item msgid="1669461741568287396">"Bàsic"</item> - <item msgid="4894328801530136615">"Avançat"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Predicció Bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Utilitza també la paraula anterior per a la predicció"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: desada"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Manteniu una tecla premuda per veure\'n les variants (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Premeu la tecla Enrere ↶ per tancar el teclat en qualsevol moment"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Accedeix a números i símbols"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Manteniu premuda la paraula de l\'extrem esquerre per afegir-la al diccionari"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Toqueu aquest suggeriment per continuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Toqueu aquí per tancar aquest suggeriment i començar a escriure."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"S\'obre el teclat cada vegada que toqueu un camp de text"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Manteniu premuda una tecla per veure\'n les variants"\n"(ø, ö, ô, ó, etc.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Toqueu aquesta tecla per canviar als números i als símbols"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Torneu a tocar aquesta tecla per tornar a les lletres"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Manteniu premuda aquesta tecla per canviar la configuració del teclat, com ara l\'emplenament automàtic"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Proveu-ho!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Vés"</string> <string name="label_next_key" msgid="362972844525672568">"Següent"</string> <string name="label_done_key" msgid="2441578748772529288">"Fet"</string> <string name="label_send_key" msgid="2815056534433717444">"Envia"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Més"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada de veu"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualment, l\'entrada de veu no és compatible amb el vostre idioma, però funciona en anglès."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"L\'entrada de veu és una funció experimental que utilitza el reconeixement de la parla en xarxa de Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Per desactivar l\'entada de veu, aneu a la configuració del teclat."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Per utilitzar l\'entrada de veu, premeu el botó del micròfon o feu lliscar el dit pel teclat en pantalla."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'entrada de veu utilitza el reconeixement de veu de Google. S\'hi aplica la "<a href="http://m.google.com/privacy">"Política de privadesa de Google per a mòbils"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per desactivar l\'entada de veu, vés a la configuració del mètode d\'entrada."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Per utilitzar l\'entrada de veu, prem el botó del micròfon."</string> <string name="voice_listening" msgid="467518160751321844">"Parleu ara"</string> <string name="voice_working" msgid="6666937792815731889">"S\'està treballant"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancel·la"</string> <string name="ok" msgid="7898366843681727667">"D\'acord"</string> <string name="voice_input" msgid="2466640768843347841">"Entrada de veu"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Al teclat principal"</item> - <item msgid="8529385602829095903">"Al teclat de símbols"</item> - <item msgid="7283103513488381103">"Desactivat"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Micròfon al teclat principal"</item> - <item msgid="6907837061058876770">"Micròfon al teclat de símbols"</item> - <item msgid="3664304608587798036">"L\'entrada de veu està desactivada"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Enviament automàtic després de la veu"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Prem automàticament Retorn en cercar o en anar al camp següent."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Obrir el teclat"\n</b></font><font size="3">\n</font>"Toqueu qualsevol camp de text."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tancar el teclat"\n</b></font><font size="3">\n</font>"Premeu la tecla Enrere."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Manteniu premuda una tecla per veure les opcions"\n</b></font><font size="3">\n</font>"Accediu a la puntuació i als accents."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Configuració del teclat"\n</b></font><font size="3">\n</font>"Manteniu premuda la tecla "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Al teclat principal"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Al tecl. de símb."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Desactivada"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micro en tecl. princ."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro en tecl. símb."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. veu desactiv."</string> <string name="selectInputMethod" msgid="315076553378705821">"Selecciona el mètode d\'entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomes d\'entrada"</string> <string name="language_selection_summary" msgid="187110938289512256">"Feu lliscar el dit a la barra espaiadora per canviar l\'idioma"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Activa els comentaris de l\'usuari"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ajuda a millorar aquest editor de mètodes d\'entrada enviant automàticament estadístiques d\'ús i informes de bloqueigs a Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Toca per corregir paraules"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Toca les paraules introduïdes per corregir-les"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca les paraules introduïdes per corregir-les, només quan els suggeriments siguin visibles"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema del teclat"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclat"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"veu"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclat txec"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Teclat àrab"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclat danès"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclat alemany"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclat anglès (Regne Unit)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclat anglès (Estats Units)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclat espanyol"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclat francès"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclat francès (Canadà)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclat francès (Suïssa)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Teclat hebreu"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclat italià"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclat noruec"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclat holandès"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclat polonès"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclat portuguès"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclat rus"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclat serbi"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclat suec"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Veu en afrikaans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Veu txeca"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Veu alemanya"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Veu anglesa"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Veu espanyola"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Veu francesa"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Veu italiana"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Veu japonesa"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Veu coreana"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Veu holandesa"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Veu polonesa"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Veu portuguesa"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Veu russa"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Veu turca"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Veu xinesa (Yue)"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Veu xinesa (mandarí)"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Veu en zulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Mode d\'estudi d\'usabilitat"</string> </resources> diff --git a/java/res/values-cs/donottranslate-altchars.xml b/java/res/values-cs/donottranslate-altchars.xml index d91a0e449..541cd2154 100644 --- a/java/res/values-cs/donottranslate-altchars.xml +++ b/java/res/values-cs/donottranslate-altchars.xml @@ -18,17 +18,17 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">áàâãäåæ</string> - <string name="alternates_for_e">3éěèêë</string> - <string name="alternates_for_i">íìîï8</string> - <string name="alternates_for_o">óòôõöœø9</string> - <string name="alternates_for_u">ůúùûü7</string> - <string name="alternates_for_s">š§ß</string> - <string name="alternates_for_n">ňñ</string> - <string name="alternates_for_c">čç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">á,à,â,ä,æ,ã,å,ā</string> + <string name="alternates_for_e">3,é,ě,è,ê,ë,ę,ė,ē</string> + <string name="alternates_for_i">8,í,î,ï,ì,į,ī</string> + <string name="alternates_for_o">9,ó,ö,ô,ò,õ,œ,ø,ō</string> + <string name="alternates_for_u">7,ú,ů,û,ü,ù,ū</string> + <string name="alternates_for_s">š,ß,ś</string> + <string name="alternates_for_n">ň,ñ,ń</string> + <string name="alternates_for_c">č,ç,ć</string> + <string name="alternates_for_y">ý,ÿ</string> <string name="alternates_for_d">ď</string> - <string name="alternates_for_r">ř4</string> - <string name="alternates_for_t">ť5</string> - <string name="alternates_for_z">ž</string> + <string name="alternates_for_r">4,ř</string> + <string name="alternates_for_t">5,ť</string> + <string name="alternates_for_z">6,ž,ź,ż</string> </resources> diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 3bbd758d1..9dbe9ae4e 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Při stisku klávesy vibrovat"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk při stisku klávesy"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Zobrazit znaky při stisku klávesy"</string> - <string name="hit_correction" msgid="4855351009261318389">"Opravovat překlepy"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Povolit opravu chyb vstupu"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Chyby vstupu v zobrazení na šířku"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Povolit opravu chyb vstupu"</string> - <string name="auto_correction" msgid="7911639788808958255">"Návrhy slov"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automaticky opravit předchozí slovo"</string> - <string name="prediction" msgid="466220283138359837">"Návrhy slov"</string> - <string name="prediction_category" msgid="7027100625580696660">"Nastavení návrhů slov"</string> - <string name="prediction_summary" msgid="459788228830873110">"Povolit automatické dokončování při psaní"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatické dokončování"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Zvětšit textové pole"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skrýt návrhy slov v zobrazení na šířku"</string> + <string name="general_category" msgid="1859088467017573195">"Obecné"</string> + <string name="correction_category" msgid="2236750915056607613">"Oprava textu"</string> + <string name="ngram_category" msgid="5337109164339320257">"Návrhy na základě předchozích slov"</string> + <string name="misc_category" msgid="6894192814868233453">"Další možnosti"</string> + <string name="advanced_settings" msgid="362895144495591463">"Pokročilá nastavení"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Možnosti pro zkušené uživatele"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Prodleva vysk. okna kláv."</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Bez prodlevy"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Výchozí"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Velká písmena automaticky"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Zahájit větu velkým písmenem"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatická interpunkce"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Rychlé opravy"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Opravuje nejčastější chyby při psaní"</string> - <string name="show_suggestions" msgid="507074425254289133">"Zobrazit návrhy"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Zobrazovat navržená slova během psaní"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automatické dokončování"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo."</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobrazit návrhy oprav"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Zobrazovat navržená slova během psaní"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vždy zobrazovat"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Zobrazit v režimu na výšku"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vždy skrývat"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Přepínání jazyků mezerníkem"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Zobrazit klávesu Nastavení"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automaticky"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vždy zobrazovat"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vždy skrývat"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Návrh Bigram"</string> + <string name="auto_correction" msgid="4979925752001319458">"Automatické opravy"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Stisknutím mezerníku a interpunkce se automaticky opravují chybně napsaná slova"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Vypnuto"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mírné"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivní"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Návrhy 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="bigram_prediction" msgid="8914273444762259739">"Odhady Bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Použít předchozí slovo také pro odhad"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Uloženo"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Podržením klávesy zobrazíte diakritiku (á, ž apod.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Stisknutím klávesy Zpět ↶ můžete klávesnici kdykoli zavřít."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Přístup k číslům a symbolům"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Stisknutím a podržením slova zcela vlevo toto slovo přidáte do slovníku."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Chcete-li pokračovat, dotkněte se tohoto tipu »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Chcete-li tento tip zavřít a začít psát, dotkněte se zde."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klávesnice se otevře vždy, když se dotknete textového pole."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Přidržením klávesy zobrazíte diakritiku"\n"(ó, ø, ö, ô apod.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Chcete-li přepnout na režim zadávání číslic a symbolů, dotkněte se této klávesy."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Chcete-li přejít zpět k zadávání písmen, dotkněte se této klávesy znovu."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Přidržením této klávesy změníte nastavení klávesnice (např. automatické dokončování)."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Vyzkoušejte si to."</b></string> <string name="label_go_key" msgid="1635148082137219148">"Přejít"</string> <string name="label_next_key" msgid="362972844525672568">"Další"</string> <string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string> <string name="label_send_key" msgid="2815056534433717444">"Odeslat"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"Alt"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Další"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Čekat"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pro váš jazyk aktuálně není hlasový vstup podporován, ale funguje v angličtině."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Hlasový vstup je experimentální funkce, která využívá síťové rozpoznávání řeči společnosti Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Chcete-li vypnout hlasový vstup, přejděte do nastavení klávesnice."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Chcete-li použít hlasový vstup, stiskněte tlačítko mikrofonu nebo přejeďte prstem přes klávesnici na obrazovce."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup používá rozpoznávání hlasu Google a vztahují se na něj "<a href="http://m.google.com/privacy">"Zásady ochrany osobních údajů pro mobilní služby"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Chcete-li vypnout hlasový vstup, přejděte do nastavení metod vstupu."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Chcete-li použít hlasový vstup, stiskněte tlačítko mikrofonu."</string> <string name="voice_listening" msgid="467518160751321844">"Mluvte"</string> <string name="voice_working" msgid="6666937792815731889">"Probíhá zpracování"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Zrušit"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Hlasový vstup"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Na hlavní klávesnici"</item> - <item msgid="8529385602829095903">"Na klávesnici se symboly"</item> - <item msgid="7283103513488381103">"Vypnout"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon na hlavní klávesnici"</item> - <item msgid="6907837061058876770">"Mikrofon na klávesnici se symboly"</item> - <item msgid="3664304608587798036">"Hlasový vstup je deaktivován"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Po hlasovém vstupu automaticky odeslat"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Při vyhledávání nebo přechodu na další pole automaticky stisknout Enter."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otevřete klávesnici"\n</b></font><font size="3">\n</font>"Dotkněte se libovolného textového pole."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zavřete klávesnici"\n</b></font><font size="3">\n</font>"Stiskněte tlačítko Zpět."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Přidržením klávesy zobrazte možnosti"\n</b></font><font size="3">\n</font>"Přístup k interpunkčním znaménkům a diakritice."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Nastavení klávesnice"\n</b></font><font size="3">\n</font>"Dotkněte se klávesy "<b>"?123"</b>" a přidržte ji."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".cz"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".net"</string> - <string name="popular_domain_4" msgid="35359437471311470">".eu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na hlavní klávesnici"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klávesnici se symb."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Vypnuto"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr. na hlav. kláv."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr. na kláv. se symb."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup vypnut"</string> <string name="selectInputMethod" msgid="315076553378705821">"Výběr metody zadávání dat"</string> <string name="language_selection_title" msgid="1651299598555326750">"Vstupní jazyky"</string> <string name="language_selection_summary" msgid="187110938289512256">"Jazyk můžete změnit posunutím prstu po mezerníku."</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Aktivovat zasílání statistik užívání a zpráv o selhání"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Automatickým zasíláním statistik o užívání editoru zadávání dat a zpráv o jeho selhání do Googlu můžete přispět k vylepšení tohoto nástroje."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotykem aktivovat opravy"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Opravy napsaných slov dotykem"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Klepnutím na zadaná slova tato slova opravíte, musí však být viditelné návrhy."</string> <string name="keyboard_layout" msgid="437433231038683666">"Motiv klávesnice"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klávesnice"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"hlas"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Klávesnice – čeština"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Klávesnice – arabština"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Klávesnice – dánština"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Klávesnice – němčina"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Klávesnice – angličtina (VB)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Klávesnice – angličtina (USA)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Klávesnice – španělština"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Klávesnice – francouzština"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Klávesnice – francouzština (Kanada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Klávesnice – francouzština (Švýc.)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Klávesnice – hebrejština"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Klávesnice – italština"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Klávesnice – norština"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Klávesnice – holandština"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polská klávesnice"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalská klávesnice"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Klávesnice – ruština"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Klávesnice – srbština"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Klávesnice – švédština"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voice – afrikánština"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voice – čeština"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voice – němčina"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voice – angličtina"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voice – španělština"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voice – francouzština"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Hlasový vstup – italština"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voice – japonština"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voice – korejština"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Hlasový vstup – holandština"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voice – polština"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voice – portugalština"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voice – ruština"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voice – turečtina"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voice – čínština, kantonština"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voice – čínština, mandarínština"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voice – zulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Režim studie použitelnosti"</string> </resources> diff --git a/java/res/values-da/donottranslate-altchars.xml b/java/res/values-da/donottranslate-altchars.xml index b1cc8b627..46f1644ad 100644 --- a/java/res/values-da/donottranslate-altchars.xml +++ b/java/res/values-da/donottranslate-altchars.xml @@ -18,21 +18,18 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">áàâąã</string> - <string name="alternates_for_e">3éèêëę€</string> - <string name="alternates_for_i">íìîï8</string> - <string name="alternates_for_o">óòôõ9</string> - <string name="alternates_for_u">úùûū7</string> - <string name="alternates_for_s">śšşß</string> - <string name="alternates_for_n">ńñň</string> - <string name="alternates_for_c">çćč</string> - <string name="alternates_for_y">ýÿü6</string> - <string name="alternates_for_d">ðď</string> - <string name="alternates_for_r">ř4</string> - <string name="alternates_for_t">ťþ5</string> - <string name="alternates_for_z">źžż</string> + <string name="alternates_for_a">á,ä,à,â,ã,ā</string> + <string name="alternates_for_e">3,é,ë</string> + <string name="alternates_for_i">8,í,ï</string> + <string name="alternates_for_o">9,ó,ô,ò,õ,œ,ō</string> + <string name="alternates_for_u">7,ú,ü,û,ù,ū</string> + <string name="alternates_for_s">ß,ś,š</string> + <string name="alternates_for_n">ñ,ń</string> + <string name="alternates_for_y">6,ý,ÿ</string> + <string name="alternates_for_d">ð</string> <string name="alternates_for_l">ł</string> - <string name="alternates_for_v">w</string> - <string name="alternates_for_ae">ä</string> - <string name="alternates_for_oe">öœ</string> + <string name="keylabel_for_scandinavia_row2_10">æ</string> + <string name="keylabel_for_scandinavia_row2_11">ø</string> + <string name="alternates_for_scandinavia_row2_10">ä</string> + <string name="alternates_for_scandinavia_row2_11">ö</string> </resources> diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index f1fe6ecc6..b4b4b5ad8 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibration ved tastetryk"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Lyd ved tastetryk"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Popup ved tastetryk"</string> - <string name="hit_correction" msgid="4855351009261318389">"Ret stavefejl"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Aktiver fejlretning af input"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Inputfejl i landskab"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Aktiver fejlretning af input"</string> - <string name="auto_correction" msgid="7911639788808958255">"Ordforslag"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Ret automatisk det forrige ord"</string> - <string name="prediction" msgid="466220283138359837">"Ordforslag"</string> - <string name="prediction_category" msgid="7027100625580696660">"Indstillinger for ordforslag"</string> - <string name="prediction_summary" msgid="459788228830873110">"Aktiver automatisk udfyldelse, når du indtaster"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatisk udfyldelse"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Forøg tekstfeltets størrelse"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skjul ordforslag i landskabsvisning"</string> + <string name="general_category" msgid="1859088467017573195">"Generelt"</string> + <string name="correction_category" msgid="2236750915056607613">"Tekstkorrigering"</string> + <string name="ngram_category" msgid="5337109164339320257">"Forslag baseret på tidligere ord"</string> + <string name="misc_category" msgid="6894192814868233453">"Andre valgmuligheder"</string> + <string name="advanced_settings" msgid="362895144495591463">"Avancerede indstillinger"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Muligheder for ekspertbrugere"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Forsink. afvis. af taste-popup"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Ingen forsink."</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standard"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Skriv aut. med stort"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Første bogstav i en sætning skrives med stort"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Foretag automatisk tegnsætning"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Hurtige løsninger"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Retter almindelige stavefejl"</string> - <string name="show_suggestions" msgid="507074425254289133">"Vis forslag"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Vis ordforslag under indtastning"</string> - <string name="auto_complete" msgid="1103196318775486023">"Udfyld automatisk"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Mellemrumstast og tegnsætning indsætter automatisk fremhævet ord"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Vis rettelsesforslag"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vis ordforslag under indtastning"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vis altid"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Vis i portrættilstand"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Skjul altid"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Brug mellemrumst. som sprogskifter"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Vis indstillingsnøgle"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisk"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vis altid"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Skjul altid"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram-forslag"</string> + <string name="auto_correction" msgid="4979925752001319458">"Automatisk retning"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Mellemrumstast og tegnsætning retter automatisk forkerte ord"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Fra"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Beskeden"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressiv"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Bigram-forudsigelse"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Brug også tidligere ord til forudsigelse"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Gemt"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Hold en tast nede for at se accenter (ø, ö osv.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Tryk på knappen Tilbage ↶ for når som helst at lukke for tastaturet"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Få adgang til tal og symboler"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tryk og hold på ordet længst til venstre for at føje det til ordbogen"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Berør dette tip for at fortsætte »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Berør her for at lukke dette tip og begynde at indtaste!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastaturet åbner når som helst, du berører et tekstfelt"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tryk på en tast, og hold den nede for a vise accenter"\n"(ø, ö, ô, ó osv.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Skift til tal og symboler ved at røre denne tast"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Gå tilbage til bogstaver ved at berøre denne tast igen"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tryk på denne tast, og hold den nede for at ændre tastaturindstillingerne, som f.eks. automatisk udfyldelse"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prøv det!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Gå"</string> <string name="label_next_key" msgid="362972844525672568">"Næste"</string> <string name="label_done_key" msgid="2441578748772529288">"Udfør"</string> <string name="label_send_key" msgid="2815056534433717444">"Send"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Mere"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pause"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Vent"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Stemmeinput"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmeinput understøttes i øjeblikket ikke for dit sprog, men fungerer på engelsk."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Stemme-input er en funktion på forsøgsbasis, som bruger Googles netværksstemmegenkendelse."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Slå stemmeinput fra i indstillingerne for tastaturet."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"For at bruge stemme-input skal du trykke på knappen mikrofon eller lade glide fingeren hen over skærmtastaturet."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Stemmeinput anvender Googles stemmegenkendelse. "<a href="http://m.google.com/privacy">"Fortrolighedspolitikken for mobilenheder"</a>" gælder."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Slå stemmeinput fra i indstillingerne for inputmetode."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Brug stemmeinput ved at trykke på mikrofonknappen."</string> <string name="voice_listening" msgid="467518160751321844">"Tal nu"</string> <string name="voice_working" msgid="6666937792815731889">"Arbejder"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Annuller"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Stemmeinput"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"På hovedtastatur"</item> - <item msgid="8529385602829095903">"På symboltastatur"</item> - <item msgid="7283103513488381103">"Fra"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon på hovedtastatur"</item> - <item msgid="6907837061058876770">"Mikrofon på symboltastatur"</item> - <item msgid="3664304608587798036">"Stemmeinput er deaktiveret"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Send automatisk efter stemme"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Tryk automatisk på enter, når du søger eller går til det næste felt."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Åbn tastaturet"\n</b></font><font size="3">\n</font>"Tryk på et hvilket som helst tekstfelt."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Luk tastaturet"\n</b></font><font size="3">\n</font>"Tryk på knappen Tilbage."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tryk på en tast, og hold den nede for valgmuligheder"\n</b></font><font size="3">\n</font>"Få adgang til tegnsætning og accenter."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastaturindstillinger"\n</b></font><font size="3">\n</font>"Tryk på tasten "<b>"?123"</b>", og hold den nede."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På hovedtastatur"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På symboltastatur"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Fra"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik. på hovedtastatur"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. på symboltastatur"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Stemmeinput deaktiveret"</string> <string name="selectInputMethod" msgid="315076553378705821">"Vælg inputmetode"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inputsprog"</string> <string name="language_selection_summary" msgid="187110938289512256">"Træk fingeren på mellemrumstasten for at skifte sprog"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brugerfeedback"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Vær med til at forbedre denne inputmetode ved at sende anvendelsesstatistikker og rapporter om nedbrud til Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryk for at rette ord"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tryk på de indtastede ord for at rette dem"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tryk på de indtastede ord for at rette dem. Kun når der er synlige forslag."</string> <string name="keyboard_layout" msgid="437433231038683666">"Tastaturtema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatur"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"stemme"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tjekkisk tastatur"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabisk tastatur"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dansk tastatur"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tysk tastatur"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelsk tastatur (Storbritannien)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelsk tastatur (USA)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spansk tastatur"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransk tastatur"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransk tastatur (Canada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransk tastatur (Schweiz)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebraisk tastatur"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiensk tastatur"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norsk tastatur"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Hollandsk tastatur"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polsk tastatur"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugisisk tastatur"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisk tastatur"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbisk tastatur"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svensk tastatur"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans stemme"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tjekkisk stemme"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Tysk stemme"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Engelsk stemme"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spansk stemme"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransk stemme"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italiensk stemme"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japansk stemme"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreansk stemme"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Hollandsk stemme"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polsk stemme"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugisisk stemme"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russisk stemme"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Tyrkisk stemme"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Kinesisk, Yue stemme"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Kinesisk, mandarin stemme"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu stemme"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Tilstand for brugsstudie"</string> </resources> diff --git a/java/res/values-zh-rCN/donottranslate-altchars.xml b/java/res/values-de-rZZ/donottranslate-altchars.xml index c165b11c5..a6f8fc810 100644 --- a/java/res/values-zh-rCN/donottranslate-altchars.xml +++ b/java/res/values-de-rZZ/donottranslate-altchars.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,13 +18,12 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">èéêë</string> - <string name="alternates_for_i">ìíîï</string> - <string name="alternates_for_o">òóôõöœø</string> - <string name="alternates_for_u">ùúûü</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ</string> + <string name="alternates_for_a">ä,â,à,á,æ,ã,å,ā</string> + <string name="alternates_for_e">3,ė</string> + <string name="alternates_for_o">9,ö,ô,ò,ó,õ,œ,ø,ō</string> + <string name="alternates_for_u">7,ü,û,ù,ú,ū</string> + <string name="alternates_for_s">ß,ś,š</string> + <string name="alternates_for_n">ñ,ń</string> + <string name="alternates_for_y">6</string> + <string name="alternates_for_z"></string> </resources> diff --git a/java/res/xml/dictionary.xml b/java/res/values-de/config.xml index 7b770a8b4..272ff326f 100644 --- a/java/res/xml/dictionary.xml +++ b/java/res/values-de/config.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,6 +18,6 @@ */ --> -<dictionary> - <part name = "main" /> -</dictionary>
\ No newline at end of file +<resources> + <bool name="config_require_umlaut_processing">true</bool> +</resources> diff --git a/java/res/values-de/donottranslate-altchars.xml b/java/res/values-de/donottranslate-altchars.xml index df27bce28..8b8b6aed7 100644 --- a/java/res/values-de/donottranslate-altchars.xml +++ b/java/res/values-de/donottranslate-altchars.xml @@ -18,14 +18,12 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">ä</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">ö9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ</string> + <string name="alternates_for_a">ä,â,à,á,æ,ã,å,ā</string> + <string name="alternates_for_e">3,ė</string> + <string name="alternates_for_o">9,ö,ô,ò,ó,õ,œ,ø,ō</string> + <string name="alternates_for_u">7,ü,û,ù,ú,ū</string> + <string name="alternates_for_s">ß,ś,š</string> + <string name="alternates_for_n">ñ,ń</string> + <string name="alternates_for_y"></string> <string name="alternates_for_z">6</string> </resources> diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index e474bd733..01adc52d2 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrieren b. Tastendruck"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Ton bei Tastendruck"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pop-up bei Tastendruck"</string> - <string name="hit_correction" msgid="4855351009261318389">"Eingabefehler korrigieren"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Korrektur von Eingabefehlern aktivieren"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Eingabefehler im Querformat"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Korrektur von Eingabefehlern aktivieren"</string> - <string name="auto_correction" msgid="7911639788808958255">"Wortvorschläge"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Vorheriges Wort automatisch korrigieren"</string> - <string name="prediction" msgid="466220283138359837">"Wortvorschläge"</string> - <string name="prediction_category" msgid="7027100625580696660">"Einstellungen für Wortvorschläge"</string> - <string name="prediction_summary" msgid="459788228830873110">"Automatische Vervollständigung während der Eingabe aktivieren"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autom. vervollständigen"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Textfeld vergrößern"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Wortvorschläge in Querformat ausblenden"</string> + <string name="general_category" msgid="1859088467017573195">"Allgemein"</string> + <string name="correction_category" msgid="2236750915056607613">"Textkorrektur"</string> + <string name="ngram_category" msgid="5337109164339320257">"Vorschläge basieren auf bisherigen Wörtern"</string> + <string name="misc_category" msgid="6894192814868233453">"Sonstige Optionen"</string> + <string name="advanced_settings" msgid="362895144495591463">"Erweiterte Einstellungen"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Optionen für Experten"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Verzög. Schlüssel-Pop-up"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Keine Verzögerung"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standard"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Autom. Groß-/Kleinschr."</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Sätze mit Großbuchstaben beginnen"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Autom. Zeichensetzung"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Quick Fixes"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Korrigiert gängige Tippfehler"</string> - <string name="show_suggestions" msgid="507074425254289133">"Vorschläge anzeigen"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Vorgeschlagene Wörter während des Tippens anzeigen"</string> - <string name="auto_complete" msgid="1103196318775486023">"Autom. vervollständigen"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Leertaste und Interpunktion fügen autom. ein markiertes Wort ein"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Änderungsvorschläge anzeigen"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vorgeschlagene Wörter während des Tippens anzeigen"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Immer anzeigen"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Im Hochformat anzeigen"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Immer ausblenden"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Sprache mit Leertaste ändern"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Einstellungstaste anz."</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisch"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Immer anzeigen"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Immer ausblenden"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigramm-Vorschläge"</string> + <string name="auto_correction" msgid="4979925752001319458">"Autokorrektur"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Korrektur fehlerhafter Wörter durch Leertaste und Satzzeichen"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Aus"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mäßig"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Stark"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Bigramm-Vervollständigung"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Vorheriges Wort auch für Vervollständigung verwenden"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: gespeichert"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Zur Anzeige von Umlauten (ä, ö usw.) Taste gedrückt halten"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Zum Schließen der Tastatur ↶ drücken"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Auf Zahlen und Symbole zugreifen"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Lange auf das Wort ganz links außen drücken, um es zum Wörterbuch hinzuzufügen"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Diesen Hinweis berühren, um fortzufahren »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Hier berühren, um diesen Hinweis zu schließen und mit dem Tippen zu beginnen!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Die Tastatur wird immer dann geöffnet, wenn Sie ein Textfeld berühren."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Halten Sie eine Taste gedrückt, um Akzente anzuzeigen"\n"(ø, ö, ô, ó usw.)."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Wechseln Sie zu Ziffern und Symbolen, indem Sie diese Taste berühren."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Durch erneutes Drücken dieser Taste gelangen Sie zurück zu den Buchstaben."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Halten Sie diese Taste gedrückt, um die Tastatureinstellungen, wie beispielsweise die automatische Vervollständigung, zu ändern."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Probieren Sie es aus!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Los"</string> <string name="label_next_key" msgid="362972844525672568">"Weiter"</string> <string name="label_done_key" msgid="2441578748772529288">"Fertig"</string> <string name="label_send_key" msgid="2815056534433717444">"Senden"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Mehr"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pause"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Warten"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Spracheingabe"</string> - <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spracheingaben werden derzeit nicht für Ihre Sprache unterstützt, funktionieren jedoch in Englisch."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Die Spracheingabe ist eine Funktion im Versuchsstadium, die die vernetzte Spracherkennung von Google verwendet."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Wenn Sie die Spracheingabe deaktivieren möchten, rufen Sie die Tastatureinstellungen auf."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Um die Spracheingabe zu verwenden, drücken Sie die Mikrofontaste oder ziehen Sie Ihren Finger über die Bildschirmtastatur."</string> + <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spracheingaben werden zurzeit nicht für Ihre Sprache unterstützt, funktionieren jedoch in Englisch."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Die Spracheingabe verwendet die Spracherkennung von Google. Es gelten die "<a href="http://m.google.com/privacy">"Google Mobile-Datenschutzbestimmungen"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Rufen Sie zum Deaktivieren der Spracheingabe die Einstellungen für die Eingabemethode auf."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Drücken Sie zur Verwendung der Spracheingabe die Mikrofonschaltfläche."</string> <string name="voice_listening" msgid="467518160751321844">"Jetzt sprechen"</string> <string name="voice_working" msgid="6666937792815731889">"Vorgang läuft"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Abbrechen"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Spracheingabe"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Auf Haupttastatur"</item> - <item msgid="8529385602829095903">"Auf Symboltastatur"</item> - <item msgid="7283103513488381103">"Aus"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon auf Haupttastatur"</item> - <item msgid="6907837061058876770">"Mikrofon auf Symboltastatur"</item> - <item msgid="3664304608587798036">"Spracheingabe ist deaktiviert"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Nach Sprachaufnahme automatisch senden"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Drücken Sie auf die Eingabetaste, wenn Sie einen Suchvorgang durchführen oder zum nächsten Feld wechseln."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Tastatur öffnen"\n</b></font><font size="3">\n</font>"Berühren Sie ein beliebiges Textfeld."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tastatur schließen"\n</b></font><font size="3">\n</font>"Drücken Sie die Zurücktaste."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Für Optionen eine Taste berühren und gedrückt halten"\n</b></font><font size="3">\n</font>"Greifen Sie auf Satzzeichen und Akzente zu."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastatureinstellungen"\n</b></font><font size="3">\n</font>"Berühren und halten Sie die Taste "<b>"?123"</b>" gedrückt."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Auf Haupttastatur"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Auf Symboltastatur"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Aus"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikro auf Haupttastatur"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikro auf Symboltastatur"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spracheingabe deaktiviert"</string> <string name="selectInputMethod" msgid="315076553378705821">"Eingabemethode auswählen"</string> <string name="language_selection_title" msgid="1651299598555326750">"Eingabesprachen"</string> <string name="language_selection_summary" msgid="187110938289512256">"Finger über die Leertaste bewegen, um die Eingabesprache zu wechseln"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Nutzer-Feedback aktivieren"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Tragen Sie zur Verbesserung dieses Eingabemethodeneditors bei, indem Sie automatisch Nutzungsstatistiken und Absturzberichte an Google senden."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Wortkorrektur"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Zum Korrigieren auf eingegebene Wörter tippen"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tippen Sie zum Korrigieren auf eingegebene Wörter (nur, wenn Vorschläge angezeigt werden)."</string> <string name="keyboard_layout" msgid="437433231038683666">"Tastaturdesign"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"Tastatur"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"Sprache"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tschechische Tastatur"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabische Tastatur"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dänische Tastatur"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Deutsche Tastatur"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Englische Tastatur (GB)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Englische Tastatur (USA)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanische Tastatur"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Französische Tastatur"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Französische Tastatur (Kanada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Französische Tastatur (Schweiz)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebräische Tastatur"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italienische Tastatur"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegische Tastatur"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Niederländische Tastatur"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polnische Tastatur"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugiesische Tastatur"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russische Tastatur"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbische Tastatur"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Schwedische Tastatur"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Stimme in Afrikaans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tschechische Sprache"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Deutsche Sprache"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Englische Stimme"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanische Sprache"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Französische Sprache"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italienisch"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanische Sprache"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreanische Sprache"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Niederländisch"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polnische Sprache"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugiesische Sprache"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russische Sprache"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Türkische Sprache"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinesische Stimme (Yue)"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinesische Stimme (Mandarin)"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Stimme in isiZulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modus der Studie zur Benutzerfreundlichkeit"</string> </resources> diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index 5e5c583bf..9d8729ebe 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Δόνηση κατά το πάτημα πλήκτρων"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Ήχος κατά το πάτημα πλήκτρων"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Εμφάνιση με το πάτημα πλήκτρου"</string> - <string name="hit_correction" msgid="4855351009261318389">"Διόρθωση σφαλμάτων πληκτρολόγησης"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Ενεργοποίηση διόρθωσης σφαλμάτων εισόδου"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Σφάλματα οριζόντιας εισαγωγής"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Ενεργοποίηση διόρθωσης σφαλμάτων εισόδου"</string> - <string name="auto_correction" msgid="7911639788808958255">"Υποδείξεις λέξεων"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Αυτόματη διόρθωση της προηγούμενης λέξης"</string> - <string name="prediction" msgid="466220283138359837">"Υποδείξεις λέξεων"</string> - <string name="prediction_category" msgid="7027100625580696660">"Ρυθμίσεις υποδείξεων λέξεων"</string> - <string name="prediction_summary" msgid="459788228830873110">"Ενεργοποίηση αυτόματης συμπλήρωσης κατά την πληκτρολόγηση"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Αυτόματη συμπλήρωση"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Αυξήστε το μέγεθος του πεδίου κειμένου"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Απόκρυψη υποδείξεων λέξεων στην οριζόντια προβολή"</string> + <string name="general_category" msgid="1859088467017573195">"Γενικά"</string> + <string name="correction_category" msgid="2236750915056607613">"Διόρθωση κειμένου"</string> + <string name="ngram_category" msgid="5337109164339320257">"Προτάσεις που βασίζονται σε προηγούμενες λέξεις"</string> + <string name="misc_category" msgid="6894192814868233453">"Άλλες επιλογές"</string> + <string name="advanced_settings" msgid="362895144495591463">"Σύνθετες ρυθμίσεις"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Επιλογές για έμπειρους χρήστες"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Χρόνος εξαφ. αναδ. παραθ."</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Χωρίς καθυστέρ."</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Προεπιλογή"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Αυτόματη χρήση κεφαλαίων"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Κεφαλαίο το πρώτο γράμμα της πρότασης"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Αυτόματος τονισμός"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Γρήγορες διορθώσεις"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Διορθώνει συνηθισμένα λάθη πληκτρολόγησης"</string> - <string name="show_suggestions" msgid="507074425254289133">"Εμφάνιση υποδείξεων"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση"</string> - <string name="auto_complete" msgid="1103196318775486023">"Αυτόματη συμπλήρωση"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Τα πλήκ.διαστήμ.και τονισμού εισάγ.αυτόμ.την επιλ.λέξη"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Εμφάνιση προτάσεων διόρθωσης"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Να εμφανίζεται πάντα"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Εμφάνιση σε λειτουργία κατακόρυφης προβολής"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Πάντα απόκρυψη"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Χρησιμοποιήστε τη δυνατότητα εναλλαγής γλώσσας του πλήκτρου διαστήματος"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Εμφάνιση πλήκτρου ρυθμίσεων"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Αυτόματο"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Να εμφανίζεται πάντα"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Πάντα απόκρυψη"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Προτάσεις bigram"</string> + <string name="auto_correction" msgid="4979925752001319458">"Αυτόματη διόρθωση"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Τα πλήκτρα διαστήματος και στίξης διορθ. αυτόμ. λάθος λέξεις"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Απενεργοποίηση"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Μέτρια"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Υψηλή"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Προτάσεις 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="bigram_prediction" msgid="8914273444762259739">"Πρόβλεψη bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Χρησιμοποιήστε, επίσης, την προηγούμενη λέξη για πρόβλεψη"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Αποθηκεύτηκε"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Κρατήστε πατημένο ένα πλήκτρο για να δείτε τους τονισμένους χαρακτήρες (ø, ö, κ.τ.λ.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Πατήστε το πλήκτρο Πίσω ↶ για να κλείσετε το πληκτρολόγιο ανά πάσα στιγμή"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Πρόσβαση σε αριθμούς και σύμβολα"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Κρατήστε πατημένη τη λέξη στην άκρη αριστερά, για να την προσθέσετε στο λεξικό"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Αγγίξτε αυτή τη συμβουλή για να συνεχίσετε »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Αγγίξτε εδώ για να κλείσετε τη συμβουλή και να ξεκινήσετε την πληκτρολόγηση!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Το πληκτρολόγιο ανοίγει κάθε φορά που αγγίζετε ένα πεδίο κειμένου"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Αγγίξτε και κρατήστε κάποιο πλήκτρο για να προβάλετε τους τονισμένους χαρακτήρες"\n"(ø, ö, ô, ó κ.τ.λ.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Αλλαγή σε αριθμούς και σύμβολα με το πάτημα αυτού του πλήκτρου"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Επιστρέψτε στα γράμματα αγγίζοντας ξανά αυτό το πλήκτρο"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Αγγίξτε και κρατήστε πατημένο αυτό το πληκτρολόγιο για να αλλάξετε τις ρυθμίσεις πληκτρολογίου, όπως η αυτόματη συμπλήρωση"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Δοκιμάστε το!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Μετ."</string> <string name="label_next_key" msgid="362972844525672568">"Επόμενο"</string> <string name="label_done_key" msgid="2441578748772529288">"Τέλος"</string> <string name="label_send_key" msgid="2815056534433717444">"Αποστολή"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ΑΒΓ"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ΑΒΓ"</string> + <string name="label_more_key" msgid="3760239494604948502">"Περισσότερα"</string> + <string name="label_pause_key" msgid="181098308428035340">"Παύση"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Αναμ."</string> <string name="voice_warning_title" msgid="4419354150908395008">"Φωνητική είσοδος"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Η φωνητική είσοδος δεν υποστηρίζεται αυτή τη στιγμή για τη γλώσσα σας, ωστόσο λειτουργεί στα Αγγλικά."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Οι φωνητικές εντολές είναι μια πειραματική λειτουργία, η οποία χρησιμοποιεί τη δικτυακή αναγνώριση ομιλίας της Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Για να απενεργοποιήσετε τη φωνητική είσοδο, μεταβείτε στις ρυθμίσεις πληκτρολογίου."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Για να χρησιμοποιήσετε τις φωνητικές εντολές, πιέστε το κουμπί μικροφώνου ή σύρετε το δάχτυλό σας κατά μήκος του πληκτρολογίου της οθόνης."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Οι φωνητικές εντολές χρησιμοποιούν την τεχνολογία αναγνώρισης φωνής της Google. Ισχύει "<a href="http://m.google.com/privacy">"η Πολιτική Απορρήτου για κινητά"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Για να απενεργοποιήσετε τις φωνητικές εντολές, μεταβείτε στις ρυθμίσεις της μεθόδου εισαγωγής."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Για τη χρήση φωνητικών εντολών, πατήστε το κουμπί του μικροφώνου."</string> <string name="voice_listening" msgid="467518160751321844">"Μιλήστε τώρα"</string> <string name="voice_working" msgid="6666937792815731889">"Σε λειτουργία"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Ακύρωση"</string> <string name="ok" msgid="7898366843681727667">"ΟΚ"</string> <string name="voice_input" msgid="2466640768843347841">"Φωνητική είσοδος"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Στο κύριο πληκτρολόγιο"</item> - <item msgid="8529385602829095903">"Πληκτρολόγιο συμβόλων ενεργοποίησης"</item> - <item msgid="7283103513488381103">"Απενεργοποίηση"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Μικρόφωνο στο κύριο πληκτρολόγιο"</item> - <item msgid="6907837061058876770">"Μικρόφωνο στο πληκτρολόγιο συμβόλων"</item> - <item msgid="3664304608587798036">"Η φωνητική είσοδος είναι απενεργοποιημένη"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Αυτόματη υποβολή μετά από ήχο"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Πατήστε enter αυτόματα κατά την αναζήτηση ή τη μετάβαση στο επόμενο πεδίο."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Ανοίξτε το πληκτρολόγιο"\n</b></font><font size="3">\n</font>"Αγγίξτε οποιοδήποτε πεδίο κειμένου."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Κλείστε το πληκτρολόγιο"\n</b></font><font size="3">\n</font>"Πατήστε το πλήκτρο Πίσω."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Αγγίξτε και κρατήστε ένα πλήκτρο για ορισμό επιλογών"\n</b></font><font size="3">\n</font>"Πρόσβαση στα σημεία στίξης και τονισμού."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Ρυθμίσεις πληκτρολογίου"\n</b></font><font size="3">\n</font>"Αγγίξτε και κρατήστε το πλήκτρο "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Στο κύριο πληκτρολ."</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Πληκτρ. συμβ. ενερ."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Απενεργοποίηση"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Μικ. στο κύριο πληκ."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Μικ. στο πληκ. συμβ."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Απεν. φωνητ. είσοδος"</string> <string name="selectInputMethod" msgid="315076553378705821">"Επιλογή μεθόδου εισόδου"</string> <string name="language_selection_title" msgid="1651299598555326750">"Γλώσσες εισόδου"</string> <string name="language_selection_summary" msgid="187110938289512256">"Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Ενεργοποίηση σχολίων χρηστών"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Βοηθήστε μας να βελτιώσουμε αυτό το πρόγραμμα επεξεργασίας μεθόδου εισόδου στέλνοντας αυτόματα στατιστικά στοιχεία και αναφορές σφαλμάτων στην Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Αγγίξτε για διόρθωση λέξεων"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Αγγίξτε τις λέξεις που εισάγετε για να τις διορθώσετε"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Αγγίξτε τις λέξες για να τις διορθώσετε, μόνο όταν οι προτάσεις είναι ορατές"</string> <string name="keyboard_layout" msgid="437433231038683666">"Θέμα πληκτρολογίου"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"πληκτρολόγιο"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"φωνητική"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Τσεχικό πληκτρολόγιο"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Πληκτρολόγιο με αραβική γραφή"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Δανικό πληκτρολόγιο"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Γερμανικό πληκτρολόγιο"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Αγγλικό (ΗΒ) πληκτρολόγιο"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Αγγλικό (ΗΠΑ) πληκτρολόγιο"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ισπανικό πληκτρολόγιο"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Γαλλικό πληκτρολόγιο"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Γαλλικό (Καναδάς) πληκτρολόγιο"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Γαλλικό (Ελβετία) πληκτρολόγιο"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Πληκτρολόγιο με εβραϊκή γραφή"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Ιταλικό πληκτρολόγιο"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Νορβηγικό πληκτρολόγιο"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Ολλανδικό πληκτρολόγιο"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Πληκτρολόγιο με πολωνικούς χαρακτήρες"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Πορτογαλικό πληκτρολόγιο"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ρωσικό πληκτρολόγιο"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Σερβικό πληκτρολόγιο"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Σουηδικό πληκτρολόγιο"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Αφρικάανς"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Τσεχικά"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Γερμανικά"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Αγγλικά"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Ισπανικά"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Γαλλικά"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Φωνητικές εντολές στα Ιταλικά"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Ιαπωνικά"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Κορεατικά"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Φωνητικές εντολές στα Ολλανδικά"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Πολωνικά"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Πορτογαλικά"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Ρωσικά"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Τουρκικά"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Κινεζικά, Γιούε"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Κινεζικά, Μανδαρινικά"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Ζουλού"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Λειτουργία μελέτης χρηστικότητας"</string> </resources> diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml index 56d666a3c..3a488f4cc 100644 --- a/java/res/values-en-rGB/strings.xml +++ b/java/res/values-en-rGB/strings.xml @@ -26,68 +26,53 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrate on key-press"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Sound on key-press"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pop-up on key press"</string> - <string name="hit_correction" msgid="4855351009261318389">"Correct typing errors"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Enable input error correction"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Landscape input errors"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Enable input error correction"</string> - <string name="auto_correction" msgid="7911639788808958255">"Word suggestions"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automatically correct the previous word"</string> - <string name="prediction" msgid="466220283138359837">"Word suggestions"</string> - <string name="prediction_category" msgid="7027100625580696660">"Word suggestion settings"</string> - <string name="prediction_summary" msgid="459788228830873110">"Enable auto-completion while typing"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Auto-completion"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Increase text field size"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Hide word suggestions in landscape view"</string> + <string name="general_category" msgid="1859088467017573195">"General"</string> + <string name="correction_category" msgid="2236750915056607613">"Text correction"</string> + <string name="ngram_category" msgid="5337109164339320257">"Suggestions based on previous words"</string> + <string name="misc_category" msgid="6894192814868233453">"Other Options"</string> + <string name="advanced_settings" msgid="362895144495591463">"Advanced settings"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Options for expert users"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Key pop-up dismiss delay"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"No delay"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Default"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"Suggest Contact names"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Use names from Contacts for suggestions and corrections"</string> <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Capitalise the start of a sentence"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Auto-punctuate"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Quick fixes"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrects commonly typed mistakes"</string> - <string name="show_suggestions" msgid="507074425254289133">"Show suggestions"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Display suggested words while typing"</string> - <string name="auto_complete" msgid="1103196318775486023">"Auto-complete"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Spacebar and punctuation automatically insert highlighted word"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Show correction suggestions"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Display suggested words while typing"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Always show"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Show on portrait mode"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Always hide"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Use the spacebar language switcher"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Show settings key"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatic"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Always show"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Always hide"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram Suggestions"</string> + <string name="auto_correction" msgid="4979925752001319458">"Auto-correction"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Spacebar and punctuation correct mistyped words automatically"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Off"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Modest"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressive"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Bigram Suggestions"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Use previous word to improve suggestion"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"None"</item> - <item msgid="1669461741568287396">"Basic"</item> - <item msgid="4894328801530136615">"Advanced"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Bigram prediction"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Use previous word also for prediction"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Saved"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Hold a key down to see accents (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Press the back key ↶ to close the keyboard at any point"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Access numbers and symbols"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"press and hold the left-most word to add it to the dictionary"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Touch this hint to continue »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Touch here to close this hint and start typing!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"The keyboard opens any time you touch a text field"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Touch & hold a key to view accents"\n"(ø, ö, ô, ó and so on)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Switch to numbers and symbols by touching this key"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Go back to letters by touching this key again"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Touch & hold this key to change keyboard settings, like auto-complete"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Try it!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Go"</string> <string name="label_next_key" msgid="362972844525672568">"Next"</string> <string name="label_done_key" msgid="2441578748772529288">"Done"</string> <string name="label_send_key" msgid="2815056534433717444">"Send"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"More"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pause"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Wait"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Voice input"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Voice input is not currently supported for your language, but does work in English."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Voice input is an experimental feature using Google\'s networked speech recognition."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"To turn off voice input, go to keyboard settings."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"To use voice input, press the microphone button or slide your finger across the on-screen keyboard."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Voice input uses Google\'s speech recognition. "<a href="http://m.google.com/privacy">"The Mobile Privacy Policy"</a>" applies."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"To turn off voice input, go to input method settings."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"To use voice input, press the microphone button."</string> <string name="voice_listening" msgid="467518160751321844">"Speak now"</string> <string name="voice_working" msgid="6666937792815731889">"Working"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +89,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancel"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Voice input"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"On main keyboard"</item> - <item msgid="8529385602829095903">"On symbols keyboard"</item> - <item msgid="7283103513488381103">"Off"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mic on main keyboard"</item> - <item msgid="6907837061058876770">"Mic on symbols keyboard"</item> - <item msgid="3664304608587798036">"Voice input is disabled"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Auto-submit after voice"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Automatically press enter when searching or going to the next field."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Open the keyboard"\n</b></font><font size="3">\n</font>"Touch any text field."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Close the keyboard"\n</b></font><font size="3">\n</font>"Press the Back key."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Touch & hold a key for options"\n</b></font><font size="3">\n</font>"Access punctuation and accents."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Keyboard settings"\n</b></font><font size="3">\n</font>"Touch & hold the "<b>"?123"</b>" key."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"On main keyboard"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"On symbols keyboard"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Off"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic on main keyboard"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic on symbols keyboard"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Voice input is disabled"</string> <string name="selectInputMethod" msgid="315076553378705821">"Select input method"</string> <string name="language_selection_title" msgid="1651299598555326750">"Input languages"</string> <string name="language_selection_summary" msgid="187110938289512256">"Slide finger on spacebar to change language"</string> @@ -133,8 +103,46 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Enable user feedback"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Help improve this input method editor by sending usage statistics and crash reports automatically to Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Touch to correct words"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Touch words entered to correct them"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Touch words entered to correct them, only when suggestions are visible"</string> <string name="keyboard_layout" msgid="437433231038683666">"Keyboard Theme"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"keyboard"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voice"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Czech Keyboard"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabic Keyboard"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danish Keyboard"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"German Keyboard"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"English (UK) Keyboard"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"English (US) Keyboard"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish Keyboard"</string> + <string name="subtype_mode_fi_keyboard" msgid="3198596464082614532">"Finnish Keyboard"</string> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French Keyboard"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"French (Canada) Keyboard"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"French (Switzerland) Keyboard"</string> + <string name="subtype_mode_hr_keyboard" msgid="7177182405440070112">"Croatian Keyboard"</string> + <string name="subtype_mode_hu_keyboard" msgid="8843338355732633647">"Hungarian Keyboard"</string> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebrew Keyboard"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italian Keyboard"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegian Keyboard"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Dutch Keyboard"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polish keyboard"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portuguese Keyboard"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russian Keyboard"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbian Keyboard"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Swedish Keyboard"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans Voice"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Czech Voice"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"German Voice"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"English Voice"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanish Voice"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"French Voice"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italian Voice"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanese Voice"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korean Voice"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Dutch Voice"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polish Voice"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portuguese Voice"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russian Voice"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkish Voice"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinese, Yue Voice"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinese, Mandarin Voice"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu Voice"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Usability Study Mode"</string> </resources> diff --git a/java/res/values-en/donottranslate-altchars.xml b/java/res/values-en/donottranslate-altchars.xml index 083befa19..29582c950 100644 --- a/java/res/values-en/donottranslate-altchars.xml +++ b/java/res/values-en/donottranslate-altchars.xml @@ -18,10 +18,12 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåāæ</string> - <string name="alternates_for_e">3èéêëē</string> - <string name="alternates_for_i">ìíîïī8</string> - <string name="alternates_for_o">òóôõöōœø9</string> - <string name="alternates_for_u">ùúûüū7</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">à,á,â,ä,æ,ã,å,ā</string> + <string name="alternates_for_e">3,è,é,ê,ë,ē</string> + <string name="alternates_for_i">8,î,ï,í,ī,ì</string> + <string name="alternates_for_o">9,ô,ö,ò,ó,œ,ø,ō,õ</string> + <string name="alternates_for_s">ß</string> + <string name="alternates_for_u">7,û,ü,ù,ú,ū</string> + <string name="alternates_for_n">ñ</string> + <string name="alternates_for_c">ç</string> </resources> diff --git a/java/res/values-el/donottranslate-altchars.xml b/java/res/values-en/whitelist.xml index d3beafade..9395f4c88 100644 --- a/java/res/values-el/donottranslate-altchars.xml +++ b/java/res/values-en/whitelist.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,13 +18,21 @@ */ --> <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> + <!-- + An entry of the whitelist word should be: + 1. (int)frequency + 2. (String)before + 3. (String)after + --> + <string-array name="wordlist_whitelist" translatable="false"> + + <item>255</item> + <item>ill</item> + <item>I\'ll</item> + + <item>255</item> + <item>thisd</item> + <item>this\'d</item> + + </string-array> </resources> diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 0cd8a50a5..048f02eed 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar teclas"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Sonar al pulsar las teclas"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Aviso emergente al pulsar tecla"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corregir errores de escritura"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Habilitar corrección de error de entrada"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Errores de entrada apaisada"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Habilitar corrección de error de entrada"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugerencias de palabras"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corregir automáticamente la palabra anterior"</string> - <string name="prediction" msgid="466220283138359837">"Sugerencias de palabras"</string> - <string name="prediction_category" msgid="7027100625580696660">"Configuración de sugerencia de palabra"</string> - <string name="prediction_summary" msgid="459788228830873110">"Habilitar finalización automática al escribir"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Finalización automática"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar el tamaño del campo de texto"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugerencias de palabras en vista apaisada"</string> + <string name="general_category" msgid="1859088467017573195">"General"</string> + <string name="correction_category" msgid="2236750915056607613">"Corrección de texto"</string> + <string name="ngram_category" msgid="5337109164339320257">"Sugerencias sobre la base de palabras anteriores"</string> + <string name="misc_category" msgid="6894192814868233453">"Otras opciones"</string> + <string name="advanced_settings" msgid="362895144495591463">"Configuración avanzada"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opciones para usuarios expertos"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Demora en rechazo de ventana emergente de clave"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sin demora"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predeterminada"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Poner en mayúscula el inicio de una oración"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Puntuación automática"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Arreglos rápidos"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige errores de escritura comunes"</string> - <string name="show_suggestions" msgid="507074425254289133">"Mostrar sugerencias"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Mostrar palabras sugeridas mientras escribe"</string> - <string name="auto_complete" msgid="1103196318775486023">"Completar automát."</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada."</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugerencias de correcciones"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostrar palabras sugeridas al escribir"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar siempre"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar en modo retrato"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar siempre"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Usa select. de id. de barra espac."</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de configuración"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automático"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar siempre"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ocultar siempre"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Sugerencias de Vigoran"</string> + <string name="auto_correction" msgid="4979925752001319458">"Corrección automática"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"La barra espaciadora y puntuación insertan automáticamente las palabras corregidas"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivado"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderado"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Total"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Sugerencias de bigramas"</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="bigram_prediction" msgid="8914273444762259739">"Predicción de biagramas"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Usar la palabra anterior también para predicción."</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Mantén una tecla presionada para ver los acentos (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Pulsa la tecla hacia atrás ↶ para cerrar el teclado en cualquier momento"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Acceder a números y símbolos"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Presiona y mantén presionada la palabra de la izquierda para agregarla al diccionario"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Toca esta sugerencia para continuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Toca aquí para cerrar esta sugerencia y comenzar a escribir."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"El teclado se abre cada vez que tocas un campo de texto."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Toca y mantén presionada una tecla para ver los acentos"\n"(ø, ö, ô, ó, y así sucesivamente)."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Cambia de números a símbolos tocando esta tecla."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Vuelve a letras tocando esta tecla nuevamente."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Toca y mantén presionada esta tecla para cambiar la configuración del teclado, como completar automáticamente."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"¡Pruébalo!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Ir"</string> <string name="label_next_key" msgid="362972844525672568">"Siguiente"</string> <string name="label_done_key" msgid="2441578748772529288">"Hecho"</string> <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Más"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada por voz"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La entrada por voz no está admitida en tu idioma, pero sí funciona en inglés."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La entrada por voz es una característica experimental que utiliza la red de reconocimiento de voz de Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar la entrada por voz, ve a configuración del teclado."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para realizar entrada por voz, presiona el botón del micrófono o desliza tus dedos por el teclado en pantalla."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada de voz usa el reconocimiento de voz de Google. "<a href="http://m.google.com/privacy">"Se aplica la política de privacidad para"</a>" celulares."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar la entrada de voz, ve a la configuración de métodos de entrada."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para utilizar entrada de voz, presiona el botón micrófono."</string> <string name="voice_listening" msgid="467518160751321844">"Habla ahora"</string> <string name="voice_working" msgid="6666937792815731889">"Procesando"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> <string name="ok" msgid="7898366843681727667">"Aceptar"</string> <string name="voice_input" msgid="2466640768843347841">"Entrada por voz"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"En el teclado principal"</item> - <item msgid="8529385602829095903">"En el teclado de símbolos"</item> - <item msgid="7283103513488381103">"Apagado"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Micrófono en el teclado principal"</item> - <item msgid="6907837061058876770">"Micrófono en el teclado de símbolos"</item> - <item msgid="3664304608587798036">"La entrada por voz está inhabilitada."</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Enviar automáticamente después del audio"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Presionar automáticamente Ingresar al buscar o ir al campo siguiente."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abrir el teclado"\n</b></font><font size="3">\n</font>"Tocar cualquier campo de texto."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Cerrar el teclado"\n</b></font><font size="3">\n</font>"Presionar la tecla Atrás."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tocar & 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 & y mantener presionada la tecla "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"En el teclado principal"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"En el teclado de símbolos"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Desactivado"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micrófono en el teclado principal"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micrófono en el teclado de símbolos"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"La entrada por voz está inhabilitada"</string> <string name="selectInputMethod" msgid="315076553378705821">"Seleccionar método de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> <string name="language_selection_summary" msgid="187110938289512256">"Deslizarse manualmente por la barra espaciadora para cambiar el idioma"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Habilitar los comentarios del usuario"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ayuda a mejorar este editor de método de introducción de texto al enviar las estadísticas de uso y los informes de error a Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corregir palabras"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Toca las palabras ingresadas que desees corregir"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca las palabras ingresadas que desees corregir solo cuando las sugerencias estén visibles."</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema del teclado"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"Teclado"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"Voz"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado en checo"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Teclado árabe"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado en danés"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado en alemán"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado en inglés (Reino Unido)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado en inglés (EE.UU.)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado en español"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado en francés"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado en francés (Canadá)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado en francés (Suiza)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Teclado hebreo"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado en italiano"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado en noruego"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado en holandés"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado polaco"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado en portugués"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado en ruso"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado en serbio"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado en sueco"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz en Afrikaans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz en checo"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz en alemán"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz en inglés"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz en español"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz en francés"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz en japonés"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz en coreano"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz en polaco"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz en portugués"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz en ruso"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz en turco"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz en Yue, chino"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz en mandarín, chino"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz en isiZulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modo estudio de usabilidad"</string> </resources> diff --git a/java/res/values-es/donottranslate-altchars.xml b/java/res/values-es/donottranslate-altchars.xml index 721062d2d..16111ec42 100644 --- a/java/res/values-es/donottranslate-altchars.xml +++ b/java/res/values-es/donottranslate-altchars.xml @@ -18,13 +18,13 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">á</string> - <string name="alternates_for_e">3é</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">ó9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">á,à,ä,â,ã,å,ą,æ,ā,ª</string> + <string name="alternates_for_e">3,é,è,ë,ê,ę,ė,ē</string> + <string name="alternates_for_i">8,í,ï,ì,î,į,ī</string> + <string name="alternates_for_o">9,ó,ò,ö,ô,õ,ø,œ,ō,º</string> + <string name="alternates_for_u">7,ú,ü,ù,û,ū</string> + <string name="alternates_for_n">ñ,ń</string> + <string name="alternates_for_c">ç,ć,č</string> + <string name="alternates_for_punctuation">"\\,,\?,!,¿,¡,:,-,\',\",),(,/,;,+,&,\@"</string> + <string name="alternates_for_web_tab_punctuation">".,\\,,\?,!,¿,¡,:,-,\',\",),(,/,;,+,&,\@"</string> </resources> diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 6e5963fb0..b7fbe96ec 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar tecla"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Sonido al pulsar tecla"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Popup al pulsar tecla"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corregir errores de escritura"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Habilitar la introducción de corrección de errores"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Errores de introducción de datos en vista horizontal"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Habilitar la introducción de corrección de errores"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugerencias de palabras"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corregir automáticamente la palabra anterior"</string> - <string name="prediction" msgid="466220283138359837">"Sugerencias de palabras"</string> - <string name="prediction_category" msgid="7027100625580696660">"Ajustes de sugerencia de palabras"</string> - <string name="prediction_summary" msgid="459788228830873110">"Habilitar Autocompletar al escribir"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autocompletar"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar el tamaño del campo de texto"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugerencias de palabras en la vista horizontal"</string> + <string name="general_category" msgid="1859088467017573195">"General"</string> + <string name="correction_category" msgid="2236750915056607613">"Corrección ortográfica"</string> + <string name="ngram_category" msgid="5337109164339320257">"Sugerencias basadas en palabras anteriores"</string> + <string name="misc_category" msgid="6894192814868233453">"Otras opciones"</string> + <string name="advanced_settings" msgid="362895144495591463">"Ajustes avanzados"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opciones para usuarios expertos"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Retraso de rechazo"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sin retraso"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predeterminado"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Escribir en mayúscula el principio de la frase"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Puntuación automática"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Correcciones rápidas"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige los errores tipográficos que se cometen con más frecuencia."</string> - <string name="show_suggestions" msgid="507074425254289133">"Mostrar sugerencias"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Muestra las palabras sugeridas mientras se escribe."</string> - <string name="auto_complete" msgid="1103196318775486023">"Autocompletar"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"La barra espaciadora y los signos de puntuación insertan automáticamente la palabra resaltada."</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugerencias de correcciones"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Muestra las palabras sugeridas mientras se escribe."</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar siempre"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar en modo vertical"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar siempre"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Utilizar espacio para cambiar idioma"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de ajustes"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automáticamente"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar siempre"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ocultar siempre"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Sugerencias de bigramas"</string> + <string name="auto_correction" msgid="4979925752001319458">"Autocorrección"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Espacio y punt para corregir errores"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivada"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Parcial"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Total"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Predicción de bigramas"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Utilizar también la palabra anterior para realizar la predicción"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Mantén pulsada una tecla para ver los caracteres acentuados (ø, ö, etc.)."</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Pulsa la tecla \"Atrás\" ↶ para cerrar el teclado en cualquier momento."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Acceso a números y símbolos"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Mantén pulsada la palabra situada más a la izquierda para añadirla al diccionario."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Toca esta sugerencia para continuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Toca aquí para cerrar la sugerencia y comenzar a escribir."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"El teclado se abre cada vez que tocas un campo de texto"</b>"."</string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Mantén pulsada una tecla para ver los caracteres acentuados"\n"(ø, ö, ô, ó, etc.)."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Cambiar a números y a símbolos tocando esta tecla"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Volver a las letras tocando esta tecla de nuevo"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Mantén pulsada esta tecla para cambiar la configuración de teclado a, por ejemplo, autocompletar"</b>"."</string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"¡Pruébalo!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Ir"</string> <string name="label_next_key" msgid="362972844525672568">"Sig."</string> <string name="label_done_key" msgid="2441578748772529288">"Listo"</string> <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Más"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Introducción de voz"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente la introducción de voz no está disponible en tu idioma, pero se puede utilizar en inglés."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La introducción de voz es una función en fase experimental que utiliza la tecnología de reconocimiento de voz en red de Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar la función de introducción de voz, accede a la configuración del teclado."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para utilizar la función de introducción de voz, pulsa el botón de micrófono o desliza el dedo por el teclado en pantalla."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada de voz utiliza el reconocimiento de voz de Google. Se aplica la "<a href="http://m.google.com/privacy">"Política de privacidad de Google para móviles"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar la función de entrada de voz, accede a los ajustes del método de introducción de texto."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para utilizar la entrada de voz, pulsa el botón de micrófono."</string> <string name="voice_listening" msgid="467518160751321844">"Habla ahora"</string> <string name="voice_working" msgid="6666937792815731889">"En curso"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> <string name="ok" msgid="7898366843681727667">"Aceptar"</string> <string name="voice_input" msgid="2466640768843347841">"Introducción de voz"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"En teclado principal"</item> - <item msgid="8529385602829095903">"En teclado de símbolos"</item> - <item msgid="7283103513488381103">"Desactivado"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Micrófono en teclado principal"</item> - <item msgid="6907837061058876770">"Micrófono en teclado de símbolos"</item> - <item msgid="3664304608587798036">"La función de introducción de voz no está habilitada."</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Enviar automáticamente después de la introducción de voz"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Pulsar Intro automáticamente al buscar o al pasar al siguiente campo"</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abrir el teclado"\n</b></font><font size="3">\n</font>"Toca cualquier campo de texto."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Cerrar el teclado"\n</b></font><font size="3">\n</font>"Pulsa la tecla \"Atrás\"."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Mantén pulsada una tecla para acceder a las opciones."\n</b></font><font size="3">\n</font>"Accede a los signos de puntuación y a los acentos."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Ajustes del teclado"\n</b></font><font size="3">\n</font>"Mantén pulsada la tecla "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"En teclado principal"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"En teclado de símbolos"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Desactivada"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micro en teclado principal"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro en teclado de símbolos"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entrada de voz inhabilitada"</string> <string name="selectInputMethod" msgid="315076553378705821">"Seleccionar método de introducción de texto"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas"</string> <string name="language_selection_summary" msgid="187110938289512256">"Deslizar el dedo por la barra espaciadora para cambiar el idioma"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Habilitar comentarios de usuarios"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ayuda a mejorar este editor de método de introducción de texto enviando estadísticas de uso e informes de error a Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corregir palabras"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tocar palabras introducidas para corregirlas"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toca las palabras introducidas para corregirlas, solo cuando las sugerencias sean visibles."</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema de teclado"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclado"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voz"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado checo"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Teclado árabe"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado danés"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado alemán"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado inglés (Reino Unido)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado de inglés (EE.UU.)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado español"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado francés"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado francés (Canadá)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado francés (Suiza)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Teclado hebreo"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado italiano"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado noruego"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado holandés"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado polaco"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado portugués"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado ruso"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado serbio"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado sueco"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz afrikáans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Google Voice en checo"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Google Voice en alemán"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz inglesa"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Google Voice en español"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Google Voice en francés"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Google Voice en japonés"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Google Voice en coreano"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Google Voice en polaco"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Google Voice en portugués"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Google Voice en ruso"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Google Voice en turco"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz china (cantonés)"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz china (mandarín)"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz zulú"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modo de estudio de uso"</string> </resources> diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml index cc4391a05..17347b20d 100644 --- a/java/res/values-fa/strings.xml +++ b/java/res/values-fa/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"لرزش با فشار کلید"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"صدا با فشار کلید"</string> <string name="popup_on_keypress" msgid="123894815723512944">"بازشو با فشار کلید"</string> - <string name="hit_correction" msgid="4855351009261318389">"تصحیح خطاهای تایپی"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"فعال کردن تصحیح خطای ورودی"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"خطاهای ورود افقی"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"فعال کردن تصحیح خطای ورودی"</string> - <string name="auto_correction" msgid="7911639788808958255">"پیشنهادات کلمه"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"تصحیح خودکار کلمه قبلی"</string> - <string name="prediction" msgid="466220283138359837">"پیشنهادات کلمه"</string> - <string name="prediction_category" msgid="7027100625580696660">"تنظیمات پیشنهاد کلمه"</string> - <string name="prediction_summary" msgid="459788228830873110">"فعال کردن تکمیل خودکار در حین تایپ"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"تکمیل خودکار"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"افزایش اندازه قسمت متنی"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"پنهان کردن پیشنهادات کلمه در نمای افقی"</string> + <string name="general_category" msgid="1859088467017573195">"کلی"</string> + <string name="correction_category" msgid="2236750915056607613">"تصحیح متن"</string> + <string name="ngram_category" msgid="5337109164339320257">"پیشنهادهایی بر اساس کلمه های قبلی"</string> + <string name="misc_category" msgid="6894192814868233453">"سایر گزینه ها"</string> + <string name="advanced_settings" msgid="362895144495591463">"تنظیمات پیشرفته"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"گزینه هایی برای کاربران حرفه ای"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"تأخیر در رد کردن کلید نمایشی"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"بدون تأخیر"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"پیش فرض"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"نوشتن با حروف بزرگ خودکار"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"بزرگ کردن اول هر جمله"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"نشان گذاری خودکار"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"راه حل های سریع"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"تصحیح خطاهای تایپی رایج"</string> - <string name="show_suggestions" msgid="507074425254289133">"نمایش پیشنهادات"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"نمایش واژه های پیشنهادی در حین تایپ"</string> - <string name="auto_complete" msgid="1103196318775486023">"تکمیل خودکار"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"کلید خط فاصله و علائم نگارشی به صورت خودکار کلمه برجسته شده را وارد می کنند."</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"نمایش پیشنهادات تصحیح"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"نمایش واژه های پیشنهادی در حین تایپ"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"همیشه نمایش داده شود"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"نمایش در حالت عمودی"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"همیشه پنهان شود"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"از ویژگی تعویض زبان کلید فاصله استفاده شود"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"نمایش کلید تنظیمات"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"خودکار"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"همیشه نمایش"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"همیشه پنهان"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"توضیحات بیگرام"</string> + <string name="auto_correction" msgid="4979925752001319458">"تصحیح خودکار"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"کلید فاصله و علائم نگارشی به صورت خودکار کلماتی را که غلط تایپ شده اند تصحیح می کنند"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"خاموش"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"متوسط"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"فعال"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"پیشنهادهای 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="bigram_prediction" msgid="8914273444762259739">"پیش بینی Bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"استفاده از کلمه قبلی برای پیش بینی"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ذخیره شد"</string> - <string name="tip_long_press" msgid="6101270866284343344">"برای مشاهده علائم تکیه (ø، ö و موارد دیگر) کلیدی را پایین نگه دارید"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"برای بستن صفحه کلید در هر نقطه که بخواهید، کلید برگشت ↶ را فشار دهید"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"دسترسی به اعداد و نمادها"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"انتهای سمت چپ واژه را برای افزودن آن به فرهنگ لغت فشار داده و نگه دارید"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"این نکته را برای ادامه لمس کنید »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"برای بستن این نکته و شروع تایپ، اینجا را لمس کنید!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"هر زمان که قسمت متنی را لمس می کنید، صفحه کلید باز می شود"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"یک کلید را برای مشاهده تکیه های صدا لمس کرده و نگه دارید (ø، ö، ô، ó و موارد دیگر)"\n</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"تغییر شماره ها و نمادها با لمس این کلید"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"با لمس مجدد این کلید، به حروف برگردید"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"این کلید را برای تغییر تنظیمات صفحه کلید مانند تکمیل خودکار لمس کرده و فشار دهید"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"امتحان کنید!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"برو"</string> <string name="label_next_key" msgid="362972844525672568">"بعدی"</string> <string name="label_done_key" msgid="2441578748772529288">"انجام شد"</string> <string name="label_send_key" msgid="2815056534433717444">"ارسال"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"بیشتر"</string> + <string name="label_pause_key" msgid="181098308428035340">"توقف موقت"</string> + <string name="label_wait_key" msgid="6402152600878093134">"منتظر بمانید"</string> <string name="voice_warning_title" msgid="4419354150908395008">"ورودی صوتی"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ورودی صوتی در حال حاضر برای زبان شما پشتیبانی نمی شود اما برای زبان انگلیسی فعال است."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"ورودی صوتی یک ویژگی آزمایشی با استفاده از تشخیص گفتار شبکه Google است."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"برای خاموش کردن ورودی صدا، به تنظیمات صفحه کلید بروید."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"برای استفاده از ورودی صوتی، دکمه میکروفن را فشار دهید یا انگشت خود را روی صفحه کلید روی صفحه حرکت دهید."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ورودی صوتی از تشخیص صدای Google استفاده می کند. "<a href="http://m.google.com/privacy">"خط مشی رازداری Mobile "</a>" اعمال می شود."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"برای خاموش کردن ورودی صدا، به تنظیمات روش ورودی بروید."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"برای استفاده از ورودی صوتی، دکمه میکروفن را فشار دهید."</string> <string name="voice_listening" msgid="467518160751321844">"اکنون صحبت کنید"</string> <string name="voice_working" msgid="6666937792815731889">"در حال کار"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"لغو"</string> <string name="ok" msgid="7898366843681727667">"تأیید"</string> <string name="voice_input" msgid="2466640768843347841">"ورودی صوتی"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"در صفحه کلید اصلی"</item> - <item msgid="8529385602829095903">"در صفحه کلید نمادها"</item> - <item msgid="7283103513488381103">"خاموش"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"میکروفن در صفحه کلید اصلی"</item> - <item msgid="6907837061058876770">"میکروفن در صفحه کلید نمادها"</item> - <item msgid="3664304608587798036">"ورودی صوتی غیر فعال شده است"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"ارائه خودکار بعد از صدا"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"هنگام جستجو یا رفتن به قسمت بعدی، Enter را به صورت خودکار فشار دهید."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"صفحه کلید را باز کنید"\n</b></font><font size="3">\n</font>"هر قسمت متنی را لمس کنید."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"بستن صفحه کلید"\n</b></font><font size="3">\n</font>"کلید برگشت را فشار دهید."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"یک کلید را برای گزینه های"\n</b></font><font size="3">\n</font>" دسترسی به علائم نگارشی و تکیه های صدا لمس کرده و نگه دارید."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"تنظیمات صفحه کلید"\n</b></font><font size="3">\n</font>"کلید "<b>"?123"</b>" را لمس کرده و نگهدارید."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"در صفحه کلید اصلی"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"در صفحه کلید نمادها"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"خاموش"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"میکروفن در صفحه کلید اصلی"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"میکروفن در صفحه کلید نمادها"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ورودی صدا غیرفعال است"</string> <string name="selectInputMethod" msgid="315076553378705821">"انتخاب روش ورودی"</string> <string name="language_selection_title" msgid="1651299598555326750">"زبان های ورودی"</string> <string name="language_selection_summary" msgid="187110938289512256">"برای تغییر زبان انگشت را روی کلید فاصله بلغزانید"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"فعال کردن بازخورد کاربر"</string> <string name="prefs_description_log" msgid="5827825607258246003">"با ارسال خودکار آمارهای کاربرد و گزارش های خرابی به Google، به بهبود این ویرایشگر روش ورودی کمک کنید."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"برای تصحیح کلمات لمس کنید"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"برای تصحیح کلمات وارد شده آنها را لمس کنید"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"فقط هنگامی که پیشنهادات قابل مشاهده هستند، برای تصحیح کلمات وارد شده آنها را لمس کنید"</string> <string name="keyboard_layout" msgid="437433231038683666">"طرح زمینه صفحه کلید"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"صفحه کلید"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"صوتی"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"صفحه کلید چک"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"صفحه کلید عربی"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"صفحه کلید دانمارکی"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"صفحه کلید آلمانی"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"صفحه کلید انگلیسی (بریتانیایی)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"صفحه کلید انگلیسی (آمریکایی)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"صفحه کلید اسپانیایی"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"صفحه کلید فرانسوی"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"صفحه کلید فرانسوی (کانادایی)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"صفحه کلید فرانسوی (سوئیس)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"صفحه کلید عبری"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"صفحه کلید ایتالیایی"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"صفحه کلید نروژی"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"صفحه کلید هلندی"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"صفحه کلید لهستانی"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"صفحه کلید پرتغالی"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"صفحه کلید روسی"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"صفحه کلید صربی"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"صفحه کلید سوئدی"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"صدای آفریکانس"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"صدای چک"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"صدای آلمانی"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"صدای انگلیسی"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"صدای اسپانیایی"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"صدای فرانسوی"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"صدای ایتالیایی"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"صدای ژاپنی"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"صدای کره ای"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"صدای هلندی"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"صدای لهستانی"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"صدای پرتغالی"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"صدای روسی"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"صدای ترکی"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"صدای چینی، یوئه"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"صدای چینی، ماندارین"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"صدای ایزی زولو"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"حالت تست قابلیت استفاده"</string> </resources> diff --git a/java/res/values-ko/donottranslate-altchars.xml b/java/res/values-fi/donottranslate-altchars.xml index d3beafade..ff87a3258 100644 --- a/java/res/values-ko/donottranslate-altchars.xml +++ b/java/res/values-fi/donottranslate-altchars.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,13 +18,13 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">æ,à,á,â,ã,ā</string> + <string name="alternates_for_o">9,ø,ô,ò,ó,õ,œ,ō</string> + <string name="alternates_for_u">7,ü</string> + <string name="alternates_for_s">š,ß,ś</string> + <string name="alternates_for_z">ž,ź,ż</string> + <string name="keylabel_for_scandinavia_row2_10">ö</string> + <string name="keylabel_for_scandinavia_row2_11">ä</string> + <string name="alternates_for_scandinavia_row2_10">ø</string> + <string name="alternates_for_scandinavia_row2_11">æ</string> </resources> diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml index 3c36a632e..7fda7c78a 100644 --- a/java/res/values-fi/strings.xml +++ b/java/res/values-fi/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Käytä värinää näppäimiä painettaessa"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Toista ääni näppäimiä painettaessa"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Ponnahdusikkuna painalluksella"</string> - <string name="hit_correction" msgid="4855351009261318389">"Korjaa kirjoitusvirheet"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Ota syöttövirheen korjaus käyttöön"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Vaakasuunnan syöttövirheet"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Ota syöttövirheen korjaus käyttöön"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sanaehdotukset"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Korjaa edellinen sana automaattisesti"</string> - <string name="prediction" msgid="466220283138359837">"Sanaehdotukset"</string> - <string name="prediction_category" msgid="7027100625580696660">"Sanaehdotusasetukset"</string> - <string name="prediction_summary" msgid="459788228830873110">"Ota automaattinen täydennys käyttöön kirjoitettaessa"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automaattinen täydennys"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Suurenna tekstikenttää"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Piilota sanaehdotukset vaakasuuntaisessa näkymässä"</string> + <string name="general_category" msgid="1859088467017573195">"Yleinen"</string> + <string name="correction_category" msgid="2236750915056607613">"Tekstin korjaus"</string> + <string name="ngram_category" msgid="5337109164339320257">"Aiempiin sanoihin perustuvat ehdotukset"</string> + <string name="misc_category" msgid="6894192814868233453">"Muut vaihtoehdot"</string> + <string name="advanced_settings" msgid="362895144495591463">"Lisäasetukset"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Valinnat kokeneille käyttäjille"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Näppäimen hylkäysviive"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Ei viivettä"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Oletus"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Automaattiset isot kirjaimet"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Aloittaa lauseet isolla kirjaimella"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automaattiset välimerkit"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Pikakorjaukset"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Korjaa yleiset kirjoitusvirheet"</string> - <string name="show_suggestions" msgid="507074425254289133">"Näytä ehdotukset"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Näytä sanaehdotukset kirjoitettaessa"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automaattinen täydennys"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Välilyönti ja välimerkki lisäävät automaattisesti korostetun sanan"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Näytä korjausehdotukset"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Näytä sanaehdotukset kirjoitettaessa"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Näytä aina"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Näytä pystysuunnassa"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Piilota aina"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Vaihda kieli välil."</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Näytä asetukset-näppäin"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automaattinen"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Näytä aina"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Piilota aina"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram-ehdotukset"</string> + <string name="auto_correction" msgid="4979925752001319458">"Autom. korjaus"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Välilyönnit ja välimerkit korjaavat väärinkirjoitetut sanat automaattisesti"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Älä käytä"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Osittainen"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Täysi"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Bigram-ehdotukset"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Paranna ehdotusta aiemman sanan avulla"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Ei mitään"</item> - <item msgid="1669461741568287396">"Tavallinen"</item> - <item msgid="4894328801530136615">"Edistynyt"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Bigram-ennakointi"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Käytä edellistä sanaa myös ennakointiin"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Tallennettu"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Näet aksenttimerkit (ø, ö jne.) pitämällä näppäintä painettuna."</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Voit sulkea näppäimistön milloin tahansa painamalla Takaisin-painiketta ↶"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Käytä numeroita ja symboleita"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Lisää vasemmanpuoleinen sana sanakirjaan pitämällä sitä painettuna"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Jatka koskettamalla tätä vihjettä »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Sulje tämä vihje ja aloita kirjoittaa koskettamalla tätä!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Näppäimistö avautuu, kun kosketat tekstikenttää"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Näytä aksenttimerkit pitämällä näppäintä painettuna"\n"(ø, ö, ô, ó ja niin edelleen"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Vaihda numeroihin ja symboleihin koskettamalla tätä näppäintä"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Siirry takaisin kirjaimiin koskettamalla tätä näppäintä uudelleen"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Muuta näppäimistön asetuksia, kuten automaattista täydentämistä, pitämällä tätä näppäintä painettuna"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Kokeile!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Siirry"</string> <string name="label_next_key" msgid="362972844525672568">"Seuraava"</string> <string name="label_done_key" msgid="2441578748772529288">"Valmis"</string> <string name="label_send_key" msgid="2815056534433717444">"Lähetä"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Lisää"</string> + <string name="label_pause_key" msgid="181098308428035340">"Tauko"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Odota"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Äänisyöte"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Äänisyötettä ei vielä tueta kielelläsi, mutta voit käyttää sitä englanniksi."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Äänisyöte on kokeellinen Googlen puheentunnistusta käyttävä ominaisuus."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Siirry näppäimistön asetuksiin poistaaksesi äänisyötteen käytöstä."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Käytä äänisyötettä painamalla mikrofonipainiketta tai liu\'uttamalla sormeasi näytön näppäimistön poikki."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Äänisyöte käyttää Googlen puheentunnistusta. "<a href="http://m.google.com/privacy">"Mobile-tietosuojakäytäntö"</a>" on voimassa."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Siirry syöttöasetuksiin poistaaksesi äänisyötteen käytöstä."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ota äänisyöte käyttöön painamalla mikrofonikuvaketta."</string> <string name="voice_listening" msgid="467518160751321844">"Puhu nyt"</string> <string name="voice_working" msgid="6666937792815731889">"Työstetään"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Peruuta"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Äänisyöte"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Päänäppäimistössä"</item> - <item msgid="8529385602829095903">"Symbolinäppäimistössä"</item> - <item msgid="7283103513488381103">"Pois käytöstä"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Päänäppäimistön mikrofoni"</item> - <item msgid="6907837061058876770">"Symbolinäppäimistön mikrofoni"</item> - <item msgid="3664304608587798036">"Äänisyöte ei ole käytössä"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Lähetä automaattisesti puheen jälkeen"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Paina automaattisesti enter-näppäintä tehdessäsi hakuja tai siirtyessäsi seuraavaan kenttään."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Avaa näppäimistö"\n</b></font><font size="3">\n</font>"Kosketa tekstikenttää."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Sulje näppäimistö"\n</b></font><font size="3">\n</font>"Paina Takaisin-näppäintä."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Näet asetukset pitämällä näppäintä painettuna"\n</b></font><font size="3">\n</font>"Käytä välimerkkejä ja aksenttimerkkejä."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Näppäimistön asetukset"\n</b></font><font size="3">\n</font>"Pidä painettuna"<b>"?123"</b>"-näppäintä."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Päänäppäimistössä"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Symbolinäppäimistössä"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Älä näytä"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr. päänäppäim."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr. symbolinäppäim."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Ääniohjaus on pois käytöstä"</string> <string name="selectInputMethod" msgid="315076553378705821">"Valitse syöttötapa"</string> <string name="language_selection_title" msgid="1651299598555326750">"Syöttökielet"</string> <string name="language_selection_summary" msgid="187110938289512256">"Vaihda kieltä liu\'uttamalla sormea välilyöntinäppäimellä"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Ota käyttäjäpalaute käyttöön"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Auta parantamaan tätä syöttötavan muokkausohjelmaa lähettämällä automaattisesti käyttötietoja ja kaatumisraportteja Googlelle."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Korjaa sanoja koskettamalla"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Korjaa sanoja koskettamalla niitä"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Korjaa annetut sanat napauttamalla. (Vain, kun ehdotuksia on näkyvillä.)"</string> <string name="keyboard_layout" msgid="437433231038683666">"Näppäimistön teema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"näppäimistö"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"ääni"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Näppäimistö: tšekki"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabiankielinen näppäimistö"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Näppäimistö: tanska"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Näppäimistö: saksa"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Näppäimistö: englanti (UK)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Näppäimistö: englanti (US)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Näppäimistö: espanja"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Näppäimistö: ranska"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Näppäimistö: ranska (Kanada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Näppäimistö: ranska (Sveitsi)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hepreankielinen näppäimistö"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Näppäimistö: italia"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Näppäimistö: norja"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Näppäimistö: hollanti"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Näppäimistö: puola"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Näppäimistö: portugali"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Näppäimistö: venäjä"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Näppäimistö: serbia"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Näppäimistö: ruotsi"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Ääni: afrikaans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Ääni: tšekki"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Ääni: saksa"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Ääni: englanti"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Ääni: espanja"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Ääni: ranska"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"italia (ääni)"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Ääni: japani"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Ääni: korea"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"hollanti (ääni)"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Ääni: puola"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Ääni: portugali"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Ääni: venäjä"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Ääni: turkki"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Ääni: kiina, yue"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Ääni: mandariinikiina"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Ääni: isiZulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Käytettävyystutkimustila"</string> </resources> diff --git a/java/res/values-fr/donottranslate-altchars.xml b/java/res/values-fr/donottranslate-altchars.xml index 874d89dab..ae9292f91 100644 --- a/java/res/values-fr/donottranslate-altchars.xml +++ b/java/res/values-fr/donottranslate-altchars.xml @@ -18,15 +18,13 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">1àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">à,â,1,æ,á,ä,ã,å,ā,ª</string> + <string name="alternates_for_e">é,è,ê,ë,3,ę,ė,ē</string> + <string name="alternates_for_i">î,8,ï,ì,í,į,ī</string> + <string name="alternates_for_o">ô,œ,9,ö,ò,ó,õ,ø,ō,º</string> + <string name="alternates_for_u">ù,û,7,ü,ú,ū</string> + <string name="alternates_for_c">ç,ć,č</string> + <string name="alternates_for_y">6,ÿ</string> <string name="alternates_for_q"></string> <string name="alternates_for_w"></string> <string name="alternates_for_z">2</string> diff --git a/java/res/values-fr/donottranslate.xml b/java/res/values-fr/donottranslate.xml index b79df7b37..09c37e31a 100644 --- a/java/res/values-fr/donottranslate.xml +++ b/java/res/values-fr/donottranslate.xml @@ -18,8 +18,12 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Symbols that are commonly considered word separators in this language --> - <string name="word_separators">.\u0009\u0020,;:!?\'\n()[]*&@{}/<>_+=|\u0022</string> - <!-- Symbols that are sentence separators, for purposes of making it hug the last sentence. --> - <string name="sentence_separators">.,</string> + <!-- Symbols that should be swapped with a magic space --> + <string name="magic_space_swapping_symbols">.,\u0022)]}</string> + <!-- Symbols that should strip a magic space --> + <string name="magic_space_stripping_symbols">\u0009\u0020\u0027\n-/_</string> + <!-- Symbols that should promote magic spaces into real space --> + <string name="magic_space_promoting_symbols">;:!?([*&@{<>+=|</string> + <!-- Symbols that do NOT separate words --> + <string name="non_word_separator_symbols">\u0027</string> </resources> diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index 06ba1eae9..2f09277b5 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer à chaque touche"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Son à chaque touche"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Agrandir les caractères"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corriger les fautes de frappe"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Activer la correction des erreurs de saisie"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Erreurs de saisie en mode paysage"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activer la correction des erreurs de saisie"</string> - <string name="auto_correction" msgid="7911639788808958255">"Saisie prédictive"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corriger automatiquement le mot précédent"</string> - <string name="prediction" msgid="466220283138359837">"Saisie prédictive"</string> - <string name="prediction_category" msgid="7027100625580696660">"Paramètres de la saisie prédictive"</string> - <string name="prediction_summary" msgid="459788228830873110">"Activer la saisie semi-automatique"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Saisie semi-automatique"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Agrandir le champ de texte"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Masquer la saisie prédictive en mode paysage"</string> + <string name="general_category" msgid="1859088467017573195">"Général"</string> + <string name="correction_category" msgid="2236750915056607613">"Correction du texte"</string> + <string name="ngram_category" msgid="5337109164339320257">"Suggestions basées sur les mots précédents"</string> + <string name="misc_category" msgid="6894192814868233453">"Autres options"</string> + <string name="advanced_settings" msgid="362895144495591463">"Paramètres avancés"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Options destinées aux utilisateurs expérimentés"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Délai masq. touche pop-up"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Aucun délai"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Par défaut"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Majuscules auto"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Mettre en majuscule la première lettre de chaque phrase"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Ponctuation automatique"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Corrections rapides"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige les fautes de frappe courantes"</string> - <string name="show_suggestions" msgid="507074425254289133">"Afficher les suggestions"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Afficher les suggestions de terme lors de la saisie"</string> - <string name="auto_complete" msgid="1103196318775486023">"Saisie semi-automatique"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Insérer autom. terme surligné (pression sur barre espace/ponctuation)"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Afficher les suggestions de correction"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Afficher les suggestions de terme lors de la saisie"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Toujours afficher"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Afficher en mode Portrait"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Toujours masquer"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Barre d\'espace pour changer langue"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Afficher touche param."</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatique"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Toujours afficher"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Toujours masquer"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Suggestions de type bigramme"</string> + <string name="auto_correction" msgid="4979925752001319458">"Correction auto."</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Corriger autom. orthographe (pression sur barre espace/signes ponctuation)"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Désactiver"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Simple"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Proactive"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Prédiction bigramme"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Utiliser le mot précédent pour la prédiction"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : enregistré"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Maintenir une touche enfoncée pour afficher les accents (à, é, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Appuyez sur la touche Retour ↶ pour fermer le clavier à tout moment."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Accéder aux chiffres et symboles"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Appuyer et maintenir le doigt sur le mot le plus à gauche pour l\'ajouter au dictionnaire"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Touchez ce conseil pour continuer »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Touchez ici pour fermer ce conseil et commencer à saisir votre texte."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Le clavier s\'affiche à chaque fois que vous touchez une zone de texte."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Maintenez une touche enfoncée pour afficher les accents"\n"(ø, ö, ô, ó, etc.)"</b>"."</string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Appuyez sur cette touche pour basculer vers les chiffres et les symboles."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Appuyez de nouveau sur cette touche pour retourner aux lettres."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Maintenez cette touche enfoncée afin de modifier les paramètres du clavier, tels que la saisie semi-automatique."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Essayez !"</b></string> <string name="label_go_key" msgid="1635148082137219148">"OK"</string> <string name="label_next_key" msgid="362972844525672568">"Suivant"</string> <string name="label_done_key" msgid="2441578748772529288">"OK"</string> <string name="label_send_key" msgid="2815056534433717444">"Envoyer"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Plus"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pause"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Attente"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Saisie vocale"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La saisie vocale n\'est pas encore prise en charge pour votre langue, mais elle fonctionne en anglais."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"La saisie vocale est une fonctionnalité expérimentale qui fait appel à la reconnaissance vocale en réseau de Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Pour désactiver la saisie vocale, accédez aux paramètres du clavier."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Pour utiliser la saisie vocale, appuyez sur la touche du microphone ou faites glisser votre doigt sur le clavier à l\'écran."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La saisie vocale fait appel à la reconnaissance vocale de Google. Les "<a href="http://m.google.com/privacy">"Règles de confidentialité Google Mobile"</a>" s\'appliquent."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Pour désactiver la saisie vocale, accédez aux paramètres du mode de saisie."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Pour utiliser la saisie vocale, appuyez sur la touche du microphone."</string> <string name="voice_listening" msgid="467518160751321844">"Parlez maintenant"</string> <string name="voice_working" msgid="6666937792815731889">"Traitement en cours"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Annuler"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Saisie vocale"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Sur le clavier principal"</item> - <item msgid="8529385602829095903">"Sur le clavier des symboles"</item> - <item msgid="7283103513488381103">"Désactivée"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Micro sur le clavier principal"</item> - <item msgid="6907837061058876770">"Micro sur le clavier des symboles"</item> - <item msgid="3664304608587798036">"Saisie vocale désactivée"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Envoi automatique après la saisie vocale"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Appuyez automatiquement sur Entrée pour effectuer une recherche ou accéder au champ suivant."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Ouvrir le clavier"\n</b></font><font size="3">\n</font>"Appuyez sur un champ de texte."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Fermer le clavier"\n</b></font><font size="3">\n</font>"Appuyez sur la touche Retour."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Appuyez sur une touche de manière prolongée pour accéder aux options"\n</b></font><font size="3">\n</font>"Accédez aux signes de ponctuation et aux accents."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Paramètres du clavier"\n</b></font><font size="3">\n</font>"Appuyez sur la touche "<b>"?123"</b>" de manière prolongée."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gouv"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Sur clavier principal"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sur clavier symboles"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Désactiver"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micro clavier principal"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro sur clavier symboles"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Saisie vocale désactivée"</string> <string name="selectInputMethod" msgid="315076553378705821">"Sélectionner un mode de saisie."</string> <string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string> <string name="language_selection_summary" msgid="187110938289512256">"Faites glisser votre doigt sur la barre d\'espacement pour changer la langue."</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Autoriser les commentaires des utilisateurs"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'incident à Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Appuyer pour corriger"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Appuyer sur les mots saisis pour les corriger"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Appuyer sur les mots saisis pour les corriger, uniquement lorsque des suggestions sont visibles"</string> <string name="keyboard_layout" msgid="437433231038683666">"Thème du clavier"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"clavier"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voix"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Clavier tchèque"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Clavier arabe"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Clavier danois"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Clavier allemand"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Clavier anglais (Royaume-Uni)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Clavier anglais (États-Unis)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Clavier espagnol"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Clavier français"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Clavier français (Canada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Clavier français (Suisse)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Clavier hébreu"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Clavier italien"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Clavier norvégien"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Clavier néerlandais"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Clavier polonais"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Clavier portugais"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Clavier russe"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Clavier serbe"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Clavier suédois"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voix parlant afrikaans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voix tchèque"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voix allemande"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voix parlant anglais"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voix espagnole"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voix française"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voix parlant italien"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voix japonaise"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voix coréenne"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voix parlant néerlandais"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voix polonaise"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voix portugaise"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voix russe"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voix turque"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voix parlant chinois (cantonais)"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voix parlant chinois (mandarin)"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voix parlant zoulou"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Mode d\'étude de l\'utilisation"</string> </resources> diff --git a/java/res/values-hdpi/config.xml b/java/res/values-hdpi/config.xml new file mode 100644 index 000000000..7333e9449 --- /dev/null +++ b/java/res/values-hdpi/config.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<resources> + <!-- Screen metrics for logging. 0 = "mdpi", 1 = "hdpi", 2 = "xlarge" --> + <integer name="log_screen_metrics">1</integer> +</resources> diff --git a/java/res/values-hr/donottranslate-altchars.xml b/java/res/values-hr/donottranslate-altchars.xml new file mode 100644 index 000000000..d0c9d4049 --- /dev/null +++ b/java/res/values-hr/donottranslate-altchars.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="alternates_for_s">š,ś,ß</string> + <string name="alternates_for_n">ñ,ń</string> + <string name="alternates_for_y"></string> + <string name="alternates_for_z">6,ž,ź,ż</string> + <string name="alternates_for_c">č,ć,ç</string> + <string name="alternates_for_d">đ</string> +</resources> diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml index a97c95360..b3df4ed05 100644 --- a/java/res/values-hr/strings.xml +++ b/java/res/values-hr/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibracija pri pritisku na tipku"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk pri pritisku tipke"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Povećanja na pritisak tipke"</string> - <string name="hit_correction" msgid="4855351009261318389">"Ispravi pogreške u pisanju"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Omogućavanje ispravka pogreške pri unosu"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Pogreške pri pejzažnom unosu"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Omogućavanje ispravka pogreške pri unosu"</string> - <string name="auto_correction" msgid="7911639788808958255">"Prijedlozi riječi"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automatsko ispravljanje prethodne riječi"</string> - <string name="prediction" msgid="466220283138359837">"Prijedlozi riječi"</string> - <string name="prediction_category" msgid="7027100625580696660">"Postavke prijedloga riječi"</string> - <string name="prediction_summary" msgid="459788228830873110">"Omogućavanje automatskog dovršavanja pri upisivanju"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatsko dovršavanje"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Povećaj tekstualno polje"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Sakrij prijedloge riječi u pejzažnom prikazu"</string> + <string name="general_category" msgid="1859088467017573195">"Općenito"</string> + <string name="correction_category" msgid="2236750915056607613">"Ispravak teksta"</string> + <string name="ngram_category" msgid="5337109164339320257">"Prijedlozi na temelju prethodnih riječi"</string> + <string name="misc_category" msgid="6894192814868233453">"Ostale opcije"</string> + <string name="advanced_settings" msgid="362895144495591463">"Napredne postavke"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opcije za stručne korisnike"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Bez odgode klj. skočnih"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Bez odgode"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Zadano"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Automatsko pisanje velikih slova"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Stavi veliko slovo na početku rečenice"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatsko stavljanje interpunkcije"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Brzi popravci"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Ispravlja uobičajene pogreške u pisanju"</string> - <string name="show_suggestions" msgid="507074425254289133">"Pokaži prijedloge"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Prikazivanje predloženih riječi prilikom upisivanja"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automatsko dovršavanje"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Razmaknica i interpunkcija automatski umeću istaknutu riječ"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokaži prijedloge ispravka"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Prikazivanje predloženih riječi prilikom upisivanja"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Uvijek prikaži"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Prikaži u portretnom načinu"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Uvijek sakrij"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Upotrijebite razmaknicu za prebacivanje jezika"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Prikaži tipku postavki"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatski"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Uvijek prikaži"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Uvijek sakrij"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram prijedlozi"</string> + <string name="auto_correction" msgid="4979925752001319458">"Samoispravak"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Razm. i intrp. aut. ispr. kr. rči."</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Isključeno"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Skromno"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivno"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Bigram prijedlozi"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Upotrijebi prethodnu riječ radi poboljšanja prijedloga"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nijedan"</item> - <item msgid="1669461741568287396">"Osnovni"</item> - <item msgid="4894328801530136615">"Napredno"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Bigram predviđanje"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Upotrijebite prethodnu riječ i za predviđanje"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Spremljeno"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Pritisnite i držite tipku da biste vidjeli naglaske (ø, ö itd.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Pritisnite tipku \"Natrag\" ↶ za zatvaranje tipkovnice"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Pristup brojevima i simbolima"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Pritisnite i držite krajnju lijevu riječ da biste je dodali u rječnik."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Dodirnite ovaj savjet za nastavak »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Dodirnite ovdje da biste zatvorili savjet i počeli upisivati!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tipkovnica se otvara svaki put kada dodirnete tekstualno polje"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Dodirnite i držite tipku da biste vidjeli naglaske"\n"(ø, ö, ô, ó i tako dalje)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Prijeđite na brojeve i simbole dodirom na ovu tipku"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Dodirnite ponovo ovu tipku za povratak na slova"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Dodirnite i držite ovu tipku da biste promijenili postavke tipkovnice, poput automatskog dovršavanja"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Isprobajte!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Idi"</string> <string name="label_next_key" msgid="362972844525672568">"Dalje"</string> <string name="label_done_key" msgid="2441578748772529288">"Gotovo"</string> <string name="label_send_key" msgid="2815056534433717444">"Pošalji"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Više"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Pričekaj"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Glasovni ulaz"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Vaš jezik trenutno nije podržan za glasovni unos, ali radi za engleski."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Glasovni unos je pokusna značajka koja koristi Googleovo umreženo prepoznavanje govora."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Za isključivanje glasovnog unosa idite na postavke tipkovnice."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Da biste koristili glasovni unos pritisnite gumb mikrofona ili kliznite prstom preko tipkovnice na zaslonu."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni unos upotrebljava Googleovo prepoznavanje govora. Primjenjuju se "<a href="http://m.google.com/privacy">"Pravila o privatnosti za uslugu Mobile"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Za isključivanje glasovnog unosa idite na postavke načina unosa."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Za upotrebu glasovnog unosa pritisnite gumb mikrofona."</string> <string name="voice_listening" msgid="467518160751321844">"Govorite sad"</string> <string name="voice_working" msgid="6666937792815731889">"Obrada"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Odustani"</string> <string name="ok" msgid="7898366843681727667">"U redu"</string> <string name="voice_input" msgid="2466640768843347841">"Glasovni ulaz"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Na glavnoj tipkovnici"</item> - <item msgid="8529385602829095903">"Na tipkovnici sa simbolima"</item> - <item msgid="7283103513488381103">"Isključeno"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon na glavnoj tipkovnici"</item> - <item msgid="6907837061058876770">"Mikrofon na tipkovnici sa simbolima"</item> - <item msgid="3664304608587798036">"Glasovni unos je onemogućen"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automatski pošalji nakon glasovnog unosa"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Automatski se pritišće \"Enter\" kad pretražujete ili idete na sljedeće polje."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otvaranje tipkovnice"\n</b></font><font size="3">\n</font>"Dodirnite bilo koje tekstualno polje"</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zatvaranje tipkovnice"\n</b></font><font size="3">\n</font>"Pritisnite tipku \"Natrag\"."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Dodirnite i držite tipku da biste vidjeli opcije"\n</b></font><font size="3">\n</font>"Pristup interpunkciji i naglascima."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Postavke tipkovnice"\n</b></font><font size="3">\n</font>"Dodirnite i držite tipku "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na glavnoj tipkovnici"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na tipkovnici simb."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Isključeno"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik. na gl. tipk."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. na tipk. simb."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. unos onemog."</string> <string name="selectInputMethod" msgid="315076553378705821">"Odabir ulazne metode"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jezici unosa"</string> <string name="language_selection_summary" msgid="187110938289512256">"Kliznite prstom po razmaknici za promjenu jezika"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Omogući korisničke povratne informacije"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Pomozite u poboljšanju ovog urednika ulazne metode automatskim slanjem statistike upotrebe i padova Googleu."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dodirnite za ispravak riječi"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dodirnite unesene riječi radi ispravka"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dodirnite unesene riječi da biste ih ispravili samo kada su prijedlozi vidljivi"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema tipkovnice"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tipkovnica"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"glas"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Češka tipkovnica"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arapska tipkovnica"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danska tipkovnica"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Njemačka tipkovnica"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engleska (UK) tipkovnica"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engleska (SAD) tipkovnica"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španjolska tipkovnica"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francuska tipkovnica"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Francuska (Kanada) tipkovnica"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francuska (Švicarska) tipkovnica"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebrejska tipkovnica"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Talijanska tipkovnica"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveška tipkovnica"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nizozemska tipkovnica"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poljska tipkovnica"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalska tipkovnica"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ruska tipkovnica"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Srpska tipkovnica"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švedska tipkovnica"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"afrikaans glasovno"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Češki glasovni"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Njemački glasovni"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"engleski glasovno"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Španjolski glas"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Francuski glas"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Talijanski glas"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanski glas"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korejski glas"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Nizozemski glas"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Poljski glas"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugalski glas"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Ruski glas"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turski glas"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"kineski, Yue glasovno"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"kineski, mandarinski glasovno"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu glasovno"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Način studije upotrebljivosti"</string> </resources> diff --git a/java/res/values-zh-rTW/donottranslate-altchars.xml b/java/res/values-hu/donottranslate-altchars.xml index c165b11c5..ae28cc5b8 100644 --- a/java/res/values-zh-rTW/donottranslate-altchars.xml +++ b/java/res/values-hu/donottranslate-altchars.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,13 +18,11 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">èéêë</string> - <string name="alternates_for_i">ìíîï</string> - <string name="alternates_for_o">òóôõöœø</string> - <string name="alternates_for_u">ùúûü</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ</string> + <string name="alternates_for_a">á,à,â,ä,æ,ã,å,ā</string> + <string name="alternates_for_e">3,é,è,ê,ë,ę,ė,ē</string> + <string name="alternates_for_i">8,í,î,ï,ì,į,ī</string> + <string name="alternates_for_o">9,ó,ö,ő,ô,ò,õ,œ,ø,ō</string> + <string name="alternates_for_u">7,ú,ü,ű,û,ù,ū</string> + <string name="alternates_for_y"></string> + <string name="alternates_for_z">6</string> </resources> diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml index 7c2f2164f..aed535ab0 100644 --- a/java/res/values-hu/strings.xml +++ b/java/res/values-hu/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Rezgés billentyű megnyomása esetén"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Hangjelzés billentyű megnyomása esetén"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Legyen nagyobb billentyű lenyomásakor"</string> - <string name="hit_correction" msgid="4855351009261318389">"Gépelési hibák kijavítása"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Beviteli hibák javításának engedélyezése"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Fekvő beviteli hibák"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Beviteli hibák javításának engedélyezése"</string> - <string name="auto_correction" msgid="7911639788808958255">"Szójavaslatok"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Az előző szó automatikus kijavítása"</string> - <string name="prediction" msgid="466220283138359837">"Szójavaslatok"</string> - <string name="prediction_category" msgid="7027100625580696660">"Szójavaslati beállítások"</string> - <string name="prediction_summary" msgid="459788228830873110">"Automatikus kiegészítés engedélyezése gépelés közben"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatikus kiegészítés"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"A szövegmező méretének növelése"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Szójavaslatok elrejtése fekvő nézetben"</string> + <string name="general_category" msgid="1859088467017573195">"Általános"</string> + <string name="correction_category" msgid="2236750915056607613">"Szövegjavítás"</string> + <string name="ngram_category" msgid="5337109164339320257">"Javaslatok korábbi szavak alapján"</string> + <string name="misc_category" msgid="6894192814868233453">"Egyéb beállítások"</string> + <string name="advanced_settings" msgid="362895144495591463">"Speciális beállítások"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Beállítások gyakorlott felhasználóknak"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Gombeltüntetés késése"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Nincs késés"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Alapbeállítás"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Automatikusan nagy kezdőbetű"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Nagybetűvel kezdi a mondatot"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatikus központozás"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Gyorsjavítások"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Kijavítja a gyakori gépelési hibákat"</string> - <string name="show_suggestions" msgid="507074425254289133">"Javaslatok megjelenítése"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"A javasolt szavak megjelenítése gépelés közben"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automatikus kiegészítés"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"A szóköz és az írásjelek használata automatikusan beszúrja a kiemelt szót"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Javítási ajánlások megjelenítése"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"A javasolt szavak megjelenítése gépelés közben"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mindig látszik"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Megjelenítés álló tájolásban"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Mindig rejtve"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Nyelvváltó: szóköz"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Beállítások billentyű megjelenítése"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatikus"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mindig látszik"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Mindig rejtve"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram javaslatok"</string> + <string name="auto_correction" msgid="4979925752001319458">"Automatikus javítás"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Szóköz és központozás automatikusan javítja az elgépelést"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Ki"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mérsékelt"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresszív"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Bigram javaslatok"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Előző szó használata a javaslatok javításához"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nincs"</item> - <item msgid="1669461741568287396">"Alap"</item> - <item msgid="4894328801530136615">"Speciális"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Bigram előrejelzés"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Az előző szó használata a prediktív bevitelhez is"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : mentve"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Az ékezetes betűk megtekintéséhez tartsa lenyomva valamelyik billentyűt (ø, ö stb.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"A vissza gomb ↶ megnyomásával bármikor elrejtheti a billentyűzetet"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Számok és szimbólumok elérése"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"A szótárhoz történő hozzáadásához nyomja meg hosszan a bal oldali legszélső szót"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"A folytatáshoz érintse meg ezt a tippet »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Érintse meg itt a tipp bezárásához és a gépelés megkezdéséhez."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Szövegmező megérintésekor a billentyűzet mindig megjelenik"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Érintse meg és tartsa lenyomva valamelyik billentyűt az ékezetes betűk megtekintéséhez"\n"(ø, ö, ô, ó stb.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Számokra és szimbólumokra ennek a billentyűnek a megérintésével válthat"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"A billentyű újbóli megérintésével visszatérhet a betűkhöz"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Érintse meg és tartsa lenyomva ezt a billentyűt a billentyűzet-beállítások (pl. az automatikus kiegészítés) módosításához"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Próbálja ki!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Ugrás"</string> <string name="label_next_key" msgid="362972844525672568">"Tovább"</string> <string name="label_done_key" msgid="2441578748772529288">"Kész"</string> <string name="label_send_key" msgid="2815056534433717444">"Küldés"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Egyebek"</string> + <string name="label_pause_key" msgid="181098308428035340">"Szün."</string> + <string name="label_wait_key" msgid="6402152600878093134">"Vár"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Hangbevitel"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A hangbevitel szolgáltatás jelenleg nem támogatja az Ön nyelvét, ám angolul működik."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A hangbevitel a Google hálózati beszédfelismerését alkalmazó kísérleti funkció."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"A hangbevitelt a billentyűzet beállításai között lehet kikapcsolni."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"A hangbevitel használatához nyomja meg a mikrofon gombját vagy húzza végig az ujját a képernyő-billentyűzeten."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A hangbevitel a Google beszédfelismerő technológiáját használja, amelyre a "<a href="http://m.google.com/privacy">"Mobil adatvédelmi irányelvek"</a>" érvényesek."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"A hangbevitelt a beviteli mód beállításai között lehet kikapcsolni."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"A hangbevitel használatához nyomja meg a mikrofon gombot."</string> <string name="voice_listening" msgid="467518160751321844">"Most beszéljen"</string> <string name="voice_working" msgid="6666937792815731889">"Feldolgozás"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Mégse"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Hangbevitel"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Főbillentyűzeten"</item> - <item msgid="8529385602829095903">"Szimbólumbillentyűzeten"</item> - <item msgid="7283103513488381103">"Ki"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon a főbillentyűzeten"</item> - <item msgid="6907837061058876770">"Mikrofon a szimbólumbillentyűzeten"</item> - <item msgid="3664304608587798036">"A hangbevitel ki van kapcsolva"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automatikus küldés a beszéd után"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Az Enter automatikus megnyomása keresés vagy a következő mezőre ugrás során."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"A billentyűzet megjelenítése"\n</b></font><font size="3">\n</font>"Érintse meg valamelyik szövegmezőt."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"A billentyűzet bezárása"\n</b></font><font size="3">\n</font>"Nyomja meg a Vissza billentyűt."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"A lehetőségek megjelenítéséhez érintse meg és tartsa lenyomva valamelyik billentyűt"\n</b></font><font size="3">\n</font>"Az írásjelek és az ékezetes betűk elérése."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Billentyűzetbeállítások"\n</b></font><font size="3">\n</font>"Érintse meg és tartsa lenyomva a "<b>"?123"</b>" billentyűt."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"A fő billentyűzeten"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Szimbólumoknál"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Ki"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr. a billentyűzeten"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr. a szimbólumoknál"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hangbevivel KI"</string> <string name="selectInputMethod" msgid="315076553378705821">"Beviteli mód kiválasztása"</string> <string name="language_selection_title" msgid="1651299598555326750">"Beviteli nyelvek"</string> <string name="language_selection_summary" msgid="187110938289512256">"A nyelv módosításához húzza végig az ujját a szóköz billentyűn"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Felhasználói visszajelzés engedélyezése"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Segíthet ennek a beviteli módszernek a javításában, ha engedélyezi a használati statisztikák és a hibajelentések elküldését a Google-nak."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Javítás a szavak megérintésével"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"A beírt szavakat megérintve kijavíthatja őket"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"A beírt szavakat csak akkor javíthatja ki megérintve, ha látszanak javaslatok"</string> <string name="keyboard_layout" msgid="437433231038683666">"Billentyűzettéma"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"billentyűzet"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"hang"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Cseh billentyűzet"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arab billentyűzet"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dán billentyűzet"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Német billentyűzet"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angol (UK) billentyűzet"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angol (US) billentyűzet"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanyol billentyűzet"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francia billentyűzet"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Francia (kanadai) billentyűzet"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Francia (svájci) billentyűzet"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Héber billentyűzet"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Olasz billentyűzet"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvég billentyűzet"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holland billentyűzet"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Lengyel billentyűzet"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugál billentyűzet"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Orosz billentyűzet"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Szerb billentyűzet"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svéd billentyűzet"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans hang"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Cseh hang"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Német hang"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Angol hang"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanyol hang"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Francia hang"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Olasz hang"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japán hang"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreai hang"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Holland hang"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Lengyel hang"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugál hang"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Orosz hang"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Török hang"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Kínai (jüe) hang"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Kínai (mandarin) hang"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu hang"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Használhatóság - tanulás mód"</string> </resources> diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml index 73b57c7bd..97706d031 100644 --- a/java/res/values-in/strings.xml +++ b/java/res/values-in/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar jika tombol ditekan"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Berbunyi jika tombol ditekan"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Muncul saat tombol ditekan"</string> - <string name="hit_correction" msgid="4855351009261318389">"Perbaiki kesalahan ketik"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Aktifkan perbaikan galat masukan"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Galat masukan lanskap"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Aktifkan perbaikan galat masukan"</string> - <string name="auto_correction" msgid="7911639788808958255">"Saran kata"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Perbaiki kata sebelumnya secara otomatis"</string> - <string name="prediction" msgid="466220283138359837">"Saran kata"</string> - <string name="prediction_category" msgid="7027100625580696660">"Setelan saran kata"</string> - <string name="prediction_summary" msgid="459788228830873110">"Aktifkan pengisian otomatis saat mengetik"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Pengisian otomatis"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Tambah ukuran bidang teks"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Sembunyikan saran kata dalam tampilan melintang"</string> + <string name="general_category" msgid="1859088467017573195">"Umum"</string> + <string name="correction_category" msgid="2236750915056607613">"Koreksi teks"</string> + <string name="ngram_category" msgid="5337109164339320257">"Saran berdasarkan kata sebelumnya"</string> + <string name="misc_category" msgid="6894192814868233453">"Opsi lain"</string> + <string name="advanced_settings" msgid="362895144495591463">"Setelan lanjutan"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Pilihan untuk pengguna ahli"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Tundaan singkir munculan kunci"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Tanpa penundaan"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Bawaan"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Kapitalisasi otomatis"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Kapitalisasi awal kalimat"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Beri tanda baca otomatis"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Perbaikan cepat"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Memperbaiki kesalahan ketik umum"</string> - <string name="show_suggestions" msgid="507074425254289133">"Perlihatkan saran"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Tampilkan kata yang disarankan ketika mengetik"</string> - <string name="auto_complete" msgid="1103196318775486023">"Pengisian otomatis"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Bilah spasi dan tanda baca secara otomatis memasukkan kata yang disorot"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Tampilkan saran koreksi"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Tampilkan kata yang disarankan ketika mengetik"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Selalu tampilkan"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Tampilkan pada mode potret"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Selalu sembunyikan"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Gunakan pengalih bahasa bilah spasi"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Lihat tombol setelan"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Otomatis"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Selalu tampilkan"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Selalu sembunyikan"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Saran Bigram"</string> + <string name="auto_correction" msgid="4979925752001319458">"Koreksi otomatis"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Bilah spasi dan tanda baca secara otomatis dikoreksi pada kata yang salah ketik"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Mati"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Sederhana"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresif"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Saran bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Gunakan kata sebelumnya untuk meningkatkan sara"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Tak Satu Pun"</item> - <item msgid="1669461741568287396">"Dasar"</item> - <item msgid="4894328801530136615">"Lanjutan"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Prediksi bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Gunakan kata sebelumnya juga untuk prediksi"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Telah disimpan"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Tahan tombol untuk melihat aksen (ø, ö, dll.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Tekan tombol kembali ↶ untuk menutup keyboard kapan saja"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Akses angka dan simbol"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tekan terus kata yang paling kiri untuk menambahkannya ke kamus"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Sentuh petunjuk ini untuk melanjutkan »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Sentuh di sini untuk menutup petunjuk dan mulailah mengetik!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Keyboard terbuka setiap kali Anda menyentuh bidang teks"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Sentuh & tahan tombol untuk melihat aksen"\n"(ø, ö, ô, ó, dan seterusnya)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Beralih ke angka dan simbol dengan menekan tombol ini"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Kembali ke huruf dengan menekan tombol ini lagi"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Sentuh & tahan tombol ini untuk mengubah setelan keyboard, seperti lengkapi otomatis"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Cobalah!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Buka"</string> <string name="label_next_key" msgid="362972844525672568">"Berikutnya"</string> <string name="label_done_key" msgid="2441578748772529288">"Selesai"</string> <string name="label_send_key" msgid="2815056534433717444">"Kirimkan"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Lainnya"</string> + <string name="label_pause_key" msgid="181098308428035340">"Jeda"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Tunggu"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Masukan suara"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Masukan suara saat ini tidak didukung untuk bahasa Anda, tetapi bekerja dalam Bahasa Inggris."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Masukan suara adalah fitur eksperimental yang menggunakan pengenal suara berjaringan Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Untuk mematikan masukan suara, buka setelan keyboard."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Untuk menggunakan masukan suara, tekan tombol mikrofon atau geser jari Anda di sepanjang keyboard pada layar."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Masukan suara menggunakan pengenalan ucapan Google. "<a href="http://m.google.com/privacy">"Kebijakan Privasi Seluler"</a>" berlaku."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Untuk mematikan masukan suara, buka setelan metode masukan."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Untuk menggunakan masukan suara, tekan tombol mikrofon."</string> <string name="voice_listening" msgid="467518160751321844">"Ucapkan sekarang"</string> <string name="voice_working" msgid="6666937792815731889">"Bekerja"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Batal"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Masukan suara"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Di keyboard utama"</item> - <item msgid="8529385602829095903">"Di keyboard simbol"</item> - <item msgid="7283103513488381103">"Mati"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mik di keyboard utama"</item> - <item msgid="6907837061058876770">"Mik di keyboard simbol"</item> - <item msgid="3664304608587798036">"Masukan suara dinonaktifkan"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Kirim otomatis setelah suara"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Tekan enter secara otomatis saat menelusuri atau menuju ke bidang berikutnya."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Buka keyboard"\n</b></font><font size="3">\n</font>"Sentuh bidang teks mana pun."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tutup keyboard"\n</b></font><font size="3">\n</font>"Tekan tombol Kembali."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Sentuh & tahan tombol tertentu untuk opsi"\n</b></font><font size="3">\n</font>"Akses tanda baca dan aksen."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Setelan keyboard"\n</b></font><font size="3">\n</font>"Sentuh & tahan tombol "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pada keyboard utama"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pada keyboard simbol"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Mati"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik pada keyboard utama"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik pada keyboard simbol"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Masukan suara dinonaktifkan"</string> <string name="selectInputMethod" msgid="315076553378705821">"Pilih metode masukan"</string> <string name="language_selection_title" msgid="1651299598555326750">"Bahasa masukan"</string> <string name="language_selection_summary" msgid="187110938289512256">"Geser jari pada bilah spasi untuk mengubah bahasa"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Aktifkan umpan balik pengguna"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Bantu tingkatkan metode editor masukan dengan mengirim statistik penggunaan dan laporan kerusakan ke Google secara otomatis."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Sentuh untuk memperbaiki kata"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Sentuh kata yang dimasukkan untuk memperbaikinya"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Sentuh kata yang dimasukkan untuk memperbaikinya, hanya saat saran dapat dilihat"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema Keyboard"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"keyboard"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"suara"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Keyboard Cheska"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Papan Tombol Arab"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Keyboard Denmark"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Keyboard Jerman"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Keyboard Inggris (Britania Raya)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Keyboard Inggris (AS)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Keyboard Spanyol"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Keyboard Prancis"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Keyboard Prancis (Kanada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Keyboard Prancis (Swiss)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Papan tombol Ibrani"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Keyboard Italia"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Keyboard Norwegia"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Keyboard Belanda"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Keyboard bahasa Polski"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Keyboard Portugis"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Keyboard Rusia"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Keyboard Serbia"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Keyboard Swedia"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Suara Bahasa Afrika"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Suara Bahasa Cheska"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Suara Bahasa Jerman"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Suara Bahasa Inggris"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Suara Bahasa Spanyol"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Suara Bahasa Prancis"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Suara Bahasa Italia"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Suara Bahasa Jepang"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Suara Bahasa Korea"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Suara Bahasa Belanda"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Suara Bahasa Polandia"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Suara Bahasa Portugis"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Suara Bahasa Rusia"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Suara Bahasa Turki"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Suara Bahasa China, Yue"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Suara Bahasa China, Mandarin"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Suara Zulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Mode Studi Daya Guna"</string> </resources> diff --git a/java/res/values-it/donottranslate-altchars.xml b/java/res/values-it/donottranslate-altchars.xml index 23960171b..1131d4852 100644 --- a/java/res/values-it/donottranslate-altchars.xml +++ b/java/res/values-it/donottranslate-altchars.xml @@ -18,13 +18,9 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àá</string> - <string name="alternates_for_e">3èé</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òó9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">à,á,â,ä,æ,ã,å,ā,ª</string> + <string name="alternates_for_e">3,è,é,ê,ë,ę,ė,ē</string> + <string name="alternates_for_i">8,ì,í,î,ï,į,ī</string> + <string name="alternates_for_o">9,ò,ó,ô,ö,õ,œ,ø,ō,º</string> + <string name="alternates_for_u">7,ù,ú,û,ü,ū</string> </resources> diff --git a/java/res/values-it/donottranslate.xml b/java/res/values-it/donottranslate.xml index 3e3f3ef2a..adb2a9a9d 100644 --- a/java/res/values-it/donottranslate.xml +++ b/java/res/values-it/donottranslate.xml @@ -18,6 +18,6 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Symbols that are commonly considered word separators in this language --> - <string name="word_separators">.\u0009\u0020,;:!?\'\n()[]*&@{}/<>_+=|\u0022</string> + <!-- Symbols that do NOT separate words --> + <string name="non_word_separator_symbols"></string> </resources> diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 3768dc230..eb902e049 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrazione tasti"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Suono tasti"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Popup sui tasti"</string> - <string name="hit_correction" msgid="4855351009261318389">"Correggi errori di digitazione"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Attiva la correzione degli errori di inserimento"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Errori di inserimento in visualizzazione orizzontale"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Attiva la correzione degli errori di inserimento"</string> - <string name="auto_correction" msgid="7911639788808958255">"Suggerimenti parola"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Correggi automaticamente la parola precedente"</string> - <string name="prediction" msgid="466220283138359837">"Suggerimenti parola"</string> - <string name="prediction_category" msgid="7027100625580696660">"Impostazioni suggerimento parole"</string> - <string name="prediction_summary" msgid="459788228830873110">"Attiva il completamento automatico durante la digitazione"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Completamento automatico"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Aumenta dimensioni campo di testo"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Nascondi i suggerimenti delle parole in visualizzazione orizzontale"</string> + <string name="general_category" msgid="1859088467017573195">"Generali"</string> + <string name="correction_category" msgid="2236750915056607613">"Correzione testo"</string> + <string name="ngram_category" msgid="5337109164339320257">"Suggerimenti in base alle parole precedenti"</string> + <string name="misc_category" msgid="6894192814868233453">"Altre opzioni"</string> + <string name="advanced_settings" msgid="362895144495591463">"Impostazioni avanzate"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opzioni per utenti esperti"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Ritardo eliminaz. popup tasto"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Nessun ritardo"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predefinito"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Maiuscole automatiche"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Rendi maiuscole le iniziali delle frasi"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Punteggiatura automat."</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Correzioni veloci"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Corregge gli errori di digitazione più comuni"</string> - <string name="show_suggestions" msgid="507074425254289133">"Mostra suggerimenti"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Visualizza le parole suggerite durante la digitazione"</string> - <string name="auto_complete" msgid="1103196318775486023">"Completamento autom."</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Barra spaziatrice e punteggiatura inseriscono la parola evidenziata"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostra suggerimenti correzioni"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Visualizza le parole suggerite durante la digitazione"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostra sempre"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostra in modalità verticale"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Nascondi sempre"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Selettore lingua da barra spaziatrice"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Mostra tasto impostaz."</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatico"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostra sempre"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Nascondi sempre"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Suggerimenti sui bigrammi"</string> + <string name="auto_correction" msgid="4979925752001319458">"Correzione automatica"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Barra spaziatrice/punteggiatura correggono parole con errori"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Off"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Media"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Massima"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Previsione bigramma"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Usa anche la parola precedente per la previsione"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : parola salvata"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Tieni premuto un tasto per vedere le lettere con segni diacritici (ø, ö etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Premi il tasto Indietro ↶ per chiudere la tastiera"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Accedi a numeri e simboli"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tieni premuto sulla parola all\'estrema sinistra per aggiungerla al dizionario"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Tocca questo suggerimento per continuare »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Tocca qui per chiudere questo suggerimento e iniziare a digitare."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"La tastiera si apre ogni volta che tocchi un campo di testo"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tocca e tieni premuto un pulsante per visualizzare le lettere con segni diacritici"\n"(ø, ö, ô, ó e così via)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Passa a numeri e simboli toccando questo pulsante"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Torna alle lettere toccando di nuovo questo pulsante"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tocca e tieni premuto questo pulsante per modificare le impostazioni della tastiera, come il completamento automatico"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prova!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Vai"</string> <string name="label_next_key" msgid="362972844525672568">"Avanti"</string> <string name="label_done_key" msgid="2441578748772529288">"Fine"</string> <string name="label_send_key" msgid="2815056534433717444">"Invia"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Altro"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Attesa"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Comandi vocali"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"I comandi vocali non sono attualmente supportati per la tua lingua ma funzionano in inglese."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"I comandi vocali sono una funzione sperimentale che utilizza il riconoscimento vocale in rete di Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Per disattivare i comandi vocali, vai alle impostazioni della tastiera."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Per utilizzare i comandi vocali, premi il pulsante del microfono o fai scorrere il dito sulla tastiera sullo schermo."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'input vocale utilizza il riconoscimento vocale di Google. Sono valide le "<a href="http://m.google.com/privacy">"norme sulla privacy di Google Mobile"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Per disattivare l\'input vocale, vai alle impostazioni del metodo di input."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Per utilizzare l\'input vocale, premi il pulsante del microfono."</string> <string name="voice_listening" msgid="467518160751321844">"Parla ora"</string> <string name="voice_working" msgid="6666937792815731889">"Elaborazione in corso"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Annulla"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Comandi vocali"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Su tastiera principale"</item> - <item msgid="8529385602829095903">"Su tastiera simboli"</item> - <item msgid="7283103513488381103">"Non attivi"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfono su tastiera principale"</item> - <item msgid="6907837061058876770">"Microfono su tastiera simboli"</item> - <item msgid="3664304608587798036">"Comandi vocali disabilitati"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Invia automaticamente dopo comando vocale"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Premi automaticamente \"Invio\" durante una ricerca o un passaggio al campo successivo."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Apertura tastiera"\n</b></font><font size="3">\n</font>"Tocca qualsiasi campo di testo."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Chiusura tastiera"\n</b></font><font size="3">\n</font>"Premi il tasto Indietro."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tocca e tieni premuto un pulsante per le opzioni"\n</b></font><font size="3">\n</font>"Accesso a punteggiatura e accenti."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Impostazioni tastiera"\n</b></font><font size="3">\n</font>"Tocca e tieni premuto il pulsante "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Su tastiera principale"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Su tastiera simboli"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Non attivo"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic su tastiera princ."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic su tastiera simboli"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Comandi vocali disatt."</string> <string name="selectInputMethod" msgid="315076553378705821">"Seleziona metodo di inserimento"</string> <string name="language_selection_title" msgid="1651299598555326750">"Lingue comandi"</string> <string name="language_selection_summary" msgid="187110938289512256">"Scorri il dito sulla barra spaziatrice per cambiare la lingua"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Attiva commenti degli utenti"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Aiuta a migliorare l\'editor del metodo di inserimento inviando automaticamente a Google statistiche sull\'utilizzo e segnalazioni sugli arresti anomali."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocca per correggere"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tocca le parole inserite per correggerle"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tocca le parole inserite per correggerle, solo quando sono visibili i suggerimenti"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema della tastiera"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastiera"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"vocale"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tastiera ceca"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Tastiera araba"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Tastiera danese"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tastiera tedesca"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastiera inglese (Regno Unito)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tastiera inglese (Stati Uniti)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Tastiera spagnola"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastiera francese"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tastiera francese (Canada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tastiera francese (Svizzera)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Tastiera ebraica"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Tastiera italiana"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Tastiera norvegese"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Tastiera olandese"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Tastiera polacca"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Tastiera portoghese"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Tastiera russa"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Tastiera serba"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Tastiera svedese"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voce afrikaans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voce ceca"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voce tedesca"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voce inglese"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voce spagnola"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voce francese"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voce italiana"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voce giapponese"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voce coreana"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voce olandese"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voce polacca"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voce portoghese"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voce russa"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voce turca"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voce cinese Yue"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voce cinese mandarino"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voce isiZulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modalità studio usabilità"</string> </resources> diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml index abc5c397c..c45351037 100644 --- a/java/res/values-iw/strings.xml +++ b/java/res/values-iw/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"רטט עם לחיצה על מקשים"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"צלילים עם לחיצה על מקשים"</string> <string name="popup_on_keypress" msgid="123894815723512944">"חלון קופץ עם לחיצה על מקשים"</string> - <string name="hit_correction" msgid="4855351009261318389">"תקן שגיאות הקלדה"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"הפוך תיקון שגיאות קלט לפעיל"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"שגיאות קלט בפריסה לרוחב"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"הפוך תיקון שגיאות קלט לפעיל"</string> - <string name="auto_correction" msgid="7911639788808958255">"הצעות למילים"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"תקן באופן אוטומטי את המילה הקודמת"</string> - <string name="prediction" msgid="466220283138359837">"הצעות למילים"</string> - <string name="prediction_category" msgid="7027100625580696660">"הגדרות של הצעות מילים"</string> - <string name="prediction_summary" msgid="459788228830873110">"הפוך השלמה אוטומטית לפעילה בעת הקלדה"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"השלמה אוטומטית"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"הגדל את הגודל של שדה הטקסט"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"הסתר הצעות למילים בתצוגה לרוחב"</string> + <string name="general_category" msgid="1859088467017573195">"כללי"</string> + <string name="correction_category" msgid="2236750915056607613">"תיקון טקסט"</string> + <string name="ngram_category" msgid="5337109164339320257">"הצעות המבוססות על מילים קודמות"</string> + <string name="misc_category" msgid="6894192814868233453">"אפשרויות אחרות"</string> + <string name="advanced_settings" msgid="362895144495591463">"הגדרות מתקדמות"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"אפשרויות עבור משתמשים מתקדמים"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"עיכוב דחייה של מוקפץ ראשי"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"ללא עיכוב"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ברירת מחדל"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"הפיכה אוטומטית של אותיות לרישיות"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"הוסף אות רישית בתחילת משפט"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"פיסוק אוטומטי"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"תיקונים מהירים"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"מתקן שגיאות הקלדה נפוצות"</string> - <string name="show_suggestions" msgid="507074425254289133">"הצג הצעות"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"הצג הצעות למילים בעת הקלדה"</string> - <string name="auto_complete" msgid="1103196318775486023">"השלמה אוטומטית"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"הקשה על מקש הרווח וסימני הפיסוק תוסיף באופן אוטומטי את המילה המסומנת"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"הצג הצעות לתיקונים"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"הצג הצעות למילים בעת הקלדה"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"הצג תמיד"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"הצג בפריסה לאורך"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"הסתר תמיד"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"השתמש במחליף השפה שבמקש הרווח"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"הצג מקש הגדרות"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"אוטומטי"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"הצג תמיד"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"הסתר תמיד"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"הצעות של צמדי אותיות (Bigram)"</string> + <string name="auto_correction" msgid="4979925752001319458">"תיקון אוטומטי"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"מקש הרווח ופיסוק מתקנים אוטומטית שגיאות הקלדה"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"כבוי"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"מצומצם"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"מחמיר"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"הצעות של צמדי אותיות (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="bigram_prediction" msgid="8914273444762259739">"חיזוי צמדי אותיות (Bigram)"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"השתמש במילה הקודמת גם עבור חיזוי"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : נשמרה"</string> - <string name="tip_long_press" msgid="6101270866284343344">"החזק מקש לחוץ כדי לראות אקצנטים (ø, ö וכדומה)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"לחץ על המקש \'הקודם\' ↶ כדי לסגור את המקלדת בכל עת"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"גישה למספרים וסמלים"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"לחץ על המילה השמאלית הקיצונית והחזק אותה לחוצה כדי להוסיף למילון"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"גע ברמז זה כדי להמשיך »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"גע כאן כדי לסגור רמז זה ולהתחיל בהקלדה!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"המקלדת נפתחת בכל פעם שאתה נוגע בשדה טקסט"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"גע במקש והחזק אותו לחוץ כדי להציג אקצנטים"\n"(ø, ö, ô, ó וכדומה)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"עבור למספרים וסמלים על ידי נגיעה במקש זה"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"חזור לאותיות על ידי מגע במקש זה שוב"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"גע במקש זה והחזק אותו לחוץ כדי לשנות את הגדרות המקלדת, כגון השלמה אוטומטית"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"נסה אותו!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"בצע"</string> <string name="label_next_key" msgid="362972844525672568">"הבא"</string> <string name="label_done_key" msgid="2441578748772529288">"בוצע"</string> <string name="label_send_key" msgid="2815056534433717444">"שלח"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"עוד"</string> + <string name="label_pause_key" msgid="181098308428035340">"השהה"</string> + <string name="label_wait_key" msgid="6402152600878093134">"המתן"</string> <string name="voice_warning_title" msgid="4419354150908395008">"קלט קולי"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"קלט קולי אינו נתמך בשלב זה בשפתך, אך הוא פועל באנגלית."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"קלט קולי הוא תכונה ניסיונית של זיהוי הדיבור ברשת של Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"כדי לכבות את הקלט הקולי, עבור להגדרות מקלדת."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"כדי להשתמש בקלט הקולי, לחץ על לחצן המיקרופון או החלק את האצבע על המקלדת שבמסך."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"קלט קולי משתמש בזיהוי דיבור של Google. "<a href="http://m.google.com/privacy">"מדיניות הפרטיות של \'Google לנייד\'"</a>" חלה במקרה זה."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"כדי לכבות את הקלט הקולי, עבור להגדרות שיטת קלט."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"כדי להשתמש בקלט קולי, לחץ על לחצן המיקרופון."</string> <string name="voice_listening" msgid="467518160751321844">"דבר כעת"</string> <string name="voice_working" msgid="6666937792815731889">"פועל"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"ביטול"</string> <string name="ok" msgid="7898366843681727667">"אישור"</string> <string name="voice_input" msgid="2466640768843347841">"קלט קולי"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"במקלדת הראשית"</item> - <item msgid="8529385602829095903">"מקלדת סמלים מופעלת"</item> - <item msgid="7283103513488381103">"כבוי"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"מיקרופון במקלדת הראשית"</item> - <item msgid="6907837061058876770">"מיקרופון במקלדת סמלים"</item> - <item msgid="3664304608587798036">"הקלט הקולי מושבת"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"שליחה אוטומטית לאחר הקלטת קול"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"הקש על Enter באופן אוטומטי בעת חיפוש או מעבר לשדה הבא."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"פתח את המקלדת"\n</b></font><font size="3">\n</font>"גע בשדה טקסט כלשהו."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"סגור את המקלדת"\n</b></font><font size="3">\n</font>"לחץ על הלחצן \'הקודם\'."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"גע במקש והחזק אותו לחוץ לקבלת אפשרויות"\n</b></font><font size="3">\n</font>"קבל גישה לסימני פיסוק ואקצנטים."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"הגדרות מקלדת"\n</b></font><font size="3">\n</font>"גע במקש "<b>"?123"</b>" והחזק אותו לחוץ."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"במקלדת הראשית"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"במקלדת הסמלים"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"כבוי"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"מיקרופון במקלדת הראשית"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"מיקרופון במקלדת הסמלים"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"הקלט הקולי מושבת"</string> <string name="selectInputMethod" msgid="315076553378705821">"בחר שיטת קלט"</string> <string name="language_selection_title" msgid="1651299598555326750">"שפות קלט"</string> <string name="language_selection_summary" msgid="187110938289512256">"החלק את האצבע על מקש הרווח כדי לשנות שפה"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"הפוך משוב ממשתמשים לפעיל"</string> <string name="prefs_description_log" msgid="5827825607258246003">"עזור לשפר שיטת קלט זו על ידי שליחה אוטומטית של סטטיסטיקת שימוש ודוחות קריסת מחשב ל-Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"גע כדי לתקן מילים"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"גע במילים שהוזנו כדי לתקן אותן"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"גע במילים שהוזנו כדי לתקן אותן, רק כאשר הצעות מוצגות"</string> <string name="keyboard_layout" msgid="437433231038683666">"עיצוב מקלדת"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"מקלדת"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"קולי"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"מקלדת צ\'כית"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"מקלדת בשפה הערבית"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"מקלדת דנית"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"מקלדת גרמנית "</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"מקלדת אנגלית (בריטניה)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"מקלדת אנגלית (ארה\"ב)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"מקלדת ספרדית"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"מקלדת צרפתית"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"מקלדת צרפתית (קנדה)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"מקלדת צרפתית (שוויץ)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"מקלדת בשפה העברית"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"מקלדת איטלקית"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"מקלדת נורווגית"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"מקלדת הולנדית"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"מקלדת פולנית"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"מקלדת פורטוגזית"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"מקלדת רוסית"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"מקלדת סרבית"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"מקלדת שוודית"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Google Voice באפריקאנס"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Google Voice צ\'כי"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Google Voice גרמני"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Google Voice באנגלית"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Google Voice ספרדי"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Google Voice צרפתי"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"קול באיטלקית"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Google Voice יפני"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Google Voice קוריאני"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"קול בהולנדית"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Google Voice פולני"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Google Voice פורטוגזי"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Google Voice רוסי"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Google Voice תורכי"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Google Voice בסינית, יו"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Google Voice בסינית, מנדרינית"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Google Voice באיסיזולו"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"מצב מחקר שימושיות"</string> </resources> diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index f04790e88..2aa55a7e0 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"キー操作バイブ"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"キー操作音"</string> <string name="popup_on_keypress" msgid="123894815723512944">"キー押下時ポップアップ"</string> - <string name="hit_correction" msgid="4855351009261318389">"入力ミス補正"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"入力間違いを自動修正する"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"横表示での入力修正"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"入力間違いを自動修正する"</string> - <string name="auto_correction" msgid="7911639788808958255">"入力候補表示"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"前の単語を自動修正する"</string> - <string name="prediction" msgid="466220283138359837">"入力候補表示"</string> - <string name="prediction_category" msgid="7027100625580696660">"入力候補の設定"</string> - <string name="prediction_summary" msgid="459788228830873110">"オートコンプリートを使用する"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"オートコンプリート"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"入力作業スペースを広げる"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"横表示では入力候補を表示しない"</string> + <string name="general_category" msgid="1859088467017573195">"全般"</string> + <string name="correction_category" msgid="2236750915056607613">"テキストの修正"</string> + <string name="ngram_category" msgid="5337109164339320257">"前の語句に基づいた入力候補表示"</string> + <string name="misc_category" msgid="6894192814868233453">"他のオプション"</string> + <string name="advanced_settings" msgid="362895144495591463">"詳細設定"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"上級ユーザー向けオプション"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"キーのポップアップ時間"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"すぐに消去"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"デフォルト"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"自動大文字変換"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"英字入力で文頭文字を大文字にする"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"句読点を自動入力"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"クイックフィックス"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"よくある誤字・脱字を修正します"</string> - <string name="show_suggestions" msgid="507074425254289133">"入力候補を表示"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"入力時に入力候補を表示する"</string> - <string name="auto_complete" msgid="1103196318775486023">"オートコンプリート"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"誤入力をスペースまたは句読点キーで修正する"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"修正候補を表示する"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"入力中に入力候補を表示する"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"常に表示"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"縦向きで表示"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"常に非表示"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"スペースバーで切替"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"設定キーを表示"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"自動"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"常に表示"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"常に非表示"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"バイグラム入力候補表示"</string> + <string name="auto_correction" msgid="4979925752001319458">"自動修正"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"誤入力をスペースまたは句読点キーで修正する"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"OFF"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"中"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"強"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"バイグラム入力候補表示"</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="bigram_prediction" msgid="8914273444762259739">"バイグラム予測"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"前の語句も予測に使用"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:保存しました"</string> - <string name="tip_long_press" msgid="6101270866284343344">"キー長押しでアクセント文字を表示(ø、öなど)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"戻るキーでキーボードを閉じます"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"数字と記号"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"一番左の単語を長押しすると辞書に追加されます"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"続けるにはここをタッチ"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"タッチしてこのヒントを終了し、入力を開始してください。"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"テキストフィールドを選択するとキーボードが表示されます"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"キーを長押しするとアクセント付き文字"\n"(ø、ö、ô、óなど)が表示されます"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"このキーを押すと、数字/記号入力に切り替わります"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"このキーを押すと、文字入力に再度切り替わります"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"オートコンプリートなどのキーボードの設定を変更するには、このキーを長押しします"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"試してみてください。"</b></string> <string name="label_go_key" msgid="1635148082137219148">"実行"</string> <string name="label_next_key" msgid="362972844525672568">"次へ"</string> <string name="label_done_key" msgid="2441578748772529288">"完了"</string> <string name="label_send_key" msgid="2815056534433717444">"送信"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Shift"</string> + <string name="label_pause_key" msgid="181098308428035340">"停止"</string> + <string name="label_wait_key" msgid="6402152600878093134">"待機"</string> <string name="voice_warning_title" msgid="4419354150908395008">"音声入力"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"音声入力は現在英語には対応していますが、日本語には対応していません。"</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"音声入力はGoogleのネットワーク音声認識技術を利用した試験段階の機能です。"</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"音声入力をOFFにするには、キーボードの設定を開きます。"</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"音声入力するには、マイクボタンを押すか画面キーボードをスワイプしてください。"</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"音声入力ではGoogleの音声認識技術を利用します。"<a href="http://m.google.com/privacy">"モバイルプライバシーポリシー"</a>"が適用されます。"</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"音声入力をOFFにするには、入力方法の設定を開きます。"</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"音声入力するには、マイクボタンを押してください。"</string> <string name="voice_listening" msgid="467518160751321844">"お話しください"</string> <string name="voice_working" msgid="6666937792815731889">"処理中"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"キャンセル"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"音声入力"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"メインキーボード上"</item> - <item msgid="8529385602829095903">"記号キーボード上"</item> - <item msgid="7283103513488381103">"OFF"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"メインキーボードのマイク"</item> - <item msgid="6907837061058876770">"記号キーボードのマイク"</item> - <item msgid="3664304608587798036">"音声入力は無効です"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"入力後に自動送信する"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"検索または次のフィールドに進む際、Enterキーが自動的に押されます。"</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"キーボードを開く"\n</b></font><font size="3">\n</font>"テキストフィールドをタップします。"</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"キーボードを閉じる"\n</b></font><font size="3">\n</font>"[戻る]キーを押します。"</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"キーを長押しして選択する"\n</b></font><font size="3">\n</font>"句読点キーとアクセント文字を表示します。"</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"キーボードの設定"\n</b></font><font size="3">\n</font>"["<b>"?123"</b>"]キーを長押しします。"</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"メインキーボード上"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"記号キーボード上"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"OFF"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"メインキーボードのマイク"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"記号キーボードのマイク"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"音声入力は無効です"</string> <string name="selectInputMethod" msgid="315076553378705821">"入力方法の選択"</string> <string name="language_selection_title" msgid="1651299598555326750">"入力言語"</string> <string name="language_selection_summary" msgid="187110938289512256">"スペースバーで指をスライドさせて言語を変更する"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"ユーザーフィードバックを有効にする"</string> <string name="prefs_description_log" msgid="5827825607258246003">"IMEの機能向上のため、使用統計状況やクラッシュレポートをGoogleに自動送信します。"</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"タップして語句を修正"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"入力した語句をタップして修正"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"候補が表示されているときのみ、入力した語句をタップして修正する"</string> <string name="keyboard_layout" msgid="437433231038683666">"キーボードテーマ"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"キーボード"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"音声"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"チェコ語のキーボード"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"アラビア語のキーボード"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"デンマーク語のキーボード"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"ドイツ語のキーボード"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英語(英国)のキーボード"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英語(米国)のキーボード"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"スペイン語のキーボード"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"フランス語のキーボード"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"フランス語(カナダ)のキーボード"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"フランス語(スイス)のキーボード"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"ヘブライ語のキーボード"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"イタリア語のキーボード"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"ノルウェー語のキーボード"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"オランダ語のキーボード"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"ポーランド語のキーボード"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"ポルトガル語のキーボード"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"ロシア語のキーボード"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"セルビア語のキーボード"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"スウェーデン語のキーボード"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"アフリカーンス語の音声"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"チェコ語の音声"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"ドイツ語の音声"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"英語の音声"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"スペイン語の音声"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"フランス語の音声"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"イタリア語の音声"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日本語の音声"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韓国語の音声"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"オランダ語の音声"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"ポーランド語の音声"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"ポルトガル語の音声"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"ロシア語の音声"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"トルコ語の音声"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"中国語(広東語)の音声"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"中国語(標準語)の音声"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"ズールー語の音声"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"使いやすさの研究モード"</string> </resources> diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index 1f966ceef..8f4747843 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"키를 누를 때 진동 발생"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"키를 누를 때 소리 발생"</string> <string name="popup_on_keypress" msgid="123894815723512944">"키를 누를 때 팝업"</string> - <string name="hit_correction" msgid="4855351009261318389">"입력 오류 수정"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"입력 오류 수정 사용"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"가로 입력 오류"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"입력 오류 수정 사용"</string> - <string name="auto_correction" msgid="7911639788808958255">"단어 추천"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"이전 단어를 자동으로 수정"</string> - <string name="prediction" msgid="466220283138359837">"단어 추천"</string> - <string name="prediction_category" msgid="7027100625580696660">"단어 추천 설정"</string> - <string name="prediction_summary" msgid="459788228830873110">"입력할 때 자동 완성 사용"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"자동 완성"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"입력란 크기 늘리기"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"가로 보기에서 추천 단어 숨기기"</string> + <string name="general_category" msgid="1859088467017573195">"일반"</string> + <string name="correction_category" msgid="2236750915056607613">"텍스트 수정"</string> + <string name="ngram_category" msgid="5337109164339320257">"이전 단어에 기반한 추천"</string> + <string name="misc_category" msgid="6894192814868233453">"기타 옵션"</string> + <string name="advanced_settings" msgid="362895144495591463">"고급 설정"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"전문 사용자용 옵션"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"키 팝업 해제 지연"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"지연 없음"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"기본값"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"자동 대문자화"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"문장의 첫 글자를 대문자로 표시"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"자동 구두점 입력"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"빠른 수정"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"자주 발생하는 오타를 수정합니다."</string> - <string name="show_suggestions" msgid="507074425254289133">"추천 단어 표시"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"글자를 입력하는 동안 추천 단어를 표시"</string> - <string name="auto_complete" msgid="1103196318775486023">"자동 완성"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"스페이스바와 문장부호 키로 강조 표시된 단어를 자동 삽입"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"수정 제안 표시"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"글자를 입력하는 동안 추천 단어 표시"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"항상 표시"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"세로 모드로 표시"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"항상 숨기기"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"스페이스 바 언어 교환기 사용"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"설정 키 표시"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"자동"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"항상 표시"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"항상 숨기기"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram 추천"</string> + <string name="auto_correction" msgid="4979925752001319458">"자동 수정"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"스페이스바와 문장부호 키를 사용하면 오타가 자동으로 교정됩니다."</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"사용 안함"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"보통"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"적극적"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Bigram 예측"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"이전 단어를 사용하여 예상 검색어를 표시합니다."</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: 저장됨"</string> - <string name="tip_long_press" msgid="6101270866284343344">"키를 길게 누르면 악센트(ø, ö 등)가 표시됩니다."</string> - <string name="tip_dismiss" msgid="7585579046862204381">"키보드를 닫으려면 언제든지 뒤로 키(↶)를 누르세요."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"숫자 및 기호 사용"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"맨 왼쪽에 있는 단어를 길게 누르면 사전에 추가됩니다."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"계속하려면 힌트를 터치하세요. »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"힌트를 닫고 입력을 시작하려면 여기를 터치하세요."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"언제든지 입력란을 터치하면 키보드가 열립니다."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"키를 길게 터치하면 악센트"\n"(ø, ö, ô, ó 등)가 표시됩니다."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"이 키를 터치하면 숫자 및 기호 키보드로 전환됩니다."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"이 키를 다시 터치하면 문자 키보드로 돌아갑니다."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"자동 완성과 같은 키보드 설정을 변경하려면 이 키를 길게 터치하세요."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"이제 사용해 보세요."</b></string> <string name="label_go_key" msgid="1635148082137219148">"이동"</string> <string name="label_next_key" msgid="362972844525672568">"다음"</string> <string name="label_done_key" msgid="2441578748772529288">"완료"</string> <string name="label_send_key" msgid="2815056534433717444">"전송"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"더보기"</string> + <string name="label_pause_key" msgid="181098308428035340">"일시 중지"</string> + <string name="label_wait_key" msgid="6402152600878093134">"대기"</string> <string name="voice_warning_title" msgid="4419354150908395008">"음성 입력"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"음성 입력은 현재 자국어로 지원되지 않으며 영어로 작동됩니다."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"음성 입력은 Google의 네트워크화된 음성 인식을 사용하는 실험적 기능입니다."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"음성 입력을 사용하지 않으려면 키보드 설정으로 이동하세요."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"음성 입력을 사용하려면 마이크 버튼을 누르거나 터치 키보드 위로 손가락을 미끄러지듯 움직이세요."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"음성 입력에서는 Google의 음성 인식 기능을 사용합니다. "<a href="http://m.google.com/privacy">"모바일 개인정보취급방침"</a>"이 적용됩니다."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"음성 입력을 사용하지 않으려면 입력 방법 설정으로 이동하세요."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"음성 입력을 사용하려면 마이크 버튼을 누르세요."</string> <string name="voice_listening" msgid="467518160751321844">"지금 말하세요."</string> <string name="voice_working" msgid="6666937792815731889">"인식 중"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"취소"</string> <string name="ok" msgid="7898366843681727667">"확인"</string> <string name="voice_input" msgid="2466640768843347841">"음성 입력"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"기본 키보드"</item> - <item msgid="8529385602829095903">"기호 키보드"</item> - <item msgid="7283103513488381103">"사용 안함"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"기본 키보드의 마이크"</item> - <item msgid="6907837061058876770">"기호 키보드의 마이크"</item> - <item msgid="3664304608587798036">"음성 입력이 사용 중지됨"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"음성을 입력한 다음 자동 제출"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"검색하거나 다음 입력란으로 이동할 때 자동으로 Enter 키를 누릅니다."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"키보드 열기"\n</b></font><font size="3">\n</font>"아무 텍스트 입력란이나 터치하세요."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"키보드 닫기"\n</b></font><font size="3">\n</font>"\'뒤로\' 키를 누르세요."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"키를 길게 눌러 옵션 보기"\n</b></font><font size="3">\n</font>"문장 부호 및 악센트 기호 입력창이 열립니다."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"키보드 설정"\n</b></font><font size="3">\n</font><b>"?123"</b>" 키를 길게 누르세요."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"기본 키보드"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"기호 키보드"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"사용 안함"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"기본 키보드의 마이크"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"기호 키보드의 마이크"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"음성 입력이 사용 중지됨"</string> <string name="selectInputMethod" msgid="315076553378705821">"입력 방법 선택"</string> <string name="language_selection_title" msgid="1651299598555326750">"입력 언어"</string> <string name="language_selection_summary" msgid="187110938289512256">"손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"사용자 의견 사용"</string> <string name="prefs_description_log" msgid="5827825607258246003">"사용 통계 및 충돌 보고서를 Google에 자동으로 전송하여 입력 방법 편집기의 개선에 도움을 줍니다."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"터치하여 단어 수정"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"입력한 단어를 터치하여 수정"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"입력한 단어를 터치하여 수정(추천 단어가 표시되는 경우에만)"</string> <string name="keyboard_layout" msgid="437433231038683666">"키보드 테마"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"키보드"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"음성"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"체코어 키보드"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"아랍어 키보드"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"덴마크어 키보드"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"독일어 키보드"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"영어(영국) 키보드"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"영어(미국) 키보드"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"스페인어 키보드"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"프랑스어 키보드"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"프랑스어(캐나다) 키보드"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"프랑스어(스위스) 키보드"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"히브리어 키보드"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"이탈리아어 키보드"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"노르웨이어 키보드"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"네덜란드어 키보드"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"폴란드어 키보드"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"포르투갈어 키보드"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"러시아어 키보드"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"세르비아어 키보드"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"스웨덴어 키보드"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"아프리칸스어 음성"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"체코어 음성"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"독일어 음성"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"영어 음성"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"스페인어 음성"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"프랑스어 음성"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"이탈리아어 음성"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"일본어 키보드"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"한국어 음성"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"네덜란드어 음성"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"폴란드어 음성"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"포르투갈어 음성"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"러시아어 음성"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"터키어 음성"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"중국어, 광둥어 음성"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"중국어, 북경어 음성"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"줄루어 음성"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"가용성 연구 모드"</string> </resources> diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml index 043f4b363..8f6eb2339 100644 --- a/java/res/values-land/dimens.xml +++ b/java/res/values-land/dimens.xml @@ -19,17 +19,32 @@ --> <resources> + <!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=0.260in --> + <dimen name="keyboardHeight">1.100in</dimen> + <fraction name="minKeyboardHeight">45%p</fraction> <!-- key_height + key_bottom_gap = popup_key_height --> - <dimen name="key_height">0.250in</dimen> +<!-- <dimen name="key_height">0.260in</dimen>--> <dimen name="key_bottom_gap">0.020in</dimen> - <dimen name="popup_key_height">0.270in</dimen> - <dimen name="keyboard_bottom_padding">0.0in</dimen> + <dimen name="popup_key_height">0.280in</dimen> + <dimen name="keyboard_top_padding">0.00in</dimen> + <dimen name="keyboard_bottom_padding">0.00in</dimen> + <dimen name="key_bottom_gap_ics">0.04in</dimen> + <dimen name="key_horizontal_gap_ics">0.01in</dimen> + <dimen name="keyboard_top_padding_ics">0.03in</dimen> + <dimen name="keyboard_bottom_padding_ics">0.00in</dimen> + <dimen name="keyboard_horizontal_edges_padding">0.0in</dimen> + <fraction name="key_letter_ratio">55%</fraction> + <fraction name="key_label_ratio">35%</fraction> + <fraction name="key_hint_letter_ratio">28%</fraction> + <fraction name="key_uppercase_letter_ratio">40%</fraction> + <fraction name="key_preview_text_ratio">90%</fraction> + <dimen name="key_preview_offset">0.08in</dimen> + <dimen name="key_preview_offset_ics">0.01in</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 --> - <dimen name="mini_keyboard_vertical_correction">-0.270in</dimen> + <!-- popup_key_height x 1.2 --> + <dimen name="mini_keyboard_slide_allowance">0.336in</dimen> + <!-- popup_key_height x -1.0 --> + <dimen name="mini_keyboard_vertical_correction">-0.280in</dimen> </resources> diff --git a/java/res/values-es-rUS/donottranslate-altchars.xml b/java/res/values-lt/donottranslate-altchars.xml index d3beafade..4aba93a3a 100644 --- a/java/res/values-es-rUS/donottranslate-altchars.xml +++ b/java/res/values-lt/donottranslate-altchars.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,13 +18,11 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">ą,à,á,â,ä,æ,ã,å,ā</string> + <string name="alternates_for_e">3,ė,ę,è,é,ê,ë,ē</string> + <string name="alternates_for_i">8,į,î,ï,ì,í,ī</string> + <string name="alternates_for_u">7,ų,ū,û,ü,ù,ú</string> + <string name="alternates_for_s">š,ß,ś</string> + <string name="alternates_for_c">č,ç,ć</string> + <string name="alternates_for_z">ž,ź,ż</string> </resources> diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml index 3a8065525..ae32914ed 100644 --- a/java/res/values-lt/strings.xml +++ b/java/res/values-lt/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibruoti, kai paspaudžiami klavišai"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Klavišo paspaudimo garsas"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Iššoka paspaudus klavišą"</string> - <string name="hit_correction" msgid="4855351009261318389">"Taisyti rašybos klaidas"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Įgalinti įvesties klaidos taisymą"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Gulsčia įvestis"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Įgalinti įvesties klaidos taisymą"</string> - <string name="auto_correction" msgid="7911639788808958255">"Žodžių pasiūlymai"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automatiškai taisyti ankstesnį žodį"</string> - <string name="prediction" msgid="466220283138359837">"Žodžių pasiūlymai"</string> - <string name="prediction_category" msgid="7027100625580696660">"Žodžių pasiūlymo nustatymai"</string> - <string name="prediction_summary" msgid="459788228830873110">"Įgalinti automatinį užbaigimą, kai įvedinėjamas tekstas"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatinis užbaigimas"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Padidinti teksto lauko dydį"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Gulsčiame rodinyje slėpti žodžių pasiūlymus"</string> + <string name="general_category" msgid="1859088467017573195">"Bendra"</string> + <string name="correction_category" msgid="2236750915056607613">"Teksto taisymas"</string> + <string name="ngram_category" msgid="5337109164339320257">"Pasiūlymai pagal ankstesnius žodžius"</string> + <string name="misc_category" msgid="6894192814868233453">"Kitos parinktys"</string> + <string name="advanced_settings" msgid="362895144495591463">"Išplėstiniai nustatymai"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Parinktys ekspertams"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Pagr. išš. l. atsis. d."</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Be delsos"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Numatytasis"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Automatinis didžiųjų raidžių rašymas"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Sakinio pradžią rašyti didžiąja raide"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatiškai dėti skyrybos ženklus"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Greiti pataisymai"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Taiso dažnai padarytas rašybos klaidas"</string> - <string name="show_suggestions" msgid="507074425254289133">"Rodyti pasiūlymus"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Įvedant tekstą pateikti siūlomus žodžius"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automatiškai užbaigti"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Tarpo klavišas ir skyrybos ženklai automatiškai įterpia paryškintą žodį"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Rodyti taisymo pasiūlymus"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Įvedant tekstą pateikti siūlomų žodžių"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Visada rodyti"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Rodyti stačiuoju režimu"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Visada slėpti"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Naud. tarpo kl. k. jung."</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Rodyti nustatymų raktą"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatinis"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Visada rodyti"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Visada slėpti"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Digramų pasiūlymai"</string> + <string name="auto_correction" msgid="4979925752001319458">"Automatinis taisymas"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Tarpo kl. ir skyr. ženkl. aut. išt. neteis. įv. žodž."</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Išjungta"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Vidutinis"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Atkaklus"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Bigramų pasiūlymai"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Naudoti ankstesnį žodį pasiūlymui patobulinti"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nėra"</item> - <item msgid="1669461741568287396">"Paprastas"</item> - <item msgid="4894328801530136615">"Išplėstinis"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Bigramų numatymas"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Numatant naudoti ir ankstesnį žodį"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: išsaugota"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Laikykite klavišą nuspaudę, kad pamatytumėte kirčius (ø, ö ir t. t.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Paspauskite klavišą „Atgal“ ↶, kad uždarytumėte klaviatūrą"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Pasiekti skaičius ir simbolius"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Paspauskite ir laikykite nuspaudę kairiausią žodį, kad pridėtumėte jį prie žodyno"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Palieskite šią užuominą, jei norite tęsti »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Paleiskite čia, kad uždarytumėte šią užuominą ir pradėtumėte įvedinėti tekstą!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klaviatūra atsidarys kaskart, kai paliesite teksto lauką"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Palieskite ir laikykite klavišą, kad pamatytumėte kirčius"\n"(ø, ö, ô, ó, and so on)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Perjunkite į skaičius ir simbolius, paliesdami šį klavišą"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Grįžkite prie raidžių dar kartą paliesdami šį klavišą"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Palieskite ir laikykite šį klavišą, kad pakeistumėte klaviatūros nustatymus, pvz., automatinį užbaigimą"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Išbandykite tai!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Pradėti"</string> <string name="label_next_key" msgid="362972844525672568">"Kitas"</string> <string name="label_done_key" msgid="2441578748772529288">"Atlikta"</string> <string name="label_send_key" msgid="2815056534433717444">"Siųsti"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Daugiau"</string> + <string name="label_pause_key" msgid="181098308428035340">"Prist."</string> + <string name="label_wait_key" msgid="6402152600878093134">"Lauk."</string> <string name="voice_warning_title" msgid="4419354150908395008">"Balso įvestis"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Šiuo metu balso įvestis jūsų kompiuteryje nepalaikoma, bet ji veikia anglų k."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Balso įvestis – tai eksperimentinė funkcija, naudojanti „Google“ tinklo kalbos atpažinimą."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Jei norite išjungti balso įvestį, eikite į klaviatūros nustatymus."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Jei norite naudoti balso įvestį, paspauskite mikrofono mygtuką arba pirštu slyskite ekranine klaviatūra."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balso įvesčiai naudojamas „Google“ kalbos atpažinimas. Taikoma "<a href="http://m.google.com/privacy">"privatumo politika mobiliesiems"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Jei norite išjungti balso įvestį, eikite į įvesties metodo nustatymus."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Jei norite naudoti balso įvestį, paspauskite mikrofono mygtuką."</string> <string name="voice_listening" msgid="467518160751321844">"Kalbėkite dabar"</string> <string name="voice_working" msgid="6666937792815731889">"Veikia"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Atšaukti"</string> <string name="ok" msgid="7898366843681727667">"Gerai"</string> <string name="voice_input" msgid="2466640768843347841">"Balso įvestis"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Pagrindinėje klaviatūroje"</item> - <item msgid="8529385602829095903">"Simbolių klaviatūroje"</item> - <item msgid="7283103513488381103">"Išjungta"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Pagrindinės klaviatūros mikrofonas"</item> - <item msgid="6907837061058876770">"Mikrofonas simbolių klaviatūroje"</item> - <item msgid="3664304608587798036">"Balso įvestis išjungta"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automatiškai pateikti po balso"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Automatiškai spausti „Įvesti“ ieškant ar einant į kitą lauką."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Atidarykite klaviatūrą"\n</b></font><font size="3">\n</font>"Palieskite bet kurį teksto lauką."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Uždarykite klaviatūrą"\n</b></font><font size="3">\n</font>"Paspauskite klavišą „Atgal“."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Palieskite ir laikykite klavišą, kad pamatytumėte parinktis"\n</b></font><font size="3">\n</font>"Pasiekite skyrybos ženklus ir kirčius."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Klaviatūros nustatymai"\n</b></font><font size="3">\n</font>"Palieskite ir laikykite klavišą "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pagr. klaviatūroje"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Simbolių klaviatūr."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Išjungta"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrof. pagr. klav."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrof. simb. klav."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balso įv. neleidž."</string> <string name="selectInputMethod" msgid="315076553378705821">"Pasirinkti įvesties metodą"</string> <string name="language_selection_title" msgid="1651299598555326750">"Įvesties kalbos"</string> <string name="language_selection_summary" msgid="187110938289512256">"Pirštu slyskite tarpo klavišu, kad pakeistumėte kalbą"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Įgalinti naudotojų atsiliepimus"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Padėkite patobulinti šią įvesties metodo redagavimo programą automatiškai „Google“ siųsdami naudojimo statistiką ir strigčių ataskaitas."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Jei norite ištais. žodž., paliesk."</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Jei norite ištaisyti įvestus žodžius, palieskite juos"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Jei norite ištaisyti įvestus žodžius, palieskite juos tik tada, kai matomi pasiūlymai"</string> <string name="keyboard_layout" msgid="437433231038683666">"Klaviatūros tema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klaviatūra"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"Voice"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Čekiška klaviatūra"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabiška klaviatūra"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Daniška klaviatūra"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Vokiška klaviatūra"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angliška (JK) klaviatūra"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angliška (JAV) klaviatūra"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ispaniška klaviatūra"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Prancūziška klaviatūra"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Prancūziška (Kanada) klaviatūra"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Prancūziška (Šveicarija) klaviatūra"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebrajiška klaviatūra"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Itališka klaviatūra"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvegiška klaviatūra"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Olandiška klaviatūra"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Lenkiška klaviatūra"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugališka klaviatūra"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Rusiška klaviatūra"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbiška klaviatūra"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švediška klaviatūra"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"„Voice“ afrikanų k."</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"„Voice“ čekų k."</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"„Voice“ vokiečių k."</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"„Voice“ anglų k."</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"„Voice“ ispanų k."</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"„Voice“ prancūzų k."</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"„Voice“ italų k."</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"„Voice“ japonų k."</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"„Voice“ korėjiečių k."</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"„Voice“ olandų k."</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"„Voice“ lenkų k."</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"„Voice“ portugalų k."</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"„Voice“ rusų k."</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"„Voice“ turkų k."</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"„Voice“ kinų (dziue) k."</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"„Voice“ kinų (mandarinų) k."</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"„Voice“ zulų k."</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Tinkamumo analizės režimas"</string> </resources> diff --git a/java/res/values-lv/donottranslate-altchars.xml b/java/res/values-lv/donottranslate-altchars.xml new file mode 100644 index 000000000..05d9bc894 --- /dev/null +++ b/java/res/values-lv/donottranslate-altchars.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="alternates_for_a">ā,à,á,â,ä,æ,ã,å</string> + <string name="alternates_for_e">3,ē,è,é,ê,ë,ę,ė</string> + <string name="alternates_for_i">8,ī,î,ï,ì,í,į</string> + <string name="alternates_for_u">7,ū,û,ü,ù,ú</string> + <string name="alternates_for_s">š,ß,ś</string> + <string name="alternates_for_n">ņ,ñ,ń</string> + <string name="alternates_for_c">č,ç,ć</string> + <string name="alternates_for_r">4,ŗ</string> + <string name="alternates_for_z">ž,ź,ż</string> + <string name="alternates_for_k">ķ</string> + <string name="alternates_for_l">ļ,ł</string> + <string name="alternates_for_g">ģ</string> +</resources> diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml index 3c0be2519..d455715e5 100644 --- a/java/res/values-lv/strings.xml +++ b/java/res/values-lv/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrēt, nospiežot taustiņu"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Skaņa, nospiežot taustiņu"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Nospiežot taustiņu, parādīt uznirstošo izvēlni"</string> - <string name="hit_correction" msgid="4855351009261318389">"Labot drukas kļūdas"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Iespējot ievades kļūdu labošanu"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Ainavas orientācijas ievades kļūdas"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Iespējot ievades kļūdu labošanu"</string> - <string name="auto_correction" msgid="7911639788808958255">"Vārdu ieteikumi"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automātiski labot iepriekšējo vārdu"</string> - <string name="prediction" msgid="466220283138359837">"Vārdu ieteikumi"</string> - <string name="prediction_category" msgid="7027100625580696660">"Vārdu ieteikumu iestatījumi"</string> - <string name="prediction_summary" msgid="459788228830873110">"Iespējot automātisko pabeigšanu ievades laikā"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automātiska pabeigšana"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Palielināt teksta lauka lielumu"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ainavas skatījumā slēpt vārdu ieteikumus"</string> + <string name="general_category" msgid="1859088467017573195">"Vispārīgi"</string> + <string name="correction_category" msgid="2236750915056607613">"Teksta korekcija"</string> + <string name="ngram_category" msgid="5337109164339320257">"Ieteikumi, kuru pamatā ir iepriekšējie vārdi"</string> + <string name="misc_category" msgid="6894192814868233453">"Citas opcijas"</string> + <string name="advanced_settings" msgid="362895144495591463">"Papildu iestatījumi"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opcijas speciālistiem"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Taust. uzn. loga noraid. aizk."</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Bez aizkaves"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Noklusējums"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Automātiska lielo burtu lietošana"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Sākt teikumu ar lielo burtu"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automātiska pieturzīmju lietošana"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Ātrie labojumi"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Nodrošina izplatītu drukas kļūdu labošanu."</string> - <string name="show_suggestions" msgid="507074425254289133">"Rādīt ieteikumus"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Ievades laikā attēlot ieteiktos vārdus"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automātiska pabeigšana"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Automātiski ievietot iezīmēto vārdu, izmantojot atstarpes taustiņu un pieturzīmes"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Rādīt labojumu ieteikumus"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Ievades laikā attēlot ieteiktos vārdus"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vienmēr rādīt"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Rādīt portreta režīmā"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vienmēr slēpt"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Izmantot valodu pārslēgšanai atstarpēšanas taustiņu"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Rādīt iestatījumu taustiņu"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automātiski"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vienmēr rādīt"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vienmēr slēpt"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram ieteikumi"</string> + <string name="auto_correction" msgid="4979925752001319458">"Automāt. korekcija"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Atstarpes taustiņš un interpunkcija; automātiska kļūdainu vārdu labošana"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Izslēgta"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mērena"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresīva"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Bigrammu ieteikumi"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Ieteikuma uzlabošanai izmantot iepriekšējo vārdu"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nav"</item> - <item msgid="1669461741568287396">"Pamata"</item> - <item msgid="4894328801530136615">"Uzlabots"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Bigrammu prognozes"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Izmantot iepriekšējo vārdu arī prognozēm"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: saglabāts"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Turiet taustiņu nospiestu, lai skatītu uzsvēruma zīmes (ø, ö u.c.)."</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Jebkurā brīdī nospiediet taustiņu Atpakaļ ↶, lai aizvērtu tastatūru."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Piekļūt cipariem un simboliem"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Nospiediet kreisajā pusē esošo vārdu un turiet, lai pievienotu to vārdnīcai."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Pieskarieties šim ieteikumam, lai turpinātu »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Pieskarieties šeit, lai aizvērtu šo ieteikumu un sāktu ievadi."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastatūra tiek atvērta ikreiz, kad pieskaraties teksta laukam"</b>"."</string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Pieskarieties taustiņam un turiet, lai skatītu uzsvara zīmes"\n"(ø, ö, ô, ó utt.)."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Pieskarieties šim taustiņam, lai izmantotu ciparus un simbolus."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Vēlreiz pieskarieties šim taustiņam, lai atkal izmantotu burtus."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Pieskarieties taustiņam un turiet, lai mainītu tastatūras iestatījumus, piemēram, automātisko pabeigšanu."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Izmēģiniet to!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Sākt"</string> <string name="label_next_key" msgid="362972844525672568">"Tālāk"</string> <string name="label_done_key" msgid="2441578748772529288">"Gatavs"</string> <string name="label_send_key" msgid="2815056534433717444">"Sūtīt"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Vairāk"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pauze"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Gaidīt"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Balss ievade"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Balss ievade jūsu valodā pašlaik netiek atbalstīta, taču tā ir pieejama angļu valodā."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Balss ievade ir izmēģinājuma funkcija, kuras pamatā ir Google tīkla runas atpazīšanas līdzeklis."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Lai izslēgtu balss ievadi, atveriet tastatūras iestatījumus."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Lai izmantotu balss ievadi, nospiediet mikrofona pogu vai slidiniet pirkstus pāri ekrāna tastatūrai."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balss ievadei tiek izmantota Google runas atpazīšanas funkcija. Uz šīs funkcijas lietošanu attiecas "<a href="http://m.google.com/privacy">"mobilo sakaru ierīču lietošanas konfidencialitātes politika"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Lai izslēgtu balss ievadi, atveriet ievades metodes iestatījumus."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Lai izmantotu balss ievadi, nospiediet mikrofona taustiņu."</string> <string name="voice_listening" msgid="467518160751321844">"Runājiet!"</string> <string name="voice_working" msgid="6666937792815731889">"Notiek apstrāde"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Atcelt"</string> <string name="ok" msgid="7898366843681727667">"Labi"</string> <string name="voice_input" msgid="2466640768843347841">"Balss ievade"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Izmantojot galveno tastatūru"</item> - <item msgid="8529385602829095903">"Izmantojot simbolu tastatūru"</item> - <item msgid="7283103513488381103">"Izsl."</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Galvenās tastatūras mikrofons"</item> - <item msgid="6907837061058876770">"Simbolu tastatūras mikrofons"</item> - <item msgid="3664304608587798036">"Balss ievade ir atspējota"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automātiski iesniegt pēc balss ievades"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Automātiski nospiest ievades taustiņu, meklējot vai pārejot uz nākamo lauku."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Tastatūras atvēršana"\n</b></font><font size="3">\n</font>"Pieskarieties jebkuram teksta laukam."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tastatūras aizvēršana"\n</b></font><font size="3">\n</font>"Nospiediet taustiņu Atpakaļ."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Pieskarieties taustiņam un turiet, lai skatītu opcijas."\n</b></font><font size="3">\n</font>"Piekļūstiet pieturzīmēm un uzsvara zīmēm."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastatūras iestatījumi"\n</b></font><font size="3">\n</font>"Pieskarieties taustiņam "<b>"?123"</b>" un turiet."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Uz galv. tastatūras"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Uz simbolu tastat."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Izslēgts"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikr.uz galv.tastat."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr.uz simb.tastat."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balss iev. atspējota"</string> <string name="selectInputMethod" msgid="315076553378705821">"Atlasīt ievades metodi"</string> <string name="language_selection_title" msgid="1651299598555326750">"Ievades valodas"</string> <string name="language_selection_summary" msgid="187110938289512256">"Slidiniet pirkstu uz atstarpes taustiņa, lai mainītu valodu"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Iespējot lietotāju atsauksmes"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Palīdziet uzlabot šo ievades metodes redaktoru, automātiski nosūtot lietojuma statistiku un pārskatus par avārijām uzņēmumam Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Pieskarties, lai izlabotu vārdus"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Pieskarties ievadītajiem vārdiem, lai tos labotu"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pieskarties ievadītajiem vārdiem, lai tos labotu (tikai tad, ja tiek rādīti ieteikumi)."</string> <string name="keyboard_layout" msgid="437433231038683666">"Tastatūras motīvs"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatūra"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"balss"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Čehu tastatūra"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arābu tastatūra"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dāņu tastatūra"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Vācu tastatūra"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Angļu (Lielbritānija) tastatūra"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Angļu (ASV) tastatūra"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spāņu tastatūra"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franču tastatūra"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franču (Kanāda) tastatūra"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franču (Šveices) tastatūra"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Ebreju tastatūra"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Itāļu tastatūra"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norvēģu tastatūra"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holandiešu tastatūra"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poļu valodas tastatūra"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugāļu valodas tastatūra"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Krievu tastatūra"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbu tastatūra"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Zviedru tastatūra"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Balss afrikandu valodā"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voice čehu valodā"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voice vācu valodā"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Balss angļu valodā"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voice spāņu valodā"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voice franču valodā"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Itāļu balss"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voice japāņu valodā"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voice korejiešu valodā"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Holandiešu balss"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voice poļu valodā"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voice portugāļu valodā"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voice krievu valodā"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voice turku valodā"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Balss ķīniešu val. (Kantonas dial.)"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Balss ķīniešu v. (mandarīnu dial.)"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Balss zulu valodā"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Lietojamības izpētes režīms"</string> </resources> diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml new file mode 100644 index 000000000..532a89539 --- /dev/null +++ b/java/res/values-ms/strings.xml @@ -0,0 +1,160 @@ +<?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">"Papan kekunci Android"</string> + <string name="english_ime_settings" msgid="6661589557206947774">"Tetapan papan kekunci Android"</string> + <string name="english_ime_input_options" msgid="3909945612939668554">"Pilihan input"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar pada tekanan kekunci"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Bunyi pada tekanan kekunci"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Pop timbul pada tekanan kunci"</string> + <string name="general_category" msgid="1859088467017573195">"Umum"</string> + <string name="correction_category" msgid="2236750915056607613">"Pembetulan teks"</string> + <string name="ngram_category" msgid="5337109164339320257">"Cadangan berdasarkan pada perkataan sebelumnya"</string> + <string name="misc_category" msgid="6894192814868233453">"Pilihan lain"</string> + <!-- no translation found for advanced_settings (362895144495591463) --> + <skip /> + <!-- no translation found for advanced_settings_summary (5193513161106637254) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <string name="auto_cap" msgid="1719746674854628252">"Huruf besar auto"</string> + <string name="quick_fixes" msgid="5353213327680897927">"Pembaikan pantas"</string> + <string name="quick_fixes_summary" msgid="3405028402510332373">"Membetulkan kesalahan menaip yang biasa"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Tunjukkan cadangan pembetulan"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Paparkan cadangan perkataan semasa menaip"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Sentiasa tunjukkan"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Tunjukkan pada mod potret"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Sentiasa sembunyikan"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Bar ruang tukar bhs"</string> + <string name="prefs_settings_key" msgid="4623341240804046498">"Tunjukkan kekunci tetapan"</string> + <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatik"</string> + <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Sentiasa tunjukkan"</string> + <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Sentiasa sembunyikan"</string> + <string name="auto_correction" msgid="4979925752001319458">"Auto Pembetulan"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Bar ruang dan tanda baca secara automatik membetulkan perkataan yang ditaip salah"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Matikan"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Sederhana"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresif"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Cadangan bigram"</string> + <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Gunakan perkataan sebelumnya untuk memperbaik cadangan"</string> + <string name="bigram_prediction" msgid="8914273444762259739">"Ramalan bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Gunakan juga perkataan sebelumnya untuk ramalan"</string> + <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Disimpan"</string> + <string name="label_go_key" msgid="1635148082137219148">"Pergi"</string> + <string name="label_next_key" msgid="362972844525672568">"Seterusnya"</string> + <string name="label_done_key" msgid="2441578748772529288">"Selesai"</string> + <string name="label_send_key" msgid="2815056534433717444">"Hantar"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Lagi"</string> + <string name="label_pause_key" msgid="181098308428035340">"Jeda"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Tnggu"</string> + <string name="voice_warning_title" msgid="4419354150908395008">"Input suara"</string> + <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Input suara tidak disokong untuk bahasa anda pada masa ini tetapi ia berfungsi dalam bahasa Inggeris."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Input suara menggunakan pengecaman pertuturan Google. "<a href="http://m.google.com/privacy">"Dasar Polisi Mudah Alih"</a>" digunakan."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Untuk mematikan input suara, pergi ke tetapan kaedah input."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Untuk menggunakan input suara, tekan butang mikrofon."</string> + <string name="voice_listening" msgid="467518160751321844">"Sebutkan sekarang"</string> + <string name="voice_working" msgid="6666937792815731889">"Berfungsi"</string> + <string name="voice_initializing" msgid="661962047129906646"></string> + <string name="voice_error" msgid="5140896300312186162">"Ralat. Sila cuba lagi."</string> + <string name="voice_network_error" msgid="6649556447401862563">"Tidak boleh disambungkan"</string> + <string name="voice_too_much_speech" msgid="5746973620134227376">"Ralat, terlalu banyak pertuturan."</string> + <string name="voice_audio_error" msgid="5072707727016414454">"Masalah audio"</string> + <string name="voice_server_error" msgid="7807129913977261644">"Ralat pelayan"</string> + <string name="voice_speech_timeout" msgid="8461817525075498795">"Tiada pertuturan didengari"</string> + <string name="voice_no_match" msgid="4285117547030179174">"Tiada padanan ditemui"</string> + <string name="voice_not_installed" msgid="5552450909753842415">"Carian suara tidak dipasang"</string> + <string name="voice_swipe_hint" msgid="6943546180310682021">"Petunjuk"<b>":"</b>" Leret merentasi papan kekunci untuk bercakap"</string> + <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Petunjuk:"</b>" Lain kali, cuba ucapkan tanda baca seperti \"titik\", \"koma\" atau \"tanda soal\"."</string> + <string name="cancel" msgid="6830980399865683324">"Batal"</string> + <string name="ok" msgid="7898366843681727667">"OK"</string> + <string name="voice_input" msgid="2466640768843347841">"Input suara"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Hidpkn kekunci utama"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pd ppn kekunci simbl"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Matikan"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik. pd kekunci utma"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. pd kekunci smbl"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Input suara dilmphkn"</string> + <string name="selectInputMethod" msgid="315076553378705821">"Pilih kaedah input"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Bahasa input"</string> + <string name="language_selection_summary" msgid="187110938289512256">"Luncurkan jari pada spacebar untuk menukar bahasa"</string> + <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Sentuh sekali lagi untuk menyimpan"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Kamus tersedia"</string> + <string name="prefs_enable_log" msgid="6620424505072963557">"Dayakan maklum balas pengguna"</string> + <string name="prefs_description_log" msgid="5827825607258246003">"Bantu memperbaik editor input ini dengan menghantar statistik penggunaan dan laporan runtuhan kepada Google."</string> + <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Sentuh untuk membetulkan perkataan"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Sentuh perkataan yang dimasukkan untuk membetulkannya, hanya apabila cadangan boleh dilihat"</string> + <string name="keyboard_layout" msgid="437433231038683666">"Tema Papan Kekunci"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Papan kekunci Czech"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Papan kekunci bahasa Arab"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Papan kekunci Denmark"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Papan kekunci Jerman"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Papan kekunci Inggeris (UK)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Papan kekunci Inggeris (AS)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Papan kekunci Sepanyol"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Papan kekunci Perancis"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Papan kekunci Perancis (Kanada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Ppan kekunci Perancis (Switzerland)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Papan kekunci bahasa Ibrani"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Papan kekunci Itali"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Papan kekunci Norway"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Papan kekunci Belanda"</string> + <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) --> + <skip /> + <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) --> + <skip /> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Papan kekunci Rusia"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Papan kekunci Serbia"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Papan kekunci Sweden"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Suara Bahasa Afrikaans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Suara Orang Czech"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Suara Orang Jerman"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Suara Bahasa Inggeris"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Suara Orang Sepanyol"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Suara Orang Perancis"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Suara Bahasa Itali"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Suara Orang Jepun"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Suara Orang Korea"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Suara Bahasa Belanda"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Suara Orang Poland"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Suara Orang Portugis"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Suara Orang Rusia"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Suara Orang Turki"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Cina, Suara Bahasa Yue"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Cina, Suara Bahasa Mandarin"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Suara bahasa isiZulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Mod Kajian Kebolehgunaan"</string> +</resources> diff --git a/java/res/values-nb/donottranslate-altchars.xml b/java/res/values-nb/donottranslate-altchars.xml index 6257dfc31..798e51c9a 100644 --- a/java/res/values-nb/donottranslate-altchars.xml +++ b/java/res/values-nb/donottranslate-altchars.xml @@ -18,20 +18,12 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">äáàâąã</string> - <string name="alternates_for_e">3éèêëę€</string> - <string name="alternates_for_i">íìîï8</string> - <string name="alternates_for_o">öóòôõ9</string> - <string name="alternates_for_u">üúùûū7</string> - <string name="alternates_for_s">śšşß</string> - <string name="alternates_for_n">ńñň</string> - <string name="alternates_for_c">çćč</string> - <string name="alternates_for_y">ýÿ6</string> - <string name="alternates_for_d">ðď</string> - <string name="alternates_for_r">ř4</string> - <string name="alternates_for_t">ťþ5</string> - <string name="alternates_for_z">źžż</string> - <string name="alternates_for_l">ł</string> - <string name="alternates_for_v">w</string> - <string name="alternates_for_oe">œ</string> + <string name="alternates_for_a">à,ä,á,â,ã,ā</string> + <string name="alternates_for_e">3,é,è,ê,ë,ę,ė,ē</string> + <string name="alternates_for_o">9,ô,ò,ó,ö,õ,œ,ō</string> + <string name="alternates_for_u">7,ü,û,ù,ú,ū</string> + <string name="keylabel_for_scandinavia_row2_10">ø</string> + <string name="keylabel_for_scandinavia_row2_11">æ</string> + <string name="alternates_for_scandinavia_row2_10">ö</string> + <string name="alternates_for_scandinavia_row2_11">ä</string> </resources> diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index c7ccce895..af5dd3ce3 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer ved tastetrykk"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Lyd ved tastetrykk"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Hurtigvindu ved tastetrykk"</string> - <string name="hit_correction" msgid="4855351009261318389">"Rett opp skrivefeil"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Slå på retting av skrivefeil"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Rett opp skrivefeil i breddeformat"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Slå på retting av skrivefeil"</string> - <string name="auto_correction" msgid="7911639788808958255">"Autokorrektur"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Autokorriger forrige ord"</string> - <string name="prediction" msgid="466220283138359837">"Ordforslag"</string> - <string name="prediction_category" msgid="7027100625580696660">"Innstillinger for ordforslag"</string> - <string name="prediction_summary" msgid="459788228830873110">"Skru på autofullføring under skriving"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autofullfør"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Større tekstfelt"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skjul ordforslag i breddeformat"</string> + <string name="general_category" msgid="1859088467017573195">"Generelt"</string> + <string name="correction_category" msgid="2236750915056607613">"Tekstkorrigering"</string> + <string name="ngram_category" msgid="5337109164339320257">"Forslag basert på tidligere ord"</string> + <string name="misc_category" msgid="6894192814868233453">"Andre alternativer"</string> + <string name="advanced_settings" msgid="362895144495591463">"Avanserte innstillinger"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Alternativer for ekspertbrukere"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Tregt tastevindu"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"U/ forsinkelse"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standard"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Stor forbokstav"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Start automatisk setninger med stor bokstav"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatisk punktum"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Autokorrektur"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Retter vanlige stavefeil"</string> - <string name="show_suggestions" msgid="507074425254289133">"Vis forslag"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Vis foreslåtte ord under skriving"</string> - <string name="auto_complete" msgid="1103196318775486023">"Autofullføring"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Mellomrom og punktum setter automatisk inn valgt ord"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Vis rettingsforslag"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vis ordforslag under skriving"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vis alltid"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Vis i stående modus"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Skjul alltid"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Skift språk med mellomromstasten"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Vis innstillingsnøkkel"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisk"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vis alltid"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Skjul alltid"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram-forslag"</string> + <string name="auto_correction" msgid="4979925752001319458">"Automatisk retting"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Mellomromstast og skilletegn retter automat. feilstavede ord"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Av"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderat"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Omfattende"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Bigram-prediksjon"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Bruk forrige ord også for forslag"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Lagret"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Hold en tast nede for å se aksenterte tegn (ø, ö, osv.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Trykk tilbakeknappen, ↶, for å lukke tastaturet"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Få tilgang til tall og symboler"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Trykk lenge på ordet lengst til venstre for å legge det til i ordlisten"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Trykk på dette hintet for å forsette »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Trykk her for å lukke dette hintet og begynne å skrive!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastaturet åpnes når du tar på et tekstfelt"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Trykk på og hold nede en tast for å se aksenter"\n"(ø, ö, ô, ó, osv.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Bytt til tall og symboler ved å trykke på denne tasten"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Gå tilbake til bokstaver igjen ved å trykke på denne tasten"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Trykk på og hold nede denne tasten for å endre tastaturinnstillinger, som autofullføring"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prøv det!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Gå"</string> <string name="label_next_key" msgid="362972844525672568">"Neste"</string> <string name="label_done_key" msgid="2441578748772529288">"Utfør"</string> <string name="label_send_key" msgid="2815056534433717444">"Send"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Mer"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pause"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Vent"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Stemmedata"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmedata håndteres foreløpig ikke på ditt språk, men fungerer på engelsk."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Talekommandoer er en eksperimentell funksjon som bruker Googles nettverksbaserte talegjenkjenning."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Gå til innstillinger for tastatur for å slå av stemmedata."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Du bruker talekommandoer ved å trykke på mikrofonknappen eller skyve fingeren over tastaturet på skjermen."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Google Voice bruker Googles talegjenkjenning. "<a href="http://m.google.com/privacy">"Personvernreglene for mobil"</a>" gjelder."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Gå til innstillinger for inndatametode for å slå av stemmedata."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Trykk på mikrofonknappen for å aktivere stemmedata."</string> <string name="voice_listening" msgid="467518160751321844">"Snakk nå"</string> <string name="voice_working" msgid="6666937792815731889">"Arbeider"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Avbryt"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Talekommando"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"På hovedtastatur"</item> - <item msgid="8529385602829095903">"På talltastatur"</item> - <item msgid="7283103513488381103">"Av"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon på hovedtastatur"</item> - <item msgid="6907837061058876770">"Mikrofon på talltastatur"</item> - <item msgid="3664304608587798036">"Talekommando er deaktivert"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Send inn automatisk etter tale"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Trykk Enter automatisk ved søk eller flytting til neste felt."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Åpne tastaturet"\n</b></font><font size="3">\n</font>"Trykk på et tekstfelt."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Lukke tastaturet"\n</b></font><font size="3">\n</font>"Trykk på tilbaketasten."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Trykk og hold nede en tast for flere valg"\n</b></font><font size="3">\n</font>"Få tilgang til skilletegn og aksenter."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Innstillinger for tastatur"\n</b></font><font size="3">\n</font>"Trykk på & hold "<b>"?123"</b>"-tasten."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".no"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".com"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".net"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".org"</string> - <string name="popular_domain_4" msgid="35359437471311470">".info"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På hovedtastatur"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På talltastatur"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Av"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon på hovedtast."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofon på talltastatur"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Taleinndata er deaktiv."</string> <string name="selectInputMethod" msgid="315076553378705821">"Velg inndatametode"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inndataspråk"</string> <string name="language_selection_summary" msgid="187110938289512256">"Dra fingeren på mellomromstasten for å endre språk"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brukertilbakemelding"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ved å sende bruksstatistikk og programstopprapporter til Google automatisk, hjelper du oss med å gjøre redigeringsfunksjonen for denne inndatametoden enda bedre."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Trykk for å endre ord"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Trykk på ord du har skrevet inn, for å endre dem"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Når forslag er synlige, kan du trykke på ord du har skrevet inn, for å endre dem"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tastaturtema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatur"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"stemme"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tsjekkisk tastatur"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabisk tastatur"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Dansk tastatur"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tysk tastatur"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelsk tastatur (Storbritannia)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelsk tastatur (USA)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spansk tastatur"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransk tastatur"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransk tastatur (Canada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransk tastatur (Sveits)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebraisk tastatur"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiensk tastatur"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norsk tastatur"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlandsk tastatur"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polsk tastatur"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugisisk tastatur"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisk tastatur"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbisk tastatur"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svensk tastatur"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans tale"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tsjekkisk tale"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Tysk tale"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Engelsk tale"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spansk tale"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransk tale"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italiensk stemme"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japansk tale"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreansk tale"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Nederlandsk stemme"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polsk tale"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugisisk tale"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russisk tale"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Tyrkisk tale"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Kinesisk (yue) tale"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Kinesisk (mandarin) tale"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu tale"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Nyttighetsmodus"</string> </resources> diff --git a/java/res/values-nl/donottranslate-altchars.xml b/java/res/values-nl/donottranslate-altchars.xml index d3beafade..e26a74967 100644 --- a/java/res/values-nl/donottranslate-altchars.xml +++ b/java/res/values-nl/donottranslate-altchars.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,13 +18,10 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">á,ä,â,à,æ,ã,å,ā</string> + <string name="alternates_for_e">3,é,ë,ê,è,ę,ė,ē</string> + <string name="alternates_for_i">8,í,ï,ì,î,į,ī</string> + <string name="alternates_for_o">9,ó,ö,ô,ò,õ,œ,ø,ō</string> + <string name="alternates_for_u">7,ú,ü,û,ù,ū</string> + <string name="alternates_for_n">ñ,ń</string> </resources> diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index 2dc77c700..6c4cb135c 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Trillen bij toetsaanslag"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Geluid bij toetsaanslag"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pop-up bij toetsaanslag"</string> - <string name="hit_correction" msgid="4855351009261318389">"Typefouten corrigeren"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Foutcorrectie tijdens invoer inschakelen"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Invoerfouten in liggende weergave"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Foutcorrectie tijdens invoer inschakelen"</string> - <string name="auto_correction" msgid="7911639788808958255">"Woordsuggesties"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Het vorige woord automatisch corrigeren"</string> - <string name="prediction" msgid="466220283138359837">"Woordsuggesties"</string> - <string name="prediction_category" msgid="7027100625580696660">"Instellingen voor woordsuggesties"</string> - <string name="prediction_summary" msgid="459788228830873110">"Automatisch voltooien tijdens typen inschakelen"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatisch voltooien"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Tekstveld vergroten"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Woordsuggesties verbergen in liggende weergave"</string> + <string name="general_category" msgid="1859088467017573195">"Algemeen"</string> + <string name="correction_category" msgid="2236750915056607613">"Tekstcorrectie"</string> + <string name="ngram_category" msgid="5337109164339320257">"Suggesties op basis van eerdere woorden"</string> + <string name="misc_category" msgid="6894192814868233453">"Andere opties"</string> + <string name="advanced_settings" msgid="362895144495591463">"Geavanceerde instellingen"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opties voor ervaren gebruikers"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Afwijz.vertr. toetspop-up"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Geen vertraging"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standaard"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Auto-hoofdlettergebruik"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Hoofdletter gebruiken aan het begin van een zin"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatische interpunctie"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Snelle oplossingen"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Hiermee worden veelvoorkomende typefouten gecorrigeerd"</string> - <string name="show_suggestions" msgid="507074425254289133">"Suggesties weergeven"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Voorgestelde woorden weergeven tijdens typen"</string> - <string name="auto_complete" msgid="1103196318775486023">"Auto-aanvullen"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Gemarkeerd woord automatisch invoegen met spatiebalk en interpunctie"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Correctievoorstellen weergeven"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Voorgestelde woorden weergeven tijdens typen"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Altijd weergeven"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Weergeven in staande modus"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Altijd verbergen"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Taal schakelen via spatiebalk"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Instellingscode weergeven"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatisch"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Altijd weergeven"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Altijd verbergen"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Digram-suggesties"</string> + <string name="auto_correction" msgid="4979925752001319458">"Autocorrectie"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Met spatiebalk en interpunctie worden verkeerd gespelde woorden automatisch gecorrigeerd"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Uitgeschakeld"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Normaal"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agressief"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Digram-voorspelling"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Het voorgaande woord ook voor voorspelling gebruiken"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: opgeslagen"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Houd een toets ingedrukt om diakritische tekens weer te geven (ø, ö, enzovoort)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Druk op elk gewenst moment op de toets Terug ↶ om het toetsenbord te sluiten"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Toegang tot cijfers en symbolen"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Blijf drukken op het meest linkse woord om het toe te voegen aan het woordenboek"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Raak deze tip aan om door te gaan »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Raak dit punt aan om deze tip te sluiten en te beginnen met typen."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Het toetsenbord wordt geopend wanneer u een tekstveld aanraakt"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Blijf een toets aanraken om diakritische tekens weer te geven"\n"(ø, ö, ô, ó, enzovoort)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Schakel over naar cijfers en symbolen door deze toets aan te raken"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Ga terug naar letters door deze toets nogmaals aan te raken"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Blijf deze toets aanraken om toetsenbordinstellingen te wijzigen, zoals auto-aanvullen"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Probeer het zelf!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Start"</string> <string name="label_next_key" msgid="362972844525672568">"Volgende"</string> <string name="label_done_key" msgid="2441578748772529288">"Gereed"</string> <string name="label_send_key" msgid="2815056534433717444">"Verzenden"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"Alt"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Meer"</string> + <string name="label_pause_key" msgid="181098308428035340">"Onderbr."</string> + <string name="label_wait_key" msgid="6402152600878093134">"Wacht"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Spraakinvoer"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spraakinvoer wordt momenteel niet ondersteund in uw taal, maar is wel beschikbaar in het Engels."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Spraakinvoer is een experimentele functie met de spraakherkenning van het Google-netwerk."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Als u spraakinvoer wilt uitschakelen, gaat u naar de toetsenbordinstellingen."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Als u spraakinvoer gebruikt, drukt u op de microfoonknop of schuift u uw vinger over het schermtoetsenbord."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Spraakinvoer maakt gebruik van de spraakherkenning van Google. Het "<a href="http://m.google.com/privacy">"Privacybeleid van Google Mobile"</a>" is van toepassing."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Als u spraakinvoer wilt uitschakelen, gaat u naar de instellingen voor invoermethoden."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Druk op de microfoontoets om spraakinvoer te gebruiken."</string> <string name="voice_listening" msgid="467518160751321844">"Nu spreken"</string> <string name="voice_working" msgid="6666937792815731889">"Wordt uitgevoerd"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Annuleren"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Spraakinvoer"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Op hoofdtoetsenbord"</item> - <item msgid="8529385602829095903">"Op toetsenbord voor symbolen"</item> - <item msgid="7283103513488381103">"Uit"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfoon op hoofdtoetsenbord"</item> - <item msgid="6907837061058876770">"Microfoon op toetsenbord voor symbolen"</item> - <item msgid="3664304608587798036">"Spraakinvoer is uitgeschakeld"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automatisch verzenden na spraak"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Drukt automatisch op Enter tijdens het zoeken of wanneer u naar het volgende veld wilt gaan."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Het toetsenbord openen"\n</b></font><font size="3">\n</font>"Raak een tekstveld aan."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Het toetsenbord sluiten"\n</b></font><font size="3">\n</font>"Druk op de terugtoets."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Een toets blijven aanraken voor opties"\n</b></font><font size="3">\n</font>"Toegang tot interpunctie en diakritische tekens."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Toetsenbordinstellingen"\n</b></font><font size="3">\n</font>"Blijf de toets \'"<b>"?123"</b>"\' aanraken."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Op hoofdtoetsenbord"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Op symbooltoetsenb."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Uitgeschakeld"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic op hoofdtoetsb."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic op symb.toetsb."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spraakinvoer is uit"</string> <string name="selectInputMethod" msgid="315076553378705821">"Invoermethode selecteren"</string> <string name="language_selection_title" msgid="1651299598555326750">"Invoertalen"</string> <string name="language_selection_summary" msgid="187110938289512256">"Schuif uw vinger over de spatiebalk om de taal te wijzigen"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Gebruikersfeedback inschakelen."</string> <string name="prefs_description_log" msgid="5827825607258246003">"Help deze invoermethode te verbeteren door automatisch gebruiksstatistieken en crashmeldingen naar Google te verzenden."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Raak aan om woorden te corrigeren"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Raak ingevoerde woorden aan om ze te corrigeren"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Ingevoerde woorden aanraken om ze te verbeteren, alleen mogelijk wanneer suggesties zichtbaar zijn"</string> <string name="keyboard_layout" msgid="437433231038683666">"Toetsenbordthema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"toetsenbord"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"spraak"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tsjechisch toetsenbord"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabisch toetsenbord"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Deens toetsenbord"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Duits toetsenbord"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engels toetsenbord (VK)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engels toetsenbord (VS)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spaans toetsenbord"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Frans toetsenbord"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Frans toetsenbord (Canada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Frans toetsenbord (Zwitserland)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebreeuws toetsenbord"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italiaans toetsenbord"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Noors toetsenbord"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nederlands toetsenbord"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Pools toetsenbord"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugees toetsenbord"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russisch toetsenbord"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Servisch toetsenbord"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Zweeds toetsenbord"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaanse stem"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Tsjechische stem"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Duitse stem"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Engelse stem"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spaanse stem"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Franse stem"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italiaanse stem"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanse stem"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Koreaanse stem"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Nederlandse stem"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Poolse stem"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portugese stem"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russische stem"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkse stem"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinese stem (Yue)"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinese stem (Mandarijn)"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu stem"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modus voor gebruiksvriendelijkheidsonderzoek"</string> </resources> diff --git a/java/res/values-pl/donottranslate-altchars.xml b/java/res/values-pl/donottranslate-altchars.xml index da6b5fd5c..971d73bc5 100644 --- a/java/res/values-pl/donottranslate-altchars.xml +++ b/java/res/values-pl/donottranslate-altchars.xml @@ -18,15 +18,12 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">ą</string> - <string name="alternates_for_e">ę3</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">ó9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">ś</string> - <string name="alternates_for_n">ń</string> - <string name="alternates_for_c">ć</string> - <string name="alternates_for_y">ýÿ6</string> - <string name="alternates_for_z">źż</string> + <string name="alternates_for_a">ą,á,à,â,ä,æ,ã,å,ā</string> + <string name="alternates_for_e">3,ę,è,é,ê,ë,ė,ē</string> + <string name="alternates_for_o">9,ó,ö,ô,ò,õ,œ,ø,ō</string> + <string name="alternates_for_s">ś,ß,š</string> + <string name="alternates_for_n">ń,ñ</string> + <string name="alternates_for_c">ć,ç,č</string> + <string name="alternates_for_z">ż,ź,ž</string> <string name="alternates_for_l">ł</string> </resources> diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 8fbb74e37..2c39c532c 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Wibracja przy naciśnięciu"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Dźwięk przy naciśnięciu"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Powiększ po naciśnięciu"</string> - <string name="hit_correction" msgid="4855351009261318389">"Popraw błędy pisowni"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Włącz poprawianie błędów wprowadzania"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Błędy wprowadzania w orientacji poziomej"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Włącz poprawianie błędów wprowadzania"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugestie słów"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automatycznie poprawiaj poprzednie słowo"</string> - <string name="prediction" msgid="466220283138359837">"Sugestie słów"</string> - <string name="prediction_category" msgid="7027100625580696660">"Ustawienia propozycji słów"</string> - <string name="prediction_summary" msgid="459788228830873110">"Włącz autouzupełnianie podczas wpisywania"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autouzupełnianie"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Zwiększ rozmiar pola tekstowego"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Wyłącz sugestie słów w orientacji poziomej"</string> + <string name="general_category" msgid="1859088467017573195">"Ogólne"</string> + <string name="correction_category" msgid="2236750915056607613">"Poprawianie tekstu"</string> + <string name="ngram_category" msgid="5337109164339320257">"Podpowiedzi na podstawie wcześniejszych słów"</string> + <string name="misc_category" msgid="6894192814868233453">"Inne opcje"</string> + <string name="advanced_settings" msgid="362895144495591463">"Ustawienia zaawansowane"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opcje dla zaawansowanych użytkowników"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Opóźnienie wyłączenia wyskakującego okienka"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Bez opóźnienia"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Wartość domyślna"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Wstawiaj wielkie litery"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Zamieniaj na wielką pierwszą literę zdania"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatyczna interpunkcja"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Szybkie poprawki"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Poprawia częste błędy wpisywania"</string> - <string name="show_suggestions" msgid="507074425254289133">"Pokaż sugestie"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Wyświetl sugerowane słowa podczas wpisywania"</string> - <string name="auto_complete" msgid="1103196318775486023">"Autouzupełnianie"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Spacja i znaki przestankowe wstawiają podświetlone słowo"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokazuj propozycje poprawek"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Wyświetl proponowane słowa podczas wpisywania"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Zawsze pokazuj"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Pokaż w trybie pionowym"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Zawsze ukrywaj"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Spacja przełącza język"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Pokaż klawisz ustawień"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatycznie"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Zawsze pokazuj"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Zawsze ukrywaj"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Sugestie dla bigramów"</string> + <string name="auto_correction" msgid="4979925752001319458">"Autokorekta"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Spacja i znaki przestankowe poprawiają błędnie wpisane słowa"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Wyłącz"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Umiarkowana"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresywna"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Podpowiadanie dwuznakó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="bigram_prediction" msgid="8914273444762259739">"Przewidywanie dwuznaków"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Przewiduj również na podstawie poprzedniego słowa"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Zapisano"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Przytrzymaj klawisz, aby wyświetlić znaki akcentowane (ą, ó itp.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Naciśnij klawisz cofania ↶, aby zamknąć klawiaturę w dowolnym momencie"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Przejdź do cyfr i symboli"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Naciśnij i przytrzymaj słowo po lewej stronie w celu dodania go do słownika"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Dotknij tej podpowiedzi, aby kontynuować »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Dotknij tutaj, aby zamknąć tę podpowiedź i zacząć pisać!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klawiatura jest otwierana po każdym dotknięciu pola tekstowego."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Dotknij i przytrzymaj klawisz, aby wyświetlić znaki akcentowane"\n"(ą, ę, ł, ó itd.)."</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Przełącz na cyfry i symbole, dotykając tego klawisza."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Wróć do trybu liter, dotykając ponownie tego klawisza."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Dotknij i przytrzymaj ten klawisz, aby zmienić ustawienia klawiatury, takie jak autouzupełnianie."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Wypróbuj!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"OK"</string> <string name="label_next_key" msgid="362972844525672568">"Dalej"</string> <string name="label_done_key" msgid="2441578748772529288">"OK"</string> <string name="label_send_key" msgid="2815056534433717444">"Wyślij"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Więcej"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Czekaj"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Wprowadzanie głosowe"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Wprowadzanie głosowe obecnie nie jest obsługiwane w Twoim języku, ale działa w języku angielskim."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Wprowadzanie głosowe to funkcja eksperymentalna wykorzystująca funkcję firmy Google umożliwiającą rozpoznawanie mowy przy użyciu sieci."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Aby wyłączyć wprowadzanie głosowe, przejdź do ustawień klawiatury."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Aby skorzystać z wprowadzania głosowego, naciśnij przycisk mikrofonu lub przesuń palcem po klawiaturze ekranowej."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Funkcja wprowadzania głosowego wykorzystuje mechanizm rozpoznawania mowy. Obowiązuje "<a href="http://m.google.com/privacy">"Polityka prywatności Google Mobile"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Aby wyłączyć rozpoznawanie mowy, przejdź do ustawień sposobu wprowadzania tekstu."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Aby użyć wprowadzania głosowego, naciśnij przycisk mikrofonu."</string> <string name="voice_listening" msgid="467518160751321844">"Mów teraz"</string> <string name="voice_working" msgid="6666937792815731889">"W toku"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Anuluj"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Wprowadzanie głosowe"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Na klawiaturze głównej"</item> - <item msgid="8529385602829095903">"Na klawiaturze z symbolami"</item> - <item msgid="7283103513488381103">"Wyłączone"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon na klawiaturze głównej"</item> - <item msgid="6907837061058876770">"Mikrofon na klawiaturze z symbolami"</item> - <item msgid="3664304608587798036">"Wprowadzanie głosowe jest wyłączone"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Automatyczne przesyłanie uruchamiane głosem"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Podczas wyszukiwania lub przechodzenia do następnego pola automatycznie naciśnij klawisz Enter."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otwórz klawiaturę"\n</b></font><font size="3">\n</font>"Dotknij dowolnego pola tekstowego."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zamknij klawiaturę"\n</b></font><font size="3">\n</font>"Naciśnij klawisz Wróć."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Dotknij klawisza i przytrzymaj go, aby wyświetlić opcje"\n</b></font><font size="3">\n</font>"Dostęp do znaków przestankowych i akcentowanych."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Ustawienia klawiatury"\n</b></font><font size="3">\n</font>"Dotknij klawisza "<b>"?123"</b>" i przytrzymaj go."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na klawiaturze głównej"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klawiaturze z symbolami"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Wyłącz"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon na klawiaturze głównej"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofon na klawiaturze z symbolami"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Wprowadzanie głosowe jest wyłączone"</string> <string name="selectInputMethod" msgid="315076553378705821">"Wybierz sposób wprowadzania tekstu"</string> <string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string> <string name="language_selection_summary" msgid="187110938289512256">"Przesuń palcem po spacji, aby zmienić język"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Włącz przesyłanie opinii użytkownika"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Pomóż ulepszyć edytor wprowadzania tekstu, automatycznie wysyłając do Google statystyki użycia i raporty o awariach."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Popraw dotknięte słowo"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dotknięte słowo zostanie poprawione"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotykaj wprowadzonych słów, aby je poprawiać tylko wówczas, gdy widoczne są sugestie."</string> <string name="keyboard_layout" msgid="437433231038683666">"Motyw klawiatury"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klawiatura"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"głosowe"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Klawiatura czeska"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Klawiatura arabska"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Klawiatura duńska"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Klawiatura niemiecka"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Klawiatura angielska (UK)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Klawiatura angielska (USA)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Klawiatura hiszpańska"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Klawiatura francuska"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Klawiatura francuska (Kanada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Klawiatura francuska (Szwajcaria)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Klawiatura hebrajska"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Klawiatura włoska"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Klawiatura norweska"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Klawiatura holenderska"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Klawiatura polska"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Klawiatura portugalska"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Klawiatura rosyjska"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Klawiatura serbska"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Klawiatura szwedzka"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Mowa afrikaans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Mowa czeska"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Mowa niemiecka"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Mowa angielska"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Mowa hiszpańska"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Mowa francuska"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Mowa włoska"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Mowa japońska"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Mowa koreańska"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Mowa holenderska"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Mowa polska"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Mowa portugalska"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Mowa rosyjska"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Mowa turecka"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Mowa chińska (kantoński)"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Mowa chińska (mandaryński)"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Mowa isiZulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Tryb badania przydatności"</string> </resources> diff --git a/java/res/values-pt-rPT/donottranslate-altchars.xml b/java/res/values-pt-rPT/donottranslate-altchars.xml deleted file mode 100644 index d3beafade..000000000 --- a/java/res/values-pt-rPT/donottranslate-altchars.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> -</resources> diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 7495b66ed..cae6f49f7 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao primir as teclas"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Som ao premir as teclas"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Mostrar popup ao premir tecla"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corrigir erros de escrita"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Activar a correcção de erros de entrada"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Erros de entrada na horizontal"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activar a correcção de erros de entrada"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugestões de palavras"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corrigir automaticamente a palavra anterior"</string> - <string name="prediction" msgid="466220283138359837">"Sugestões de palavras"</string> - <string name="prediction_category" msgid="7027100625580696660">"Definições de sugestão de palavras"</string> - <string name="prediction_summary" msgid="459788228830873110">"Activar a conclusão automática durante a escrita"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Conclusão automática"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar o tamanho do campo de texto"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugestões de palavras na vista horizontal"</string> + <string name="general_category" msgid="1859088467017573195">"Geral"</string> + <string name="correction_category" msgid="2236750915056607613">"Correção de texto"</string> + <string name="ngram_category" msgid="5337109164339320257">"Sugestões baseadas em palavras anteriores"</string> + <string name="misc_category" msgid="6894192814868233453">"Outras opções"</string> + <string name="advanced_settings" msgid="362895144495591463">"Definições avançadas"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opções para utilizadores experientes"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Atraso p/ ignorar pop-up"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sem atraso"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predefinido"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Letras maiúsculas automáticas"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Colocar inicial maiúscula no início de uma frase"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Pontuação automática"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Correcções rápidas"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige os erros de escrita comuns"</string> - <string name="show_suggestions" msgid="507074425254289133">"Mostrar sugestões"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Apresentar sugestões de palavras ao escrever"</string> - <string name="auto_complete" msgid="1103196318775486023">"Conclusão automática"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"A barra de espaços e a pontuação inserem automaticamente uma palavra realçada"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugestões de correcção"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Apresentar sugestões de palavras ao escrever"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar no modo de retrato"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar sempre"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Utilizar barra esp. alt. idioma"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla das definições"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automático"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar sempre"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ocultar sempre"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Sugestões Bigram"</string> + <string name="auto_correction" msgid="4979925752001319458">"Auto correcção"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Correcção automática de palavras mal escritas c/ barra de espaços e pontuação"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desligar"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderada"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agressiva"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Predição Bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Utilizar a palavra anterior também para predição"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Mantenha uma tecla premida para ver os acentos (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Prima a tecla de retrocesso ↶ para fechar o teclado a qualquer momento"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Aceder a números e símbolos"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Prima e mantenha premida a palavra mais à esquerda para a adicionar ao dicionário"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Toque nesta sugestão para continuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Toque aqui para fechar esta sugestão e começar a escrever!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"O teclado abre quando tocar num campo de texto"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Mantenha premida uma tecla para ver os acentos"\n"(ø, ö, ô, ó, etc.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Mude para números e símbolos tocando nesta tecla"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Regresse às letras tocando novamente nesta tecla"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Mantenha premida esta tecla para alterar definições do teclado, tais como a conclusão automática"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Experimente!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Ir"</string> <string name="label_next_key" msgid="362972844525672568">"Seguinte"</string> <string name="label_done_key" msgid="2441578748772529288">"Feito"</string> <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Mais"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Esp."</string> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente, a entrada de voz não é suportada para o seu idioma, mas funciona em inglês."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A entrada de voz é uma funcionalidade experimental que utiliza o reconhecimento de voz em rede da Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desactivar a entrada de voz, aceda às definições do teclado."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para utilizar a entrada de voz, prima o botão do microfone ou deslize o dedo no teclado do ecrã."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de voz utiliza o reconhecimento de voz da Google. É aplicável a "<a href="http://m.google.com/privacy">"Política de privacidade do Google Mobile"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desactivar a entrada de voz, aceda às definições do método de entrada."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para utilizar a entrada de voz, prima o botão do microfone."</string> <string name="voice_listening" msgid="467518160751321844">"Falar agora"</string> <string name="voice_working" msgid="6666937792815731889">"A executar"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Entrada de voz"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"No teclado principal"</item> - <item msgid="8529385602829095903">"No teclado de símbolos"</item> - <item msgid="7283103513488381103">"Desactivada"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfone no teclado principal"</item> - <item msgid="6907837061058876770">"Microfone no teclado de símbolos"</item> - <item msgid="3664304608587798036">"A entrada de voz está desactivada"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Enviar automaticamente depois da voz"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Premir automaticamente ENTER ao pesquisar ou avançar para o campo seguinte."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abra o teclado"\n</b></font><font size="3">\n</font>"Toque em qualquer campo de texto."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Feche o teclado"\n</b></font><font size="3">\n</font>"Prima a tecla \"Anterior\"."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Mantenha premida uma tecla para as opções"\n</b></font><font size="3">\n</font>"Aceder a pontuação e acentos."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Definições do teclado"\n</b></font><font size="3">\n</font>"Mantenha premida a tecla "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"No teclado principal"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"No teclado símbolos"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Desligar"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic. tecl. principal"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic. tecl. símbolos"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. voz desact."</string> <string name="selectInputMethod" msgid="315076553378705821">"Seleccionar método de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> <string name="language_selection_summary" msgid="187110938289512256">"Deslize o dedo pela barra de espaço para alterar o idioma"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Activar comentários do utilizador"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Envie automaticamente estatísticas de utilização e relatórios de falhas para a Google e ajude-nos a melhor este editor de método de introdução."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corrigir palavras"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tocar nas palavras introduzidas para as corrigir"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tocar nas palavras introduzidas para as corrigir, apenas quando as sugestões estiverem visíveis"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema do teclado"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclado"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voz"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado checo"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Teclado árabe"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado dinamarquês"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado alemão"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado inglês (Reino Unido)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado inglês (EUA)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado espanhol"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado francês"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado francês (Canadá)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado francês (Suíça)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Teclado hebraico"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado italiano"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado norueguês"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado holandês"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado Polaco"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado Português"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado russo"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado sérvio"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado sueco"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz em africânder"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz checa"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz alemã"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz em inglês"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz espanhola"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz francesa"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz japonesa"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz coreana"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz polaca"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz portuguesa"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz russa"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz turca"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz em yue, chinês"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz em mandarim, chinês"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz em isiZulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modo de estudo da capacidade de utilização"</string> </resources> diff --git a/java/res/values-pt/donottranslate-altchars.xml b/java/res/values-pt/donottranslate-altchars.xml index d3beafade..a39976151 100644 --- a/java/res/values-pt/donottranslate-altchars.xml +++ b/java/res/values-pt/donottranslate-altchars.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,13 +18,10 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóôõöœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_a">á,ã,à,â,ä,å,æ,ª</string> + <string name="alternates_for_e">3,é,ê,è,ę,ė,ē,ë</string> + <string name="alternates_for_i">8,í,î,ì,ï,į,ī</string> + <string name="alternates_for_o">9,ó,õ,ô,ò,ö,œ,ø,ō,º</string> + <string name="alternates_for_u">7,ú,ü,ù,û,ū</string> + <string name="alternates_for_c">ç,č,ć</string> </resources> diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index d359ce932..62c20eb82 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao tocar a tecla"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Som ao tocar a tecla"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Exibir pop-up ao digitar"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corrigir erros de digitação"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Ativar a correção de erro de entrada"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Erros de entrada de paisagem"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Ativar a correção de erro de entrada"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugestões de palavra"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corrigir automaticamente a palavra anterior"</string> - <string name="prediction" msgid="466220283138359837">"Sugestões de palavra"</string> - <string name="prediction_category" msgid="7027100625580696660">"Configurações de sugestão de palavra"</string> - <string name="prediction_summary" msgid="459788228830873110">"Ativar a conclusão automática durante a digitação"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Conclusão automática"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar o tamanho do arquivo de texto"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugestões de palavra na visualização da paisagem"</string> + <string name="general_category" msgid="1859088467017573195">"Geral"</string> + <string name="correction_category" msgid="2236750915056607613">"Correção de texto"</string> + <string name="ngram_category" msgid="5337109164339320257">"Sugestões baseadas em palavras anteriores"</string> + <string name="misc_category" msgid="6894192814868233453">"Outras opções"</string> + <string name="advanced_settings" msgid="362895144495591463">"Configurações avançadas"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opções para usuários experientes"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Dispens. atraso chave princ."</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sem atraso"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Padrão"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Capitaliz. automática"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Colocar em maiúscula o início de uma frase"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Pontuação automática"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Reparos rápidos"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige erros comuns de digitação"</string> - <string name="show_suggestions" msgid="507074425254289133">"Mostrar sugestões"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Exibir sugestões de palavras durante a digitação"</string> - <string name="auto_complete" msgid="1103196318775486023">"Conclusão automática"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Barra de espaço e pontuação inserem a palavra destacada"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Exibir sugestões de correção"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Exibir sugestões de palavras durante a digitação"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Mostrar em modo retrato"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Sempre ocultar"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Alt. idiomas c/ a barra"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Mostrar tecla de config."</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automático"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Mostrar sempre"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Sempre ocultar"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Sugestões de bigrama"</string> + <string name="auto_correction" msgid="4979925752001319458">"Autocorreção"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"A barra de espaço e a pontuação corrigem automaticamente palavras com erro de digitação"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desativado"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderado"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agressivo"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Previsão de bigrama"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Use também a palavra anterior para prever"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Salvo"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Segure uma tecla pressionada para ver os acentos (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Apertar a tecla voltar ↶ para fechar o teclado, em qualquer ponto"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Acessar números e símbolos"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Pressione e segure a palavra mais à esquerda para adicioná-la ao dicionário"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Toque nesta dica para continuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Toque aqui para fechar esta dica e começar a digitar!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"O teclado abre toda vez que você tocar em um campo de texto"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tocar e segurar uma tecla para visualizar acentos"\n"(ø, ö, ô, ó e assim por diante)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Alternar para números e símbolos tocando nessa tecla"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Voltar às letras tocando novamente nessa tecla"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tocar e segurar esta tecla para alterar as configurações do teclado, como a conclusão automática"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Experimente!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Ir"</string> <string name="label_next_key" msgid="362972844525672568">"Avançar"</string> <string name="label_done_key" msgid="2441578748772529288">"Feito"</string> <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Mais"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Esp."</string> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A entrada de voz não é suportada no momento para o seu idioma, mas funciona em inglês."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"A entrada de voz é um recurso experimental que usa o reconhecimento de fala de rede do Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Para desativar a entrada de voz, vá para as configurações do teclado."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Para usar a entrada de voz, pressione o botão com o microfone ou deslize o dedo sobre o teclado na tela."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de texto por voz usa o reconhecimento de voz do Google. "<a href="http://m.google.com/privacy">"A política de privacidade para celulares"</a>" é aplicada."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Para desativar a entrada de texto por voz, vá para configurações do método de entrada."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Para usar a entrada de texto por voz, pressione o botão do microfone."</string> <string name="voice_listening" msgid="467518160751321844">"Fale agora"</string> <string name="voice_working" msgid="6666937792815731889">"Trabalhando"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Entrada de voz"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"No teclado principal"</item> - <item msgid="8529385602829095903">"No teclado de símbolos"</item> - <item msgid="7283103513488381103">"Desativado"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfone no teclado principal"</item> - <item msgid="6907837061058876770">"Microfone no teclado de símbolos"</item> - <item msgid="3664304608587798036">"Entrada de voz desativada"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Enviar automaticamente depois de falar"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Pressione Enter automaticamente ao pesquisar ou ir para o próximo campo."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abra o teclado"\n</b></font><font size="3">\n</font>"Toque em qualquer campo de texto."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Feche o teclado"\n</b></font><font size="3">\n</font>"Pressione a tecla Voltar."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Toque e mantenha pressionada uma tecla para ver as opções"\n</b></font><font size="3">\n</font>"Acesse a pontuação e as pronúncias."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Configurações de teclado"\n</b></font><font size="3">\n</font>"Toque e mantenha pressionada a tecla "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"No teclado principal"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"No teclado de símb."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Desativado"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic. no teclado"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic. no teclado"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Texto por voz desat."</string> <string name="selectInputMethod" msgid="315076553378705821">"Selecionar método de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> <string name="language_selection_summary" msgid="187110938289512256">"Deslize o dedo na barra de espaços para alterar o idioma"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Ativar comentário do usuário"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ajude a melhorar este editor de método de entrada enviando automaticamente ao Google estatísticas de uso e relatórios de falhas."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tocar para corrigir"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Toque as palavras para corrigi-las"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Toque nas palavras digitadas para corrigi-las apenas quando as sugestões estiverem visíveis"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema do teclado"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"teclado"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voz"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Teclado em tcheco"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Teclado árabe"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Teclado para dinamarquês"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Teclado para alemão"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Teclado para inglês (Reino Unido)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Teclado para inglês (EUA)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Teclado para espanhol"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Teclado para francês"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Teclado para francês (Canadá)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Teclado para francês (Suíça)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Teclado hebraico"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Teclado para italiano"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Teclado para norueguês"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Teclado para holandês"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Teclado polonês"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Teclado em português"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Teclado para russo"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Teclado para sérvio"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Teclado para sueco"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voz em africâner"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voz em tcheco"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voz em alemão"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voz em inglês"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voz em espanhol"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voz em francês"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voz italiana"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voz em japonês"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voz em coreano"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voz holandesa"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voz em polonês"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voz em português"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voz em russo"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voz em turco"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voz em chinês, cantonês"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voz em chinês, mandarim"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voz em zulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modo de estudo de utilização"</string> </resources> diff --git a/java/res/values-rm/donottranslate-altchars.xml b/java/res/values-rm/donottranslate-altchars.xml index f17026fa9..0a5d2aad1 100644 --- a/java/res/values-rm/donottranslate-altchars.xml +++ b/java/res/values-rm/donottranslate-altchars.xml @@ -18,13 +18,5 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">3èéêë</string> - <string name="alternates_for_i">ìíîï8</string> - <string name="alternates_for_o">òóöôõœø9</string> - <string name="alternates_for_u">ùúûü7</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ6</string> + <string name="alternates_for_o">9,ò,ó,ö,ô,õ,œ,ø</string> </resources> diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml index 47afae9a6..ddb40e809 100644 --- a/java/res/values-rm/strings.xml +++ b/java/res/values-rm/strings.xml @@ -27,28 +27,43 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar cun smatgar in buttun"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Tun cun smatgar in buttun"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pop-up cun smatgar ina tasta"</string> - <string name="hit_correction" msgid="4855351009261318389">"Curreger sbagls d\'endataziun"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Activar la correctura da sbagls d\'endataziun"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Sbagls d\'endataziun en il format orizontal"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activar la correctura da sbagls d\'endataziun"</string> - <string name="auto_correction" msgid="7911639788808958255">"Propostas da pleds"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Curreger automaticamain il pled precedent"</string> - <string name="prediction" msgid="466220283138359837">"Propostas da pleds"</string> - <string name="prediction_category" msgid="7027100625580696660">"Parameters da las propostas per pleds"</string> - <string name="prediction_summary" msgid="459788228830873110">"Activar la cumplettaziun automatica durant l\'endataziun"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Cumplettaziun automatica"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Engrondir il champ da text"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Zuppentar propostas da pleds en il format orizontal"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- no translation found for correction_category (2236750915056607613) --> + <skip /> + <!-- no translation found for ngram_category (5337109164339320257) --> + <skip /> + <!-- no translation found for misc_category (6894192814868233453) --> + <skip /> + <!-- no translation found for advanced_settings (362895144495591463) --> + <skip /> + <!-- no translation found for advanced_settings_summary (5193513161106637254) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Maiusclas automaticas"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Scriver grond l\'entschatta da mintga frasa"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Interpuncziun automatica"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Correcturas sveltas"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Curregia sbagls da tippar currents"</string> - <string name="show_suggestions" msgid="507074425254289133">"Mussar las propostas"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Mussar pleds proponids durant l\'endataziun"</string> - <string name="auto_complete" msgid="1103196318775486023">"Cumplettaziun automatica"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Inserir auto. il pled marcà cun la tasta da vid/interpuncziun"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3551821800439659812) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> + <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) --> + <skip /> <!-- no translation found for prefs_settings_key (4623341240804046498) --> <skip /> <!-- no translation found for settings_key_mode_auto_name (2993460277873684680) --> @@ -57,42 +72,38 @@ <skip /> <!-- no translation found for settings_key_mode_always_hide_name (7833948046716923994) --> <skip /> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Propostas da tip bigram"</string> + <!-- outdated translation 7911639788808958255 --> <string name="auto_correction" msgid="4979925752001319458">"Propostas da pleds"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Curreger automaticamain il pled precedent"</string> + <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_aggeressive (3524029103734923819) --> + <skip /> + <!-- outdated translation 1323347224043514969 --> <string name="bigram_suggestion" msgid="2636414079905220518">"Propostas da tip bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Meglierar la proposta cun agid dal pled precedent"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Nagin"</item> - <item msgid="1669461741568287396">"Simpel"</item> - <item msgid="4894328801530136615">"Avanzà"</item> - </string-array> + <!-- no translation found for bigram_prediction (8914273444762259739) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (1747261921174300098) --> + <skip /> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Memorisà"</string> - <string name="tip_long_press" msgid="6101270866284343344">"\"Tegnair smatgà per mussar ils accents (à, é, etc.)\""</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Smatgar ↶ per serrar la tastatura"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Acceder a cifras e simbols"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Smatgar ditg sin il pled dal tut a sanestra per l\'agiuntar al dicziunari"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Tutgar quest commentari per cuntinuar »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"\"Tutgar qua, per serrar quest commentari e cumenzar a tippar!\""</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"La tastatura vegn adina averta sche Vus tutgais in champ da text."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501">"\""<b>"Tegnai smatgà ina tasta per mussar ils segns spezials"\n"(ø, ö, ô, ó etc.)."</b>"\""</string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Midai a numers e simbols cun tutgar quest buttun."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Turnai a letras cun smatgar danovamain quest buttun."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128">"\""<b>"Tegnai smatgà quest buttun per midar ils parameters da tastatura, sco p. ex. la cumplettaziun automatica."</b>"\""</string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Empruvai!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Dai"</string> <string name="label_next_key" msgid="362972844525672568">"Vinavant"</string> <string name="label_done_key" msgid="2441578748772529288">"Finì"</string> <string name="label_send_key" msgid="2815056534433717444">"Trametter"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <!-- no translation found for label_to_alpha_key (4793983863798817523) --> + <skip /> + <!-- no translation found for label_more_key (3760239494604948502) --> + <skip /> + <!-- no translation found for label_pause_key (181098308428035340) --> + <skip /> + <!-- no translation found for label_wait_key (6402152600878093134) --> + <skip /> <string name="voice_warning_title" msgid="4419354150908395008">"Cumonds vocals"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"\"Cumonds vocals en Vossa lingua na vegnan actualmain betg sustegnids, ma la funcziun è disponibla per englais.\""</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"\"Per deactivar ils cumonds vocals, avri ils parameters da tastatura.\""</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"\"Per utilisar ils cumonds vocals, smatgai il buttun dal microfon u stritgai cun il det sur la tastatura dal visur.\""</string> + <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google."</string> + <!-- outdated translation 5652369578498701761 --> <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"\"Per deactivar ils cumonds vocals, avri ils parameters da tastatura.\""</string> + <!-- outdated translation 6892342981545727994 --> <string name="voice_hint_dialog_message" msgid="1420686286820661548">"\"Per utilisar ils cumonds vocals, smatgai il buttun dal microfon u stritgai cun il det sur la tastatura dal visur.\""</string> <string name="voice_listening" msgid="467518160751321844">"Ussa discurrer"</string> <string name="voice_working" msgid="6666937792815731889">"Operaziun en progress"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -109,27 +120,18 @@ <string name="cancel" msgid="6830980399865683324">"Interrumper"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Cumonds vocals"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Sin la tastatura principala"</item> - <item msgid="8529385602829095903">"Sin la tastatura da simbols"</item> - <item msgid="7283103513488381103">"Deactivà"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfon sin la tastatura principala"</item> - <item msgid="6907837061058876770">"Microfon sin la tastatura da simbols"</item> - <item msgid="3664304608587798036">"Ils cumonds vocals èn deactivads"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Trametter automaticamain suenter il cumond vocal"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Smatgai sin la tasta enter sche Vus exequis ina tschertga u siglis al proxim champ."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Avrir la tastatura"\n</b></font><font size="3">\n</font>"Tutgai inqual champ da text."</string> - <string name="close_the_keyboard" msgid="6251022259044940103">"\""<font size="17"><b>"Serrar la tastatura"\n</b></font><font size="3">\n</font>"Smatgai il buttun \"\"Enavos\"\".\""</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tutgar e tegnair smatgà in buttun per acceder a las opziuns"\n</b></font><font size="3">\n</font>"Accedi a segns d\'interpuncziun ed accents."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Parameters da tastatura"\n</b></font><font size="3">\n</font>"Tutgai e tegnai smatgà il buttun "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) --> + <skip /> + <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) --> + <skip /> + <!-- no translation found for voice_input_modes_off (3745699748218082014) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_off (63875609591897607) --> + <skip /> <!-- no translation found for selectInputMethod (315076553378705821) --> <skip /> <string name="language_selection_title" msgid="1651299598555326750">"Linguas da cumonds vocals"</string> @@ -140,9 +142,87 @@ <string name="prefs_description_log" msgid="5827825607258246003">"Gidai a meglierar quest editur da la metoda d\'endataziun cun trametter automaticamain datas statisticas davart l\'utilisaziun e rapports da collaps a Google."</string> <!-- no translation found for prefs_enable_recorrection (4588408906649533582) --> <skip /> - <!-- no translation found for prefs_enable_recorrection_summary (1056068922330206170) --> + <!-- no translation found for prefs_enable_recorrection_summary (5082041365862396329) --> <skip /> <string name="keyboard_layout" msgid="437433231038683666">"Design da la tastatura"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatura"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"vusch"</string> + <!-- no translation found for subtype_mode_cs_keyboard (1141718931112377586) --> + <skip /> + <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) --> + <skip /> + <!-- no translation found for subtype_mode_da_keyboard (1243570804427922104) --> + <skip /> + <!-- no translation found for subtype_mode_de_keyboard (1990979135959462145) --> + <skip /> + <!-- no translation found for subtype_mode_en_GB_keyboard (7945856548410373708) --> + <skip /> + <!-- no translation found for subtype_mode_en_US_keyboard (3708655163769735410) --> + <skip /> + <!-- no translation found for subtype_mode_es_keyboard (1775125478866113148) --> + <skip /> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <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_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) --> + <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_pl_keyboard (2225816414814396047) --> + <skip /> + <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) --> + <skip /> + <!-- no translation found for subtype_mode_ru_keyboard (1383995915064277943) --> + <skip /> + <!-- no translation found for subtype_mode_sr_keyboard (5019440799612208168) --> + <skip /> + <!-- no translation found for subtype_mode_sv_keyboard (4933838139861753401) --> + <skip /> + <!-- no translation found for subtype_mode_af_voice (7542487489657902699) --> + <skip /> + <!-- no translation found for subtype_mode_cs_voice (1136386688120958641) --> + <skip /> + <!-- no translation found for subtype_mode_de_voice (8378803143958089866) --> + <skip /> + <!-- no translation found for subtype_mode_en_voice (6643420989651848728) --> + <skip /> + <!-- no translation found for subtype_mode_es_voice (1323473601346507487) --> + <skip /> + <!-- no translation found for subtype_mode_fr_voice (4675914209337824269) --> + <skip /> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <!-- no translation found for subtype_mode_ja_voice (6604859132669646367) --> + <skip /> + <!-- no translation found for subtype_mode_ko_voice (4890391190762324561) --> + <skip /> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <!-- no translation found for subtype_mode_pl_voice (2076196021014840487) --> + <skip /> + <!-- no translation found for subtype_mode_pt_voice (8036522712795994397) --> + <skip /> + <!-- no translation found for subtype_mode_ru_voice (8034596947963787529) --> + <skip /> + <!-- no translation found for subtype_mode_tr_voice (3402067436761140005) --> + <skip /> + <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) --> + <skip /> + <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) --> + <skip /> + <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (6937813623647419810) --> + <skip /> </resources> diff --git a/java/res/values-ro/donottranslate-altchars.xml b/java/res/values-ro/donottranslate-altchars.xml new file mode 100644 index 000000000..728ead472 --- /dev/null +++ b/java/res/values-ro/donottranslate-altchars.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="alternates_for_a">ă,â,à,á,ä,æ,ã,å,ā</string> + <string name="alternates_for_i">8,î,ï,ì,í,į,ī</string> + <string name="alternates_for_s">ș,ß,ś,š</string> + <string name="alternates_for_t">5,ț</string> +</resources> diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml index 37fdeb4cb..960ced552 100644 --- a/java/res/values-ro/strings.xml +++ b/java/res/values-ro/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrare la apăsarea tastei"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Sunet la apăsarea tastei"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Fereastră pop-up la apăsarea tastei"</string> - <string name="hit_correction" msgid="4855351009261318389">"Corectaţi erorile de dactilografiere"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Activaţi corectarea erorii de intrare"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Erori de introducere în modul peisaj"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Activaţi corectarea erorii de intrare"</string> - <string name="auto_correction" msgid="7911639788808958255">"Sugestii de cuvinte"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Corecţie automată a cuvântului anterior"</string> - <string name="prediction" msgid="466220283138359837">"Sugestii de cuvinte"</string> - <string name="prediction_category" msgid="7027100625580696660">"Setările sugestiei de cuvinte"</string> - <string name="prediction_summary" msgid="459788228830873110">"Activaţi completarea automată în timpul introducerii textului"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Completare automată"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Măriţi dimensiunea câmpului text"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ascundeţi sugestiile de cuvinte în vizualizarea de tip peisaj"</string> + <string name="general_category" msgid="1859088467017573195">"General"</string> + <string name="correction_category" msgid="2236750915056607613">"Corectare text"</string> + <string name="ngram_category" msgid="5337109164339320257">"Sugestii bazate pe cuvinte anterioare"</string> + <string name="misc_category" msgid="6894192814868233453">"Alte opţiuni"</string> + <string name="advanced_settings" msgid="362895144495591463">"Setări avansate"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Opţiuni pt. utiliz. experţi"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Înt. înch. pop-up esenţ."</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Fără întârziere"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Prestabilit"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalizare"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Doresc să se scrie cu majusculă începutul propoziţiilor"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Punctuaţie automată"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Remedieri rapide"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Corectează greşelile introduse frecvent"</string> - <string name="show_suggestions" msgid="507074425254289133">"Afişaţi sugestiile"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Afişare sugestii de cuvinte în timpul introducerii de text"</string> - <string name="auto_complete" msgid="1103196318775486023">"Completare automată"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Bara de spaţiu şi punctuaţia inserează automat un cuvânt evidenţiat"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Afişaţi sugestii de corectare"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Afişaţi sugestii de cuvinte în timpul introducerii textului"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Afişaţi întotdeauna"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Afişaţi în modul Portret"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ascundeţi întotdeauna"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Spacebar – selector limbă"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Afişaţi tasta setări"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automat"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Afişaţi întotdeauna"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Ascundeţi întotdeauna"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Sugestii pentru cuvinte de două litere"</string> + <string name="auto_correction" msgid="4979925752001319458">"Autocorecţie"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Corectare automată cuvinte prin bară spaţiu/semne punctuaţie"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Dezactivată"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderată"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivă"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Sugestii de tip bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Utilizaţi cuvântul anterior pentru a îmbunătăţi sugestia"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Niciunul"</item> - <item msgid="1669461741568287396">"De bază"</item> - <item msgid="4894328801530136615">"Avansat"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Predicţii de tip bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Se utilizează şi cuvântul precedent pentru predicţii"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: salvat"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Ţineţi o tastă apăsată pentru a vedea accentele (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Apăsaţi tasta Înapoi ↶ pentru a închide oricând tastatura"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Accesaţi numere şi simboluri"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Apăsaţi şi ţineţi apăsat pe cuvântul cel mai din stânga, pentru a-l adăuga la dicţionar"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Atingeţi acest indiciu pentru a continua »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Atingeţi aici pentru a închide acest indiciu şi începeţi să introduceţi text!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastatura se deschide de fiecare dată când atingeţi un câmp text"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Atingeţi şi ţineţi apăsată o tastă pentru a vizualiza accentele"\n"(ø, ö, ô, ó etc.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Comutaţi între numere şi simboluri atingând această tastă"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Reveniţi la litere prin atingerea acestei taste din nou"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Apăsaţi şi ţineţi apăsată această tastă pentru a schimba setările tastaturii, cum ar fi completarea automată"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Încercaţi!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"OK"</string> <string name="label_next_key" msgid="362972844525672568">"Înainte"</string> <string name="label_done_key" msgid="2441578748772529288">"Terminat"</string> <string name="label_send_key" msgid="2815056534433717444">"Trimiteţi"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Mai multe"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pauză"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Aşt."</string> <string name="voice_warning_title" msgid="4419354150908395008">"Intrare voce"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Intrarea vocală nu este acceptată în prezent pentru limba dvs., însă funcţionează în limba engleză."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Intrarea vocală este o funcţie experimentală ce utilizează recunoaşterea vocală în reţea oferită de Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Pentru a dezactiva intrarea vocală, accesaţi setările tastaturii."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Pentru a utiliza intrarea vocală, apăsaţi butonul de microfon sau glisaţi degetul de-a lungul tastaturii de pe ecran."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Intrarea vocală utilizează funcţia Google de recunoaştere vocală. Se aplică "<a href="http://m.google.com/privacy">"Politica de confidenţialitate Google Mobil"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Pentru a dezactiva intrarea vocală, accesaţi setările metodei de intrare."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Pentru a utiliza intrarea vocală, apăsaţi pe butonul Microfon."</string> <string name="voice_listening" msgid="467518160751321844">"Vorbiţi acum"</string> <string name="voice_working" msgid="6666937792815731889">"Se analizează"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Anulaţi"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Intrare voce"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Pe tastatura principală"</item> - <item msgid="8529385602829095903">"Pe tastatura de simboluri"</item> - <item msgid="7283103513488381103">"Dezactivat"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Microfon pe tastatura principală"</item> - <item msgid="6907837061058876770">"Microfon pe tastatura de simboluri"</item> - <item msgid="3664304608587798036">"Intrarea vocală este dezactivată"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Trimitere automată după intrarea vocală"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Apăsaţi automat tasta Enter atunci când se face o căutare sau când se trece la câmpul următor."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Deschideţi tastatura"\n</b></font><font size="3">\n</font>"Atingeţi orice câmp de text."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Închideţi tastatura"\n</b></font><font size="3">\n</font>"Apăsaţi pe tasta Înapoi."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Atingeţi şi ţineţi apăsată o tastă pentru opţiuni"\n</b></font><font size="3">\n</font>"Accesaţi punctuaţia şi accentele."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Setările tastaturii"\n</b></font><font size="3">\n</font>"Atingeţi şi ţineţi apăsată tasta "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pe tastat. princip."</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pe tastat. simbol."</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Dezactivată"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic. pe tast. princ."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micr. pe tast. simb."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Intr. vocală dezact."</string> <string name="selectInputMethod" msgid="315076553378705821">"Selectaţi metoda de introducere a textului"</string> <string name="language_selection_title" msgid="1651299598555326750">"Selectaţi limba"</string> <string name="language_selection_summary" msgid="187110938289512256">"Glisaţi degetul pe bara de spaţiu pentru a schimba limba"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Activaţi feedback de la utilizatori"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Ajutaţi la îmbunătăţirea acestui instrument de editare a metodelor de introducere a textului trimiţând în mod automat la Google statistici de utilizare şi rapoarte de blocare."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Atingeţi pentru a corecta cuvintele"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Atingeţi cuvintele introduse pentru a le corecta"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Atingeţi cuvintele introduse pentru a le corecta, numai când pot fi văzute sugestii"</string> <string name="keyboard_layout" msgid="437433231038683666">"Temă pentru tastatură"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tastatură"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"voce"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tastatură cehă"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Tastatură arabă"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Tastatură daneză"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tastatură germană"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tastatură engleză (Marea Britanie)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tastatură engleză (S.U.A.)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Tastatură spaniolă"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Tastatură franceză"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tastatură franceză (Canada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tastatură franceză (Elveţia)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Tastatură ebraică"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Tastatură italiană"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Tastatură norvegiană"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Tastatură olandeză"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Tastatură poloneză"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Tastatură portugheză"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Tastatură rusă"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Tastatură sârbă"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Tastatură suedeză"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voce afrikaans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Voce cehă"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Voce germană"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voce engleză"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Voce spaniolă"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Voce franceză"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voce italiană"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Voce japoneză"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Voce coreeană"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voce olandeză"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Voce poloneză"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Voce portugheză"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Voce rusă"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Voce turcă"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voce chineză, yue"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voce chineză, mandarină"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voce isiZulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Modul Studiu privind utilizarea"</string> </resources> diff --git a/java/res/values-ru/donottranslate-altchars.xml b/java/res/values-ru/donottranslate-altchars.xml index 46241a62a..2da8b8469 100644 --- a/java/res/values-ru/donottranslate-altchars.xml +++ b/java/res/values-ru/donottranslate-altchars.xml @@ -18,15 +18,6 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">èéêë</string> - <string name="alternates_for_i">ìíîï</string> - <string name="alternates_for_o">òóôõöœø</string> - <string name="alternates_for_u">ùúûü</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ</string> - <string name="alternates_for_cyrillic_e">ё5</string> + <string name="alternates_for_cyrillic_e">5,ё</string> <string name="alternates_for_cyrillic_soft_sign">ъ</string> </resources> diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 0b70f0b34..68ec65038 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Виброотклик клавиш"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук клавиш"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Увеличение нажатых"</string> - <string name="hit_correction" msgid="4855351009261318389">"Исправлять опечатки"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Включить исправление ошибок при вводе"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Ошибки при вводе в горизонтальной ориентации"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Включить исправление ошибок при вводе"</string> - <string name="auto_correction" msgid="7911639788808958255">"Предложение слов"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Автоматически исправлять предыдущее слово"</string> - <string name="prediction" msgid="466220283138359837">"Предложение слов"</string> - <string name="prediction_category" msgid="7027100625580696660">"Настройки подсказок"</string> - <string name="prediction_summary" msgid="459788228830873110">"Включить автоматическое завершение слов при вводе"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Автоматическое завершение"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Увеличить размер текстового поля"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Скрывать предложение слов в горизонтальной ориентации"</string> + <string name="general_category" msgid="1859088467017573195">"Общие"</string> + <string name="correction_category" msgid="2236750915056607613">"Исправление текста"</string> + <string name="ngram_category" msgid="5337109164339320257">"Подсказки, основанные на предыдущих словах"</string> + <string name="misc_category" msgid="6894192814868233453">"Другие варианты"</string> + <string name="advanced_settings" msgid="362895144495591463">"Расширенные настройки"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Для опытных пользователей"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Задержка закрытия"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Без задержки"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"По умолчанию"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Заглавные автоматически"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Делать заглавной первую букву предложения"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Автопунктуация"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Быстрое исправление"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Исправлять распространенные опечатки"</string> - <string name="show_suggestions" msgid="507074425254289133">"Предлагать варианты"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Предлагать варианты слов во время ввода"</string> - <string name="auto_complete" msgid="1103196318775486023">"Автозавершение"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"При нажатии пробела вставлять предложенное слово"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Показать варианты исправлений"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Предлагать варианты слов во время ввода"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Всегда показывать"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показать вертикально"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Всегда скрывать"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Пробел меняет язык"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Кнопка настроек"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Автоматически"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Всегда показывать"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Всегда скрывать"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Биграммные подсказки"</string> + <string name="auto_correction" msgid="4979925752001319458">"Автоисправление"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Автоматическое исправление опечаток при вводе знака препинания или пробела"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Откл."</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умеренное"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Активное"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Биграммные подсказки"</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="bigram_prediction" msgid="8914273444762259739">"Биграммный прогноз"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Использовать предыдущее слово для прогнозирования"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: сохранено"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Удерживайте клавишу, чтобы увидеть варианты с диакритическими знаками (ø, ö и т.д.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Нажмите клавишу \"Назад\" ↶, чтобы закрыть клавиатуру в любой момент"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Открыть цифры и символы"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Нажмите и удерживайте слово слева, чтобы добавить его в словарь"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Чтобы продолжить, нажмите на эту подсказку »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Нажмите здесь, чтобы закрыть подсказку и начать вводить текст."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Клавиатура появляется автоматически при касании текстового поля"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Нажмите и удерживайте клавишу для отображения вариантов с диакритическими знаками "\n"(ø, ö, ô, ó и т. п.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Для переключения между вводом цифр и символов используйте эту клавишу"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Чтобы вернуться к буквенной клавиатуре, снова нажмите на эту клавишу"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Чтобы изменить настройки клавиатуры (такие как автозавершение), нажмите и удерживайте эту клавишу"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Попробуйте!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Поиск"</string> <string name="label_next_key" msgid="362972844525672568">"Далее"</string> <string name="label_done_key" msgid="2441578748772529288">"Готово"</string> <string name="label_send_key" msgid="2815056534433717444">"Отправить"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"АБВ"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string> + <string name="label_more_key" msgid="3760239494604948502">"Ещё"</string> + <string name="label_pause_key" msgid="181098308428035340">"Приостановить"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Подождите"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Голосовой ввод"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"В настоящее время функция голосового ввода не поддерживает ваш язык, но вы можете пользоваться ей на английском."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Голосовой ввод – экспериментальная функция на основе технологии сетевого распознавания речи от Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Функция голосового ввода отключается в настройках клавиатуры."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Чтобы использовать голосовой ввод, нажмите кнопку микрофона или проведите пальцем по экранной клавиатуре."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовой ввод использует алгоритмы распознавания речи Google. Действует "<a href="http://m.google.com/privacy">"политика конфиденциальности для мобильных устройств"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Функция голосового ввода отключается в настройках способа ввода."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Чтобы использовать голосовой ввод, нажмите кнопку микрофона."</string> <string name="voice_listening" msgid="467518160751321844">"Говорите"</string> <string name="voice_working" msgid="6666937792815731889">"Обработка запроса"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Отмена"</string> <string name="ok" msgid="7898366843681727667">"ОК"</string> <string name="voice_input" msgid="2466640768843347841">"Голосовой ввод"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Значок на основной клавиатуре"</item> - <item msgid="8529385602829095903">"Значок на клавиатуре символов"</item> - <item msgid="7283103513488381103">"Отключить голосовой ввод"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Значок на основной клавиатуре"</item> - <item msgid="6907837061058876770">"Значок на клавиатуре символов"</item> - <item msgid="3664304608587798036">"Голосовой ввод отключен"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Автоматически отправлять по окончании голосового ввода"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Автоматически нажимать \"Ввод\" при поиске или переходе к следующему полю."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Открытие клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите на любое текстовое поле."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Закрытие клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите клавишу \"Назад\"."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Нажмите и удерживайте клавишу для вызова параметров"\n</b></font><font size="3">\n</font>"Доступ к пунктуационным и диакритическим знакам."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Настройки клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите и удерживайте клавишу "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Значок на основной клавиатуре"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Значок на клавиатуре символов"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Выкл."</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Значок на основной клавиатуре"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Значок на клавиатуре символов"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голосовой ввод откл."</string> <string name="selectInputMethod" msgid="315076553378705821">"Выбрать способ ввода"</string> <string name="language_selection_title" msgid="1651299598555326750">"Языки ввода"</string> <string name="language_selection_summary" msgid="187110938289512256">"Для изменения языка проведите пальцем по пробелу"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Включить отправку сведений"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Помогите усовершенствовать редактор способа ввода, разрешив отправку статистики и отчетов о сбоях в Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Исправление нажатием"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Нажмите на слово, чтобы исправить его"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Нажмите на слово, чтобы исправить его (при наличии подсказок)"</string> <string name="keyboard_layout" msgid="437433231038683666">"Вид клавиатуры"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"клавиатура"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"голосовой"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Клавиатура: чешская"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Арабская клавиатура"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Клавиатура: датская"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Клавиатура: немецкая"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Клавиатура: английская (Великобритания)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Клавиатура: английская (США)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Клавиатура: испанская"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Клавиатура: французская"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Клавиатура: французская"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Клавиатура: французская (Швейцария)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Клавиатура на иврите"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Клавиатура: итальянская"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Клавиатура: норвежская"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Клавиатура: голландская"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Польская клавиатура"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Португальская раскладка"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Клавиатура: русская"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Клавиатура: сербская"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Голос: шведский"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Голосовой ввод на африкаанс"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Голос: чешский"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Голос: немецкий"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Голосовой ввод на английском"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Голос: испанский"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Голос: французский"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Голосовой ввод на итальянском"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Голос: японский"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Голос: корейский"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Голосовой ввод на голландском"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Голос: польский"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Голос: португальский"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Голос: русский"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Голос: турецкий"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Голосовой ввод на китайском (диалект юэ)"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Голосовой ввод на китайском (мандаринский диалект)"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Голосовой ввод на зулу"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Режим проверки удобства использования"</string> </resources> diff --git a/java/res/values-sk/donottranslate-altchars.xml b/java/res/values-sk/donottranslate-altchars.xml new file mode 100644 index 000000000..6d9836e9c --- /dev/null +++ b/java/res/values-sk/donottranslate-altchars.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="alternates_for_a">ä,á,à,â,æ,ã,å,ā</string> + <string name="alternates_for_e">3,é,ě,è,ê,ë,ę,ė,ē</string> + <string name="alternates_for_i">8,í,î,ï,ì,į,ī</string> + <string name="alternates_for_o">9,ô,ó,ö,ò,õ,œ,ø,ō</string> + <string name="alternates_for_u">7,ú,ú,û,ü,ù,ū</string> + <string name="alternates_for_s">š,ß,ś</string> + <string name="alternates_for_n">ň,ñ,ń</string> + <string name="alternates_for_c">č,ç,ć</string> + <string name="alternates_for_y">6,ý,ÿ</string> + <string name="alternates_for_d">ď</string> + <string name="alternates_for_r">4,ŕ,ř</string> + <string name="alternates_for_t">5,ť</string> + <string name="alternates_for_z">ž,ź,ż</string> + <string name="alternates_for_l">ľ,ĺ,ł</string> +</resources> diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml index 89e3bea29..3d5dd5878 100644 --- a/java/res/values-sk/strings.xml +++ b/java/res/values-sk/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Pri stlačení klávesu vibrovať"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk pri stlačení klávesu"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Zobraziť znaky pri stlačení klávesu"</string> - <string name="hit_correction" msgid="4855351009261318389">"Opravovať preklepy"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Povoliť opravu chýb vstupu"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Chyby vstupu v zobrazení na šírku"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Povoliť opravu chýb vstupu"</string> - <string name="auto_correction" msgid="7911639788808958255">"Návrhy slov"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Automaticky opraviť predchádzajúce slovo"</string> - <string name="prediction" msgid="466220283138359837">"Návrhy slov"</string> - <string name="prediction_category" msgid="7027100625580696660">"Nastavenia návrhov slov"</string> - <string name="prediction_summary" msgid="459788228830873110">"Povoliť automatické dokončovanie pri písaní"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatické dokončovanie"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Zväčšiť textové pole"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skryť návrhy slov v zobrazení na šírku"</string> + <string name="general_category" msgid="1859088467017573195">"Všeobecné"</string> + <string name="correction_category" msgid="2236750915056607613">"Oprava textu"</string> + <string name="ngram_category" msgid="5337109164339320257">"Návrhy na základe predchádzajúcich slov"</string> + <string name="misc_category" msgid="6894192814868233453">"Ďalšie možnosti"</string> + <string name="advanced_settings" msgid="362895144495591463">"Rozšírené nastavenia"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Možnosti pre skúsených používateľov"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Onesk. zrušenia kľúč. kon. okna"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Bez oneskorenia"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predvolená"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Veľké písmená automaticky"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Začať vetu veľkým písmenom"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatická interpunkcia"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Rýchle opravy"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Opravuje najčastejšie chyby pri písaní"</string> - <string name="show_suggestions" msgid="507074425254289133">"Zobraziť návrhy"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Zobrazovať navrhované slová počas písania"</string> - <string name="auto_complete" msgid="1103196318775486023">"Automatické dokončovanie"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Stlačením medzerníka alebo interpunkčného znamienka automaticky vložíte zvýraznené slovo."</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobraziť návrhy opráv"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Zobrazovať navrhované slová počas písania"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vždy zobrazovať"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Zobraziť v režime na výšku"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vždy skrývať"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Použite medzerník na prepínanie medzi jazykmi"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Zobraziť kláves Nastavenia"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automaticky"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vždy zobrazovať"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vždy skrývať"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Návrh Bigram"</string> + <string name="auto_correction" msgid="4979925752001319458">"Automatické opravy"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Stlačením medzerníka a interpunkcie sa aut. opravia chybné slová"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Vypnuté"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Mierne"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresívne"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Návrhy Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Na zlepšenie návrhu použiť predchádzajúce slovo"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Žiadne"</item> - <item msgid="1669461741568287396">"Základné"</item> - <item msgid="4894328801530136615">"Rozšírené"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Odhady Bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Použiť predchádzajúce slovo aj pre predpoveď"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Uložené"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Podržaním klávesu zobrazíte diakritiku (á, ž atď.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Stlačením klávesu Späť ↶ môžete klávesnicu kedykoľvek zavrieť."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Prístup k číslam a symbolom"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Stlačením a podržaním slova úplne vľavo toto slovo pridáte do slovníka."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Ak chcete pokračovať, dotknite sa tohto tipu »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Ak chcete tento tip zavrieť a začať písať, dotknite sa tu."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klávesnica sa otvorí vždy, keď sa dotknete textového poľa."</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Pridržaním klávesu zobrazíte diakritiku"\n"(ó, ø, ö, ô apod.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Ak chcete prepnúť na režim zadávania číslic a symbolov, dotknite sa tohto klávesu."</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Ak chcete prejsť späť na zadávanie písmen, dotknite sa znova tohto klávesu."</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Pridržaním tohto klávesu zmeníte nastavenia klávesnice (napr. automatické dokončovanie)."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Skúste si to."</b></string> <string name="label_go_key" msgid="1635148082137219148">"Hľadať"</string> <string name="label_next_key" msgid="362972844525672568">"Ďalej"</string> <string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string> <string name="label_send_key" msgid="2815056534433717444">"Odoslať"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Viac"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pozastaviť"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Čakajte"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pre váš jazyk aktuálne nie je hlasový vstup podporovaný, ale funguje v angličtine."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Hlasový vstup je experimentálna funkcia, ktorá využíva sieťové rozpoznanie reči spoločnosti Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Ak chcete vypnúť hlasový vstup, prejdite na nastavenia klávesnice."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Ak chcete použiť hlasový vstup, stlačte tlačidlo mikrofónu alebo prejdite prstom po klávesnici na obrazovke."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup používa rozpoznávanie hlasu Google. Na používanie hlasového vstupu sa vzťahujú "<a href="http://m.google.com/privacy">"Pravidlá ochrany osobných údajov pre mobilné služby"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ak chcete vypnúť hlasový vstup, prejdite na nastavenia metódy vstupu."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ak chcete použiť hlasový vstup, stlačte tlačidlo mikrofón."</string> <string name="voice_listening" msgid="467518160751321844">"Hovorte"</string> <string name="voice_working" msgid="6666937792815731889">"Prebieha spracovanie"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Zrušiť"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Hlasový vstup"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Na hlavnej klávesnici"</item> - <item msgid="8529385602829095903">"Na klávesnici so symbolmi"</item> - <item msgid="7283103513488381103">"Vypnuté"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofón na hlavnej klávesnici"</item> - <item msgid="6907837061058876770">"Mikrofón na klávesnici so symbolmi"</item> - <item msgid="3664304608587798036">"Hlasový vstup je zakázaný"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Po hlasovom vstupe automaticky odoslať"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Pri vyhľadávaní alebo prechode na ďalšie pole automaticky stlačiť kláves Enter."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otvorte klávesnicu"\n</b></font><font size="3">\n</font>"Dotknite sa ľubovoľného textového poľa."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zatvorte klávesnicu"\n</b></font><font size="3">\n</font>"Stlačte tlačidlo Späť."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Dotknutím a pridržaním klávesu zobrazíte možnosti"\n</b></font><font size="3">\n</font>"Prístup k interpunkčným znamienkam a diakritike."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Nastavenia klávesnice"\n</b></font><font size="3">\n</font>"Dotknite sa klávesu "<b>"?123"</b>" a podržte ho."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".sk"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".net"</string> - <string name="popular_domain_4" msgid="35359437471311470">".eu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na hlavnej klávesnici"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na klávesnici so symbolmi"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Vypnuté"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofón na hlavnej klávesnici"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofón na klávesnici so symbolmi"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup je zakázaný"</string> <string name="selectInputMethod" msgid="315076553378705821">"Výber metódy vstupu"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jazyky vstupu"</string> <string name="language_selection_summary" msgid="187110938289512256">"Jazyk môžete zmeniť posunutím prsta po medzerníku."</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Povoliť spätnú väzbu od používateľov"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Automatickým zasielaním štatistík o využívaní editora metódy vstupu a správ o jeho zlyhaní do služby Google môžete prispieť k vylepšeniu tohto nástroja."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotykom opravíte slová"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dotykom zadaným slov ich opravíte"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotykom zadaných slov tieto slová opravíte, musia však byť viditeľné návrhy"</string> <string name="keyboard_layout" msgid="437433231038683666">"Motív klávesnice"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klávesnica"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"hlasová"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"klávesnica – čeština"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"klávesnica – arabčina"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"klávesnica – dánčina"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"klávesnica – nemčina"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"klávesnica – angličtina (br.)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"klávesnica – angličtina (am.)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"klávesnica – španielčina"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"klávesnica – francúzština"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"klávesnica – francúzština (Kanada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"klávesnica – francúzština (Švajč.)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"klávesnica – hebrejčina"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"klávesnica – taliančina"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"klávesnica – nórčina"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"klávesnica – holandčina"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poľská klávesnica"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalská klávesnica"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"klávesnica – ruština"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"hlas – srbčina"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"klávesnica – švédčina"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Hlas – afrikánčina"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"hlas – čeština"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"hlas – nemčina"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Hlas – angličtina"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"hlas – španielčina"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"hlas – francúzština"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"hlas – taliančina"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"hlas – japončina"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"hlas – kórejčina"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"hlas – holandčina"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"hlas – poľština"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"hlas – portugalčina"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"hlas – ruština"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"hlas – turečtina"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Hlas – čínština, kantónčina"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Hlas – čínština, mandarínska"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Hlas – Zulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Režim Štúdia vhodnosti použitia"</string> </resources> diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml index 090e0b92e..a747f4c66 100644 --- a/java/res/values-sl/strings.xml +++ b/java/res/values-sl/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibriranje ob pritisku tipke"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Zvok ob pritisku tipke"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pojavno okno ob pritisku tipke"</string> - <string name="hit_correction" msgid="4855351009261318389">"Popravljanje tipkarskih napak"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Omogoči popravljanje napak pri vnosu"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Napake pri vnosu v ležečem položaju"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Omogoči popravljanje napak pri vnosu"</string> - <string name="auto_correction" msgid="7911639788808958255">"Predlogi besed"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Samodejno popravi prejšnjo besedo"</string> - <string name="prediction" msgid="466220283138359837">"Predlogi besed"</string> - <string name="prediction_category" msgid="7027100625580696660">"Nastavitve za predlaganje besede"</string> - <string name="prediction_summary" msgid="459788228830873110">"Omogoči samodokončanje med tipkanjem"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Samodokončanje"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Povečaj velikost besedilnega polja"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Skrij predloge besed v ležečem pogledu"</string> + <string name="general_category" msgid="1859088467017573195">"Splošno"</string> + <string name="correction_category" msgid="2236750915056607613">"Popravek besedila"</string> + <string name="ngram_category" msgid="5337109164339320257">"Predlogi, ki temeljijo na prejšnjih besedah"</string> + <string name="misc_category" msgid="6894192814868233453">"Druge možnosti"</string> + <string name="advanced_settings" msgid="362895144495591463">"Dodatne nastavitve"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Možnosti za izkušene uporabnike"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Zakas. okna za zavrnitev"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Brez zamude"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Privzeto"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Samodejne velike začetnice"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Napiši začetek stavka z veliko začetnico"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Samodejno vstavljanje ločil"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Hitri popravki"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Popravi pogoste tipkarske napake"</string> - <string name="show_suggestions" msgid="507074425254289133">"Pokaži predloge"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Prikaži predlagane besede med tipkanjem"</string> - <string name="auto_complete" msgid="1103196318775486023">"Samodokončanje"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Preslednica in ločila samodejno vnesejo označeno besedo"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokaži predloge popravkov"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Pokaži predlagane besede med tipkanjem"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vedno pokaži"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Pokaži v pokončnem načinu"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Vedno skrij"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Preklopite med jeziki s preslednico"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Pokaži tipko za nastavitve"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Samodejno"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Vedno pokaži"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Vedno skrij"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigramni predlogi"</string> + <string name="auto_correction" msgid="4979925752001319458">"Samodejni popravek"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Preslednica in ločila samodejno popravijo napačno vtipkane besede"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Izklopljeno"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Zmerno"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivno"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Bigramni predlogi"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Predlog izboljšaj s prejšnjo besedo"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Brez"</item> - <item msgid="1669461741568287396">"Osnovni"</item> - <item msgid="4894328801530136615">"Dodatno"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Bigramsko predvidevanje"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Uporabi prejšnjo besedo tudi za predvidevanje"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: shranjeno"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Držite tipko, da prikažete poudarke (ø, ö itd.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Kadar koli lahko pritisnete tipko »Nazaj« ↶, da zaprete tipkovnico"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Dostop do številk in simbolov"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Če besedo želite dodati v slovar, jo pridržite"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Dotaknite se tega nasveta za nadaljevanje »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Dotaknite se tukaj, da zaprete nasvet in začnete tipkati!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tipkovnice se odpre, kadar se dotaknete besedilnega polja"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Za ogled poudarkov pridržite tipko"\n"(ø, ö, ô, ó itd.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Preklopite na številke in simbole z dotikom te tipke"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Na črke se vrnete, če se še enkrat dotaknete te tipke"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Pridržite to tipko, če želite spremeniti nastavitve tipkovnice, npr. samodokončanje"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Poskusite!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Pojdi"</string> <string name="label_next_key" msgid="362972844525672568">"Naprej"</string> <string name="label_done_key" msgid="2441578748772529288">"Dokončano"</string> <string name="label_send_key" msgid="2815056534433717444">"Pošlji"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Več"</string> + <string name="label_pause_key" msgid="181098308428035340">"Premor"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Čakaj"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Glasovni vnos"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Glasovni vnos trenutno ni podprt v vašem jeziku, deluje pa v angleščini."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Glasovni vnos je poskusna funkcija, ki uporablja Googlovo omrežno prepoznavanje govora."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Če želite izklopiti glasovni vnos, pojdite na nastavitve tipkovnice."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Če želite uporabiti glasovni vnos, pritisnite gumb z mikrofonom ali podrsajte s prstom po zaslonski tipkovnici."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni vnos uporablja Googlovo prepoznavanje govora. Zanj velja "<a href="http://m.google.com/privacy">"pravilnik o zasebnosti za mobilne naprave"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Glasovni vnos izklopite v nastavitvah načina vnosa."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Če želite uporabljati glasovni vnos, pritisnite gumb z mikrofonom."</string> <string name="voice_listening" msgid="467518160751321844">"Začnite govoriti"</string> <string name="voice_working" msgid="6666937792815731889">"Obdelava"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Prekliči"</string> <string name="ok" msgid="7898366843681727667">"V redu"</string> <string name="voice_input" msgid="2466640768843347841">"Glasovni vnos"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Na glavni tipkovnici"</item> - <item msgid="8529385602829095903">"Na tipkovnici s simboli"</item> - <item msgid="7283103513488381103">"Izklopljeno"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon na glavni tipkovnici"</item> - <item msgid="6907837061058876770">"Mikrofon na tipkovnici s simboli"</item> - <item msgid="3664304608587798036">"Glasovni vnos je onemogočen"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Samodejno pošlji po govoru"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Samodejno pritisni »Enter« pri iskanju ali prehodu na naslednje polje."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Odprite tipkovnico"\n</b></font><font size="3">\n</font>"Dotaknite se katerega koli besedilnega polja."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zaprite tipkovnico"\n</b></font><font size="3">\n</font>"Pritisnite tipko »Nazaj«."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Pridržite tipko za ogled možnosti"\n</b></font><font size="3">\n</font>"Dostop do ločil in poudarkov."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Nastavitve "\n</b></font><font size="3">\n</font>"Pridržite tipko "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na glavni tipkovnici"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na tipk. s simboli"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Izklopljeno"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mik. na glavni tipk."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. na tipk. s sim."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. vnos je onem."</string> <string name="selectInputMethod" msgid="315076553378705821">"Izberite način vnosa"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jeziki vnosa"</string> <string name="language_selection_summary" msgid="187110938289512256">"Podrsajte s prstom po preslednici, da zamenjate jezik"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Omogoči povratne informacije uporabnikov"</string> <string name="prefs_description_log" msgid="5827825607258246003">"S samodejnim pošiljanjem statističnih podatkov o uporabi in poročil o zrušitvah Googlu nam lahko pomagate izboljšati urejevalnik načina vnosa."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Dotaknite se besed in jih popravite"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Dotaknite se vnesenih besed in jih popravite"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Dotaknite se vnesenih besed in jih popravite, samo ko so predlogi vidni"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema tipkovnice"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tipkovnica"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"govor"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Češka tipkovnica"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabska tipkovnica"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danska tipkovnica"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Nemška tipkovnica"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Tipkovnica za britansko angleščino"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Tipkovnica za ameriško angleščino"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Španska tipkovnica"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Francoska tipkovnica"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Tipkovnica za kanadsko francoščino"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Tipkovnica za švicarsko francoščino"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebrejska tipkovnica"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italijanska tipkovnica"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveška tipkovnica"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Nizozemska tipkovnica"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Poljska tipkovnica"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugalska tipkovnica"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ruska tipkovnica"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Srbska tipkovnica"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Švedska tipkovnica"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Govor v afrikanščini"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Govor v češčini"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Govor v nemščini"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Govor v angleščini"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Govor v španščini"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Govor v francoščini"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Govor v italijanščini"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Govor v japonščini"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Govor v korejščini"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Govor v nizozemščini"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Govor v poljščini"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Govor v portugalščini"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Govor v ruščini"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Govor v turščini"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Govor v kitajščini, jue"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Govor v kitajščini, mandarinščini"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Govor v zulujščini"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Način za preučevanje uporabnosti"</string> </resources> diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml index 7b00501a5..025ce91b5 100644 --- a/java/res/values-sr/strings.xml +++ b/java/res/values-sr/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вибрирај на притисак тастера"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук на притисак тастера"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Искачући прозор приликом притиска тастера"</string> - <string name="hit_correction" msgid="4855351009261318389">"Исправи грешке у куцању"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Омогућавање исправљања грешака током уноса"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Грешке приликом уноса у положеном приказу"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Омогућавање исправљања грешака током уноса"</string> - <string name="auto_correction" msgid="7911639788808958255">"Предлагање речи"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Аутоматско исправљање претходне речи"</string> - <string name="prediction" msgid="466220283138359837">"Предлагање речи"</string> - <string name="prediction_category" msgid="7027100625580696660">"Подешавања за предлагање речи"</string> - <string name="prediction_summary" msgid="459788228830873110">"Омогућавање аутоматског довршавања током уноса текста"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Аутоматско довршавање"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Повећај величину поља за текст"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Скривање предложених речи у положеном приказу"</string> + <string name="general_category" msgid="1859088467017573195">"Опште"</string> + <string name="correction_category" msgid="2236750915056607613">"Исправљање текста"</string> + <string name="ngram_category" msgid="5337109164339320257">"Предлози на основу претходних речи"</string> + <string name="misc_category" msgid="6894192814868233453">"Друге опције"</string> + <string name="advanced_settings" msgid="362895144495591463">"Напредна подешавања"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Опције за искусне кориснике"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Одложи одбац. иск. прозора тастера"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Без одлагања"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Подразумевано"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Аутоматски унос великих слова"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Унос великог слова на почетку реченице"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Аутоматска интерпункција"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Брзе исправке"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Исправља честе грешке у куцању"</string> - <string name="show_suggestions" msgid="507074425254289133">"Прикажи предлоге"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Приказивање предложених речи током уноса текста"</string> - <string name="auto_complete" msgid="1103196318775486023">"Аутоматско довршавање"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Означена реч се аутоматски умеће када притиснете размак или знак интерпункције"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Прикажи предлоге за исправку"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Приказивање предложених речи током уноса текста"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Увек прикажи"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Прикажи у усправном режиму"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Увек сакриј"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Користи размак за избор језика"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Прикажи тастер за подешавања"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Аутоматски"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Увек прикажи"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Увек сакриј"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram предлози"</string> + <string name="auto_correction" msgid="4979925752001319458">"Аутоматско исправљање"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Размак и интерпункција аутоматски исправљају грешке у куцању"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Искључи"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Умерено"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Агресивно"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Bigram предвиђање"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Користи претходну реч и за предвиђање"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Сачувано"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Држите тастер да бисте видели акценте (ø, ö итд.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Притисните тастер „Назад“ ↶ у било ком тренутку да бисте затворили тастатуру"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Приступите бројевима и симболима"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Притисните и држите прву реч са леве стране да бисте је додали у речник"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Додирните овај савет да бисте наставили »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Додирните овде да бисте затворили овај савет и почели да уносите текст!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Тастатура се отвара сваки пут када додирнете поље за текст"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Додирните и држите тастер да бисте видели акценте"\n"(ø, ö, ô, ó, и тако даље)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Пређите на бројеве и симболе тако што ћете додирнути овај тастер"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Вратите се на слова тако што ћете поново додирнути овај тастер"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Додирните и држите овај тастер да бисте променили подешавања тастатуре, као што је аутоматско довршавање"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Пробајте!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Иди"</string> <string name="label_next_key" msgid="362972844525672568">"Следеће"</string> <string name="label_done_key" msgid="2441578748772529288">"Готово"</string> <string name="label_send_key" msgid="2815056534433717444">"Пошаљи"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Још"</string> + <string name="label_pause_key" msgid="181098308428035340">"Паузирај"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Сачекајте"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Гласовни унос"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Гласовни унос тренутно није подржан за ваш језик, али функционише на енглеском."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Гласовни унос је експериментална функција која користи Google-ово мрежно препознавање гласа."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Да бисте искључили гласовни унос, идите на подешавања тастатуре."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Да бисте користили гласовни унос, притисните дугме за микрофон или превуците прст преко тастатуре на екрану."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовни унос користи Google-ову функцију за препознавање гласа. Примењује се "<a href="http://m.google.com/privacy">"политика приватности за мобилне уређаје"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Да бисте искључили гласовни унос, идите на подешавања за начин уноса."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Да бисте користили гласовни унос, притисните дугме за микрофон."</string> <string name="voice_listening" msgid="467518160751321844">"Говорите сада"</string> <string name="voice_working" msgid="6666937792815731889">"Обрада"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Откажи"</string> <string name="ok" msgid="7898366843681727667">"Потврди"</string> <string name="voice_input" msgid="2466640768843347841">"Гласовни унос"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"На главној тастатури"</item> - <item msgid="8529385602829095903">"На тастатури са симболима"</item> - <item msgid="7283103513488381103">"Искључено"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Микрофон на главној тастатури"</item> - <item msgid="6907837061058876770">"Микрофон на тастатури са симболима"</item> - <item msgid="3664304608587798036">"Гласовни унос је онемогућен"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Аутоматски пошаљи после гласа"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Аутоматски притисак на enter приликом претраге или преласка на следеће поље."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Активирање тастатуре"\n</b></font><font size="3">\n</font>"Додирните било које поље за текст."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Затварање тастатуре"\n</b></font><font size="3">\n</font>"Притисните тастер „Назад“."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Додирните и држите тастер да би се приказале опције"\n</b></font><font size="3">\n</font>"Приступ знаковима интерпункције и акцентима."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Подешавања тастатуре"\n</b></font><font size="3">\n</font>"Додирните и држите тастер "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На главној тастатури"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"На тастатури са симболима"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Искључи"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Микрофон на главној тастатури"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Микрофон на тастатури са симболима"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Гласовни унос је онемогућен"</string> <string name="selectInputMethod" msgid="315076553378705821">"Изаберите метод уноса"</string> <string name="language_selection_title" msgid="1651299598555326750">"Језици за унос"</string> <string name="language_selection_summary" msgid="187110938289512256">"Превуците прст преко тастера за размак да бисте променили језик"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Омогући повратну информацију корисника"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Помозите да се побољша овај уређивач режима уноса тако што ће се аутоматски послати статистика о коришћењу и извештаји о грешкама компанији Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Додирните да бисте исправили речи"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Додирните унете речи да бисте их исправили"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Додирните унете речи да бисте их исправили само када су предлози видљиви"</string> <string name="keyboard_layout" msgid="437433231038683666">"Тема тастатуре"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"тастатура"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"глас"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Језик тастатуре: чешки"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Језик тастатуре: арапски"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Језик тастатуре: дански"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Језик тастатуре: немачки"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Језик тастатуре: енглески (УК)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Језик тастатуре: енглески (САД)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Језик тастатуре: шпански"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Језик тастатуре: француски"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Језик тастатуре: француски (Канада)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Језик тастатуре: француски (Швајц.)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Језик тастатуре: хебрејски"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Језик тастатуре: италијански"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Језик тастатуре: норвешки"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Језик тастатуре: холандски"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Језик тастатуре: пољски"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Језик тастатуре: португалски"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Језик тастатуре: руски"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Језик тастатуре: српски"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Језик тастатуре: шведски"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Глас на африкансу"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Глас на чешком"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Глас на немачком"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Глас на енглеском"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Глас на шпанском"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Глас на француском"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Глас на италијанском"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Глас на јапанском"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Глас на корејском"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Глас на холандском"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Глас на пољском"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Глас на португалском"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Глас на руском"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Глас на турском"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Глас на јуе кинеском"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Глас на мандаринском кинеском"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Глас на језику исизулу"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Режим за студију могућности коришћења"</string> </resources> diff --git a/java/res/values-sv/donottranslate-altchars.xml b/java/res/values-sv/donottranslate-altchars.xml index 4d26e6c47..d03ae1a6c 100644 --- a/java/res/values-sv/donottranslate-altchars.xml +++ b/java/res/values-sv/donottranslate-altchars.xml @@ -18,21 +18,12 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">áàâąã</string> - <string name="alternates_for_e">3éèêëę€</string> - <string name="alternates_for_i">íìîï8</string> - <string name="alternates_for_o">óòôõ9</string> - <string name="alternates_for_u">úùûū7</string> - <string name="alternates_for_s">śšşß</string> - <string name="alternates_for_n">ńñň</string> - <string name="alternates_for_c">çćč</string> - <string name="alternates_for_y">ýÿü6</string> - <string name="alternates_for_d">ðď</string> - <string name="alternates_for_r">ř4</string> - <string name="alternates_for_t">ťþ5</string> - <string name="alternates_for_z">źžż</string> - <string name="alternates_for_l">ł</string> - <string name="alternates_for_v">w</string> - <string name="alternates_for_a_umlaut">æ</string> - <string name="alternates_for_o_umlaut">øœ</string> + <string name="alternates_for_e">3,é,è,ê,ë,ę</string> + <string name="alternates_for_o">9,œ,ô,ò,ó,õ,ō</string> + <string name="alternates_for_u">7,ü,û,ù,ú,ū</string> + <string name="alternates_for_s">ß,ś,š</string> + <string name="keylabel_for_scandinavia_row2_10">ö</string> + <string name="keylabel_for_scandinavia_row2_11">ä</string> + <string name="alternates_for_scandinavia_row2_10">ø</string> + <string name="alternates_for_scandinavia_row2_11">æ</string> </resources> diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index c736418f3..cf0fcf899 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrera vid tangenttryck"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Knappljud"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Popup vid knapptryck"</string> - <string name="hit_correction" msgid="4855351009261318389">"Rätta skrivfel"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Aktivera rättning av felaktiga inmatningar"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Inmatningsfel i liggande vy"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Aktivera rättning av felaktiga inmatningar"</string> - <string name="auto_correction" msgid="7911639788808958255">"Ordförslag"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Rätta automatiskt föregående ord"</string> - <string name="prediction" msgid="466220283138359837">"Ordförslag"</string> - <string name="prediction_category" msgid="7027100625580696660">"Inställningar för ordförslag"</string> - <string name="prediction_summary" msgid="459788228830873110">"Aktivera Komplettera automatiskt när du skriver"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Komplettera automatiskt"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Gör textfältet större"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Dölj ordförslag i liggande vy"</string> + <string name="general_category" msgid="1859088467017573195">"Allmänt"</string> + <string name="correction_category" msgid="2236750915056607613">"Textkorrigering"</string> + <string name="ngram_category" msgid="5337109164339320257">"Förslag baserade på tidigare ord"</string> + <string name="misc_category" msgid="6894192814868233453">"Andra alternativ"</string> + <string name="advanced_settings" msgid="362895144495591463">"Avancerade inställningar"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Alternativ för expertanvändare"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Ta bort popup-fördröjning"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Fördröj inte"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standard"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Automatiska versaler"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Använd versal i början av mening"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Automatiska punkter"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Snabba lösningar"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Åtgärdar automatiskt vanliga misstag"</string> - <string name="show_suggestions" msgid="507074425254289133">"Visa förslag"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Visar ordförslag när du skriver"</string> - <string name="auto_complete" msgid="1103196318775486023">"Komplettera automatiskt"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Blanksteg och punkt infogar automatiskt markerat ord"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Visa rättningsförslag"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Visar ordförslag när du skriver"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Visa alltid"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Visa stående"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Dölj alltid"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Byt språk m. mellanslag"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Visa inställningsknapp"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Automatiskt"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Visa alltid"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Dölj alltid"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigramförslag"</string> + <string name="auto_correction" msgid="4979925752001319458">"Autokorrigering"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Blanksteg/skiljetecken rättar felstavning"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Av"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Måttlig"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressiv"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Bigramförslag"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Använd även föregående ord för att ge förslag"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: sparat"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Håll nere en tangent om du vill visa accenter (ø, ö, etc.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Tryck på Tillbaka ↶ om du vill stänga tangentbordet"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"För siffror och symboler"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tryck och håll ned ordet längst till vänster om du vill lägga till det i ordlistan"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Tryck på tipset för att fortsätta »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Tryck här om du vill stänga tipset och börja skriva!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tangentbordet öppnas när du trycker på ett textfält"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tryck och håll nere en tangent om du vill visa accenter"\n"(ø, ö, ô, ó och så vidare)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Växla till siffror och symboler med den här tangenten"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Återvänd till bokstäver genom att trycka på tangenten en gång till"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tryck och håll ned tangenten om du vill ändra inställningarna för tangentbordet, till exempel Komplettera automatiskt"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Testa!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Kör"</string> <string name="label_next_key" msgid="362972844525672568">"Nästa"</string> <string name="label_done_key" msgid="2441578748772529288">"Färdig"</string> <string name="label_send_key" msgid="2815056534433717444">"Skicka"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Mer"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Vänta"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Röstindata"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Röstindata stöds inte på ditt språk än, men tjänsten fungerar på engelska."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Röstinmatning är en funktion på experimentstadiet som använder Googles nätverks taligenkänning."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Om du vill stänga av röstindata öppnar du inställningarna för tangentbordet."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Om du vill använda röstinmatning trycker du på mikrofonknappen eller drar fingret över tangentbordet på skärmen."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Röstinmatning använder sig av Googles tjänst för taligenkänning. "<a href="http://m.google.com/privacy">"Sekretesspolicyn för mobila enheter"</a>" gäller."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Om du vill stänga av röstinmatning öppnar du inställningarna för inmatningsmetod."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Om du vill använda röstinmatning trycker du på mikrofonknappen."</string> <string name="voice_listening" msgid="467518160751321844">"Tala nu"</string> <string name="voice_working" msgid="6666937792815731889">"Fungerar"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Avbryt"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Röstindata"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"På huvudtangentbordet"</item> - <item msgid="8529385602829095903">"På symboltangentbordet"</item> - <item msgid="7283103513488381103">"Av"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mikrofon på huvudtangentbordet"</item> - <item msgid="6907837061058876770">"Mikrofon på symboltangentbordet"</item> - <item msgid="3664304608587798036">"Röstindata är inaktiverat"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Skicka automatiskt efter röst"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Tryck automatiskt på retur vid sökning eller när du fortsätter till nästa fält."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Öppna tangentbordet"\n</b></font><font size="3">\n</font>"Tryck på ett textfält."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Stäng tangentbordet"\n</b></font><font size="3">\n</font>"Tryck på Tillbaka."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tryck länge på en tangent om du vill se alternativ"\n</b></font><font size="3">\n</font>"Använda skiljetecken och accenter."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tangentbordsinställningar"\n</b></font><font size="3">\n</font>"Tryck länge på tangenten"<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"På huvudtangentbord"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"På symboltangentbord"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Av"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mick huvudtangentbord"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mick bland symboler"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Röstinmatning inaktiv"</string> <string name="selectInputMethod" msgid="315076553378705821">"Välj inmatningsmetod"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inmatningsspråk"</string> <string name="language_selection_summary" msgid="187110938289512256">"Dra med fingret på blanksteg om du vill ändra språk"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Aktivera synpunkter från användare"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Du kan hjälpa till att förbättra inmatningsmetoden genom att automatiskt skicka användningsstatistik och felrapporter till Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Tryck om du vill korrigera ord"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Tryck på skrivna ord om du vill korrigera dem"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Tryck på skrivna ord om du vill korrigera dem, endast när förslag visas"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tangentbordstema"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"tangentbord"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"röst"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Tjeckiskt tangentbord"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabiskt tangentbord"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danskt tangentbord"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Tyskt tangentbord"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Engelskt tangentbord (Storbrit.)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Engelskt tangentbord (USA)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanskt tangentbord"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Franskt tangentbord"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Franskt tangentbord (Kanada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Franskt tangentbord (Schweiz)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebreiskt tangentbord"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italienskt tangentbord"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norskt tangentbord"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Holländskt tangentbord"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polskt tangentbord"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portugisiskt tangentbord"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ryskt tangentbord"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbiskt tangentbord"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Svenskt tangentbord"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Röst, afrikaans"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Röst på tjeckiska"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Röst på tyska"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Röst, engelska"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Röst på spanska"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Röst på franska"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Röst på italienska"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Röst på japanska"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Röst på koreanska"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Röst på holländska"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Röst på polska"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Röst på portugisiska"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Röst på ryska"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Röst på turkiska"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Röst, kinesiska, yue"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Röst, kinesiska, mandarin"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Röst, isiZulusk"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Läge för användbarhetsstudie"</string> </resources> diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml new file mode 100644 index 000000000..44f0722da --- /dev/null +++ b/java/res/values-sw/strings.xml @@ -0,0 +1,177 @@ +<?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">"Kibodi ya Android"</string> + <string name="english_ime_settings" msgid="6661589557206947774">"Mipangilio ya kibodi ya Android"</string> + <string name="english_ime_input_options" msgid="3909945612939668554">"Chaguo za uingizaji"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Tetema unabofya kitufe"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Toa sauti unapobofya kitufe"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Ibuka kitufe kinapobonyezwa"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- no translation found for correction_category (2236750915056607613) --> + <skip /> + <!-- no translation found for ngram_category (5337109164339320257) --> + <skip /> + <!-- no translation found for misc_category (6894192814868233453) --> + <skip /> + <!-- no translation found for advanced_settings (362895144495591463) --> + <skip /> + <!-- no translation found for advanced_settings_summary (5193513161106637254) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <string name="auto_cap" msgid="1719746674854628252">"Uwekaji wa herufi kubwa kiotomatiki"</string> + <string name="quick_fixes" msgid="5353213327680897927">"Utatuzi wa haraka"</string> + <string name="quick_fixes_summary" msgid="3405028402510332373">"Husahihisha makosa ya kawaida yaliyoandikwa"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Onyesha maneno yaliyopendekezwa wakati unachapa"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Onyesha kila wakati"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Onyesha kwenye hali wima"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ficha kila wakati"</string> + <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) --> + <skip /> + <string name="prefs_settings_key" msgid="4623341240804046498">"Onyesha kitufe cha mipangilio"</string> + <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Kiotomatiki"</string> + <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Onyesha kila wakati"</string> + <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">" Ficha kila mara"</string> + <string name="auto_correction" msgid="4979925752001319458">"Usahihishaji Kioto"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Sahihisha neno lililotangulia kiotomatiki"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Zima"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Ya wastani"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Ya hima"</string> + <!-- outdated translation 1323347224043514969 --> <string name="bigram_suggestion" msgid="2636414079905220518">"Mapendekezo ya Bigramu"</string> + <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Tumia neno la hapo awali ili kuboresha pendekezo"</string> + <!-- no translation found for bigram_prediction (8914273444762259739) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (1747261921174300098) --> + <skip /> + <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Imehifadhiwa"</string> + <string name="label_go_key" msgid="1635148082137219148">"Nenda"</string> + <string name="label_next_key" msgid="362972844525672568">"Ifuatayo"</string> + <string name="label_done_key" msgid="2441578748772529288">"Kwisha"</string> + <string name="label_send_key" msgid="2815056534433717444">"Tuma"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Zaidi"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pumzisha"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Subiri"</string> + <string name="voice_warning_title" msgid="4419354150908395008">"Uingizaji wa sauti"</string> + <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Uingizaji wa sauti hauhimiliwi kwa lugha yako kwa sasa, lakini inafanya kazi kwa Kiingereza."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Uingizaji wa sauti hutumia utambuaji wa usemi wa Google. "<a href="http://m.google.com/privacy">"Sera ya Faragha ya Simu za mkononi "</a>" hutumika."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ili kuzima uingizaji sauti, nenda kwa mipangilio ya mbinu ya uingizaji."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ili kutumia uingizaji wa sauti, bonyeza kitufe cha maikrofoni."</string> + <string name="voice_listening" msgid="467518160751321844">"Ongea sasa"</string> + <string name="voice_working" msgid="6666937792815731889">"Inafanya kazi"</string> + <string name="voice_initializing" msgid="661962047129906646"></string> + <string name="voice_error" msgid="5140896300312186162">"Hitilafu. Tafadhali jaribu tena."</string> + <string name="voice_network_error" msgid="6649556447401862563">"Haiwezi kuunganisha"</string> + <string name="voice_too_much_speech" msgid="5746973620134227376">"Hitilafu, usemi ni zaidi."</string> + <string name="voice_audio_error" msgid="5072707727016414454">"Tatizo la sauti"</string> + <string name="voice_server_error" msgid="7807129913977261644">"Hitilafu ya Seva"</string> + <string name="voice_speech_timeout" msgid="8461817525075498795">"Hakuna matamshi yaliyosikizwa"</string> + <string name="voice_no_match" msgid="4285117547030179174">"Hakuna zinazolingana zilizopatikana."</string> + <string name="voice_not_installed" msgid="5552450909753842415">"Utafutaji wa sauti haujawekwa"</string> + <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Kidokezo:"</b>" Telezesha kidole kwenye kibodi ili utamke"</string> + <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Kidokezo:"</b>" Wakati mwingine, jaribu kutamka uakifishaji kama vile \"kituo\", \"koma\", au \"kiulizio cha swali\"."</string> + <string name="cancel" msgid="6830980399865683324">"Ghairi"</string> + <string name="ok" msgid="7898366843681727667">"Sawa"</string> + <string name="voice_input" msgid="2466640768843347841">"Uingizaji wa sauti"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Kwenye kibodi kuu"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Kwenye kibodi ya ishara"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Zima"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Maikrofoni kwenye kibodi kuu"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Maikrofoni kwenye kibodi ya ishara"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Uingizaji sauti umelemazwa"</string> + <string name="selectInputMethod" msgid="315076553378705821">"Chagua mtindo wa uingizaji"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Lugha za uingizaji"</string> + <string name="language_selection_summary" msgid="187110938289512256">"Telezesha kidole kwenye kitufe cha nafasi ili kubadilisha lugha"</string> + <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Gusa tena ili kuhifadhi"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Kamusi inapatikana"</string> + <string name="prefs_enable_log" msgid="6620424505072963557">"Wezesha maoni ya watumiaji"</string> + <string name="prefs_description_log" msgid="5827825607258246003">"Saidia kuimarisha mbinu ya uingizaji wa kihariri, kwa kutuma takwimu za matumizi na ripoti za kuvurugika kwa Google kiotomatiki."</string> + <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Gusa ili kurekebisha maneno"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Gusa maneno yaliyoingizwa ili kuyasahihisha, wakati mapendekezo yanaonekana tu"</string> + <string name="keyboard_layout" msgid="437433231038683666">"Maandhari ya Kibodi"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Kibodi ya Kicheki"</string> + <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) --> + <skip /> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Kibodi ya Kidenmaki"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Kibodi ya Kijerumani"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Kibodi ya Kiingereza (Uingereza)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Kibodi ya Kiingereza (Marekani)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Kibodi ya Kihispania"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Kibodi ya Kifaransa"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Kibodi ya Kifaransa (Kanada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Kibodi ya Kifaransa (Uswizi)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) --> + <skip /> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Kibodi ya Kiitaliano"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Kibodi ya Kinorwe"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Kibodi ya Kiholanzi"</string> + <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) --> + <skip /> + <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) --> + <skip /> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Kibodi ya Kirusi"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Kibodi ya Kiserbia"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Kibodi ya Kiswidi"</string> + <!-- no translation found for subtype_mode_af_voice (7542487489657902699) --> + <skip /> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Sauti ya Kicheki"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Sauti ya Kijerumani"</string> + <!-- no translation found for subtype_mode_en_voice (6643420989651848728) --> + <skip /> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Sauti ya Kihispania"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Sauti ya Kifaransa"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Sauti ya Kijapani"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Sauti ya Kikorea"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Sauti ya Kipolandi"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Sauti ya Kireno"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Sauti ya Kirusi"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Sauti ya Kituruki"</string> + <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) --> + <skip /> + <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) --> + <skip /> + <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) --> + <skip /> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Hali ya Uchunguzi wa Utumizi"</string> +</resources> diff --git a/java/res/values-sw600dp-land/dimens.xml b/java/res/values-sw600dp-land/dimens.xml new file mode 100644 index 000000000..6e583e3bf --- /dev/null +++ b/java/res/values-sw600dp-land/dimens.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<resources> + <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 --> + <dimen name="keyboardHeight">45.0mm</dimen> + <fraction name="minKeyboardHeight">45%p</fraction> + <!-- key_height + key_bottom_gap = popup_key_height --> + <!-- <dimen name="key_height">14.5mm</dimen> --> + <dimen name="key_bottom_gap">1.3mm</dimen> + <dimen name="key_horizontal_gap">1.3mm</dimen> + <dimen name="keyboard_top_padding">1.1mm</dimen> + <dimen name="keyboard_bottom_padding">0.0mm</dimen> + <dimen name="key_bottom_gap_ics">1.3mm</dimen> + <dimen name="key_horizontal_gap_ics">1.3mm</dimen> + <dimen name="keyboard_top_padding_ics">1.1mm</dimen> + <dimen name="keyboard_bottom_padding_ics">0.0mm</dimen> + <dimen name="popup_key_height">13.0mm</dimen> + + <fraction name="key_letter_ratio">45%</fraction> + <fraction name="key_label_ratio">32%</fraction> + <fraction name="key_hint_letter_ratio">23%</fraction> + <fraction name="key_uppercase_letter_ratio">29%</fraction> + <!-- left or right padding of label alignment --> + <dimen name="key_label_horizontal_alignment_padding">18dip</dimen> + <dimen name="candidate_strip_padding">40.0mm</dimen> +</resources> diff --git a/java/res/values-sw600dp/config.xml b/java/res/values-sw600dp/config.xml new file mode 100644 index 000000000..75c0edf87 --- /dev/null +++ b/java/res/values-sw600dp/config.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<resources> + <bool name="config_enable_show_settings_key_option">true</bool> + <bool name="config_enable_show_voice_key_option">false</bool> + <bool name="config_enable_show_popup_on_keypress_option">false</bool> + <bool name="config_enable_show_recorrection_option">false</bool> + <bool name="config_enable_quick_fixes_option">false</bool> + <bool name="config_enable_bigram_suggestions_option">false</bool> + <bool name="config_swipe_down_dismiss_keyboard_enabled">false</bool> + <bool name="config_sliding_key_input_enabled">false</bool> + <bool name="config_digit_popup_characters_enabled">false</bool> + <!-- Whether or not Popup on key press is enabled by default --> + <bool name="config_default_popup_preview">false</bool> + <bool name="config_default_sound_enabled">true</bool> + <bool name="config_auto_correction_spacebar_led_enabled">false</bool> + <bool name="config_use_spacebar_language_switcher">false</bool> + <!-- Showing mini keyboard, just above the touched point if true, aligned to the key if false --> + <bool name="config_show_mini_keyboard_at_touched_point">true</bool> + <!-- The language is never displayed if == 0, always displayed if < 0 --> + <integer name="config_delay_before_fadeout_language_on_spacebar">1200</integer> + <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. --> + <string name="config_default_keyboard_theme_id" translatable="false">5</string> + <string name="config_text_size_of_language_on_spacebar" translatable="false">medium</string> + <integer name="config_max_popup_keyboard_column">5</integer> +</resources> diff --git a/java/res/values-sw600dp/dimens.xml b/java/res/values-sw600dp/dimens.xml new file mode 100644 index 000000000..274b62b4c --- /dev/null +++ b/java/res/values-sw600dp/dimens.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<resources> + <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 --> + <dimen name="keyboardHeight">48.0mm</dimen> + <fraction name="maxKeyboardHeight">50%p</fraction> + <fraction name="minKeyboardHeight">-35.0%p</fraction> + <!-- key_height + key_bottom_gap = popup_key_height --> + <!-- <dimen name="key_height">14.5mm</dimen> --> + <dimen name="key_bottom_gap">1.0mm</dimen> + <dimen name="key_horizontal_gap">1.0mm</dimen> + <dimen name="popup_key_height">10.0mm</dimen> + <dimen name="keyboard_top_padding">1.1mm</dimen> + <dimen name="keyboard_bottom_padding">0.0mm</dimen> + <dimen name="key_bottom_gap_ics">1.0mm</dimen> + <dimen name="key_horizontal_gap_ics">1.0mm</dimen> + <dimen name="keyboard_top_padding_ics">1.1mm</dimen> + <dimen name="keyboard_bottom_padding_ics">0.0mm</dimen> + <dimen name="mini_keyboard_key_horizontal_padding">12dip</dimen> + <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> + <!-- popup_key_height x 1.2 --> + <dimen name="mini_keyboard_slide_allowance">15.6mm</dimen> + <!-- popup_key_height x -1.0 --> + <dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen> + + <fraction name="key_letter_ratio">37%</fraction> + <fraction name="key_label_ratio">22%</fraction> + <fraction name="key_hint_letter_ratio">23%</fraction> + <fraction name="key_uppercase_letter_ratio">25%</fraction> + <fraction name="key_preview_text_ratio">50%</fraction> + <dimen name="key_preview_height">15.0mm</dimen> + <dimen name="key_preview_offset">0.1in</dimen> + <dimen name="key_preview_offset_ics">0.05in</dimen> + <!-- left or right padding of label alignment --> + <dimen name="key_label_horizontal_alignment_padding">6dip</dimen> + + <dimen name="candidate_strip_height">46dip</dimen> + <dimen name="candidate_strip_padding">15.0mm</dimen> + <dimen name="candidate_min_width">0.3in</dimen> + <dimen name="candidate_padding">12dip</dimen> + <dimen name="candidate_text_size">22dip</dimen> +</resources> diff --git a/java/res/values-sw600dp/donottranslate.xml b/java/res/values-sw600dp/donottranslate.xml new file mode 100644 index 000000000..6d94c2811 --- /dev/null +++ b/java/res/values-sw600dp/donottranslate.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Default value of the visibility of the suggestion strip --> + <string name="prefs_suggestion_visibility_default_value" translatable="false">1</string> +</resources> diff --git a/java/res/values-sw768dp-land/dimens.xml b/java/res/values-sw768dp-land/dimens.xml new file mode 100644 index 000000000..74eb08aa3 --- /dev/null +++ b/java/res/values-sw768dp-land/dimens.xml @@ -0,0 +1,49 @@ +<?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, key_height=14.5mm --> + <dimen name="keyboardHeight">58.0mm</dimen> + <fraction name="minKeyboardHeight">45%p</fraction> + <!-- key_height + key_bottom_gap = popup_key_height --> + <!-- <dimen name="key_height">14.5mm</dimen> --> + <dimen name="key_bottom_gap">1.6mm</dimen> + <dimen name="key_horizontal_gap">1.6mm</dimen> + <dimen name="keyboard_top_padding">1.1mm</dimen> + <dimen name="keyboard_bottom_padding">0.0mm</dimen> + <dimen name="key_bottom_gap_ics">1.6mm</dimen> + <dimen name="key_horizontal_gap_ics">1.6mm</dimen> + <dimen name="keyboard_top_padding_ics">1.1mm</dimen> + <dimen name="keyboard_bottom_padding_ics">0.0mm</dimen> + <dimen name="popup_key_height">13.0mm</dimen> + <dimen name="keyboard_horizontal_edges_padding">0.0mm</dimen> + + <fraction name="key_letter_ratio">38%</fraction> + <fraction name="key_label_ratio">26%</fraction> + <fraction name="key_hint_letter_ratio">23%</fraction> + <fraction name="key_uppercase_letter_ratio">24%</fraction> + <dimen name="key_preview_height">17.0mm</dimen> + <!-- left or right padding of label alignment --> + <dimen name="key_label_horizontal_alignment_padding">18dip</dimen> + <dimen name="key_preview_height_holo">26.5mm</dimen> + <dimen name="key_preview_offset_holo">7.5mm</dimen> + + <dimen name="candidate_strip_padding">40.0mm</dimen> +</resources> diff --git a/java/res/values-sw768dp/config.xml b/java/res/values-sw768dp/config.xml new file mode 100644 index 000000000..4025b0e41 --- /dev/null +++ b/java/res/values-sw768dp/config.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<resources> + <bool name="config_enable_show_settings_key_option">false</bool> + <bool name="config_enable_show_voice_key_option">false</bool> + <bool name="config_enable_show_popup_on_keypress_option">false</bool> + <bool name="config_enable_show_recorrection_option">false</bool> + <bool name="config_enable_quick_fixes_option">false</bool> + <bool name="config_enable_bigram_suggestions_option">false</bool> + <bool name="config_swipe_down_dismiss_keyboard_enabled">false</bool> + <bool name="config_sliding_key_input_enabled">false</bool> + <bool name="config_digit_popup_characters_enabled">false</bool> + <!-- Whether or not Popup on key press is enabled by default --> + <bool name="config_default_popup_preview">false</bool> + <bool name="config_default_sound_enabled">true</bool> + <bool name="config_auto_correction_spacebar_led_enabled">false</bool> + <bool name="config_use_spacebar_language_switcher">false</bool> + <!-- Showing mini keyboard, just above the touched point if true, aligned to the key if false --> + <bool name="config_show_mini_keyboard_at_touched_point">true</bool> + <integer name="config_delay_update_suggestions">180</integer> + <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. --> + <string name="config_default_keyboard_theme_id" translatable="false">5</string> + <string name="config_text_size_of_language_on_spacebar" translatable="false">medium</string> + <integer name="config_max_popup_keyboard_column">5</integer> + <!-- Screen metrics for logging. 0 = "mdpi", 1 = "hdpi", 2 = "xlarge" --> + <integer name="log_screen_metrics">2</integer> +</resources> diff --git a/java/res/values-sw768dp/dimens.xml b/java/res/values-sw768dp/dimens.xml new file mode 100644 index 000000000..b5d5a8496 --- /dev/null +++ b/java/res/values-sw768dp/dimens.xml @@ -0,0 +1,65 @@ +<?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, key_height=12mm --> + <dimen name="keyboardHeight">48.0mm</dimen> + <fraction name="maxKeyboardHeight">50%p</fraction> + <fraction name="minKeyboardHeight">-35.0%p</fraction> + <!-- key_height + key_bottom_gap = popup_key_height --> + <!-- <dimen name="key_height">14.5mm</dimen> --> + <dimen name="key_bottom_gap">1.1mm</dimen> + <dimen name="key_horizontal_gap">1.1mm</dimen> + <dimen name="keyboard_top_padding">1.1mm</dimen> + <dimen name="keyboard_bottom_padding">0.0mm</dimen> + <dimen name="key_bottom_gap_ics">1.1mm</dimen> + <dimen name="key_horizontal_gap_ics">1.1mm</dimen> + <dimen name="keyboard_top_padding_ics">1.1mm</dimen> + <dimen name="keyboard_bottom_padding_ics">0.0mm</dimen> + <dimen name="popup_key_height">10.0mm</dimen> + <dimen name="keyboard_horizontal_edges_padding">0.0mm</dimen> + <dimen name="mini_keyboard_horizontal_padding_holo">40dip</dimen> + <dimen name="mini_keyboard_key_horizontal_padding">12dip</dimen> + <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> + <!-- popup_key_height x 1.2 --> + <dimen name="mini_keyboard_slide_allowance">15.6mm</dimen> + <!-- popup_key_height x -1.0 --> + <dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen> + + <fraction name="key_letter_ratio">38%</fraction> + <fraction name="key_label_ratio">26%</fraction> + <fraction name="key_hint_letter_ratio">23%</fraction> + <fraction name="key_uppercase_letter_ratio">25%</fraction> + <fraction name="key_preview_text_ratio">50%</fraction> + <dimen name="key_preview_height">15.0mm</dimen> + <dimen name="key_preview_offset">0.1in</dimen> + <dimen name="key_preview_offset_ics">0.05in</dimen> + <!-- left or right padding of label alignment --> + <dimen name="key_label_horizontal_alignment_padding">6dip</dimen> + + <dimen name="candidate_strip_height">46dip</dimen> + <!-- candidate_strip_minimum_height = + key_preview_height_holo - key_preview_offset_holo + alpha --> + <dimen name="candidate_strip_minimum_height">18mm</dimen> + <dimen name="candidate_strip_padding">15.0mm</dimen> + <dimen name="candidate_min_width">46dip</dimen> + <dimen name="candidate_padding">8dip</dimen> + <dimen name="candidate_text_size">22dip</dimen> +</resources> diff --git a/java/res/values-sw768dp/donottranslate.xml b/java/res/values-sw768dp/donottranslate.xml new file mode 100644 index 000000000..672dea589 --- /dev/null +++ b/java/res/values-sw768dp/donottranslate.xml @@ -0,0 +1,23 @@ +<?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"> + <!-- Default value of the visibility of the suggestion strip --> + <string name="prefs_suggestion_visibility_default_value" translatable="false">2</string> +</resources> diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml index 0812a894d..1cbc42e23 100644 --- a/java/res/values-th/strings.xml +++ b/java/res/values-th/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"สั่นเมื่อกดปุ่ม"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"ส่งเสียงเมื่อกดปุ่ม"</string> <string name="popup_on_keypress" msgid="123894815723512944">"ป๊อปอัปเมื่อกดแป้น"</string> - <string name="hit_correction" msgid="4855351009261318389">"แก้ไขข้อผิดพลาดในการพิมพ์"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"เปิดการใช้งานการแก้ไขข้อผิดพลาดในการป้อนข้อมูล"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"ข้อผิดพลาดในการป้อนข้อมูลแนวนอน"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"เปิดการใช้งานการแก้ไขข้อผิดพลาดในการป้อนข้อมูล"</string> - <string name="auto_correction" msgid="7911639788808958255">"การแนะนำคำ"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"แก้ไขคำก่อนหน้าอัตโนมัติ"</string> - <string name="prediction" msgid="466220283138359837">"การแนะนำคำ"</string> - <string name="prediction_category" msgid="7027100625580696660">"การตั้งค่าการแนะนำคำ"</string> - <string name="prediction_summary" msgid="459788228830873110">"เปิดใช้งานการเติมคำอัตโนมัติขณะพิมพ์"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"เติมคำอัตโนมัติ"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"เพิ่มขนาดฟิลด์ข้อความ"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"ซ่อนการแนะนำคำในมุมมองแนวนอน"</string> + <string name="general_category" msgid="1859088467017573195">"ทั่วไป"</string> + <string name="correction_category" msgid="2236750915056607613">"การแก้ไขข้อความ"</string> + <string name="ngram_category" msgid="5337109164339320257">"ข้อเสนอแนะตามคำก่อนหน้านี้"</string> + <string name="misc_category" msgid="6894192814868233453">"ตัวเลือกอื่นๆ"</string> + <string name="advanced_settings" msgid="362895144495591463">"การตั้งค่าขั้นสูง"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"ตัวเลือกสำหรับผู้ใช้ที่มีความเชี่ยวชาญ"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"การหน่วงเวลาก่อนปิดป๊อปอัพหลัก"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"ไม่มีการหน่วงเวลา"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ค่าเริ่มต้น"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"ปรับเป็นตัวพิมพ์ใหญ่อัตโนมัติ"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"ใช้ตัวพิมพ์ใหญ่เมื่อขึ้นต้นประโยค"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"ใส่เครื่องหมายวรรคตอนอัตโนมัติ"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"แก้ไขด่วน"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"แก้ไขข้อผิดพลาดในการพิมพ์ที่พบบ่อย"</string> - <string name="show_suggestions" msgid="507074425254289133">"แสดงคำแนะนำ"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"แสดงคำที่แนะนำขณะพิมพ์"</string> - <string name="auto_complete" msgid="1103196318775486023">"เติมคำอัตโนมัติ"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"ใช้แป้นเคาะวรรคและเครื่องหมายวรรคตอนเพื่อแทรกคำที่ไฮไลต์โดยอัตโนมัติ"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"แสดงคำแนะนำการแก้ไข"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"แสดงคำที่แนะนำขณะพิมพ์"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"แสดงทุกครั้ง"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"แสดงในโหมดแนวตั้ง"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ซ่อนทุกครั้ง"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"ใช้แป้น Spacebar เพื่อสลับภาษา"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"แสดงแป้นการตั้งค่า"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"อัตโนมัติ"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"แสดงตลอดเวลา"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"ซ่อนตลอดเวลา"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"คำแนะนำ Bigram"</string> + <string name="auto_correction" msgid="4979925752001319458">"การแก้ไขอัตโนมัติ"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"กดเว้นวรรคและเครื่องหมายจะแก้คำผิดอัตโนมัติ"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"ปิด"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"ปานกลาง"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"เข้มงวด"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"คำแนะนำ 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="bigram_prediction" msgid="8914273444762259739">"การคาดคะเน Bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"ใช้คำก่อนหน้านี้สำหรับการคาดคะเน"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : บันทึกแล้ว"</string> - <string name="tip_long_press" msgid="6101270866284343344">"กดปุ่มค้างไว้เพื่อดูการออกเสียง (ø, ö, ฯลฯ)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"กดปุ่ม ย้อนกลับ เพื่อปิดแป้นพิมพ์เมื่อใดก็ได้"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"เข้าถึงหมายเลขและสัญลักษณ์"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"กดคำซ้ายสุดค้างไว้เพื่อเพิ่มลงในพจนานุกรม"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"แตะคำแนะนำนี้เพื่อทำงานต่อ »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"แตะที่นี่เพื่อปิดคำแนะนำนี้และเริ่มพิมพ์!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"แป้นพิมพ์จะเปิดขึ้นเมื่อคุณแตะฟิลด์ข้อความ"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"แตะปุ่มค้างไว้เพื่อดูการออกเสียง"\n"(ø, ö, ô, ó และอื่นๆ)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"เปลี่ยนเป็นตัวเลขและสัญลักษณ์เมื่อแตะปุ่มนี้"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"กลับไปที่ตัวอักษรโดยการแตะปุ่มนี้อีกครั้ง"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"แตะปุ่มนี้ค้างไว้เพื่อเปลี่ยนการตั้งค่าแป้นพิมพ์ เช่น การเติมคำอัตโนมัติ"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"ลองดูสิ!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"ไป"</string> <string name="label_next_key" msgid="362972844525672568">"ถัดไป"</string> <string name="label_done_key" msgid="2441578748772529288">"เสร็จสิ้น"</string> <string name="label_send_key" msgid="2815056534433717444">"ส่ง"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"เพิ่มเติม"</string> + <string name="label_pause_key" msgid="181098308428035340">"หยุดชั่วคราว"</string> + <string name="label_wait_key" msgid="6402152600878093134">"รอ"</string> <string name="voice_warning_title" msgid="4419354150908395008">"การป้อนข้อมูลด้วยเสียง"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ขณะนี้การป้อนข้อมูลด้วยเสียงยังไม่ได้รับการสนับสนุนในภาษาของคุณ แต่ใช้ได้ในภาษาอังกฤษ"</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"การป้อนข้อมูลด้วยเสียงเป็นคุณลักษณะทดลองที่ใช้การจดจำเสียงที่มีการสร้างเครือข่ายไว้ของ Google"</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"หากต้องการปิดการป้อนข้อมูลด้วยเสียง ไปที่การตั้งค่าแป้นพิมพ์"</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"หากต้องการใช้การป้อนข้อมูลด้วยเสียง กดปุ่มไมโครโฟนหรือเลื่อนนิ้วผ่านแป้นพิมพ์บนหน้าจอ"</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ป้อนข้อมูลด้วยเสียงใช้การจดจำคำพูดของ Google "<a href="http://m.google.com/privacy">" นโยบายส่วนบุคคลของมือถือ"</a>"มีผลบังคับใช้"</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"หากต้องการปิดการป้อนข้อมูลด้วยเสียง ไปที่การตั้งค่าวิธีการป้อนข้อมูล"</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"หากต้องการใช้การป้อนข้อมูลด้วยเสียง ให้กดปุ่มไมโครโฟน"</string> <string name="voice_listening" msgid="467518160751321844">"พูดได้เลย"</string> <string name="voice_working" msgid="6666937792815731889">"กำลังทำงาน"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"ยกเลิก"</string> <string name="ok" msgid="7898366843681727667">"ตกลง"</string> <string name="voice_input" msgid="2466640768843347841">"การป้อนข้อมูลด้วยเสียง"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"บนแป้นพิมพ์หลัก"</item> - <item msgid="8529385602829095903">"บนแป้นพิมพ์สัญลักษณ์"</item> - <item msgid="7283103513488381103">"ปิด"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"ไมโครโฟนบนแป้นพิมพ์หลัก"</item> - <item msgid="6907837061058876770">"ไมโครโฟนบนแป้นพิมพ์สัญลักษณ์"</item> - <item msgid="3664304608587798036">"การป้อนข้อมูลด้วยเสียงถูกปิดการใช้งาน"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"ส่งอัตโนมัติหลังบันทึกเสียง"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"กด Enter อัตโนมัติเมื่อค้นหาหรือไปที่ฟิลด์ถัดไป"</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"เปิดแป้นพิมพ์"\n</b></font><font size="3">\n</font>"แตะฟิลด์ข้อความใดก็ได้"</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"ปิดแป้นพิมพ์"\n</b></font><font size="3">\n</font>"กดปุ่ม ย้อนกลับ"</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"แตะปุ่มค้างไว้เพื่อดูตัวเลือก "\n</b></font><font size="3">\n</font>"เข้าถึงเครื่องหมายวรรคตอนและการออกเสียง"</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"การตั้งค่าแป้นพิมพ์"\n</b></font><font size="3">\n</font>"แตะปุ่ม "<b>"?123"</b>"ค้างไว้"</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"บนแป้นพิมพ์หลัก"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"บนแป้นพิมพ์สัญลักษณ์"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"ปิด"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"ไมค์บนแป้นพิมพ์หลัก"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"ไมค์บนแป้นพิมพ์สัญลักษณ์"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ปิดใช้งานป้อนข้อมูลด้วยเสียง"</string> <string name="selectInputMethod" msgid="315076553378705821">"เลือกวิธีการป้อนข้อมูล"</string> <string name="language_selection_title" msgid="1651299598555326750">"ภาษาในการป้อนข้อมูล"</string> <string name="language_selection_summary" msgid="187110938289512256">"เลื่อนนิ้วไปบนแป้นเคาะวรรคเพื่อเปลี่ยนภาษา"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"เปิดใช้งานการแสดงความคิดเห็นจากผู้ใช้"</string> <string name="prefs_description_log" msgid="5827825607258246003">"ช่วยปรับปรุงตัวแก้ไขวิธีการป้อนข้อมูลนี้โดยการส่งสถิติการใช้งานและรายงานการขัดข้องถึง Google โดยอัตโนมัติ"</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"แตะเพื่อแก้ไขคำ"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"แตะคำที่ป้อนไว้เพื่อแก้ไข"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"แตะคำที่ป้อนไว้เพื่อแก้ไข เฉพาะเมื่อเห็นข้อเสนอแนะเท่านั้น"</string> <string name="keyboard_layout" msgid="437433231038683666">"ชุดรูปแบบแป้นพิมพ์"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"แป้นพิมพ์"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"เสียง"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"แป้นพิมพ์ภาษาเช็ก"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"แป้นพิมพ์ภาษาอาหรับ"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"แป้นพิมพ์ภาษาเดนมาร์ก"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"แป้นพิมพ์ภาษาเยอรมัน"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"แป้นพิมพ์ภาษาอังกฤษ (สหราชอาณาจักร)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"แป้นพิมพ์ภาษาอังกฤษ (สหรัฐอเมริกา)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"แปันพิมพ์ภาษาสเปน"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"แป้นพิมพ์ภาษาฝรั่งเศส"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"แป้นพิมพ์ภาษาฝรั่งเศส (แคนาดา)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"แป้นพิมพ์ภาษาฝรั่งเศส (สวิตเซอร์แลนด์)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"แป้นพิมพ์ภาษาฮิบรู"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"แป้นพิมพ์ภาษาอิตาลี"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"แป้นพิมพ์ภาษานอร์เวย์"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"แป้นพิมพ์ภาษาดัตช์"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"แป้นพิมพ์ภาษาโปแลนด์"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"แป้นพิมพ์ภาษาโปรตุเกส"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"แป้นพิมพ์ภาษารัสเซีย"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"แป้นพิมพ์ภาษาเซอร์เบีย"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"แป้นพิมพ์ภาษาสวีเดน"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"เสียงภาษาแอฟริกัน"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"เสียงภาษาเช็ก"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"เสียงภาษาเยอรมัน"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"เสียงภาษาอังกฤษ"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"เสียงภาษาสเปน"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"เสียงภาษาฝรั่งเศส"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"เสียงภาษาอิตาลี"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"เสียงภาษาญี่ปุ่น"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"เสียงภาษาเกาหลี"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"เสียงภาษาดัตช์"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"เสียงภาษาโปแลนด์"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"เสียงภาษาโปรตุเกส"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"เสียงภาษารัสเซีย"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"เสียงภาษาตุรกี"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"เสียงภาษาจีนกวางตุ้ง"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"เสียงภาษาจีนกลาง"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"เสียงภาษาซูลู"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"โหมดศึกษาประโยชน์ในการใช้งาน"</string> </resources> diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml index d2c25d871..e5d968769 100644 --- a/java/res/values-tl/strings.xml +++ b/java/res/values-tl/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Mag-vibrate sa keypress"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Tunog sa keypress"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Popup sa keypress"</string> - <string name="hit_correction" msgid="4855351009261318389">"Itama ang mga error sa pag-type"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Paganahin ang pagtatama ng error sa pag-input"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Mga error sa pag-input ng landscape"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Paganahin ang pagtatama ng error sa pag-input"</string> - <string name="auto_correction" msgid="7911639788808958255">"Mga suhestiyon ng salita"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Awtomatikong itama ang nakaraang salita"</string> - <string name="prediction" msgid="466220283138359837">"Mga suhestiyon ng salita"</string> - <string name="prediction_category" msgid="7027100625580696660">"Mga setting ng suhestiyon ng salita"</string> - <string name="prediction_summary" msgid="459788228830873110">"Paganahin ang awtomatikong pagkumpleto habang nagta-type"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Awtomatikong pagkumpleto"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Taasan ang laki ng field ng teksto"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Itago ang mga suhestiyon ng salita sa lanscape na view"</string> + <string name="general_category" msgid="1859088467017573195">"Pangkalahatan"</string> + <string name="correction_category" msgid="2236750915056607613">"Pagwawasto ng teksto"</string> + <string name="ngram_category" msgid="5337109164339320257">"Mga suhestiyon batay sa mga nakaraang salita"</string> + <string name="misc_category" msgid="6894192814868233453">"Iba pang mga pagpipilian"</string> + <string name="advanced_settings" msgid="362895144495591463">"Mga advanced na setting"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Mga pagpipilian para sa mga ekspertong user"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Balewala antala key popup"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Walang antala"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Default"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalization"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"I-capitalize ang simula ng isang pangungusap"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"I-auto-punctuate"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Mga mabilisang pagsasaayos"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Itinatama ang mga karaniwang na-type na mali"</string> - <string name="show_suggestions" msgid="507074425254289133">"Ipakita ang mga suhestiyon"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Ipakita ang mga iminumungkahing salita habang nagta-type"</string> - <string name="auto_complete" msgid="1103196318775486023">"I-auto-complete"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Awtomatikong ipinapasok ng spacebar at bantas ang naka-highlight na salita"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Magpakita ng mga suhestiyon ng pagwawasto"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Ipakita ang mga iminumungkahing salita habang nagta-type"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Palaging ipakita"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Ipakita sa portrait mode"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Palaging itago"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Gamitin ang panglipat ng wika sa spacebar"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Ipakita ang key ng mga setting"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Awtomatiko"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Palaging ipakita"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Palaging itago"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Mga Suhestiyon na Bigram"</string> + <string name="auto_correction" msgid="4979925752001319458">"Awtomatikong pagwasto"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Awto tinatama ng spacebar at bantas ang maling na-type"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Naka-off"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Modest"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresibo"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Mga bigram na suhestiyon"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Gamitin ang nakaraang salita upang pahusayin ang suhestiyon"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Wala"</item> - <item msgid="1669461741568287396">"Batayan"</item> - <item msgid="4894328801530136615">"Advanced"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Bigram na hula"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Gamitin ang nakaraang salita para din sa hula"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Na-save"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Pinduting nang matagal ang isang key pababa upang makita ang mga accent (ø, ö, atbp.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Pindutin ang key na bumalik ↶ upang isara ang keyboard anumang oras"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"I-access ang mga numero at simbolo"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Pindutin nang matagal ang salita sa kaliwang bahagi upang idagdag ito sa diksyunaryo"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Galawin ang pahiwatig na ito upang magpatuloy »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Galawin dito upang isara ang pahiwatig na ito at simulan ang pag-type!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Nagbubukas ang keyboard anumang oras na galawin mo ang field ng teksto"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Galawin & pinduting nang matagal ang isang key upang tingnan ang mga accent"\n"(ø, ö, ô, ó, at iba pa)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Lumipat sa mga numero at simbolo sa pamamagitan ng paggalaw sa key na "</b>" na ito"</string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Pumunta muli sa mga titik sa pamamagitan ng muling paggalaw sa key na ito"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Galawin & pinduting nang matagal ang key na ito upang baguhin ang mga setting ng keyboard, tulad ng awtomatikong pagkumpleto"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Subukan ito!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Punta"</string> <string name="label_next_key" msgid="362972844525672568">"Susunod"</string> <string name="label_done_key" msgid="2441578748772529288">"Tapos na"</string> <string name="label_send_key" msgid="2815056534433717444">"Ipadala"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Higit pa"</string> + <string name="label_pause_key" msgid="181098308428035340">"Pause"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Intay"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Pag-input ng boses"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Hindi kasalukuyang suportado ang pag-input ng boses para sa iyong wika, ngunit gumagana sa Ingles."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ang pag-input ng boses ay isang tampok na pang-eksperimento na gumagamit ng naka-network na pagkilala sa pananalita ng Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Upang i-off ang pag-input ng boses, pumunta sa mga setting ng keyboard."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Upang gumamit ng pag-input ng boses, pindutin ang pindutang microphone o i-slide ang iyong daliri sa screen keyboard."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Gumagamit ang pag-input ng boses ng speech recognition ng Google. Nalalapat "<a href="http://m.google.com/privacy">"Ang Patakaran sa Privacy ng Mobile"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Upang i-off ang pag-input ng boses, pumunta sa mga setting ng pamamaraan ng pag-input."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Upang gamitin ang pag-input ng boses, pindutin ang pindutan na mikropono."</string> <string name="voice_listening" msgid="467518160751321844">"Magsalita ngayon"</string> <string name="voice_working" msgid="6666937792815731889">"Nagtatrabaho"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Kanselahin"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Pag-input ng boses"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"I-on ang pangunahing keyboard"</item> - <item msgid="8529385602829095903">"Sa mga simbolo ng keyboard"</item> - <item msgid="7283103513488381103">"Naka-off"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Mic sa pangunahing keyboard"</item> - <item msgid="6907837061058876770">"Mic sa keyboard ng mga simbolo"</item> - <item msgid="3664304608587798036">"Hindi pinagana ang pag-input ng boses"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Awtomatikong isumite pagkatapos ng boses"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Awtomatikong pindutin ang enter kapag naghahanap o pupunta sa susunod na field."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Buksan ang keyboard"\n</b></font><font size="3">\n</font>"Galawin ang kahit anong field ng teksto."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Isara ang keyboard"\n</b></font><font size="3">\n</font>"Pindutin ang key na Bumalik."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Galawin & pinduting nang matagal ang isang key para sa mga pagpipilian"\n</b></font><font size="3">\n</font>"I-access ang bantas at mga accent."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Mga setting ng keyboard"\n</b></font><font size="3">\n</font>"Galawin & pindutin nang matagal ang "<b>"?123"</b>" na key."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Sa pangunahing keyboard"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sa keyboard ng mga simbolo"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Naka-off"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic sa pangunahing keyboard"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic sa keyboard ng mga simbolo"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hindi pinagana ang voice input"</string> <string name="selectInputMethod" msgid="315076553378705821">"Pumili ng paraan ng pag-input"</string> <string name="language_selection_title" msgid="1651299598555326750">"Mag-input ng mga wika"</string> <string name="language_selection_summary" msgid="187110938289512256">"I-slide ang daliri sa spacebar upang palitan ang wika"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Paganahin ang feedback ng user"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Tumulong na pahusayin ang editor ng paraan ng pag-input na ito sa pamamagitan ng awtomatikong pagpapadala ng mga istatistika ng paggamit at mga ulat ng crash sa Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Pindutin upang itama ang mga salita"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Pindutin ang mga ipinasok na salita upang itama ang mga ito"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Pindutin ang mga inilagay na salita upang iwasto ang mga ito, kapag nakikita lang ang mga suhestiyon"</string> <string name="keyboard_layout" msgid="437433231038683666">"Tema ng Keyboard"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"keyboard"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"boses"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Czech na Keyboard"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arabic na Keyboard"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danish na Keyboard"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"German na Keyboard"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Ingles (UK) na Keyboard"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Ingles (US) na Keyboard"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Spanish na Keyboard"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"French na Keyboard"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"French (Canada) na Keyboard"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"French (Switzerland) na Keyboard"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Hebrew na Keyboard"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Italian na Keyboard"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norwegian na Keyboard"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Dutch na Keyboard"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Polish na Keyboard"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portuguese na Keyboard"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Russian na Keyboard"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Serbian na Keyboard"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Swedish na Keyboard"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikaans na Boses"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Czech na Boses"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"German na Boses"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Ingles na Boses"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Spanish na Boses"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"French na Boses"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Italian na Boses"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japanese na Boses"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korean na Boses"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Dutch na Boses"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Polish na Boses"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portuguese na Boses"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Russian na Boses"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Turkish na Boses"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Chinese, Yue na Boses"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Chinese, Mandarin na Boses"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"isiZulu na Boses"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Usability Study Mode"</string> </resources> diff --git a/java/res/values-tr/donottranslate-altchars.xml b/java/res/values-tr/donottranslate-altchars.xml index fb2419c1e..1b83b65c8 100644 --- a/java/res/values-tr/donottranslate-altchars.xml +++ b/java/res/values-tr/donottranslate-altchars.xml @@ -19,13 +19,10 @@ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="alternates_for_a">â</string> - <string name="alternates_for_e">3</string> - <string name="alternates_for_i">īįíìïîı8</string> - <string name="alternates_for_o">ōøõóòœôö9</string> - <string name="alternates_for_u">ūúùûü7</string> - <string name="alternates_for_s">śşßš</string> - <string name="alternates_for_n"></string> - <string name="alternates_for_c">čćç</string> - <string name="alternates_for_y">6</string> + <string name="alternates_for_i">8,ı,î,ï,ì,í,į,ī</string> + <string name="alternates_for_o">9,ö,ô,œ,ò,ó,õ,ø,ō</string> + <string name="alternates_for_u">7,ü,û,ù,ú,ū</string> + <string name="alternates_for_s">ş,ß,ś,š</string> <string name="alternates_for_g">ğ</string> -</resources>
\ No newline at end of file + <string name="alternates_for_c">ç,ć,č</string> +</resources> diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 9248ac4fd..8be9f7a6d 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Tuşa basıldığında titret"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Tuşa basıldığında ses çıkar"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Tuşa basıldığında pop-up aç"</string> - <string name="hit_correction" msgid="4855351009261318389">"Yazım hatalarını düzelt"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Giriş hatası düzeltmeyi etkinleştir"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Yatay giriş hataları"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Giriş hatası düzeltmeyi etkinleştir"</string> - <string name="auto_correction" msgid="7911639788808958255">"Kelime önerileri"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Önceki kelimeyi otomatik olarak düzelt"</string> - <string name="prediction" msgid="466220283138359837">"Kelime önerileri"</string> - <string name="prediction_category" msgid="7027100625580696660">"Kelime önerme ayarları"</string> - <string name="prediction_summary" msgid="459788228830873110">"Yazarken otomatik tamamlamayı etkinleştir"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Otomatik tamamlama"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Metin alanı boyutunu artır"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Yatay görünümde kelime önerilerini gizle"</string> + <string name="general_category" msgid="1859088467017573195">"Genel"</string> + <string name="correction_category" msgid="2236750915056607613">"Metin düzeltme"</string> + <string name="ngram_category" msgid="5337109164339320257">"Önceki kelimelere dayalı öneriler"</string> + <string name="misc_category" msgid="6894192814868233453">"Diğer seçenekler"</string> + <string name="advanced_settings" msgid="362895144495591463">"Gelişmiş ayarlar"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Uzman kullanıcılar için seçenekler"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Tuş popup içn kaptm ertlm"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Gecikme yok"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Varsayılan"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Otomatik olarak büyük harf yap"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Cümlenin baş harfini büyük yap"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Otomatik noktalama"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Hızlı onarımlar"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Yaygın olarak yapılan yazım hatalarını düzeltir"</string> - <string name="show_suggestions" msgid="507074425254289133">"Önerileri göster"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Yazarken önerilen kelimeleri görüntüle"</string> - <string name="auto_complete" msgid="1103196318775486023">"Otomatik tamamla"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Boşluk tuşu ve noktalama vurgulanan kelimeyi otomatik ekler"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Düzeltme önerilerini göster"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Yazarken, önerilen kelimeleri görüntüle"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Her zaman göster"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Dikey modda göster"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Her zaman gizle"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Dil geçişi > boşluk çubuğuyla"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Ayarları göster tuşu"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Otomatik"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Her zaman göster"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Her zaman gizle"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Bigram Önerileri"</string> + <string name="auto_correction" msgid="4979925752001319458">"Otomatik düzeltme"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Boşluk çbğ ve nokt işr yanlış yazılan kelimeleri oto düzeltir"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Kapalı"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Ölçülü"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresif"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"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="bigram_prediction" msgid="8914273444762259739">"Bigram tahmini"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Önceki kelimeyi de tahmin için kullan"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kaydedildi"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Vurguları görmek için bir tuşu basılı tutun (ø, ö, v.b.)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Klavyeyi herhangi bir anda kapatmak için geri tuşuna ↶ basın"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Sayılara ve simgelere erişin"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Sözlüğe eklemek için en soldaki kelimeye basın ve basılı tutun"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Devam etmek için bu ipucuna dokunun »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Bu ipucunu kapatmak için buraya dokunun ve yazmaya başlayın!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Bir metin alanına dokunduğunuzda klavye açılır"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Vurguları görüntülemek için bir tuşa basın ve basılı tutun"\n"(ø, ö, ô, ó v.b.)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Bu tuşa dokunarak sayılar ve simgeler arasında geçiş yap"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Bu tuşa tekrar dokunarak harflere geri dönün"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Otomatik tamamlama gibi klavye ayarlarını değiştirmek için bu tuşa basın ve basılı tutun"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Deneyin!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Git"</string> <string name="label_next_key" msgid="362972844525672568">"İleri"</string> <string name="label_done_key" msgid="2441578748772529288">"Bitti"</string> <string name="label_send_key" msgid="2815056534433717444">"Gönder"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Diğer"</string> + <string name="label_pause_key" msgid="181098308428035340">"Durkl"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Bekle"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Ses girişi"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Ses girişi, şu anda sizin diliniz için desteklenmiyor ama İngilizce dilinde kullanılabilir."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Ses girişi, Google\'ın ağ bağlantılı ses tanıma işlevini kullanan deneysel bir özelliktir."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Ses girişini kapatmak için klavye ayarlarına gidin."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Ses girişini kullanmak için mikrofon düğmesine basın veya parmağınızı dokunmatik klavye üzerinde kaydırın."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ses girişi Google\'ın konuşma tanıma işlevini kullanır. "<a href="http://m.google.com/privacy">" Mobil Gizlilik Politikası"</a>" geçerlidir."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ses girişini kapatmak için giriş yöntemi ayarlarına gidin."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ses girişini kullanmak için mikrofon düğmesine basın."</string> <string name="voice_listening" msgid="467518160751321844">"Şimdi konuşun"</string> <string name="voice_working" msgid="6666937792815731889">"Çalışıyor"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"İptal"</string> <string name="ok" msgid="7898366843681727667">"Tamam"</string> <string name="voice_input" msgid="2466640768843347841">"Ses girişi"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Ana klavyede"</item> - <item msgid="8529385602829095903">"Simge klavyesinde"</item> - <item msgid="7283103513488381103">"Kapalı"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Ana klavyedeki mikrofon"</item> - <item msgid="6907837061058876770">"Simge klavyesindeki mikrofon"</item> - <item msgid="3664304608587798036">"Sesle giriş devre dışı bırakıldı"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Sesten sonra otomatik gönder"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Arama yaparken veya bir sonraki alana giderken enter tuşuna otomatik olarak basın."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Klavyeyi açın"\n</b></font><font size="3">\n</font>"Herhangi bir metin alanına dokunun."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Klavyeyi kapatın"\n</b></font><font size="3">\n</font>"Geri tuşuna basın."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Seçenekler için bir tuşa dokunun ve basılı tutun"\n</b></font><font size="3">\n</font>"Noktalama ve vurgulama işaretlerine erişin."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Klavye ayarları"\n</b></font><font size="3">\n</font><b>"?123"</b>" tuşuna dokunun ve basılı tutun."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Ana klavyede"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Simge klavyesinde"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Kapalı"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Ana klavyede mikrfn"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Simge klavysnd mikrf"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Sesle grş devre dışı"</string> <string name="selectInputMethod" msgid="315076553378705821">"Giriş yöntemini seç"</string> <string name="language_selection_title" msgid="1651299598555326750">"Giriş dilleri"</string> <string name="language_selection_summary" msgid="187110938289512256">"Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Kullanıcı geri bildirimini etkinleştir"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Kullanım istatistiklerini ve kilitlenme raporlarını Google\'a otomatik olarak göndererek bu giriş yöntemi düzenleyicisinin iyileştirilmesine yardımcı olun."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Kelimeleri düzeltmek için dokunun"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Düzeltmek için, girilen kelimelere dokunun"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Yalnızca öneriler görünür olduğunda, düzeltmek için girilen kelimelere dokunun"</string> <string name="keyboard_layout" msgid="437433231038683666">"Klavye Teması"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"klavye"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"ses"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Çekçe Klavye"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Arapça Klavye"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Danca Klavye"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Almanca Klavye"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"İngilizce (İngiltere) Klavye"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"İngilizce (ABD) Klavye"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"İspanyolca Klavye"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Fransızca Klavye"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Fransızca (Kanada) Klavye"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Fransızca (İsviçre) Klavye"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"İbranice Klavye"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"İtalyanca Klavye"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Norveççe Klavye"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Felemenkçe Klavye"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Lehçe Klavye"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Portekizce Klavye"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Rusça Klavye"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Sırpça Klavye"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"İsveççe Klavye"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Afrikanca Ses"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Çekçe Ses"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Almanca Ses"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"İngilizce Ses"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"İspanyolca Ses"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Fransızca Ses"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"İtalyanca Ses"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Japonca Ses"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Korece Ses"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Felemenkçe Ses"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Lehçe Ses"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Portekizce Ses"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Rusça Ses"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Türkçe Ses"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Çince, Yue Ses"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Çince, Mandarin Ses"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Zuluca Ses"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Kullanılabilirlik Çalışması Modu"</string> </resources> diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml index 8788021be..e5d2b31e1 100644 --- a/java/res/values-uk/strings.xml +++ b/java/res/values-uk/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вібр при натиску клав."</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натиску клав."</string> <string name="popup_on_keypress" msgid="123894815723512944">"Сплив. при нат.клав."</string> - <string name="hit_correction" msgid="4855351009261318389">"Виправ. помилки вводу"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Увімкн. виправл. помилок вводу"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Помилки альбомного вводу"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Увімкн. виправл. помилок вводу"</string> - <string name="auto_correction" msgid="7911639788808958255">"Пропозиції слів"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Автоматично виправляти попереднє слово"</string> - <string name="prediction" msgid="466220283138359837">"Пропозиції слів"</string> - <string name="prediction_category" msgid="7027100625580696660">"Налашт-ня пропозицій слів"</string> - <string name="prediction_summary" msgid="459788228830873110">"Увімкн. автозаповнення при вводі"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Автозаповнення"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Збільш. розмір текст. поля"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Сховати пропозиції слів в альбом. режимі"</string> + <string name="general_category" msgid="1859088467017573195">"Загальні"</string> + <string name="correction_category" msgid="2236750915056607613">"Виправлення тексту"</string> + <string name="ngram_category" msgid="5337109164339320257">"Пропозиції на основі попередніх слів"</string> + <string name="misc_category" msgid="6894192814868233453">"Інші опції"</string> + <string name="advanced_settings" msgid="362895144495591463">"Розширені налаштування"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Налаштування для досвідчених користувачів"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Затримка клавіши закриття"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Без затримки"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"За умовчанням"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Авто викор. вел. літер"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Поч. писати речення з великої літери"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Авто пунктуація"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Шв. виправлення"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Виправляє поширені помилки"</string> - <string name="show_suggestions" msgid="507074425254289133">"Показати пропозиції"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Відображати при вводі пропоновані слова"</string> - <string name="auto_complete" msgid="1103196318775486023">"Автозаповнення"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Пробіл і пунктуація автоматично вставляє виділене слово"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Показувати пропозиції виправлень"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Відображати пропоновані слова під час вводу"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Завжди показувати"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Показувати в книжковому режимі"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Завжди ховати"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Використ. зміну мови пробілом"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Показ. клав. налашт."</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Автоматично"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Завжди показ."</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Завжди ховати"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Двобуквені пропозиції"</string> + <string name="auto_correction" msgid="4979925752001319458">"Автомат. виправлення"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Пробіл і пунктуація автоматично виправляють слова з помилками"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Вимк."</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Середнє"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Повне"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Пропозиції з двох слів"</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="bigram_prediction" msgid="8914273444762259739">"Передбачений запит із двох слів"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Використовувати попереднє слово також як передбачений запит"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : збережено"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Утр. клав. натис., щоб див. нагол. (ø, ö, тощо)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Натисн. клавішу назад ↶, щоб будь-коли закрити клавіат."</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Доступ до цифр і символів"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Натисн. і утримуйте ліве крайнє слово, щоб додати його до словн."</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Натис. цю підказку для продовж.»"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Натисн. тут, щоб закрити цю підказку і почати ввод."</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Клавіатура відривається при торканні текстового поля"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Натис. і утрим. клавішу для перегл. наголосів"\n"(ø, ö, ô, ó тощо)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Перемк. до цифр і символів, натиснувши цю кнопку "</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Поверніться до літер, знову натиснувши цю клавішу"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Натис. і утрим. клавішу, щоб змін. налашт-ння клавіат., такі як автозапов."</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Спробуйте!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Іти"</string> <string name="label_next_key" msgid="362972844525672568">"Далі"</string> <string name="label_done_key" msgid="2441578748772529288">"Готово"</string> <string name="label_send_key" msgid="2815056534433717444">"Надісл."</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"Алфавіт"</string> + <string name="label_more_key" msgid="3760239494604948502">"Більше"</string> + <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Чек."</string> <string name="voice_warning_title" msgid="4419354150908395008">"Голос. ввід"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Голос. ввід наразі не підтрим. для вашої мови, але можна користуватися англійською."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Голос. ввід є експеремент. ф-цією, яка викор. мережеве розпізнавання голосу Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Щоб вимкн. голос ввід, йдіть до налашт-нь клавіатури."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Щоб викор. голос. ввід, натисніть кнопку мікрофона або пересуньте палець на екранній клавіатурі."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовий ввід використовує розпізнавання мовлення Google. Застосовується "<a href="http://m.google.com/privacy">"Політика конфіденційності для мобільних пристроїв"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Щоб вимкнути голосовий ввід, перейдіть до налаштувань методів введення."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Щоб використовувати голосовий ввід, натисніть кнопку мікрофона."</string> <string name="voice_listening" msgid="467518160751321844">"Диктуйте"</string> <string name="voice_working" msgid="6666937792815731889">"Працює"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Скасувати"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Голос. ввід"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"На осн. клавіатурі"</item> - <item msgid="8529385602829095903">"Символьна клавіатура"</item> - <item msgid="7283103513488381103">"Вимк."</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Miкр. на осн. клавіатурі"</item> - <item msgid="6907837061058876770">"Miкр. на символ. клавіатурі"</item> - <item msgid="3664304608587798036">"Голос. ввід вимкнуто"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Авто подав. після гол. пош."</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Автомат. натиск. enter під час пошуку або переходу до наступного поля."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Відкр. клавіатуру"\n</b></font><font size="3">\n</font>"Натисн. якесь текст. поле."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Закрити клавіатуру"\n</b></font><font size="3">\n</font>"Натисн. клавішу Назад."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Натис.і утрим. клавішк для отрим. парам."\n</b></font><font size="3">\n</font>"Доступ до пункт. та наголос."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Налашт-ння клавіатури"\n</b></font><font size="3">\n</font>"Натисн. і утрим. клавішу "<b>"?123"</b></string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"На основ. клавіатурі"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Символьна клавіатура"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Вимк."</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Miкр. на осн. клав."</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Miкр. на симв. клавіат."</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голос. ввід вимкнено"</string> <string name="selectInputMethod" msgid="315076553378705821">"Вибрати метод введення"</string> <string name="language_selection_title" msgid="1651299598555326750">"Мови вводу"</string> <string name="language_selection_summary" msgid="187110938289512256">"Переміст. палець на пробіл, щоб змін. мову"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Увімк. відгуки корист."</string> <string name="prefs_description_log" msgid="5827825607258246003">"Допоможіть покращ. редактор методу введ., автомат. надсилаючи в Google статистику використ. та звіти про збої."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Торкн., щоб виправ. слова"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Торкн. введених слів, щоб виправити їх"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Торкніться введених слів, щоб виправити їх, лише коли ввімкнено пропозиції"</string> <string name="keyboard_layout" msgid="437433231038683666">"Тема клавіатури"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"клавіатура"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"голос."</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Чеська розкладка"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Розкладка для арабської мови"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Данська розкладка"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Німецька розкладка"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Англ. розкладка (Великобританія)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Англійська розкладка (США)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Іспанська розкладка"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Французька розкладка"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Французька розкладка (Канада)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Французька розкладка (Швейцарія)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Розкладка для івриту"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Італійська розкладка"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Норвезька розкладка"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Голланд. розклад."</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Польська розкладка"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Португальська розкладка"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Російська розкладка"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Сербська розкладка"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Шведська розкладка"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Voice мовою африкаанс"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Голос чеською"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Голос німецькою"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Voice англійською мовою"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Голос іспанською"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Голос французькою"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Voice італійською мовою"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Голос японською"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Голос корейською"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Voice голландською мовою"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Голос польською"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Голос португальською"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Голос російською"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Голос турецькою"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Voice китайською, юеською мовою"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Voice китайською, мандарин. мовою"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Voice мовою ісізулу"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Режим вивчення зручності у використанні"</string> </resources> diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml index 53ec91c1b..a75f7e82e 100644 --- a/java/res/values-vi/strings.xml +++ b/java/res/values-vi/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"Rung khi nhấn phím"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Âm thanh khi nhấn phím"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Cửa sổ bật lên khi nhấn phím"</string> - <string name="hit_correction" msgid="4855351009261318389">"Sửa lỗi đánh máy"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"Bật sửa lỗi nhập"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"Lỗi nhập theo khổ ngang"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"Bật sửa lỗi nhập"</string> - <string name="auto_correction" msgid="7911639788808958255">"Đề xuất từ"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"Tự động sửa từ trước đó"</string> - <string name="prediction" msgid="466220283138359837">"Đề xuất từ"</string> - <string name="prediction_category" msgid="7027100625580696660">"Cài đặt đề xuất từ"</string> - <string name="prediction_summary" msgid="459788228830873110">"Bật tự động hoàn tất khi nhập"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Tự động hoàn tất"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"Tăng kích cỡ trường văn bản"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ẩn đề xuất từ trong chế độ xem ngang"</string> + <string name="general_category" msgid="1859088467017573195">"Chung"</string> + <string name="correction_category" msgid="2236750915056607613">"Sửa văn bản"</string> + <string name="ngram_category" msgid="5337109164339320257">"Đề xuất dựa trên các từ trước đó"</string> + <string name="misc_category" msgid="6894192814868233453">"Tùy chọn khác"</string> + <string name="advanced_settings" msgid="362895144495591463">"Cài đặt nâng cao"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"Tùy chọn cho người dùng chuyên gia"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Hlại việc l.bỏ csổ b.lên chính"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Không có tgian trễ"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Mặc định"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"Tự động viết hoa"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"Viết hoa chữ cái đầu câu"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"Tự động chấm câu"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"Sửa nhanh"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"Sửa lỗi nhập thông thường"</string> - <string name="show_suggestions" msgid="507074425254289133">"Hiển thị đề xuất"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"Hiển thị từ được đề xuất khi nhập"</string> - <string name="auto_complete" msgid="1103196318775486023">"Tự động hoàn tất"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"Dấu cách và dấu câu tự động chèn vào từ được đánh dấu"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Hiển thị gợi ý sửa"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Hiển thị từ được đề xuất khi nhập"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Luôn hiển thị"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Hiển thị trên chế độ khổ đứng"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Luôn ẩn"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"Sử dụng trình chuyển đổi ngôn ngữ thanh cách"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"Hiển thị phím cài đặt"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Tự động"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Luôn hiển thị"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Luôn ẩn"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"Đề xuất Bigram"</string> + <string name="auto_correction" msgid="4979925752001319458">"Tự động sửa"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Phím cách và dấu câu tự động sửa từ nhập sai"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Tắt"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Đơn giản"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Linh hoạt"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"Đề xuất Bigram"</string> <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Sử dụng từ trước đó để cải tiến đề xuất"</string> - <string-array name="prediction_modes"> - <item msgid="4870266572388153286">"Không"</item> - <item msgid="1669461741568287396">"Cơ bản"</item> - <item msgid="4894328801530136615">"Nâng cao"</item> - </string-array> + <string name="bigram_prediction" msgid="8914273444762259739">"Dự đoán Bigram"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"Cũng sử dụng từ trước đó để dự đoán"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Đã lưu"</string> - <string name="tip_long_press" msgid="6101270866284343344">"Giữ phím xuống để xem dấu trọng âm (ø, ö, v.v...)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"Nhấn phím quay lại ↶ để đóng bàn phím bất kỳ lúc nào"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"Truy cập các số và ký hiệu"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Nhấn và giữ từ ngoài cùng bên trái để thêm từ đó vào từ điển"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"Chạm vào gợi ý này để tiếp tục »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"Chạm vào đây để đóng gợi ý này và bắt đầu nhập"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Bàn phím mở ra bất cứ khi nào bạn chạm vào trường văn bản"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Chạm & giữ phím để xem dấu trọng âm"\n"(ø, ö, ô, ó, v.v...)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Chuyển sang số và ký hiệu bằng cách chạm vào phím này"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Quay lại các chữ cái bằng cách chạm vào phím này lần nữa"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Chạm & giữ phím này để thay đổi cài đặt bàn phím, như tự động hoàn tất"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Hãy dùng thử!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"Đến"</string> <string name="label_next_key" msgid="362972844525672568">"Tiếp theo"</string> <string name="label_done_key" msgid="2441578748772529288">"Xong"</string> <string name="label_send_key" msgid="2815056534433717444">"Gửi"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Khác"</string> + <string name="label_pause_key" msgid="181098308428035340">"Tạm dừng"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Đợi"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Nhập liệu bằng giọng nói"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Nhập liệu bằng giọng nói hiện không được hỗ trợ cho ngôn ngữ của bạn nhưng hoạt động với ngôn ngữ tiếng Anh."</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"Nhập liệu bằng giọng nói là tính năng thử nghiệm sử dụng nhận dạng tiếng nói được kết nối mạng của Google."</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Để tắt nhập liệu bằng giọng nói, đi tới cài đặt bàn phím."</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Để sử dụng nhập liệu bằng giọng nói, hãy nhấn nút micrô hoặc trượt ngón tay trên bàn phím ảo."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Nhập liệu bằng giọng nói sử dụng nhận dạng giọng nói của Google. Áp dụng "<a href="http://m.google.com/privacy">"Chính sách bảo mật dành cho điện thoại di động"</a>"."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Để tắt nhập liệu bằng giọng nói, đi tới cài đặt phương pháp nhập liệu."</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Để sử dụng nhập liệu bằng giọng nói, hãy nhấn nút micrô."</string> <string name="voice_listening" msgid="467518160751321844">"Xin mời nói"</string> <string name="voice_working" msgid="6666937792815731889">"Đang hoạt động"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"Huỷ"</string> <string name="ok" msgid="7898366843681727667">"OK"</string> <string name="voice_input" msgid="2466640768843347841">"Nhập liệu bằng giọng nói"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"Trên bàn phím chính"</item> - <item msgid="8529385602829095903">"Trên bàn phím có biểu tượng"</item> - <item msgid="7283103513488381103">"Tắt"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"Micrô trên bàn phím chính"</item> - <item msgid="6907837061058876770">"Micrô trên bàn phím có biểu tượng"</item> - <item msgid="3664304608587798036">"Nhập liệu bằng giọng nói đã bị vô hiệu hoá"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"Tự động gửi sau thoại"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"Tự đông nhấn enter khi tìm kiếm hoặc đi tới trường tiếp theo."</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Mở bàn phím"\n</b></font><font size="3">\n</font>"Chạm vào bất kỳ trường văn bản nào."</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Đóng bàn phím"\n</b></font><font size="3">\n</font>"Nhấn phím Quay lại."</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Chạm & giữ phím cho các tuỳ chọn"\n</b></font><font size="3">\n</font>"Truy cập dấu câu và dấu trọng âm."</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Cài đặt bàn phím"\n</b></font><font size="3">\n</font>"Chạm & giữ phím "<b>"?123"</b>"."</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Trên bàn phím chính"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Trên bàn phím biểu tượng"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Tắt"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micrô trên bàn phím chính"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micrô trên bàn phím biểu tượng"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Nhập liệu bằng giọng nói đã bị vô hiệu hóa"</string> <string name="selectInputMethod" msgid="315076553378705821">"Chọn phương thức nhập"</string> <string name="language_selection_title" msgid="1651299598555326750">"Ngôn ngữ nhập"</string> <string name="language_selection_summary" msgid="187110938289512256">"Trượt ngón tay trên phím cách để thay đổi ngôn ngữ"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"Bật phản hồi của người dùng"</string> <string name="prefs_description_log" msgid="5827825607258246003">"Giúp nâng cao trình chỉnh sửa phương thức nhập này bằng cách tự động gửi thống kê sử dụng và báo cáo sự cố cho Google."</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Chạm để sửa từ"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"Chạm các từ đã nhập để sửa"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Chạm các từ đã nhập để sửa, chỉ khi các đề xuất hiển thị"</string> <string name="keyboard_layout" msgid="437433231038683666">"Chủ đề bàn phím"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"bàn phím"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"thoại"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Bàn phím tiếng Séc"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"Bàn phím tiếng Ả Rập"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Bàn phím tiếng Đan Mạch"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Bàn phím tiếng Đức"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Bàn phím tiếng Anh (Anh)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Bàn phím tiếng Anh (Mỹ)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Bàn phím tiếng Tây Ban Nha"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Bàn phím tiếng Pháp"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Bàn phím tiếng Pháp (Canada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Bàn phím tiếng Pháp (Thụy Sĩ)"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"Bàn phím tiếng Do Thái"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Bàn phím tiếng Ý"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Bàn phím tiếng Na Uy"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Bàn phím tiếng Hà Lan"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"Bàn phím tiếng Ba Lan"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"Bàn phím tiếng Bồ Đào Nha"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Bàn phím tiếng Nga"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Bàn phím tiếng Serbia"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Bàn phím tiếng Thụy Điển"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"Giọng tiếng Hà Lan ở Nam Phi"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Giọng nói tiếng Séc"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Giọng nói tiếng Đức"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"Giọng tiếng Anh"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Giọng nói tiếng Tây Ban Nha"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Giọng nói tiếng Pháp"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"Giọng nói tiếng Ý"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Giọng nói tiếng Nhật"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Giọng nói tiếng Hàn"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"Giọng nói tiếng Hà Lan"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Giọng nói tiếng Ba Lan"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Giọng nói tiếng Bồ Đào Nha"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Giọng nói tiếng Nga"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Giọng nói tiếng Thổ Nhĩ Kỳ"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"Giọng tiếng Trung, Yue"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"Giọng tiếng Trung, tiếng Quan thoại"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"Giọng isiZulu"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Chế độ nghiên cứu tính khả dụng"</string> </resources> diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 9e8df7562..2db21f4d1 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"按键时振动"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"按键时播放音效"</string> <string name="popup_on_keypress" msgid="123894815723512944">"按键时显示弹出窗口"</string> - <string name="hit_correction" msgid="4855351009261318389">"纠正输入错误"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"启用输入错误纠正功能"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"横向输入错误"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"启用输入错误纠正功能"</string> - <string name="auto_correction" msgid="7911639788808958255">"字词建议"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"自动纠正前面的字词"</string> - <string name="prediction" msgid="466220283138359837">"字词建议"</string> - <string name="prediction_category" msgid="7027100625580696660">"字词建议设置"</string> - <string name="prediction_summary" msgid="459788228830873110">"输入时启用自动填写功能"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"自动完成"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"扩大文字字段"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"在横向视图中隐藏字词建议"</string> + <string name="general_category" msgid="1859088467017573195">"常规"</string> + <string name="correction_category" msgid="2236750915056607613">"文本更正"</string> + <string name="ngram_category" msgid="5337109164339320257">"根据前面的字词提供建议"</string> + <string name="misc_category" msgid="6894192814868233453">"其他选项"</string> + <string name="advanced_settings" msgid="362895144495591463">"高级设置"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"适合专家级用户的选项"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"关闭弹出式键盘的延迟"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"无延迟"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"默认"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"自动大写"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"句首字母大写"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"自动加标点"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"快速纠正"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"纠正常见的输入错误"</string> - <string name="show_suggestions" msgid="507074425254289133">"显示建议"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"输入时启用联想提示"</string> - <string name="auto_complete" msgid="1103196318775486023">"自动填写"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"按空格键和标点符号时自动插入突出显示的字词"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"显示更正建议"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"键入时显示建议的字词"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"始终显示"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"以纵向模式显示"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"始终隐藏"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"使用空格键切换语言"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"显示设置键"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"自动"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"始终显示"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"始终隐藏"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"双连词建议"</string> + <string name="auto_correction" msgid="4979925752001319458">"自动更正"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"空格键或标点自动更正拼写错误的字词"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"关闭"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"部分"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"全部"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"双连词建议"</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="bigram_prediction" msgid="8914273444762259739">"双连词预测"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"结合前一个字词进行预测"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已保存"</string> - <string name="tip_long_press" msgid="6101270866284343344">"按住某个键可看到重音符号(例如 ø、ö 等)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"随时可以通过按后退键 ↶ 关闭键盘"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"访问数字和符号"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"长按最左侧的字可将其添加到词典中"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"轻触此提示继续 »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"轻触此处可关闭该提示,然后便可开始输入内容!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"您可以随时通过触摸文字字段打开键盘"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"轻触并按住某个键可以查看重音符号"\n"(ø、ö、ô、ó 等)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"轻触该键即可切换到数字和符号键盘"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"再次轻触该键即可返回字母键盘"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"触摸并按住该键可更改键盘设置,例如自动完成"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"试试吧!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"开始"</string> <string name="label_next_key" msgid="362972844525672568">"下一步"</string> <string name="label_done_key" msgid="2441578748772529288">"完成"</string> <string name="label_send_key" msgid="2815056534433717444">"发送"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"更多"</string> + <string name="label_pause_key" msgid="181098308428035340">"暂停"</string> + <string name="label_wait_key" msgid="6402152600878093134">"等待"</string> <string name="voice_warning_title" msgid="4419354150908395008">"语音输入"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"语音输入功能当前还不支持您的语言,您只能输入英语语音。"</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"语音输入是一项试验性的功能,它采用了 Google 的网络语音识别功能。"</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"要关闭语音输入功能,请转至键盘设置。"</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"要使用语音输入,请按麦克风按钮或者在屏幕键盘上滑动手指。"</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"语音输入采用了 Google 的语音识别技术,因此请遵守"<a href="http://m.google.com/privacy">"“Google 移动”隐私权政策"</a>"。"</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"要关闭语音输入功能,请转至输入法设置。"</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"要使用语音输入功能,请按“麦克风”按钮。"</string> <string name="voice_listening" msgid="467518160751321844">"请开始说话"</string> <string name="voice_working" msgid="6666937792815731889">"正在处理"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"取消"</string> <string name="ok" msgid="7898366843681727667">"确定"</string> <string name="voice_input" msgid="2466640768843347841">"语音输入"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"主键盘上"</item> - <item msgid="8529385602829095903">"符号键盘上"</item> - <item msgid="7283103513488381103">"关"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"主键盘上的麦克风"</item> - <item msgid="6907837061058876770">"符号键盘上的麦克风"</item> - <item msgid="3664304608587798036">"已停用语音输入"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"语音结束后自动提交"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"搜索或转到下一字段时自动按 Enter。"</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"打开键盘"\n</b></font><font size="3">\n</font>"触摸任意文本字段。"</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"关闭键盘"\n</b></font><font size="3">\n</font>"按“返回”键。"</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"触摸并按住选项键"\n</b></font><font size="3">\n</font>"进入标点/重音符号界面。"</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"键盘设置"\n</b></font><font size="3">\n</font>"触摸并按住 "<b>"?123"</b>" 键。"</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"主键盘上"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"符号键盘上"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"关闭"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"主键盘上的麦克风"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"符号键盘上的麦克风"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"语音输入功能已停用"</string> <string name="selectInputMethod" msgid="315076553378705821">"选择输入法"</string> <string name="language_selection_title" msgid="1651299598555326750">"输入语言"</string> <string name="language_selection_summary" msgid="187110938289512256">"在空格键上滑动手指可更改语言"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"启用用户反馈"</string> <string name="prefs_description_log" msgid="5827825607258246003">"自动向 Google 发送使用情况统计信息和崩溃报告,帮助改进该输入法编辑器。"</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"触摸以更正字词"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"触摸所输入字词以进行更正"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"仅在系统显示建议后,才触摸输入的字词进行更正"</string> <string name="keyboard_layout" msgid="437433231038683666">"键盘主题"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"键盘"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"语音"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"捷克语键盘"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"阿拉伯语键盘"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"丹麦语键盘"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"德语键盘"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英语(英国)键盘"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英语(美国)键盘"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"西班牙语键盘"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"法语键盘"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"法语(加拿大)键盘"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"法语(瑞士)键盘"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"希伯来语键盘"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"意大利语键盘"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"挪威语键盘"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"荷兰语键盘"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"波兰语键盘"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"葡萄牙语键盘"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"俄语键盘"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"塞尔维亚语键盘"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"瑞典语键盘"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"南非荷兰语语音"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"捷克语语音"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"德语语音"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"英语语音"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"西班牙语语音"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"法语语音"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"意大利语语音"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日语语音"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韩语语音"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"荷兰语语音"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"波兰语语音"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"葡萄牙语语音"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"俄语语音"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"土耳其语语音"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"中文,粤语语音"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"中文,普通话语音"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"祖鲁语语音"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"可用性研究模式"</string> </resources> diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index dd5996d25..43a1f3770 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -26,68 +26,55 @@ <string name="vibrate_on_keypress" msgid="5258079494276955460">"按鍵時震動"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"按鍵時播放音效"</string> <string name="popup_on_keypress" msgid="123894815723512944">"按鍵時顯示彈出式視窗"</string> - <string name="hit_correction" msgid="4855351009261318389">"修正輸入錯誤"</string> - <string name="hit_correction_summary" msgid="8761701873008070796">"啟用輸入錯誤修正功能"</string> - <string name="hit_correction_land" msgid="2567691684825205448">"橫向輸入錯誤"</string> - <string name="hit_correction_land_summary" msgid="4076803842198368328">"啟用輸入錯誤修正功能"</string> - <string name="auto_correction" msgid="7911639788808958255">"字詞建議"</string> - <string name="auto_correction_summary" msgid="6881047311475758267">"自動修正前一個字詞"</string> - <string name="prediction" msgid="466220283138359837">"字詞建議"</string> - <string name="prediction_category" msgid="7027100625580696660">"字詞建議設定"</string> - <string name="prediction_summary" msgid="459788228830873110">"輸入時啟用自動完成"</string> - <string name="auto_complete_dialog_title" msgid="2172048590607201920">"自動完成"</string> - <string name="prediction_landscape" msgid="4874601565593216183">"放大文字欄位大小"</string> - <string name="prediction_landscape_summary" msgid="6736551095997839472">"在橫向檢視模式中隱藏字詞建議"</string> + <string name="general_category" msgid="1859088467017573195">"一般設定"</string> + <string name="correction_category" msgid="2236750915056607613">"文字修正"</string> + <string name="ngram_category" msgid="5337109164339320257">"根據先前字詞產生的建議"</string> + <string name="misc_category" msgid="6894192814868233453">"其他選項"</string> + <string name="advanced_settings" msgid="362895144495591463">"進階設定"</string> + <string name="advanced_settings_summary" msgid="5193513161106637254">"提供給專業使用者的選項"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"關閉彈出式鍵盤的延遲時間"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"不延遲"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"預設"</string> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> <string name="auto_cap" msgid="1719746674854628252">"自動大寫"</string> - <string name="auto_cap_summary" msgid="3260681697600786825">"句首字母大寫"</string> - <string name="auto_punctuate" msgid="7276672334264521751">"自動標點"</string> - <string name="auto_punctuate_summary" msgid="6589441565817502132"></string> <string name="quick_fixes" msgid="5353213327680897927">"快速修正"</string> <string name="quick_fixes_summary" msgid="3405028402510332373">"修正一般打字錯誤"</string> - <string name="show_suggestions" msgid="507074425254289133">"顯示建議"</string> - <string name="show_suggestions_summary" msgid="1989672863935759654">"打字時顯示建議字詞"</string> - <string name="auto_complete" msgid="1103196318775486023">"自動完成"</string> - <string name="auto_complete_summary" msgid="6113149638718274624">"在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"顯示修正建議"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"輸入時顯示建議字詞"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"一律顯示"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"以垂直模式顯示"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"永遠隱藏"</string> + <string name="prefs_use_spacebar_language_switch" msgid="8828538114550634449">"使用空白鍵切換語言"</string> <string name="prefs_settings_key" msgid="4623341240804046498">"顯示設定金鑰"</string> <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"自動"</string> <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"一律顯示"</string> <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"永遠隱藏"</string> - <!-- no translation found for settings_key_modes:0 (8549888726962891527) --> - <!-- no translation found for settings_key_modes:1 (881280041213210923) --> - <!-- no translation found for settings_key_modes:2 (7317310620171067848) --> - <string name="bigram_suggestion" msgid="1323347224043514969">"雙連詞建議"</string> + <string name="auto_correction" msgid="4979925752001319458">"自動修正"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"自動插入空白鍵和標點符號鍵盤,以修正拼字錯誤"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"關閉"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"部分"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"全部"</string> + <string name="bigram_suggestion" msgid="2636414079905220518">"雙連詞建議"</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="bigram_prediction" msgid="8914273444762259739">"雙連詞預測"</string> + <string name="bigram_prediction_summary" msgid="1747261921174300098">"同樣使用先前的字詞進行預測"</string> <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已儲存"</string> - <string name="tip_long_press" msgid="6101270866284343344">"按住按鍵可查看重音符號 (ø、ö 等)"</string> - <string name="tip_dismiss" msgid="7585579046862204381">"隨時可以透過按後退鍵 ↶ 關閉鍵盤"</string> - <string name="tip_access_symbols" msgid="6344098517525531652">"使用數字和符號"</string> - <string name="tip_add_to_dictionary" msgid="1487293888469227817">"按住最左邊的字詞,將其新增到字典中"</string> - <string name="touch_to_continue" msgid="7869803257948414531">"輕觸此提示繼續 »"</string> - <string name="touch_to_finish" msgid="7990196086480585789">"輕觸此處以關閉提示,並開始打字!"</string> - <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"輕觸文字欄位時即會開啟鍵盤"</b></string> - <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"輕觸並按住某個鍵即可查看聲調"\n"(ø、ö、ô、ó 等)"</b></string> - <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"輕觸此鍵即可切換到數字和符號鍵盤"</b></string> - <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"再次輕觸此鍵即可返回到字母鍵盤"</b></string> - <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"輕觸並按住此鍵即可變更鍵盤設定,例如自動完成"</b></string> - <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"試試看!"</b></string> <string name="label_go_key" msgid="1635148082137219148">"開始"</string> <string name="label_next_key" msgid="362972844525672568">"繼續"</string> <string name="label_done_key" msgid="2441578748772529288">"完成"</string> <string name="label_send_key" msgid="2815056534433717444">"傳送"</string> - <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string> - <string name="label_phone_key" msgid="4275497665515080551">"123"</string> - <string name="label_alpha_key" msgid="8864943487292437456">"ABC"</string> - <string name="label_alt_key" msgid="2846315350346694811">"ALT"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"更多"</string> + <string name="label_pause_key" msgid="181098308428035340">"暫停"</string> + <string name="label_wait_key" msgid="6402152600878093134">"等候"</string> <string name="voice_warning_title" msgid="4419354150908395008">"語音輸入"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"語音輸入目前不支援您的語言,但是可以辨識英文。"</string> - <string name="voice_warning_may_not_understand" msgid="4611518823070986445">"語音輸入這項實驗功能運用了 Google 的網路語音辨識系統。"</string> - <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"請前往鍵盤設定來關閉語音輸入。"</string> - <string name="voice_hint_dialog_message" msgid="6892342981545727994">"如要使用語音輸入,按下 [麥克風] 按鈕,或將手指滑過螢幕小鍵盤即可。"</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"語音輸入使用 Google 的語音辨識功能,並遵循《"<a href="http://m.google.com/privacy">"行動服務隱私權政策"</a>"》。"</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"如要關閉語音輸入,請前往輸入方式設定。"</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"如要使用語音輸入,請按下麥克風按鈕。"</string> <string name="voice_listening" msgid="467518160751321844">"請說話"</string> <string name="voice_working" msgid="6666937792815731889">"辨識中"</string> <string name="voice_initializing" msgid="661962047129906646"></string> @@ -104,27 +91,12 @@ <string name="cancel" msgid="6830980399865683324">"取消"</string> <string name="ok" msgid="7898366843681727667">"確定"</string> <string name="voice_input" msgid="2466640768843347841">"語音輸入"</string> - <string-array name="voice_input_modes"> - <item msgid="1349082139076086774">"於主鍵盤"</item> - <item msgid="8529385602829095903">"符號鍵盤上"</item> - <item msgid="7283103513488381103">"關閉"</item> - </string-array> - <string-array name="voice_input_modes_summary"> - <item msgid="554248625705084903">"主鍵盤上的麥克風"</item> - <item msgid="6907837061058876770">"符號鍵盤上的麥克風"</item> - <item msgid="3664304608587798036">"已停用語音輸入"</item> - </string-array> - <string name="auto_submit" msgid="9151008027068358518">"說話後自動提交"</string> - <string name="auto_submit_summary" msgid="4961875269610384226">"搜尋或前往下一個欄位時自動按下輸入。"</string> - <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"開啟鍵盤"\n</b></font><font size="3">\n</font>"輕觸任何文字欄位。"</string> - <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"關閉鍵盤"\n</b></font><font size="3">\n</font>"按下 Back 鍵。"</string> - <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>\n"輕觸並按住按鍵開啟選項"</b></font><font size="3">\n</font>"輸入標點與輕重音。"</string> - <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"鍵盤設定"\n</b></font><font size="3">\n</font>"輕觸並按住 "<b>"?123"</b>" 鍵。"</string> - <string name="popular_domain_0" msgid="3745279225122472969">".com"</string> - <string name="popular_domain_1" msgid="1370572248164278467">".net"</string> - <string name="popular_domain_2" msgid="3036812463748402878">".org"</string> - <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string> - <string name="popular_domain_4" msgid="35359437471311470">".edu"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"主鍵盤上"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"符號鍵盤上"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"關閉"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"主鍵盤上的麥克風"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"符號鍵盤上的麥克風"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"語音輸入已停用"</string> <string name="selectInputMethod" msgid="315076553378705821">"選取輸入法"</string> <string name="language_selection_title" msgid="1651299598555326750">"輸入語言"</string> <string name="language_selection_summary" msgid="187110938289512256">"以手指在空白鍵上滑動可變更語言"</string> @@ -133,8 +105,49 @@ <string name="prefs_enable_log" msgid="6620424505072963557">"啟用使用者意見回饋"</string> <string name="prefs_description_log" msgid="5827825607258246003">"自動將使用統計資料和當機報告傳送給 Google,協助改善這個輸入法編輯器。"</string> <string name="prefs_enable_recorrection" msgid="4588408906649533582">"輕觸此處可修正字詞"</string> - <string name="prefs_enable_recorrection_summary" msgid="1056068922330206170">"輕觸輸入的字詞即可加以修正"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"輕觸輸入的字詞即可加以修正 (出現建議時才適用)"</string> <string name="keyboard_layout" msgid="437433231038683666">"鍵盤主題"</string> - <string name="subtype_mode_keyboard" msgid="2242090416595003881">"鍵盤"</string> - <string name="subtype_mode_voice" msgid="4394113125441627771">"語音"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"捷克文鍵盤"</string> + <string name="subtype_mode_ar_keyboard" msgid="2655338636329774995">"阿拉伯文鍵盤"</string> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"丹麥文鍵盤"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"德文鍵盤"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"英文 (英國) 鍵盤"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"英文 (美國) 鍵盤"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"西班牙文鍵盤"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"法文鍵盤"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"法文 (加拿大) 鍵盤"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"法文 (瑞士) 鍵盤"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <string name="subtype_mode_iw_keyboard" msgid="1787536828253289950">"希伯來文鍵盤"</string> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"義大利文鍵盤"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"挪威文鍵盤"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"荷蘭文鍵盤"</string> + <string name="subtype_mode_pl_keyboard" msgid="2225816414814396047">"波蘭文鍵盤"</string> + <string name="subtype_mode_pt_keyboard" msgid="7503997804861754840">"葡萄牙文鍵盤"</string> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"俄文鍵盤"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"塞爾維亞文鍵盤"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"瑞典文語音"</string> + <string name="subtype_mode_af_voice" msgid="7542487489657902699">"南非荷蘭文語音"</string> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"捷克文語音"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"德文語音"</string> + <string name="subtype_mode_en_voice" msgid="6643420989651848728">"英文語音"</string> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"西班牙文語音"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"法文語音"</string> + <string name="subtype_mode_it_voice" msgid="5077373057157441323">"義大利文語音"</string> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"日文語音"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"韓文語音"</string> + <string name="subtype_mode_nl_voice" msgid="2603552312869575021">"荷蘭文語音"</string> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"波蘭文語音"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"葡萄牙文語音"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"俄文語音"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"土耳其文語音"</string> + <string name="subtype_mode_yue_voice" msgid="1576887891614624263">"中文 (粵語) 語音"</string> + <string name="subtype_mode_zh_voice" msgid="4360533229467271152">"中文 (華語) 語音"</string> + <string name="subtype_mode_zu_voice" msgid="1146122571698884636">"祖魯文語音"</string> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"使用習慣學習模式"</string> </resources> diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml new file mode 100644 index 000000000..3c6f2ba75 --- /dev/null +++ b/java/res/values-zu/strings.xml @@ -0,0 +1,177 @@ +<?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">"Ikhibhodi ye-Android"</string> + <string name="english_ime_settings" msgid="6661589557206947774">"Izilungiselelo zekhibhodi ye-Android"</string> + <string name="english_ime_input_options" msgid="3909945612939668554">"Okukhethwa kukho kokungenayo"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Dlidlizelisa ngokucindezela inkinobho"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Umsindo wokucindezela ukhiye"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Ugaxekile ngokucindezela ukhiye"</string> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- no translation found for correction_category (2236750915056607613) --> + <skip /> + <!-- no translation found for ngram_category (5337109164339320257) --> + <skip /> + <!-- no translation found for misc_category (6894192814868233453) --> + <skip /> + <!-- no translation found for advanced_settings (362895144495591463) --> + <skip /> + <!-- no translation found for advanced_settings_summary (5193513161106637254) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <string name="auto_cap" msgid="1719746674854628252">"Ukwenza ofeleba okuzenzakalelayo"</string> + <string name="quick_fixes" msgid="5353213327680897927">"Ukulungisa okusheshayo"</string> + <string name="quick_fixes_summary" msgid="3405028402510332373">"Ilungisa amaphutha athayiphwa ngokuvamile"</string> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Bonisa amagama aphakamisiwe ngenkathi uthayipha"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Bonisa njalo"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3551821800439659812">"Bonisa kwimodi emile"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Fihla njalo"</string> + <!-- no translation found for prefs_use_spacebar_language_switch (8828538114550634449) --> + <skip /> + <string name="prefs_settings_key" msgid="4623341240804046498">"Bonisa ukhiye wezilungiselelo"</string> + <string name="settings_key_mode_auto_name" msgid="2993460277873684680">"Okuzenzakalelayo"</string> + <string name="settings_key_mode_always_show_name" msgid="3047567041784760575">"Bonisa njalo"</string> + <string name="settings_key_mode_always_hide_name" msgid="7833948046716923994">"Fihla njalo"</string> + <string name="auto_correction" msgid="4979925752001319458">"Ukulungisa okuzenzakalelayo"</string> + <!-- outdated translation 6881047311475758267 --> <string name="auto_correction_summary" msgid="5625751551134658006">"Ngokuzenzakalelayo ilungisa igama elandulele"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Valiwe"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Thobekile"</string> + <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Bukhali"</string> + <!-- outdated translation 1323347224043514969 --> <string name="bigram_suggestion" msgid="2636414079905220518">"Iziphakamiso ze-Biagram"</string> + <string name="bigram_suggestion_summary" msgid="4383845146070101531">"Sebenzisa igama elandulele ukuthuthukisa okusikiselwayo"</string> + <!-- no translation found for bigram_prediction (8914273444762259739) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (1747261921174300098) --> + <skip /> + <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kulondoloziwe"</string> + <string name="label_go_key" msgid="1635148082137219148">"Iya"</string> + <string name="label_next_key" msgid="362972844525672568">"Okulandelayo"</string> + <string name="label_done_key" msgid="2441578748772529288">"Kwenziwe"</string> + <string name="label_send_key" msgid="2815056534433717444">"Thumela"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string> + <string name="label_more_key" msgid="3760239494604948502">"Okungaphezulu"</string> + <string name="label_pause_key" msgid="181098308428035340">"Misa okwesikhashana"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Linda"</string> + <string name="voice_warning_title" msgid="4419354150908395008">"Okungenayo kwezwi"</string> + <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Okungenayo kwezwi akusekelwa kolimi lwakho, kodwa kuyasebenza Ngesingisi."</string> + <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Okufakwayo kwezwi kusebenzisa ukuqaphela izwi le-Google. "<a href="http://m.google.com/privacy">"Inqubomgomo Yobumfihlo Yefoni"</a>" iyasebenza."</string> + <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Ukuvala okufakwayo kwezwi, iya kuzilungiselelo zendlela yokufakwayo"</string> + <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Ukusebenzisa okufakwayo kwezwi, cindezela inkinobho yemakrofoni."</string> + <string name="voice_listening" msgid="467518160751321844">"Khuluma manje"</string> + <string name="voice_working" msgid="6666937792815731889">"Kuyasebenza"</string> + <string name="voice_initializing" msgid="661962047129906646"></string> + <string name="voice_error" msgid="5140896300312186162">"Iphutha. Sicela uzame futhi."</string> + <string name="voice_network_error" msgid="6649556447401862563">"Ayikwazanga ukuxhuma"</string> + <string name="voice_too_much_speech" msgid="5746973620134227376">"Iphutha, kunamagama amaningi."</string> + <string name="voice_audio_error" msgid="5072707727016414454">"Inkinga yomsindo"</string> + <string name="voice_server_error" msgid="7807129913977261644">"Iphutha leseva"</string> + <string name="voice_speech_timeout" msgid="8461817525075498795">"Awekho amagama azwakele"</string> + <string name="voice_no_match" msgid="4285117547030179174">"Akukho okufanayo okutholiwe"</string> + <string name="voice_not_installed" msgid="5552450909753842415">"Ukusesha ngezwi akufakiwe"</string> + <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"Isexwayiso:"</b>"Shintshela kwikhibhodi ukuze ukhulume"</string> + <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"Isixwayiso: "</b>"Esikhathini esilandelayo, zama ukukhuluma izimpimiselo ezinjengo \"isikhathi, \"ikhefu\" noma \"uphawu lombuzo\"."</string> + <string name="cancel" msgid="6830980399865683324">"Khansela"</string> + <string name="ok" msgid="7898366843681727667">"KULUNGILE"</string> + <string name="voice_input" msgid="2466640768843347841">"Okungenayo kwezwi"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Kwikhibhodi eyisisekelo"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Ikhibhodi yezimpawu"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"VALIWE"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"I-mic kwikhibhodi eyisisekelo"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Ikhibhodi yezimpawu ze-mic"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Okufakwayo kwezwi kuvimbelwe"</string> + <string name="selectInputMethod" msgid="315076553378705821">"Khetha indlela yokungenayo"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Izilimi zokufakwayo"</string> + <string name="language_selection_summary" msgid="187110938289512256">"Slayida umunwe kwibha yesikhala ukushintsha ulimi"</string> + <string name="hint_add_to_dictionary" msgid="9006292060636342317">"← Thinta futhi ukulondoloza"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Isichazamazwi siyatholakala"</string> + <string name="prefs_enable_log" msgid="6620424505072963557">"Vumela impendulo yomsebenzisi"</string> + <string name="prefs_description_log" msgid="5827825607258246003">"Siza ukuthuthukisa umhleli wendlela yokungenayo ngokuthumela izibalo zokubala nokuphahlaza imibiko e-Google."</string> + <string name="prefs_enable_recorrection" msgid="4588408906649533582">"Thinta ukulungisa amagama"</string> + <string name="prefs_enable_recorrection_summary" msgid="5082041365862396329">"Thinta amagama afakiwe ukuwalungisa, kuphela lapho okusikiselwayo kubonakala"</string> + <string name="keyboard_layout" msgid="437433231038683666">"Indikimba Yekhibhodi"</string> + <string name="subtype_mode_cs_keyboard" msgid="1141718931112377586">"Ikhibhodi yesi-Czech"</string> + <!-- no translation found for subtype_mode_ar_keyboard (2655338636329774995) --> + <skip /> + <string name="subtype_mode_da_keyboard" msgid="1243570804427922104">"Ikhibhodi yesi-Danish"</string> + <string name="subtype_mode_de_keyboard" msgid="1990979135959462145">"Ikhobhodi yei-German"</string> + <string name="subtype_mode_en_GB_keyboard" msgid="7945856548410373708">"Ikhibhodi ye-English (UK)"</string> + <string name="subtype_mode_en_US_keyboard" msgid="3708655163769735410">"Ikhobhodi ye-English (US)"</string> + <string name="subtype_mode_es_keyboard" msgid="1775125478866113148">"Ikhobhodi yesi-Spanish"</string> + <!-- no translation found for subtype_mode_fi_keyboard (3198596464082614532) --> + <skip /> + <string name="subtype_mode_fr_keyboard" msgid="8016515336759761014">"Ikhibhodi yesi-French"</string> + <string name="subtype_mode_fr_CA_keyboard" msgid="2628517247158376263">"Ikhobhodi yesi-French (i-Canada)"</string> + <string name="subtype_mode_fr_CH_keyboard" msgid="6742806653181621228">"Ikhibhodi yesi-French (i-Switzerland"</string> + <!-- no translation found for subtype_mode_hr_keyboard (7177182405440070112) --> + <skip /> + <!-- no translation found for subtype_mode_hu_keyboard (8843338355732633647) --> + <skip /> + <!-- no translation found for subtype_mode_iw_keyboard (1787536828253289950) --> + <skip /> + <string name="subtype_mode_it_keyboard" msgid="4934199655425394484">"Ikhibhodi yesi-Italian"</string> + <string name="subtype_mode_nb_keyboard" msgid="1175783216100212360">"Ikhibhodi yesi-Norwegian"</string> + <string name="subtype_mode_nl_keyboard" msgid="5090278083256037936">"Ikhibhodi yesi-Dutch"</string> + <!-- no translation found for subtype_mode_pl_keyboard (2225816414814396047) --> + <skip /> + <!-- no translation found for subtype_mode_pt_keyboard (7503997804861754840) --> + <skip /> + <string name="subtype_mode_ru_keyboard" msgid="1383995915064277943">"Ikhobhodi yesi-Russian"</string> + <string name="subtype_mode_sr_keyboard" msgid="5019440799612208168">"Ikhibhodi yesi-Serbian"</string> + <string name="subtype_mode_sv_keyboard" msgid="4933838139861753401">"Ikhobhodi yesi-Swedish"</string> + <!-- no translation found for subtype_mode_af_voice (7542487489657902699) --> + <skip /> + <string name="subtype_mode_cs_voice" msgid="1136386688120958641">"Izwi le-Czech"</string> + <string name="subtype_mode_de_voice" msgid="8378803143958089866">"Izwi lesi-German"</string> + <!-- no translation found for subtype_mode_en_voice (6643420989651848728) --> + <skip /> + <string name="subtype_mode_es_voice" msgid="1323473601346507487">"Izwi lesi-Spanish"</string> + <string name="subtype_mode_fr_voice" msgid="4675914209337824269">"Izwi lesi-French"</string> + <!-- no translation found for subtype_mode_it_voice (5077373057157441323) --> + <skip /> + <string name="subtype_mode_ja_voice" msgid="6604859132669646367">"Izwi lesi-Japanese"</string> + <string name="subtype_mode_ko_voice" msgid="4890391190762324561">"Izwi lesi-Korean"</string> + <!-- no translation found for subtype_mode_nl_voice (2603552312869575021) --> + <skip /> + <string name="subtype_mode_pl_voice" msgid="2076196021014840487">"Izwi lesi-Polish"</string> + <string name="subtype_mode_pt_voice" msgid="8036522712795994397">"Izwi lesi-Portuguese"</string> + <string name="subtype_mode_ru_voice" msgid="8034596947963787529">"Izwi lesi-Russian"</string> + <string name="subtype_mode_tr_voice" msgid="3402067436761140005">"Izwi lesi-Turkish"</string> + <!-- no translation found for subtype_mode_yue_voice (1576887891614624263) --> + <skip /> + <!-- no translation found for subtype_mode_zh_voice (4360533229467271152) --> + <skip /> + <!-- no translation found for subtype_mode_zu_voice (1146122571698884636) --> + <skip /> + <string name="prefs_usability_study_mode" msgid="6937813623647419810">"Imodi Yesitadi Yokusebenziseka"</string> +</resources> diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 995373e84..e9b6354a5 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -15,31 +15,56 @@ --> <resources> - - <declare-styleable name="LatinKeyboardBaseView"> - <!-- Default KeyboardView style. --> + <declare-styleable name="KeyboardTheme"> + <!-- Keyboard style --> + <attr name="keyboardStyle" format="reference" /> + <!-- LatinKeyboard style --> + <attr name="latinKeyboardStyle" format="reference" /> + <!-- KeyboardView style --> <attr name="keyboardViewStyle" format="reference" /> + <attr name="keyPreviewStyle" format="reference" /> + <!-- PopupMiniKeyboardView style --> + <attr name="popupMiniKeyboardViewStyle" format="reference" /> + <attr name="popupMiniKeyboardPanelStyle" format="reference" /> + <!-- Suggestions strip style --> + <attr name="suggestionsStripBackgroundStyle" format="reference" /> + <attr name="suggestionBackgroundStyle" format="reference" /> + <attr name="suggestionPreviewBackgroundStyle" format="reference" /> + <attr name="candidateViewStyle" format="reference" /> + </declare-styleable> + <declare-styleable name="KeyboardView"> <!-- Image for the key. This image needs to be a StateListDrawable, with the following possible states: normal, pressed, checkable, checkable+pressed, checkable+checked, 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 custom keys with some text and no icon. --> - <attr name="labelTextSize" format="dimension" /> + <!-- Size of the text for one letter keys, in the proportion of key height. --> + <attr name="keyLetterRatio" format="float" /> + <!-- Size of the text for keys with some text, in the proportion of key height. --> + <attr name="keyLabelRatio" format="float" /> + <!-- Size of the text for hint letter, in the proportion of key height. --> + <attr name="keyHintLetterRatio" format="float" /> + <!-- Size of the text for upper case letter, in the proportion of key height. --> + <attr name="keyUppercaseLetterRatio" format="float" /> <!-- 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 inactivated state. --> + <attr name="keyTextInactivatedColor" format="color" /> + <!-- Key hint letter color --> + <attr name="keyHintLetterColor" format="color" /> + <!-- Upper case letter colors --> + <attr name="keyUppercaseLetterInactivatedColor" format="color" /> + <attr name="keyUppercaseLetterActivatedColor" format="color" /> + + <!-- Popup hint icon "..." --> + <attr name="keyPopupHintIcon" format="reference" /> <!-- Layout resource for key press feedback.--> <attr name="keyPreviewLayout" format="reference" /> - <!-- Vertical offset of the key press feedback from the key. --> <attr name="keyPreviewOffset" format="dimension" /> - <!-- Height of the key press feedback popup. --> <attr name="keyPreviewHeight" format="dimension" /> @@ -56,17 +81,242 @@ <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="keyTextStyle" format="enum"> + <!-- 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> + </declare-styleable> - <attr name="symbolColorScheme"> - <flag name="white" value="0" /> - <flag name="black" value="1" /> + <declare-styleable name="CandidateView"> + <attr name="autoCorrectHighlight" format="integer"> + <flag name="autoCorrectBold" value="0x01" /> + <flag name="autoCorrectUnderline" value="0x02" /> + <flag name="autoCorrectInvert" value="0x04" /> </attr> + <attr name="colorTypedWord" format="color" /> + <attr name="colorAutoCorrect" format="color" /> + <attr name="colorSuggested" format="color" /> + <attr name="iconExpandPane" format="reference" /> + <attr name="iconClosePane" format="reference" /> + </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" /> + <!-- Minimum keyboard height represented in pixels, percentage of display height if fraction + is positive, or percentage of display width if fraction is negative. --> + <attr name="minKeyboardHeight" format="dimension|fraction" /> + <!-- Keyboard top and bottom paddings. --> + <attr name="keyboardTopPadding" format="dimension" /> + <attr name="keyboardBottomPadding" format="dimension" /> + <!-- Default width of a key, in pixels or percentage of display width. + If the value is zero, the actual key width will be determined to fill out the area up + to the right edge of the keyboard. + If the value is negative, the actual key width will be determined to fill out the + area between the nearest key on the left hand side and the right edge of the keyboard. + --> + <attr name="keyWidth" format="dimension|fraction|enum"> + <enum name="fillRight" value="0" /> + <enum name="fillBoth" value="-1" /> + </attr> + <!-- 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" /> + <!-- Locale of the keyboard layout --> + <attr name="keyboardLocale" format="string" /> + <!-- Icon set for key top and key preview. --> + <attr name="iconShiftKey" format="reference" /> + <attr name="iconToSymbolKey" format="reference" /> + <attr name="iconToSymbolKeyWithShortcut" format="reference" /> + <attr name="iconDeleteKey" format="reference" /> + <attr name="iconSettingsKey" format="reference" /> + <attr name="iconShortcutKey" format="reference" /> + <attr name="iconSpaceKey" format="reference" /> + <attr name="iconReturnKey" format="reference" /> + <attr name="iconSearchKey" format="reference" /> + <attr name="iconTabKey" format="reference" /> + <attr name="iconNum1Key" format="reference" /> + <attr name="iconNum2Key" format="reference" /> + <attr name="iconNum3Key" format="reference" /> + <attr name="iconNum4Key" format="reference" /> + <attr name="iconNum5Key" format="reference" /> + <attr name="iconNum6Key" format="reference" /> + <attr name="iconNum7Key" format="reference" /> + <attr name="iconNum8Key" format="reference" /> + <attr name="iconNum9Key" format="reference" /> + <attr name="iconNum0Key" format="reference" /> + <attr name="iconShiftedShiftKey" format="reference" /> + <attr name="iconPreviewSpaceKey" format="reference" /> + <attr name="iconPreviewTabKey" format="reference" /> + <attr name="iconPreviewSettingsKey" format="reference" /> + <attr name="iconPreviewShortcutKey" 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" format="integer"> + <!-- 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 functional key which has different key top than normal key. --> + <attr name="isFunctional" 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 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 hint letter to display on the key in conjunction with the label. --> + <attr name="keyHintLetter" format="string" /> + <!-- The key label option. --> + <attr name="keyLabelOption" format="integer"> + <!-- This should be aligned with Key.LABEL_OPTION_* --> + <flag name="alignLeft" value="0x01" /> + <flag name="alignRight" value="0x02" /> + <flag name="alignBottom" value="0x08" /> + <flag name="fontNormal" value="0x10" /> + <flag name="fontFixedWidth" value="0x20" /> + <flag name="followKeyLetterRatio" value="0x40" /> + <flag name="popupHint" value="0x80" /> + <flag name="hasUppercaseLetter" value="0x100" /> + </attr> + <!-- The icon to display on the key instead of the label. --> + <attr name="keyIcon" format="enum"> + <!-- This should be aligned with KeyboardIcons.ICON_* --> + <enum name="iconShiftKey" value="1" /> + <enum name="iconToSymbolKey" value="2" /> + <enum name="iconToSymbolKeyWithShortcut" value="3" /> + <enum name="iconDeleteKey" value="4" /> + <enum name="iconSettingsKey" value="5" /> + <enum name="iconShortcutKey" value="6" /> + <enum name="iconSpaceKey" value="7" /> + <enum name="iconReturnKey" value="8" /> + <enum name="iconSearchKey" value="9" /> + <enum name="iconTabKey" value="10" /> + <enum name="iconNum1Key" value="11" /> + <enum name="iconNum2Key" value="12" /> + <enum name="iconNum3Key" value="13" /> + <enum name="iconNum4Key" value="14" /> + <enum name="iconNum5Key" value="15" /> + <enum name="iconNum6Key" value="16" /> + <enum name="iconNum7Key" value="17" /> + <enum name="iconNum8Key" value="18" /> + <enum name="iconNum9Key" value="19" /> + <enum name="iconNum0Key" value="20" /> + </attr> + <!-- Shift key icon for shifted state --> + <attr name="keyIconShifted" format="enum"> + <!-- This should be aligned with KeyboardIcons.ICON_SHIFTED_* --> + <enum name="iconShiftedShiftKey" value="21" /> + </attr> + <!-- The icon to show in the popup preview. --> + <attr name="keyIconPreview" format="enum"> + <!-- This should be aligned with KeyboardIcons.ICON_PREVIEW_* --> + <enum name="iconPreviewSpaceKey" value="22" /> + <enum name="iconPreviewTabKey" value="23" /> + <enum name="iconPreviewSettingsKey" value="24" /> + <enum name="iconPreviewShortcutKey" value="25" /> + </attr> + <!-- The key style to specify a set of key attributes defined by <key_style/> --> + <attr name="keyStyle" format="string" /> + <!-- The key is enabled and responds on press. --> + <attr name="enabled" format="boolean" /> + <!-- Visual insets --> + <attr name="visualInsetsLeft" format="dimension|fraction" /> + <attr name="visualInsetsRight" format="dimension|fraction" /> + <!-- The X-coordinate of upper right corner of this key including horizontal gap. + If the value is negative, the origin is the right edge of the keyboard. --> + <attr name="keyXPos" format="dimension|fraction" /> + </declare-styleable> + + <declare-styleable name="Keyboard_Row"> + <!-- Row edge flags. --> + <attr name="rowEdgeFlags" format="integer"> + <!-- 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" format="enum|string"> + <enum name="text" value="0" /> + <enum name="url" value="1" /> + <enum name="email" value="2" /> + <enum name="im" value="3" /> + <enum name="phone" value="4" /> + <enum name="number" value="5" /> + </attr> + <attr name="navigateAction" format="boolean" /> + <attr name="passwordInput" format="boolean" /> + <attr name="hasSettingsKey" format="boolean" /> + <!-- This should be aligned with KeyboardID.F2KEY_MODE_* --> + <attr name="f2KeyMode" format="enum"> + <enum name="none" value="0" /> + <enum name="settings" value="1" /> + <enum name="shortcutIme" value="2" /> + <enum name="shortcutImeOrSettings" value="3" /> + </attr> + <attr name="clobberSettingsKey" format="boolean" /> + <attr name="voiceKeyEnabled" format="boolean" /> + <attr name="hasVoiceKey" format="boolean" /> + <attr name="imeAction" format="enum"> + <!-- This should be aligned with EditorInfo.IME_ACTION_* --> + <enum name="actionUnspecified" value="0" /> + <enum name="actionNone" value="1" /> + <enum name="actionGo" value="2" /> + <enum name="actionSearch" value="3" /> + <enum name="actionSend" value="4" /> + <enum name="actionNext" value="5" /> + <enum name="actionDone" value="6" /> + <enum name="actionPrevious" value="7" /> + </attr> + <attr name="localeCode" format="string" /> + <attr name="languageCode" format="string" /> + <attr name="countryCode" format="string" /> + </declare-styleable> + + <declare-styleable name="Keyboard_KeyStyle"> + <attr name="styleName" format="string" /> + <attr name="parentStyle" format="string" /> + </declare-styleable> + + <declare-styleable name="LatinKeyboard"> + <attr name="autoCorrectionSpacebarLedEnabled" format="boolean" /> + <attr name="autoCorrectionSpacebarLedIcon" format="reference" /> + <attr name="disabledShortcutIcon" format="reference" /> + <attr name="spacebarTextColor" format="color" /> + <attr name="spacebarTextShadowColor" format="color" /> + <attr name="spacebarArrowLeftIcon" format="reference" /> + <attr name="spacebarArrowRightIcon" format="reference" /> + <attr name="spacebarArrowPreviewLeftIcon" format="reference" /> + <attr name="spacebarArrowPreviewRightIcon" format="reference" /> + </declare-styleable> </resources> diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml index 5a24e4c60..889d8f784 100644 --- a/java/res/values/bools.xml +++ b/java/res/values/bools.xml @@ -18,16 +18,7 @@ */ --> <resources> - <!-- Whether or not auto-correction should be enabled by default --> - <bool name="enable_autocorrect">true</bool> <!-- Whether this input method should be used as the default for a locale. Override it for latin languages. --> <bool name="im_is_default">false</bool> - <!-- Whether or not voice input is enabled by default. --> - <bool name="voice_input_default">true</bool> - <bool name="config_swipeDisambiguation">true</bool> - <!-- Whether or not Popup on key press is enabled by default --> - <bool name="default_popup_preview">true</bool> - <bool name="default_recorrection_enabled">true</bool> - <bool name="config_long_press_comma_for_settings_enabled">true</bool> </resources> diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml deleted file mode 100644 index 0161589a4..000000000 --- a/java/res/values/colors.xml +++ /dev/null @@ -1,32 +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. -*/ ---> -<resources> - <color name="candidate_normal">#FFFFFFFF</color> - <color name="candidate_recommended">#FFFCAE00</color> - <color name="candidate_other">#FFFCAE00</color> - <color name="latinkeyboard_transparent">#00000000</color> - <color name="latinkeyboard_bar_language_shadow_white">#80000000</color> - <color name="latinkeyboard_bar_language_shadow_black">#80FFFFFF</color> - <color name="latinkeyboard_bar_language_text">#FFC0C0C0</color> - <color name="latinkeyboard_extension_background">#A0000000</color> - <color name="latinkeyboard_feedback_language_text">#FFFFFFFF</color> - <color name="latinkeyboard_key_color_white">#FFFFFFFF</color> - <color name="latinkeyboard_key_color_black">#FF000000</color> -</resources> diff --git a/java/res/values/config.xml b/java/res/values/config.xml index edb6cd845..40cca9543 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -19,14 +19,70 @@ --> <resources> + <bool name="config_swipeDisambiguation">true</bool> + <bool name="config_enable_show_settings_key_option">true</bool> + <bool name="config_enable_show_voice_key_option">true</bool> + <bool name="config_enable_show_popup_on_keypress_option">true</bool> + <bool name="config_enable_show_recorrection_option">true</bool> + <bool name="config_enable_quick_fixes_option">true</bool> + <bool name="config_enable_bigram_suggestions_option">true</bool> + <bool name="config_enable_usability_study_mode_option">false</bool> + <bool name="config_swipe_down_dismiss_keyboard_enabled">true</bool> + <bool name="config_sliding_key_input_enabled">true</bool> + <bool name="config_digit_popup_characters_enabled">true</bool> + <!-- Whether or not Popup on key press is enabled by default --> + <bool name="config_default_popup_preview">true</bool> + <!-- Default values for whether quick fixes and bigram suggestions are activated --> + <bool name="config_default_quick_fixes">true</bool> + <!-- Default value for bigram suggestion: while showing candidates for a word should we weigh + in the previous word? --> + <bool name="config_default_bigram_suggestions">true</bool> + <!-- Default value for bigram prediction: after entering a word and a space only, should we look + at input history to suggest a hopefully helpful candidate for the next word? --> + <bool name="config_default_bigram_prediction">false</bool> + <bool name="config_default_recorrection_enabled">true</bool> + <bool name="config_default_sound_enabled">false</bool> + <bool name="config_auto_correction_spacebar_led_enabled">true</bool> + <bool name="config_use_spacebar_language_switcher">true</bool> + <!-- Showing mini keyboard, just above the touched point if true, aligned to the key if false --> + <bool name="config_show_mini_keyboard_at_touched_point">false</bool> + <!-- The language is never displayed if == 0, always displayed if < 0 --> + <integer name="config_delay_before_fadeout_language_on_spacebar">1200</integer> + <integer name="config_delay_update_suggestions">100</integer> + <integer name="config_delay_update_old_suggestions">300</integer> + <integer name="config_delay_update_shift_state">100</integer> + <integer name="config_duration_of_fadeout_language_on_spacebar">50</integer> + <integer name="config_final_fadeout_percentage_of_language_on_spacebar">50</integer> <integer name="config_delay_before_preview">0</integer> - <integer name="config_delay_after_preview">10</integer> - <integer name="config_preview_fadein_anim_time">0</integer> - <integer name="config_preview_fadeout_anim_time">70</integer> + <integer name="config_delay_after_preview">70</integer> <integer name="config_mini_keyboard_fadein_anim_time">0</integer> <integer name="config_mini_keyboard_fadeout_anim_time">100</integer> <integer name="config_delay_before_key_repeat_start">400</integer> <integer name="config_key_repeat_interval">50</integer> + <integer name="config_keyboard_grid_width">32</integer> + <integer name="config_keyboard_grid_height">16</integer> <integer name="config_long_press_key_timeout">400</integer> - <integer name="config_multi_tap_key_timeout">800</integer> + <integer name="config_long_press_shift_key_timeout">1200</integer> + <integer name="config_touch_noise_threshold_millis">40</integer> + <integer name="config_double_spaces_turn_into_period_timeout">1100</integer> + <dimen name="config_touch_noise_threshold_distance">2.0mm</dimen> + <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. --> + <string name="config_default_keyboard_theme_id" translatable="false">5</string> + <string name="config_text_size_of_language_on_spacebar" translatable="false">small</string> + <integer name="config_max_popup_keyboard_column">5</integer> + <string-array name="auto_correction_threshold_values" translatable="false"> + <!-- Off, When auto correction setting is Off, this value is not used. --> + <item></item> + <!-- Modest : Suggestion whose normalized score is greater than this value + will be subject to auto-correction. --> + <item>0.22</item> + <!-- Aggressive --> + <item>0.08</item> + <!-- Very Aggressive : Suggestion whose normalized score is greater than this value + will be subject to auto-correction. --> + <item>0</item> + </string-array> + <!-- Screen metrics for logging. 0 = "mdpi", 1 = "hdpi", 2 = "xlarge" --> + <integer name="log_screen_metrics">0</integer> + <bool name="config_require_umlaut_processing">false</bool> </resources> diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 0c3b6ad2e..54256de3c 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -19,32 +19,59 @@ --> <resources> + <!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=0.295in --> + <dimen name="keyboardHeight">1.285in</dimen> + <fraction name="maxKeyboardHeight">50%p</fraction> + <fraction name="minKeyboardHeight">-61.8%p</fraction> <!-- key_height + key_bottom_gap = popup_key_height --> - <dimen name="key_height">0.290in</dimen> + <!-- <dimen name="key_height">0.295in</dimen> --> <dimen name="key_bottom_gap">0.035in</dimen> - <dimen name="popup_key_height">0.325in</dimen> + <dimen name="key_horizontal_gap">0.000in</dimen> + <dimen name="popup_key_height">0.330in</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="key_bottom_gap_stone">0.00in</dimen> + <dimen name="key_horizontal_gap_stone">0.00in</dimen> + <dimen name="key_bottom_gap_ics">0.06in</dimen> + <dimen name="key_horizontal_gap_ics">0.01in</dimen> + <dimen name="keyboard_top_padding_ics">0.03in</dimen> + <dimen name="keyboard_bottom_padding_ics">0.06in</dimen> + <dimen name="keyboard_horizontal_edges_padding">0.0in</dimen> + <dimen name="mini_keyboard_horizontal_padding">16dip</dimen> + <dimen name="mini_keyboard_horizontal_padding_holo">38dip</dimen> + <dimen name="mini_keyboard_key_horizontal_padding">8dip</dimen> + <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> + <!-- popup_key_height x 1.2 --> + <dimen name="mini_keyboard_slide_allowance">0.396in</dimen> + <!-- popup_key_height x -1.0 --> + <dimen name="mini_keyboard_vertical_correction">-0.330in</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> + + <fraction name="key_letter_ratio">45%</fraction> + <fraction name="key_label_ratio">29%</fraction> + <fraction name="key_hint_letter_ratio">23%</fraction> + <fraction name="key_uppercase_letter_ratio">35%</fraction> + <!-- left or right padding of label alignment --> + <dimen name="key_label_horizontal_alignment_padding">21dip</dimen> + <fraction name="key_preview_text_ratio">82%</fraction> + <dimen name="key_preview_height">80sp</dimen> + <dimen name="key_preview_offset">0.1in</dimen> + <dimen name="key_preview_offset_ics">0.05in</dimen> + <dimen name="candidate_strip_height">42dip</dimen> + <!-- candidate_strip_minimum_height = + key_preview_height_holo - key_preview_offset_holo + alpha --> + <dimen name="candidate_strip_minimum_height">100sp</dimen> <dimen name="candidate_strip_fading_edge_length">63dip</dimen> - <dimen name="spacebar_vertical_correction">4dip</dimen> + <dimen name="candidate_strip_padding">0dip</dimen> + <dimen name="candidate_min_width">32dip</dimen> + <dimen name="candidate_padding">6dip</dimen> + <dimen name="candidate_text_size">18dip</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 --> - <dimen name="mini_keyboard_vertical_correction">-0.325in</dimen> + <dimen name="key_hysteresis_distance">0.05in</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> </resources> diff --git a/java/res/values/donottranslate-altchars.xml b/java/res/values/donottranslate-altchars.xml index bba7282c9..e77957578 100644 --- a/java/res/values/donottranslate-altchars.xml +++ b/java/res/values/donottranslate-altchars.xml @@ -18,29 +18,39 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="alternates_for_a">àáâãäåæ</string> - <string name="alternates_for_e">èéêë</string> - <string name="alternates_for_i">ìíîï</string> - <string name="alternates_for_o">òóôõöœø</string> - <string name="alternates_for_u">ùúûü</string> - <string name="alternates_for_s">§ß</string> - <string name="alternates_for_n">ñ</string> - <string name="alternates_for_c">ç</string> - <string name="alternates_for_y">ýÿ</string> + <string name="alternates_for_a"></string> + <string name="alternates_for_e">3</string> + <string name="alternates_for_i">8</string> + <string name="alternates_for_o">9</string> + <string name="alternates_for_u">7</string> + <string name="alternates_for_s"></string> + <string name="alternates_for_n"></string> + <string name="alternates_for_c"></string> + <string name="alternates_for_y">6</string> <string name="alternates_for_q">1</string> <string name="alternates_for_w">2</string> <string name="alternates_for_d"></string> <string name="alternates_for_r">4</string> <string name="alternates_for_t">5</string> <string name="alternates_for_z"></string> + <string name="alternates_for_k"></string> <string name="alternates_for_l"></string> <string name="alternates_for_g"></string> <string name="alternates_for_p">0</string> <string name="alternates_for_v"></string> - <string name="alternates_for_ae"></string> - <string name="alternates_for_oe"></string> + <string name="keylabel_for_scandinavia_row2_10"></string> + <string name="keylabel_for_scandinavia_row2_11"></string> + <string name="alternates_for_scandinavia_row2_10"></string> + <string name="alternates_for_scandinavia_row2_11"></string> <string name="alternates_for_cyrillic_e"></string> <string name="alternates_for_cyrillic_soft_sign"></string> - <string name="alternates_for_a_umlaut"></string> - <string name="alternates_for_o_umlaut"></string> + <string name="alternates_for_currency_dollar">¢,£,€,¥,₱</string> + <string name="alternates_for_currency_euro">¢,£,$,¥,₱</string> + <string name="alternates_for_currency_pound">¢,$,€,¥,₱</string> + <string name="alternates_for_smiley">":-)|:-) ,:-(|:-( ,;-)|;-) ,:-P|:-P ,=-O|=-O ,:-*|:-* ,:O|:O ,B-)|B-) ,:-$|:-$ ,:-!|:-! ,:-[|:-[ ,O:-)|O:-) ,:-\\\\\\\\|:-\\\\\\\\ ,:\'(|:\'( ,:-D|:-D "</string> + <string name="alternates_for_punctuation">"\\,,\?,!,:,-,\',\",(,),/,;,+,&,\@"</string> + <string name="alternates_for_web_tab_punctuation">".,\\,,\?,!,:,-,\',\",(,),/,;,+,&,\@"</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..21e6c55c6 100644 --- a/java/res/values/donottranslate.xml +++ b/java/res/values/donottranslate.xml @@ -18,18 +18,148 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Symbols that are commonly considered word separators in this language --> - <string name="word_separators">.\u0009\u0020,;:!?\n()[]*&@{}/<>_+=|\u0022</string> - <!-- 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> + <!-- Symbols that should be swapped with a magic space --> + <string name="magic_space_swapping_symbols">.,;:!?)]}\u0022</string> + <!-- Symbols that should strip a magic space --> + <string name="magic_space_stripping_symbols">\u0009\u0020\n/_\u0027-</string> + <!-- Symbols that should convert magic spaces into real space --> + <string name="magic_space_promoting_symbols">([*&@{<>+=|</string> + <!-- Symbols that do NOT separate words --> + <string name="non_word_separator_symbols">\u0027-</string> + <!-- Word separator list is the union of all symbols except those that are not separators: + magic_space_swapping_symbols | magic_space_stripping_symbols | + magic_space_neutral_symbols \ non_word_separator_symbols --> + + <!-- 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 phone numeric" key. Must be short to fit on key! --> + <string name="label_to_phone_numeric_key">123</string> + <!-- Label for "switch to phone symbols" key. Must be short to fit on key! --> + <string name="label_to_phone_symbols_key">\uff0a\uff03\uff08</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 name="auto_correction_threshold_mode_index_very_aggeressive">3</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> + <item>@string/auto_correction_threshold_mode_index_very_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> + <item>@string/auto_correction_threshold_mode_very_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_ics">IceCreamSandwich</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_ics</item> + </string-array> + <string-array name="keyboard_layout_modes_values"> + <item>0</item> + <item>1</item> + <item>2</item> + <item>3</item> + <item>4</item> + <item>5</item> + </string-array> + + <!-- Subtype locale name exceptions --> + <string-array name="subtype_locale_exception_keys"> + <item>en_US</item> + <item>en_GB</item> + <item>de_ZZ</item> + </string-array> + <string-array name="subtype_locale_exception_values"> + <item>English (US)</item> + <item>English (UK)</item> + <item>Deutsch (QWERTY)</item> + </string-array> </resources> diff --git a/java/res/values/durations.xml b/java/res/values/durations.xml deleted file mode 100644 index 92af68e39..000000000 --- a/java/res/values/durations.xml +++ /dev/null @@ -1,25 +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. -*/ ---> - -<resources> - <!-- Vibration duration in milliseconds, for key presses in the IME. This can be hardware - dependent and may require overriding with a device specific overlay. --> - <integer name="vibrate_duration_ms">40</integer> -</resources> diff --git a/java/res/values/keyboard-icons-black.xml b/java/res/values/keyboard-icons-black.xml new file mode 100644 index 000000000..3ba345580 --- /dev/null +++ b/java/res/values/keyboard-icons-black.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <style name="KeyboardIcons.Black" parent="android:Theme.Light"> + <!-- Keyboard icons --> + <item name="iconShiftKey">@drawable/sym_bkeyboard_shift</item> + <item name="iconToSymbolKeyWithShortcut">@drawable/sym_bkeyboard_123_mic</item> + <item name="iconDeleteKey">@drawable/sym_bkeyboard_delete</item> + <item name="iconSettingsKey">@drawable/sym_bkeyboard_settings</item> + <item name="iconShortcutKey">@drawable/sym_bkeyboard_mic</item> + <item name="iconSpaceKey">@drawable/sym_bkeyboard_space</item> + <item name="iconReturnKey">@drawable/sym_bkeyboard_return</item> + <item name="iconSearchKey">@drawable/sym_bkeyboard_search</item> + <item name="iconTabKey">@drawable/sym_bkeyboard_tab</item> + <item name="iconNum1Key">@drawable/sym_bkeyboard_num1</item> + <item name="iconNum2Key">@drawable/sym_bkeyboard_num2</item> + <item name="iconNum3Key">@drawable/sym_bkeyboard_num3</item> + <item name="iconNum4Key">@drawable/sym_bkeyboard_num4</item> + <item name="iconNum5Key">@drawable/sym_bkeyboard_num5</item> + <item name="iconNum6Key">@drawable/sym_bkeyboard_num6</item> + <item name="iconNum7Key">@drawable/sym_bkeyboard_num7</item> + <item name="iconNum8Key">@drawable/sym_bkeyboard_num8</item> + <item name="iconNum9Key">@drawable/sym_bkeyboard_num9</item> + <item name="iconNum0Key">@drawable/sym_bkeyboard_num0</item> + <item name="iconShiftedShiftKey">@drawable/sym_bkeyboard_shift_locked</item> + <item name="iconPreviewSpaceKey">@drawable/sym_keyboard_feedback_space</item> + <item name="iconPreviewTabKey">@drawable/sym_keyboard_feedback_tab</item> + <item name="iconPreviewSettingsKey">@drawable/sym_keyboard_feedback_settings</item> + <item name="iconPreviewShortcutKey">@drawable/sym_keyboard_feedback_mic</item> + <!-- LatinKeyboard icons --> + <item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led</item> + <item name="disabledShortcutIcon">@drawable/sym_keyboard_voice_off_holo</item> + <item name="spacebarArrowLeftIcon">@drawable/sym_keyboard_language_arrows_left</item> + <item name="spacebarArrowRightIcon">@drawable/sym_keyboard_language_arrows_right</item> + <item name="spacebarArrowPreviewLeftIcon">@drawable/sym_keyboard_feedback_language_arrows_left</item> + <item name="spacebarArrowPreviewRightIcon">@drawable/sym_keyboard_feedback_language_arrows_right</item> + </style> +</resources> diff --git a/java/res/values/keyboard-icons-ics.xml b/java/res/values/keyboard-icons-ics.xml new file mode 100644 index 000000000..1dfbdf96e --- /dev/null +++ b/java/res/values/keyboard-icons-ics.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <style name="KeyboardIcons.IceCreamSandwich" parent="android:Theme.Holo"> + <!-- Keyboard icons --> +<!-- <item name="iconShiftKey">@drawable/sym_keyboard_shift_holo</item> --> + <item name="iconShiftKey">@drawable/sym_keyboard_shift</item> +<!-- <item name="iconToSymbolKeyWithShortcut">@drawable/sym_keyboard_123_voice_holo</item> --> + <item name="iconToSymbolKeyWithShortcut">@drawable/sym_keyboard_123_mic</item> +<!-- <item name="iconDeleteKey">@drawable/sym_keyboard_delete_holo</item> --> + <item name="iconDeleteKey">@drawable/sym_keyboard_delete</item> +<!-- <item name="iconSettingsKey">@drawable/sym_keyboard_settings_holo</item> --> + <item name="iconSettingsKey">@drawable/sym_keyboard_settings</item> +<!-- <item name="iconShortcutKey">@drawable/sym_keyboard_voice_holo</item> --> + <item name="iconShortcutKey">@drawable/sym_keyboard_mic</item> +<!-- <item name="iconSpaceKey">@drawable/sym_keyboard_space_holo</item> --> + <item name="iconSpaceKey">@drawable/sym_keyboard_space</item> +<!-- <item name="iconReturnKey">@drawable/sym_keyboard_return_holo</item> --> + <item name="iconReturnKey">@drawable/sym_keyboard_return</item> +<!-- <item name="iconSearchKey">@drawable/sym_keyboard_search_holo</item> --> + <item name="iconSearchKey">@drawable/sym_keyboard_search</item> +<!-- <item name="iconTabKey">@drawable/sym_keyboard_tab_holo</item> --> + <item name="iconTabKey">@drawable/sym_keyboard_tab</item> +<!-- <item name="iconNum1Key">@drawable/sym_keyboard_num1_holo</item> --> +<!-- <item name="iconNum2Key">@drawable/sym_keyboard_num2_holo</item> --> +<!-- <item name="iconNum3Key">@drawable/sym_keyboard_num3_holo</item> --> +<!-- <item name="iconNum4Key">@drawable/sym_keyboard_num4_holo</item> --> +<!-- <item name="iconNum5Key">@drawable/sym_keyboard_num5_holo</item> --> +<!-- <item name="iconNum6Key">@drawable/sym_keyboard_num6_holo</item> --> +<!-- <item name="iconNum7Key">@drawable/sym_keyboard_num7_holo</item> --> +<!-- <item name="iconNum8Key">@drawable/sym_keyboard_num8_holo</item> --> +<!-- <item name="iconNum9Key">@drawable/sym_keyboard_num9_holo</item> --> +<!-- <item name="iconNum0Key">@drawable/sym_keyboard_num0_holo</item> --> +<!-- <item name="iconNumStarKey">@drawable/sym_keyboard_numbstar_holo</item> --> +<!-- <item name="iconNumPoundKey">@drawable/sym_keyboard_numbpound_holo</item> --> +<!-- <item name="iconNumAltKey">@drawable/sym_keyboard_numalt_holo</item> --> + <item name="iconNum1Key">@drawable/sym_keyboard_num1</item> + <item name="iconNum2Key">@drawable/sym_keyboard_num2</item> + <item name="iconNum3Key">@drawable/sym_keyboard_num3</item> + <item name="iconNum4Key">@drawable/sym_keyboard_num4</item> + <item name="iconNum5Key">@drawable/sym_keyboard_num5</item> + <item name="iconNum6Key">@drawable/sym_keyboard_num6</item> + <item name="iconNum7Key">@drawable/sym_keyboard_num7</item> + <item name="iconNum8Key">@drawable/sym_keyboard_num8</item> + <item name="iconNum9Key">@drawable/sym_keyboard_num9</item> + <item name="iconNum0Key">@drawable/sym_keyboard_num0</item> +<!-- <item name="iconShiftedShiftKey">@drawable/sym_keyboard_shift_locked_holo</item> --> + <item name="iconShiftedShiftKey">@drawable/sym_keyboard_shift_locked</item> + <item name="iconPreviewSpaceKey">@drawable/transparent</item> +<!-- <item name="iconPreviewTabKey">@drawable/sym_keyboard_tab_holo</item> --> + <item name="iconPreviewTabKey">@drawable/sym_keyboard_feedback_tab</item> +<!-- <item name="iconPreviewSettingsKey">@drawable/sym_keyboard_settings_holo</item> --> + <item name="iconPreviewSettingsKey">@drawable/sym_keyboard_settings</item> +<!-- <item name="iconPreviewShortcutKey">@drawable/sym_keyboard_feedback_voice_holo</item> --> + <item name="iconPreviewShortcutKey">@drawable/sym_keyboard_feedback_mic</item> + <!-- LatinKeyboard icons --> + <item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led</item> + <item name="disabledShortcutIcon">@drawable/sym_keyboard_voice_off_holo</item> + <item name="spacebarArrowLeftIcon">@drawable/sym_keyboard_language_arrows_left</item> + <item name="spacebarArrowRightIcon">@drawable/sym_keyboard_language_arrows_right</item> +<!-- <item name="spacebarArrowPreviewLeftIcon">@drawable/sym_keyboard_feedback_language_arrows_left</item> --> +<!-- <item name="spacebarArrowPreviewRightIcon">@drawable/sym_keyboard_feedback_language_arrows_right</item> --> + </style> +</resources> diff --git a/java/res/values/keyboard-icons-white.xml b/java/res/values/keyboard-icons-white.xml new file mode 100644 index 000000000..9f5fb5a5b --- /dev/null +++ b/java/res/values/keyboard-icons-white.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <style name="KeyboardIcons" parent="android:Theme"> + <!-- Keyboard icons --> + <item name="iconShiftKey">@drawable/sym_keyboard_shift</item> + <item name="iconToSymbolKeyWithShortcut">@drawable/sym_keyboard_123_mic</item> + <item name="iconDeleteKey">@drawable/sym_keyboard_delete</item> + <item name="iconSettingsKey">@drawable/sym_keyboard_settings</item> + <item name="iconShortcutKey">@drawable/sym_keyboard_mic</item> + <item name="iconSpaceKey">@drawable/sym_keyboard_space</item> + <item name="iconReturnKey">@drawable/sym_keyboard_return</item> + <item name="iconSearchKey">@drawable/sym_keyboard_search</item> + <item name="iconTabKey">@drawable/sym_keyboard_tab</item> + <item name="iconNum1Key">@drawable/sym_keyboard_num1</item> + <item name="iconNum2Key">@drawable/sym_keyboard_num2</item> + <item name="iconNum3Key">@drawable/sym_keyboard_num3</item> + <item name="iconNum4Key">@drawable/sym_keyboard_num4</item> + <item name="iconNum5Key">@drawable/sym_keyboard_num5</item> + <item name="iconNum6Key">@drawable/sym_keyboard_num6</item> + <item name="iconNum7Key">@drawable/sym_keyboard_num7</item> + <item name="iconNum8Key">@drawable/sym_keyboard_num8</item> + <item name="iconNum9Key">@drawable/sym_keyboard_num9</item> + <item name="iconNum0Key">@drawable/sym_keyboard_num0</item> + <item name="iconShiftedShiftKey">@drawable/sym_keyboard_shift_locked</item> + <item name="iconPreviewSpaceKey">@drawable/sym_keyboard_feedback_space</item> + <item name="iconPreviewTabKey">@drawable/sym_keyboard_feedback_tab</item> + <item name="iconPreviewSettingsKey">@drawable/sym_keyboard_feedback_settings</item> + <item name="iconPreviewShortcutKey">@drawable/sym_keyboard_feedback_mic</item> + <!-- LatinKeyboard icons --> + <item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led</item> + <item name="disabledShortcutIcon">@drawable/sym_keyboard_voice_off_holo</item> + <item name="spacebarArrowLeftIcon">@drawable/sym_keyboard_language_arrows_left</item> + <item name="spacebarArrowRightIcon">@drawable/sym_keyboard_language_arrows_right</item> + <item name="spacebarArrowPreviewLeftIcon">@drawable/sym_keyboard_feedback_language_arrows_left</item> + <item name="spacebarArrowPreviewRightIcon">@drawable/sym_keyboard_feedback_language_arrows_right</item> + </style> +</resources> diff --git a/java/res/values/keycodes.xml b/java/res/values/keycodes.xml index c5d5b3cd1..ee345291a 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> + <integer name="key_settings">-6</integer> + <integer name="key_shortcut">-8</integer> </resources> diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 6644d2224..f6e130789 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -22,7 +22,7 @@ <string name="english_ime_name">Android keyboard</string> <!-- Title for Latin keyboard settings activity / dialog --> <string name="english_ime_settings">Android keyboard settings</string> - <!-- Title for Latin keyboard input options dialog --> + <!-- Title for Latin keyboard input options dialog [CHAR LIMIT=25] --> <string name="english_ime_input_options">Input options</string> <!-- Option to provide vibrate/haptic feedback on keypress --> @@ -31,151 +31,94 @@ <!-- Option to play back sound on keypress in soft keyboard --> <string name="sound_on_keypress">Sound on keypress</string> - <!-- Option to pop up the character with a larger font above soft keyboard --> + <!-- Option to control whether or not to show a popup with a larger font on each key press. --> <string name="popup_on_keypress">Popup on keypress</string> - <!-- Option to enable using nearby keys when correcting/predicting --> - <string name="hit_correction">Correct typing errors</string> - - <!-- Description for hit_correction --> - <string name="hit_correction_summary">Enable input error correction</string> - - <!-- Option to enable using nearby keys when correcting/predicting in landscape--> - <string name="hit_correction_land">Landscape input errors</string> - - <!-- Description for hit_correction in landscape --> - <string name="hit_correction_land_summary">Enable input error correction</string> - - <!-- Option to automatically correct word on hitting space --> - <string name="auto_correction">Word suggestions</string> - - <!-- Description for auto_correction --> - <string name="auto_correction_summary">Automatically correct the previous word</string> - - <!-- Option to enable text prediction --> - <string name="prediction">Word suggestions</string> + <!-- Category title for general settings for Android keyboard --> + <string name="general_category">General</string> + <!-- Category title for text prediction --> - <string name="prediction_category">Word suggestion settings</string> - <!-- Description for text prediction --> - <string name="prediction_summary">Enable auto completion while typing</string> - - <!-- Dialog title for auto complete choices --> - <string name="auto_complete_dialog_title">Auto completion</string> - - <!-- Option to enable text prediction in landscape --> - <string name="prediction_landscape">Increase text field size</string> - <!-- Description for text prediction --> - <string name="prediction_landscape_summary">Hide word suggestions in landscape view</string> - + <string name="correction_category">Text correction</string> + + <!-- Category title for ngrams --> + <string name="ngram_category">Suggestions based on previous words</string> + + <!-- Category title for misc options --> + <string name="misc_category">Other options</string> + + <!-- Option name for advanced settings screen [CHAR LIMIT=25] --> + <string name="advanced_settings">Advanced settings</string> + <!-- Option summary for advanced settings screen [CHAR LIMIT=65 (two lines) or 30 (fits on one line, preferable)] --> + <string name="advanced_settings_summary">Options for expert users</string> + + <!-- Option for the dismiss delay of the key popup [CHAR LIMIT=25] --> + <string name="key_preview_popup_dismiss_delay">Key popup dismiss delay</string> + <!-- Description for delay for dismissing a popup on keypress: no delay [CHAR LIMIT=15] --> + <string name="key_preview_popup_dismiss_no_delay">No delay</string> + <!-- Description for delay for dismissing a popup on screen: default value of the delay [CHAR LIMIT=15] --> + <string name="key_preview_popup_dismiss_default_delay">Default</string> + + <!-- Option name for enabling or disabling the use of names of people in Contacts for suggestion and correction [CHAR LIMIT=25] --> + <string name="use_contacts_dict">Suggest Contact names</string> + <!-- Description for option enabling or disabling the use of names of people in Contacts for suggestion and correction [CHAR LIMIT=65] --> + <string name="use_contacts_dict_summary">Use names from Contacts for suggestions and corrections</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 configure dictionaries --> + <string name="configure_dictionaries_title">Configure dictionaries</string> + <!-- Option to enable quick fixes --> <string name="quick_fixes">Quick fixes</string> <!-- Description for quick fixes --> <string name="quick_fixes_summary">Corrects commonly typed mistakes</string> - + <!-- Option to enable showing suggestions --> - <string name="show_suggestions">Show suggestions</string> + <string name="prefs_show_suggestions">Show correction suggestions</string> <!-- Description for show suggestions --> - <string name="show_suggestions_summary">Display suggested words while typing</string> - - <!-- Option to enable auto completion --> - <string name="auto_complete">Auto-complete</string> - <!-- Description for auto completion --> - <string name="auto_complete_summary">Spacebar and punctuation automatically insert highlighted word</string> - + <string name="prefs_show_suggestions_summary">Display suggested words while typing</string> + <string name="prefs_suggestion_visibility_show_name">Always show</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name">Show on portrait mode</string> + <string name="prefs_suggestion_visibility_hide_name">Always hide</string> + <!-- Option to enable spacebar language switcher [CHAR LIMIT=20]--> + <string name="prefs_use_spacebar_language_switch">Use the spacebar language switcher</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 --> - <string name="bigram_suggestion">Bigram Suggestions</string> - <!-- Description for auto completion --> - <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> + <!-- Option to decide the auto correction threshold score --> + <!-- Option to enable auto correction [CHAR LIMIT=20]--> + <string name="auto_correction">Auto correction</string> + <!-- Description for auto correction [CHAR LIMIT=35] --> + <string name="auto_correction_summary">Spacebar and punctuation automatically correct mistyped words</string> + <!-- Option to disable auto correction. [CHAR LIMIT=20] --> + <string name="auto_correction_threshold_mode_off">Off</string> + <!-- Option to suggest auto correction candidates modestly. Auto-corrects only to a word which has small edit distance from typed word. [CHAR LIMIT=20] --> + <string name="auto_correction_threshold_mode_modest">Modest</string> + <!-- Option to suggest auto correction candidates aggressively. Auto-corrects to a word which has even large edit distance from typed word. [CHAR LIMIT=20] --> + <string name="auto_correction_threshold_mode_aggeressive">Aggressive</string> + <!-- Option to suggest auto correction candidates very aggressively. Auto-corrects to a word which has even large edit distance from typed word. [CHAR LIMIT=20] --> + <string name="auto_correction_threshold_mode_very_aggeressive">Very Aggressive</string> + + <!-- Option to enable bigram correction --> + <string name="bigram_suggestion">Bigram suggestions</string> + <!-- Description for auto correction --> + <string name="bigram_suggestion_summary">Use previous word to improve suggestion</string> + <!-- Option to enable using user-history bigram when no input --> + <string name="bigram_prediction">Bigram prediction</string> + <!-- Description for auto correction --> + <string name="bigram_prediction_summary">Use previous word also for prediction</string> <!-- 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 & 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 & 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 +127,113 @@ <string name="label_done_key">Done</string> <!-- Label for soft enter key when it performs SEND action. Must be short to fit on key! --> <string name="label_send_key">Send</string> - <!-- Label for "switch to symbols" key. Must be short to fit on key! --> - <string name="label_symbol_key">\?123</string> - <!-- Label for "switch to numeric" key. Must be short to fit on key! --> - <string name="label_phone_key">123</string> <!-- Label for "switch to alphabetic" key. Must be short to fit on key! --> - <string name="label_alpha_key">ABC</string> - <!-- Label for ALT modifier key. Must be short to fit on key! --> - <string name="label_alt_key">ALT</string> + <string name="label_to_alpha_key">ABC</string> + <!-- Label for Shift modifier key of symbol keyboard. Must be short to fit on key! --> + <string name="label_more_key">More</string> + <!-- Label for "Pause" key of phone number keyboard. Must be short to fit on key! [CHAR LIMIT=5] --> + <string name="label_pause_key">Pause</string> + <!-- Label for "Wait" key of phone number keyboard. Must be short to fit on key! [CHAR LIMIT=5]--> + <string name="label_wait_key">Wait</string> + + <!-- Spoken description for the currently entered text --> + <string name="spoken_current_text_is">Current text is "%s"</string> + <!-- Spoken description when there is no text entered --> + <string name="spoken_no_text_entered">No text entered</string> + + <!-- Spoken description for unknown keyboard keys. --> + <string name="spoken_description_unknown">Key code %d</string> + <!-- Spoken description for the "Shift" keyboard key. --> + <string name="spoken_description_shift">Shift</string> + <!-- Spoken description for the "Shift" keyboard key's pressed state. --> + <string name="spoken_description_shift_shifted">Shift enabled</string> + <!-- Spoken description for the "Shift" keyboard key's pressed state. --> + <string name="spoken_description_caps_lock">Caps lock enabled</string> + <!-- Spoken description for the "Delete" keyboard key. --> + <string name="spoken_description_delete">Delete</string> + <!-- Spoken description for the "To Symbol" keyboard key. --> + <string name="spoken_description_to_symbol">Symbols</string> + <!-- Spoken description for the "To Alpha" keyboard key. --> + <string name="spoken_description_to_alpha">Letters</string> + <!-- Spoken description for the "To Numbers" keyboard key. --> + <string name="spoken_description_to_numeric">Numbers</string> + <!-- Spoken description for the "Settings" keyboard key. --> + <string name="spoken_description_settings">Settings</string> + <!-- Spoken description for the "Tab" keyboard key. --> + <string name="spoken_description_tab">Tab</string> + <!-- Spoken description for the "Space" keyboard key. --> + <string name="spoken_description_space">Space</string> + <!-- Spoken description for the "Mic" keyboard key. --> + <string name="spoken_description_mic">Voice input</string> + <!-- Spoken description for the "Smiley" keyboard key. --> + <string name="spoken_description_smiley">Smiley face</string> + <!-- Spoken description for the "Return" keyboard key. --> + <string name="spoken_description_return">Return</string> + + <!-- Spoken description for the "," keyboard key. --> + <string name="spoken_description_comma">Comma</string> + <!-- Spoken description for the "." keyboard key. --> + <string name="spoken_description_period">Period</string> + <!-- Spoken description for the "(" keyboard key. --> + <string name="spoken_description_left_parenthesis">Left parenthesis</string> + <!-- Spoken description for the ")" keyboard key. --> + <string name="spoken_description_right_parenthesis">Right parenthesis</string> + <!-- Spoken description for the ":" keyboard key. --> + <string name="spoken_description_colon">Colon</string> + <!-- Spoken description for the ";" keyboard key. --> + <string name="spoken_description_semicolon">Semicolon</string> + <!-- Spoken description for the "!" keyboard key. --> + <string name="spoken_description_exclamation_mark">Exclamation mark</string> + <!-- Spoken description for the "?" keyboard key. --> + <string name="spoken_description_question_mark">Question mark</string> + <!-- Spoken description for the """ keyboard key. --> + <string name="spoken_description_double_quote">Double quote</string> + <!-- Spoken description for the "'" keyboard key. --> + <string name="spoken_description_single_quote">Single quote</string> + <!-- Spoken description for the "•" keyboard key. --> + <string name="spoken_description_dot">Dot</string> + <!-- Spoken description for the "√" keyboard key. --> + <string name="spoken_description_square_root">Square root</string> + <!-- Spoken description for the "π" keyboard key. --> + <string name="spoken_description_pi">Pi</string> + <!-- Spoken description for the "Δ" keyboard key. --> + <string name="spoken_description_delta">Delta</string> + <!-- Spoken description for the "™" keyboard key. --> + <string name="spoken_description_trademark">Trademark</string> + <!-- Spoken description for the "℅" keyboard key. --> + <string name="spoken_description_care_of">Care of</string> + <!-- Spoken description for the "*" keyboard key. --> + <string name="spoken_description_star">Star</string> + <!-- Spoken description for the "#" keyboard key. --> + <string name="spoken_description_pound">Pound</string> + <!-- Spoken description for the "…" keyboard key. --> + <string name="spoken_description_ellipsis">Ellipsis</string> + <!-- Spoken description for the "„" keyboard key. --> + <string name="spoken_description_low_double_quote">Low double quote</string> <!-- Voice related labels --> <!-- Title of the warning dialog that shows when a user initiates voice input for the first time. --> <string name="voice_warning_title">Voice input</string> - + <!-- Message that gets put at the top of the warning dialog if the user is attempting to use voice input in a currently unsupported locale. Voice input will work for such a user, but it will only recognize them in English. --> <string name="voice_warning_locale_not_supported">Voice input is not currently supported for your language, but does work in English.</string> - + <!-- Message of the warning dialog that shows when a user initiates voice input for - the first time, or turns it on in settings. --> - <string name="voice_warning_may_not_understand">Voice input is an experimental feature using Google\'s networked speech recognition.</string> - + the first time, or turns it on in settings. [CHAR LIMIT=200] --> + <string name="voice_warning_may_not_understand">Voice input uses Google\'s speech recognition. <a href="http://m.google.com/privacy">The Mobile Privacy Policy</a> applies.</string> + <!-- An additional part of the warning dialog for voice input that only shows when the user - actually initiates voice input, rather than just turning it on in settings. --> - <string name="voice_warning_how_to_turn_off">To turn off voice input, go to keyboard settings.</string> - - <!-- Message to show when user clicks the swiping hint (which says - "Swipe across keyboard to speak"). Also shown when enabling settings. --> - <string name="voice_hint_dialog_message">To use voice input, press the microphone button or slide your finger across the on-screen keyboard.</string> - + actually initiates voice input, rather than just turning it on in settings. [CHAR LIMIT=200] --> + <string name="voice_warning_how_to_turn_off">To turn off voice input, go to input method settings.</string> + + <!-- Message to show when user enables the voice input settings (which says + "Press the microphone button"). [CHAR LIMIT=100] --> + <string name="voice_hint_dialog_message">To use voice input, press the microphone button.</string> + <!-- Short message to tell the user the system is ready for them to speak. --> <string name="voice_listening">Speak now</string> @@ -230,7 +248,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 +265,7 @@ <!-- Short message shown when the server couldn't parse any speech. --> <string name="voice_no_match">No matches found</string> - <!-- Short message shown when the user initiates voice and voice - search is not installed. --> + <!-- Short message shown when the user initiates voice and voice search is not installed. --> <string name="voice_not_installed">Voice search not installed</string> <!-- Short hint shown in candidate view to explain voice input. --> @@ -266,74 +283,32 @@ <!-- Preferences item for enabling speech input --> <string name="voice_input">Voice input</string> - <!-- Array of Voice Input modes --> - <string-array name="voice_input_modes"> - <item>On main keyboard</item> - <item>On symbols keyboard</item> - <item>Off</item> - </string-array> - - <!-- Don't translate --> - <string name="voice_mode_main" translatable="false">0</string> - <!-- Don't translate --> - <string name="voice_mode_symbols" translatable="false">1</string> - <!-- Don't translate --> - <string name="voice_mode_off" translatable="false">2</string> - - <string-array name="voice_input_modes_values" translatable="false"> - <item>@string/voice_mode_main</item> - <item>@string/voice_mode_symbols</item> - <item>@string/voice_mode_off</item> - </string-array> - - <!-- Array of Voice Input modes summary --> - <string-array name="voice_input_modes_summary"> - <item>Mic on main keyboard</item> - <item>Mic on symbols keyboard</item> - <item>Voice input is disabled</item> - </string-array> - - <!-- Press the "enter" key after the user speaks. Option on settings.--> - <string name="auto_submit">Auto submit after voice</string> - - <!-- Press the "enter" key after the user speaks. Summary of option in settings.--> - <string name="auto_submit_summary">Automatically press enter when searching or going to the next field.</string> - - <!-- IME Tutorial screen (ROMAN) --><skip /> - <!-- appears above image showing the user to click on a TextView to show the IME --> - <string name="open_the_keyboard"><font size="17"><b>Open the keyboard\n</b></font><font size="3">\n</font>Touch any text field.</string> - - <!-- appears above the image showing the back button used to close the keyboard --> - <string name="close_the_keyboard"><font size="17"><b>Close the keyboard\n</b></font><font size="3">\n</font>Press the Back key.</string> - - <!-- appears above image showing how to use touch and hold --> - <string name="touch_and_hold"><font size="17"><b>Touch \u0026 hold a key for options\n</b></font><font size="3">\n</font>Access punctuation and accents.</string> - - <!-- appears above image showing how to access keyboard settings --> - <string name="keyboard_settings"><font size="17"><b>Keyboard settings\n</b></font><font size="3">\n</font>Touch \u0026 hold the <b>\?123\</b> key.</string> - - <!-- popular web domains for the locale - most popular, displayed on the keyboard --> - <string name="popular_domain_0">".com"</string> - <!-- popular web domains for the locale - item 1, displayed in the popup --> - <string name="popular_domain_1">".net"</string> - <!-- popular web domains for the locale - item 2, displayed in the popup --> - <string name="popular_domain_2">".org"</string> - <!-- popular web domains for the locale - item 3, displayed in the popup --> - <string name="popular_domain_3">".gov"</string> - <!-- popular web domains for the locale - item 4, displayed in the popup --> - <string name="popular_domain_4">".edu"</string> - - <!-- Menu item for launching Input method picker --> + <!-- Voice Input modes --> + <!-- On settings screen, voice input pop-up menu option to show voice key on main keyboard [CHAR LIMIT=20] --> + <string name="voice_input_modes_main_keyboard">On main keyboard</string> + <!-- On settings screen, voice input pop-up menu option to show voice key on symbols keyboard [CHAR LIMIT=20] --> + <string name="voice_input_modes_symbols_keyboard">On symbols keyboard</string> + <!-- On settings screen, voice input pop-up menu option to never show voice key [CHAR LIMIT=20] --> + <string name="voice_input_modes_off">Off</string> + <!-- Voice Input modes summary --> + <!-- On settings screen, voice input pop-up menu summary text to show voice key on main keyboard [CHAR LIMIT=20] --> + <string name="voice_input_modes_summary_main_keyboard">Mic on main keyboard</string> + <!-- On settings screen, voice input pop-up menu summary text to show voice key on symbols keyboard [CHAR LIMIT=20] --> + <string name="voice_input_modes_summary_symbols_keyboard">Mic on symbols keyboard</string> + <!-- On settings screen, voice input pop-up menu summary text to never show voice key [CHAR LIMIT=20] --> + <string name="voice_input_modes_summary_off">Voice input is disabled</string> + + <!-- Title of the dialog for selecting input methods. [CHAR LIMIT=20] --> <string name="selectInputMethod">Select input method</string> <!-- Title for input language selection screen --> <string name="language_selection_title">Input languages</string> <!-- Title summary for input language selection screen --> <string name="language_selection_summary">Slide finger on spacebar to change language</string> - + <!-- Add to dictionary hint --> <string name="hint_add_to_dictionary">\u2190 Touch again to save</string> - + <!-- Inform the user that a particular language has an available dictionary --> <string name="has_dictionary">Dictionary available</string> @@ -341,39 +316,98 @@ <string name="prefs_enable_log">Enable user feedback</string> <!-- Description for enabling to send user statistics to Google --> <string name="prefs_description_log">Help improve this input method editor by automatically sending usage statistics and crash reports to Google.</string> - <!-- Preferences item for enabling to correct suggestions by touching words you have typed --> + <!-- Preferences item for enabling to correct suggestions by touching words you have typed [CHAR LIMIT= 35] --> <string name="prefs_enable_recorrection">Touch to correct words</string> - <!-- The summary for the preferences item for enabling to correct suggestions by touching words you have typed --> - <string name="prefs_enable_recorrection_summary">Touch entered words to correct them</string> + <!-- The summary for the preferences item for enabling to correct suggestions by touching words you have typed [CHAR LIMIT= 100] --> + <string name="prefs_enable_recorrection_summary">Touch entered words to correct them, only when suggestions are visible</string> - <!-- Description for keyboard theme switcher --> + <!-- Title of the item to change the keyboard theme [CHAR LIMIT=20]--> <string name="keyboard_layout">Keyboard Theme</string> - <string name="layout_basic" translatable="false">Basic</string> - <string name="layout_high_contrast" translatable="false">Basic (High Contrast)</string> - <string name="layout_stone_bold" translatable="false">Stone (bold)</string> - <string name="layout_stone_normal" translatable="false">Stone (normal)</string> - <string name="layout_gingerbread" translatable="false">Gingerbread</string> - - <string-array name="keyboard_layout_modes" translatable="false"> - <item>@string/layout_basic</item> - <item>@string/layout_high_contrast</item> - <item>@string/layout_stone_normal</item> - <item>@string/layout_stone_bold</item> - <item>@string/layout_gingerbread</item> - </string-array> - - <string-array name="keyboard_layout_modes_values" translatable="false"> - <item>0</item> - <item>1</item> - <item>2</item> - <item>3</item> - <item>4</item> - </string-array> - - <string name="subtype_mode_keyboard">keyboard</string> - <string name="subtype_mode_voice">voice</string> - - <!-- Title for Latin keyboard debug settings activity / dialog --> - <string name="english_ime_debug_settings" translatable="false">Android keyboard Debug settings</string> - <string name="prefs_debug_mode" translatable="false">Debug Mode</string> + + <!-- Description for Czech keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_cs_keyboard">Czech Keyboard</string> + <!-- Description for Arabic keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_ar_keyboard">Arabic Keyboard</string> + <!-- Description for Danish keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_da_keyboard">Danish Keyboard</string> + <!-- Description for German keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_de_keyboard">German Keyboard</string> + <!-- Description for German QWERTY keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_de_qwerty_keyboard">German QWERTY Keyboard</string> + <!-- Description for English (United Kingdom) keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_en_GB_keyboard">English (UK) Keyboard</string> + <!-- Description for English (United States) keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_en_US_keyboard">English (US) Keyboard</string> + <!-- Description for Spanish keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_es_keyboard">Spanish Keyboard</string> + <!-- Description for Finnish keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_fi_keyboard">Finnish Keyboard</string> + <!-- Description for French keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_fr_keyboard">French Keyboard</string> + <!-- Description for French (Canada) keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_fr_CA_keyboard">French (Canada) Keyboard</string> + <!-- Description for French (Switzerland) keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_fr_CH_keyboard">French (Switzerland) Keyboard</string> + <!-- Description for Croatian keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_hr_keyboard">Croatian Keyboard</string> + <!-- Description for Hungarian keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_hu_keyboard">Hungarian Keyboard</string> + <!-- Description for Hebrew keyboard subtype [CHAR LIMIT=35] --> + <!-- Java uses the deprecated "iw" code instead of the standard "he" code --> + <string name="subtype_mode_iw_keyboard">Hebrew Keyboard</string> + <!-- Description for Italian keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_it_keyboard">Italian Keyboard</string> + <!-- Description for Norwegian keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_nb_keyboard">Norwegian Keyboard</string> + <!-- Description for Dutch keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_nl_keyboard">Dutch Keyboard</string> + <!-- Description for Polish keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_pl_keyboard">Polish Keyboard</string> + <!-- Description for Portuguese keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_pt_keyboard">Portuguese Keyboard</string> + <!-- Description for Russian keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_ru_keyboard">Russian Keyboard</string> + <!-- Description for Serbian keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_sr_keyboard">Serbian Keyboard</string> + <!-- Description for Swedish keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_sv_keyboard">Swedish Keyboard</string> + <!-- Description for Turkish keyboard subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_tr_keyboard">Turkish Keyboard</string> + <!-- Description for Afrikaans voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_af_voice">Afrikaans Voice</string> + <!-- Description for Czech voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_cs_voice">Czech Voice</string> + <!-- Description for German voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_de_voice">German Voice</string> + <!-- Description for English voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_en_voice">English Voice</string> + <!-- Description for Spanish voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_es_voice">Spanish Voice</string> + <!-- Description for French voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_fr_voice">French Voice</string> + <!-- Description for Italian voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_it_voice">Italian Voice</string> + <!-- Description for Japanese voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_ja_voice">Japanese Voice</string> + <!-- Description for Korean voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_ko_voice">Korean Voice</string> + <!-- Description for Dutch voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_nl_voice">Dutch Voice</string> + <!-- Description for Polish voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_pl_voice">Polish Voice</string> + <!-- Description for Portuguese voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_pt_voice">Portuguese Voice</string> + <!-- Description for Russian voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_ru_voice">Russian Voice</string> + <!-- Description for Turkish voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_tr_voice">Turkish Voice</string> + <!-- Description for Chinese, Yue voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_yue_voice">Chinese, Yue Voice</string> + <!-- Description for Chinese, Mandarin voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_zh_voice">Chinese, Mandarin Voice</string> + <!-- Description for isiZulu voice input subtype [CHAR LIMIT=35] --> + <string name="subtype_mode_zu_voice">isiZulu Voice</string> + + <!-- Title of an option for usability study mode --> + <string name="prefs_usability_study_mode">Usability Study Mode</string> </resources> diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index 0372b07cf..05defcb52 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -15,29 +15,171 @@ --> <resources> - <style name="LatinKeyboardBaseView"> + <!-- Theme "Basic" --> + <style name="Keyboard"> + <item name="rowHeight">25%p</item> + <item name="keyboardHeight">@dimen/keyboardHeight</item> + <item name="maxKeyboardHeight">@fraction/maxKeyboardHeight</item> + <item name="minKeyboardHeight">@fraction/minKeyboardHeight</item> + <item name="popupKeyboardTemplate">@xml/kbd_popup_template</item> + <item name="keyboardTopPadding">@dimen/keyboard_top_padding</item> + <item name="keyboardBottomPadding">@dimen/keyboard_bottom_padding</item> + <item name="horizontalGap">@dimen/key_horizontal_gap</item> + <item name="verticalGap">@dimen/key_bottom_gap</item> + <item name="maxPopupKeyboardColumn">@integer/config_max_popup_keyboard_column</item> + </style> + <style name="LatinKeyboard"> + <item name="autoCorrectionSpacebarLedEnabled">@bool/config_auto_correction_spacebar_led_enabled</item> + <item name="spacebarTextColor">#FFC0C0C0</item> + <item name="spacebarTextShadowColor">#80000000</item> + </style> + <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="keyLetterRatio">@fraction/key_letter_ratio</item> + <item name="keyLabelRatio">@fraction/key_label_ratio</item> + <item name="keyHintLetterRatio">@fraction/key_hint_letter_ratio</item> + <item name="keyUppercaseLetterRatio">@fraction/key_uppercase_letter_ratio</item> + <item name="keyTextStyle">normal</item> <item name="keyTextColor">#FFFFFFFF</item> + <item name="keyTextInactivatedColor">#FFFFFFFF</item> + <item name="keyHintLetterColor">#80000000</item> + <item name="keyUppercaseLetterInactivatedColor">#66E0E4E5</item> + <item name="keyUppercaseLetterActivatedColor">#CCE0E4E5</item> + <item name="keyPopupHintIcon">@drawable/hint_popup</item> <item name="keyPreviewLayout">@layout/key_preview</item> <item name="keyPreviewOffset">@dimen/key_preview_offset</item> <item name="keyPreviewHeight">@dimen/key_preview_height</item> - <item name="labelTextSize">@dimen/key_label_text_size</item> <item name="popupLayout">@layout/keyboard_popup</item> <item name="keyHysteresisDistance">@dimen/key_hysteresis_distance</item> <item name="verticalCorrection">@dimen/keyboard_vertical_correction</item> <item name="shadowColor">#BB000000</item> <item name="shadowRadius">2.75</item> <item name="backgroundDimAmount">0.5</item> - <item name="symbolColorScheme">white</item> </style> - <style name="KeyPreviewAnimation"> - <item name="android:windowEnterAnimation">@anim/key_preview_fadein</item> - <item name="android:windowExitAnimation">@anim/key_preview_fadeout</item> + <style name="KeyPreviewStyle"> + <item name="android:background">@drawable/keyboard_key_feedback</item> + <item name="android:textColor">#FFFFFFFF</item> + </style> + <style name="PopupMiniKeyboardView" parent="KeyboardView"> + <item name="keyBackground">@drawable/btn_keyboard_key_popup</item> + <item name="keyHysteresisDistance">0dip</item> + <item name="verticalCorrection">@dimen/mini_keyboard_vertical_correction</item> + </style> + <style name="PopupMiniKeyboardPanelStyle"> + <item name="android:background">@drawable/keyboard_popup_panel_background</item> + <item name="android:paddingLeft">@dimen/mini_keyboard_horizontal_padding</item> + <item name="android:paddingRight">@dimen/mini_keyboard_horizontal_padding</item> + </style> + <style name="SuggestionsStripBackgroundStyle"> + <item name="android:background">@drawable/keyboard_suggest_strip</item> + </style> + <style name="SuggestionBackgroundStyle"> + <item name="android:background">@drawable/btn_candidate</item> + </style> + <style name="SuggestionPreviewBackgroundStyle"> + <item name="android:background">@drawable/candidate_feedback_background</item> + </style> + <style name="CandidateViewStyle" parent="SuggestionsStripBackgroundStyle"> + <item name="autoCorrectHighlight">autoCorrectBold</item> + <item name="colorTypedWord">#FFFFFFFF</item> + <item name="colorAutoCorrect">#FFFCAE00</item> + <item name="colorSuggested">#FFFCAE00</item> + <item name="iconExpandPane">@drawable/btn_expand_candidates_pane</item> + <item name="iconClosePane">@drawable/btn_close_candidates_pane</item>" + </style> + <!-- Theme "Basic high contrast" --> + <style name="KeyboardView.HighContrast" parent="KeyboardView"> + <item name="android:background">@android:color/black</item> + <item name="keyBackground">@drawable/btn_keyboard_key3</item> + </style> + <!-- Theme "Stone" --> + <style name="Keyboard.Stone" parent="Keyboard"> + <item name="horizontalGap">@dimen/key_horizontal_gap_stone</item> + <item name="verticalGap">@dimen/key_bottom_gap_stone</item> + </style> + <style name="LatinKeyboard.Stone" parent="LatinKeyboard"> + <item name="spacebarTextColor">#FF444444</item> + <item name="spacebarTextShadowColor">#80FFFFFF</item> + </style> + <style name="KeyboardView.Stone" parent="KeyboardView"> + <item name="keyBackground">@drawable/btn_keyboard_key_stone</item> + <item name="keyTextColor">#FF000000</item> + <item name="keyTextInactivatedColor">#FF808080</item> + <item name="shadowColor">#FFFFFFFF</item> + </style> + <style name="PopupMiniKeyboardView.Stone" parent="PopupMiniKeyboardView"> + <item name="keyBackground">@drawable/btn_keyboard_key_stone</item> + <item name="keyTextColor">#FF000000</item> + <item name="shadowColor">#FFFFFFFF</item> + </style> + <!-- Theme "Stone bold" --> + <style name="KeyboardView.Stone.Bold" parent="KeyboardView.Stone"> + <item name="keyTextStyle">bold</item> + </style> + <!-- Theme "Gingerbread" --> + <style name="KeyboardView.Gingerbread" parent="KeyboardView"> + <item name="android:background">@drawable/keyboard_dark_background</item> + <item name="keyBackground">@drawable/btn_keyboard_key_gingerbread</item> + <item name="keyTextStyle">bold</item> + </style> + <style name="PopupMiniKeyboardView.Gingerbread" parent="PopupMiniKeyboardView"> + <item name="android:background">@null</item> + </style> + <!-- Theme "IceCreamSandwich" --> + <style name="Keyboard.IceCreamSandwich" parent="Keyboard" > + <item name="keyboardTopPadding">@dimen/keyboard_top_padding_ics</item> + <item name="keyboardBottomPadding">@dimen/keyboard_bottom_padding_ics</item> + <item name="horizontalGap">@dimen/key_horizontal_gap_ics</item> + <item name="verticalGap">@dimen/key_bottom_gap_ics</item> + </style> + <style name="LatinKeyboard.IceCreamSandwich" parent="LatinKeyboard"> + <item name="disabledShortcutIcon">@drawable/sym_keyboard_voice_off_holo</item> + </style> + <style name="KeyboardView.IceCreamSandwich" parent="KeyboardView"> + <item name="android:background">@drawable/keyboard_background_holo</item> + <item name="keyBackground">@drawable/btn_keyboard_key_ics</item> + <item name="keyTextStyle">bold</item> + <item name="keyTextInactivatedColor">#66E0E4E5</item> + <item name="keyHintLetterColor">#80000000</item> + <item name="keyUppercaseLetterInactivatedColor">#66E0E4E5</item> + <item name="keyUppercaseLetterActivatedColor">#FFFFFFFF</item> + <item name="keyPopupHintIcon">@drawable/hint_popup</item> + <item name="keyPreviewHeight">@dimen/key_preview_height</item> + <item name="keyPreviewOffset">@dimen/key_preview_offset_ics</item> + <item name="shadowColor">#00000000</item> + <item name="shadowRadius">0.0</item> + </style> + <style name="KeyPreviewStyle.IceCreamSandwich"> + <item name="android:background">@drawable/keyboard_key_feedback_ics</item> + </style> + <style name="PopupMiniKeyboardView.IceCreamSandwich" parent="PopupMiniKeyboardView"> + <item name="android:background">@null</item> + <item name="keyBackground">@drawable/btn_keyboard_key_popup_ics</item> + </style> + <style name="PopupMiniKeyboardPanelStyle.IceCreamSandwich"> + <item name="android:background">@drawable/keyboard_popup_panel_background_holo</item> + <item name="android:paddingLeft">@dimen/mini_keyboard_horizontal_padding_holo</item> + <item name="android:paddingRight">@dimen/mini_keyboard_horizontal_padding_holo</item> + </style> + <style name="SuggestionsStripBackgroundStyle.IceCreamSandwich"> + <item name="android:background">@drawable/keyboard_suggest_strip_holo</item> + </style> + <style name="SuggestionBackgroundStyle.IceCreamSandwich"> + <item name="android:background">@drawable/btn_candidate_ics</item> + </style> + <style name="SuggestionPreviewBackgroundStyle.IceCreamSandwich"> + <item name="android:background">@drawable/keyboard_popup_panel_background_holo</item> + </style> + <style name="CandidateViewStyle.IceCreamSandwich" parent="SuggestionsStripBackgroundStyle.IceCreamSandwich"> + <item name="autoCorrectHighlight">autoCorrectUnderline|autoCorrectInvert</item> + <item name="colorTypedWord">#FFFFFFFF</item> + <item name="colorAutoCorrect">#FFFFFFFF</item> + <item name="colorSuggested">#FFFFFFFF</item> + <item name="iconExpandPane">@drawable/btn_expand_candidates_pane</item> + <item name="iconClosePane">@drawable/btn_close_candidates_pane</item>" </style> - <style name="MiniKeyboardAnimation"> + <style name="PopupMiniKeyboardAnimation"> <item name="android:windowEnterAnimation">@anim/mini_keyboard_fadein</item> <item name="android:windowExitAnimation">@anim/mini_keyboard_fadeout</item> </style> diff --git a/java/res/values/themes-basic-highcontrast.xml b/java/res/values/themes-basic-highcontrast.xml new file mode 100644 index 000000000..8122e4eb0 --- /dev/null +++ b/java/res/values/themes-basic-highcontrast.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <style name="KeyboardTheme.HighContrast" parent="KeyboardIcons"> + <item name="keyboardStyle">@style/Keyboard</item> + <item name="latinKeyboardStyle">@style/LatinKeyboard</item> + <item name="keyboardViewStyle">@style/KeyboardView.HighContrast</item> + <item name="keyPreviewStyle">@style/KeyPreviewStyle</item> + <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView</item> + <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item> + <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item> + <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item> + <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item> + <item name="candidateViewStyle">@style/CandidateViewStyle</item> + </style> +</resources> diff --git a/java/res/values/themes-basic.xml b/java/res/values/themes-basic.xml new file mode 100644 index 000000000..50b52de32 --- /dev/null +++ b/java/res/values/themes-basic.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <style name="KeyboardTheme" parent="KeyboardIcons"> + <item name="keyboardStyle">@style/Keyboard</item> + <item name="latinKeyboardStyle">@style/LatinKeyboard</item> + <item name="keyboardViewStyle">@style/KeyboardView</item> + <item name="keyPreviewStyle">@style/KeyPreviewStyle</item> + <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView</item> + <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item> + <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item> + <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item> + <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item> + <item name="candidateViewStyle">@style/CandidateViewStyle</item> + </style> +</resources> diff --git a/java/res/values/themes-gingerbread.xml b/java/res/values/themes-gingerbread.xml new file mode 100644 index 000000000..cdb10c81a --- /dev/null +++ b/java/res/values/themes-gingerbread.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <style name="KeyboardTheme.Gingerbread" parent="KeyboardIcons"> + <item name="keyboardStyle">@style/Keyboard</item> + <item name="latinKeyboardStyle">@style/LatinKeyboard</item> + <item name="keyboardViewStyle">@style/KeyboardView.Gingerbread</item> + <item name="keyPreviewStyle">@style/KeyPreviewStyle</item> + <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Gingerbread</item> + <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item> + <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item> + <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item> + <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item> + <item name="candidateViewStyle">@style/CandidateViewStyle</item> + </style> +</resources> diff --git a/java/res/values/themes-ics.xml b/java/res/values/themes-ics.xml new file mode 100644 index 000000000..33c40816b --- /dev/null +++ b/java/res/values/themes-ics.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <style name="KeyboardTheme.IceCreamSandwich" parent="KeyboardIcons.IceCreamSandwich"> + <item name="keyboardStyle">@style/Keyboard.IceCreamSandwich</item> + <item name="latinKeyboardStyle">@style/LatinKeyboard.IceCreamSandwich</item> + <item name="keyboardViewStyle">@style/KeyboardView.IceCreamSandwich</item> + <item name="keyPreviewStyle">@style/KeyPreviewStyle.IceCreamSandwich</item> + <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.IceCreamSandwich</item> + <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle.IceCreamSandwich</item> + <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle.IceCreamSandwich</item> + <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle.IceCreamSandwich</item> + <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle.IceCreamSandwich</item> + <item name="candidateViewStyle">@style/CandidateViewStyle.IceCreamSandwich</item> + </style> +</resources> diff --git a/java/res/values/themes-stone-bold.xml b/java/res/values/themes-stone-bold.xml new file mode 100644 index 000000000..6589807ec --- /dev/null +++ b/java/res/values/themes-stone-bold.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <style name="KeyboardTheme.Stone.Bold" parent="KeyboardIcons.Black"> + <item name="keyboardStyle">@style/Keyboard.Stone</item> + <item name="latinKeyboardStyle">@style/LatinKeyboard.Stone</item> + <item name="keyboardViewStyle">@style/KeyboardView.Stone.Bold</item> + <item name="keyPreviewStyle">@style/KeyPreviewStyle</item> + <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Stone</item> + <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item> + <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item> + <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item> + <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item> + <item name="candidateViewStyle">@style/CandidateViewStyle</item> + </style> +</resources> diff --git a/java/res/values/themes-stone.xml b/java/res/values/themes-stone.xml new file mode 100644 index 000000000..a8608f6b3 --- /dev/null +++ b/java/res/values/themes-stone.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <style name="KeyboardTheme.Stone" parent="KeyboardIcons.Black"> + <item name="keyboardStyle">@style/Keyboard.Stone</item> + <item name="latinKeyboardStyle">@style/LatinKeyboard.Stone</item> + <item name="keyboardViewStyle">@style/KeyboardView.Stone</item> + <item name="keyPreviewStyle">@style/KeyPreviewStyle</item> + <item name="popupMiniKeyboardViewStyle">@style/PopupMiniKeyboardView.Stone</item> + <item name="popupMiniKeyboardPanelStyle">@style/PopupMiniKeyboardPanelStyle</item> + <item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item> + <item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item> + <item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item> + <item name="candidateViewStyle">@style/CandidateViewStyle</item> + </style> +</resources> diff --git a/java/res/values/whitelist.xml b/java/res/values/whitelist.xml new file mode 100644 index 000000000..d4ecbfaa4 --- /dev/null +++ b/java/res/values/whitelist.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- + An entry of the whitelist word should be: + 1. (int)frequency + 2. (String)before + 3. (String)after + --> + <string-array name="wordlist_whitelist"> + </string-array> +</resources> diff --git a/java/res/xml-ar/kbd_qwerty.xml b/java/res/xml-ar/kbd_qwerty.xml new file mode 100644 index 000000000..57a6d2caf --- /dev/null +++ b/java/res/xml-ar/kbd_qwerty.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="ar" +> + <include + latin:keyboardLayout="@xml/kbd_rows_arabic" /> +</Keyboard> diff --git a/java/res/xml-cs/kbd_qwerty.xml b/java/res/xml-cs/kbd_qwerty.xml new file mode 100644 index 000000000..9991ea2d2 --- /dev/null +++ b/java/res/xml-cs/kbd_qwerty.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="cs" +> + <include + latin:keyboardLayout="@xml/kbd_rows_qwertz" /> +</Keyboard> diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml index b7b1b1769..37a50fdfd 100644 --- a/java/res/xml-da/kbd_qwerty.xml +++ b/java/res/xml-da/kbd_qwerty.xml @@ -18,519 +18,10 @@ */ --> -<!-- - Danish Keyboard Layout - - Just a copy of the Norwegian layout, with æ/ø switched. ---> - <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="da" > - <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_rows_scandinavian" /> </Keyboard> diff --git a/java/res/xml-da/kbd_qwerty_black.xml b/java/res/xml-da/kbd_qwerty_black.xml deleted file mode 100644 index 3fb4acd1b..000000000 --- a/java/res/xml-da/kbd_qwerty_black.xml +++ /dev/null @@ -1,478 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<!-- - Danish Keyboard Layout - - Just a copy of the Norwegian layout, with æ/ø switched. ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" /> - <Key - android:keyLabel="å" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" /> - <Key - android:keyLabel="æ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_ae" /> - <Key - android:keyLabel="ø" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_oe" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="10%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml-de-rZZ/kbd_qwerty.xml b/java/res/xml-de-rZZ/kbd_qwerty.xml new file mode 100644 index 000000000..d5fd8ef7a --- /dev/null +++ b/java/res/xml-de-rZZ/kbd_qwerty.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="de" +> + <include + latin:keyboardLayout="@xml/kbd_rows_qwerty" /> +</Keyboard> diff --git a/java/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml index 6f34b45f1..89e10b26d 100644 --- a/java/res/xml-de/kbd_qwerty.xml +++ b/java/res/xml-de/kbd_qwerty.xml @@ -19,497 +19,9 @@ --> <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:keyboardLocale="de" > - <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_rows_qwertz" /> </Keyboard> diff --git a/java/res/xml-de/kbd_qwerty_black.xml b/java/res/xml-de/kbd_qwerty_black.xml deleted file mode 100644 index 833537019..000000000 --- a/java/res/xml-de/kbd_qwerty_black.xml +++ /dev/null @@ -1,457 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="/" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="\@" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:keyLabel="/" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:keyLabel="\@" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml-es/kbd_qwerty.xml b/java/res/xml-es/kbd_qwerty.xml new file mode 100644 index 000000000..568f4d652 --- /dev/null +++ b/java/res/xml-es/kbd_qwerty.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="es,es_US" +> + <include + latin:keyboardLayout="@xml/kbd_rows_spanish" /> +</Keyboard> diff --git a/java/res/xml-fi/kbd_qwerty.xml b/java/res/xml-fi/kbd_qwerty.xml new file mode 100644 index 000000000..75721e057 --- /dev/null +++ b/java/res/xml-fi/kbd_qwerty.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="fi" +> + <include + latin:keyboardLayout="@xml/kbd_rows_scandinavian" /> +</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..7bdfbadf1 --- /dev/null +++ b/java/res/xml-fr-rCA/kbd_qwerty.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:keyboardLocale="fr_CA" +> + <include + latin:keyboardLayout="@xml/kbd_rows_qwerty" /> +</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..41b701d83 --- /dev/null +++ b/java/res/xml-fr-rCH/kbd_qwerty.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:keyboardLocale="fr_CH" +> + <include + latin:keyboardLayout="@xml/kbd_rows_qwertz" /> +</Keyboard> diff --git a/java/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml index 9a2c75d8c..8c730a24f 100644 --- a/java/res/xml-fr/kbd_qwerty.xml +++ b/java/res/xml-fr/kbd_qwerty.xml @@ -19,498 +19,9 @@ --> <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:keyboardLocale="fr" > - <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_rows_azerty" /> </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-hr/kbd_qwerty.xml b/java/res/xml-hr/kbd_qwerty.xml new file mode 100644 index 000000000..ca92e86a7 --- /dev/null +++ b/java/res/xml-hr/kbd_qwerty.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="hr" +> + <!-- TODO: Dedicated Croatian layout especially for tablet. --> + <include + latin:keyboardLayout="@xml/kbd_rows_qwertz" /> +</Keyboard> diff --git a/java/res/xml-hu/kbd_qwerty.xml b/java/res/xml-hu/kbd_qwerty.xml new file mode 100644 index 000000000..3195d5b1f --- /dev/null +++ b/java/res/xml-hu/kbd_qwerty.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="hu" +> + <include + latin:keyboardLayout="@xml/kbd_rows_qwertz" /> +</Keyboard> diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml index 5d8338ae8..dc2c5d35a 100644 --- a/java/res/xml-iw/kbd_qwerty.xml +++ b/java/res/xml-iw/kbd_qwerty.xml @@ -1,474 +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 +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this 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. */ --> <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:keyboardLocale="iw" > - <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_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" /> - </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: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_rows_hebrew" /> </Keyboard> diff --git a/java/res/xml-iw/kbd_qwerty_black.xml b/java/res/xml-iw/kbd_qwerty_black.xml deleted file mode 100644 index eee6dc158..000000000 --- a/java/res/xml-iw/kbd_qwerty_black.xml +++ /dev/null @@ -1,416 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="ק" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ר" /> - <Key - android:keyLabel="א" /> - <Key - android:keyLabel="ט" /> - <Key - android:keyLabel="ו" /> - <Key - android:keyLabel="ן" /> - <Key - android:keyLabel="ם" /> - <Key - android:keyLabel="פ" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="13.75%p" - android:horizontalGap="1.25%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="ש" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ד" /> - <Key - android:keyLabel="ג" /> - <Key - android:keyLabel="כ" /> - <Key - android:keyLabel="ע" /> - <Key - android:keyLabel="י" /> - <Key - android:keyLabel="ח" /> - <Key - android:keyLabel="ל" /> - <Key - android:keyLabel="ך" /> - <Key - android:keyLabel="ף" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="ז" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ס" /> - <Key - android:keyLabel="ב" /> - <Key - android:keyLabel="ה" /> - <Key - android:keyLabel="נ" /> - <Key - android:keyLabel="מ" /> - <Key - android:keyLabel="צ" /> - <Key - android:keyLabel="ת" /> - <Key - android:keyLabel="ץ" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml index 14071d770..1f4e86e89 100644 --- a/java/res/xml-nb/kbd_qwerty.xml +++ b/java/res/xml-nb/kbd_qwerty.xml @@ -18,519 +18,10 @@ */ --> -<!-- - Norwegian Keyboard Layout - - Just a copy of the Swedish layout, with ä/æ and ö/ø switched. ---> - <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="nb" > - <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_rows_scandinavian" /> </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-pl/kbd_qwerty.xml b/java/res/xml-pl/kbd_qwerty.xml new file mode 100644 index 000000000..44312c52c --- /dev/null +++ b/java/res/xml-pl/kbd_qwerty.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="pl" +> + <include + latin:keyboardLayout="@xml/kbd_rows_qwerty" /> +</Keyboard> diff --git a/java/res/xml-pt/kbd_qwerty.xml b/java/res/xml-pt/kbd_qwerty.xml new file mode 100644 index 000000000..f5dcbc61b --- /dev/null +++ b/java/res/xml-pt/kbd_qwerty.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="pt" +> + <include + latin:keyboardLayout="@xml/kbd_rows_qwerty" /> +</Keyboard> diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml index c0b98bafa..aee1b1bfc 100644 --- a/java/res/xml-ru/kbd_qwerty.xml +++ b/java/res/xml-ru/kbd_qwerty.xml @@ -19,496 +19,9 @@ --> <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:keyboardLocale="ru" > - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="й" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="1" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ц" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="2" /> - <Key - android:keyLabel="у" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="3" /> - <Key - android:keyLabel="к" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="4" /> - <Key - android:keyLabel="е" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_cyrillic_e" /> - <Key - android:keyLabel="н" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="6" /> - <Key - android:keyLabel="г" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="7" /> - <Key - android:keyLabel="ш" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="8" /> - <Key - android:keyLabel="щ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="9" /> - <Key - android:keyLabel="з" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="0" /> - <Key - android:keyLabel="х" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="ф" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ы" /> - <Key - android:keyLabel="в" /> - <Key - android:keyLabel="а" /> - <Key - android:keyLabel="п" /> - <Key - android:keyLabel="р" /> - <Key - android:keyLabel="о" /> - <Key - android:keyLabel="л" /> - <Key - android:keyLabel="д" /> - <Key - android:keyLabel="ж" /> - <Key - android:keyLabel="э" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="8.5%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_keyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="я" /> - <Key - android:keyLabel="ч" /> - <Key - android:keyLabel="с" /> - <Key - android:keyLabel="м" /> - <Key - android:keyLabel="и" /> - <Key - android:keyLabel="т" /> - <Key - android:keyLabel="ь" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_cyrillic_soft_sign" /> - <Key - android:keyLabel="б" /> - <Key - android:keyLabel="ю" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> + <include + latin:keyboardLayout="@xml/kbd_rows_russian" /> </Keyboard> diff --git a/java/res/xml-ru/kbd_qwerty_black.xml b/java/res/xml-ru/kbd_qwerty_black.xml deleted file mode 100644 index 94a450cfa..000000000 --- a/java/res/xml-ru/kbd_qwerty_black.xml +++ /dev/null @@ -1,456 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="й" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="1" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ц" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="2" /> - <Key - android:keyLabel="у" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="3" /> - <Key - android:keyLabel="к" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="4" /> - <Key - android:keyLabel="е" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_cyrillic_e" /> - <Key - android:keyLabel="н" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="6" /> - <Key - android:keyLabel="г" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="7" /> - <Key - android:keyLabel="ш" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="8" /> - <Key - android:keyLabel="щ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="9" /> - <Key - android:keyLabel="з" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="0" /> - <Key - android:keyLabel="х" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="ф" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ы" /> - <Key - android:keyLabel="в" /> - <Key - android:keyLabel="а" /> - <Key - android:keyLabel="п" /> - <Key - android:keyLabel="р" /> - <Key - android:keyLabel="о" /> - <Key - android:keyLabel="л" /> - <Key - android:keyLabel="д" /> - <Key - android:keyLabel="ж" /> - <Key - android:keyLabel="э" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="8.5%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="я" /> - <Key - android:keyLabel="ч" /> - <Key - android:keyLabel="с" /> - <Key - android:keyLabel="м" /> - <Key - android:keyLabel="и" /> - <Key - android:keyLabel="т" /> - <Key - android:keyLabel="ь" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_cyrillic_soft_sign" /> - <Key - android:keyLabel="б" /> - <Key - android:keyLabel="ю" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="11.75%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml index 464c74f40..58fc187c2 100644 --- a/java/res/xml-sr/kbd_qwerty.xml +++ b/java/res/xml-sr/kbd_qwerty.xml @@ -18,490 +18,10 @@ */ --> -<!-- 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:keyboardLocale="sr" > - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="љ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="1" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="њ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="2" /> - <Key - android:keyLabel="е" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="3" /> - <Key - android:keyLabel="р" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="4" /> - <Key - android:keyLabel="т" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="5" /> - <Key - android:keyLabel="з" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="6" /> - <Key - android:keyLabel="у" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="7" /> - <Key - android:keyLabel="и" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="8" /> - <Key - android:keyLabel="о" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="9" /> - <Key - android:keyLabel="п" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="0" /> - <Key - android:keyLabel="ш" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="а" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="с" /> - <Key - android:keyLabel="д" /> - <Key - android:keyLabel="ф" /> - <Key - android:keyLabel="г" /> - <Key - android:keyLabel="х" /> - <Key - android:keyLabel="ј" /> - <Key - android:keyLabel="к" /> - <Key - android:keyLabel="л" /> - <Key - android:keyLabel="ч" /> - <Key - android:keyLabel="ћ" /> - <Key - android:keyLabel="ђ" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="8.5%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_keyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ж" /> - <Key - android:keyLabel="џ" /> - <Key - android:keyLabel="ц" /> - <Key - android:keyLabel="в" /> - <Key - android:keyLabel="б" /> - <Key - android:keyLabel="н" /> - <Key - android:keyLabel="м" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_keyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> + <include + latin:keyboardLayout="@xml/kbd_rows_serbian" /> </Keyboard> diff --git a/java/res/xml-sr/kbd_qwerty_black.xml b/java/res/xml-sr/kbd_qwerty_black.xml deleted file mode 100644 index 2ffa240f5..000000000 --- a/java/res/xml-sr/kbd_qwerty_black.xml +++ /dev/null @@ -1,449 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<!-- Serbian keyboard layout, based on the X11 layout for Serbian --> -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="љ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="1" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="њ" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="2" /> - <Key - android:keyLabel="е" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="3" /> - <Key - android:keyLabel="р" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="4" /> - <Key - android:keyLabel="т" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="5" /> - <Key - android:keyLabel="з" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="6" /> - <Key - android:keyLabel="у" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="7" /> - <Key - android:keyLabel="и" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="8" /> - <Key - android:keyLabel="о" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="9" /> - <Key - android:keyLabel="п" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="0" /> - <Key - android:keyLabel="ш" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="а" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="с" /> - <Key - android:keyLabel="д" /> - <Key - android:keyLabel="ф" /> - <Key - android:keyLabel="г" /> - <Key - android:keyLabel="х" /> - <Key - android:keyLabel="ј" /> - <Key - android:keyLabel="к" /> - <Key - android:keyLabel="л" /> - <Key - android:keyLabel="ч" /> - <Key - android:keyLabel="ћ" /> - <Key - android:keyLabel="ђ" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="8.5%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="11.75%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="ж" /> - <Key - android:keyLabel="џ" /> - <Key - android:keyLabel="ц" /> - <Key - android:keyLabel="в" /> - <Key - android:keyLabel="б" /> - <Key - android:keyLabel="н" /> - <Key - android:keyLabel="м" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="11.75%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml index 0fc80a341..e29d9abce 100644 --- a/java/res/xml-sv/kbd_qwerty.xml +++ b/java/res/xml-sv/kbd_qwerty.xml @@ -18,520 +18,10 @@ */ --> -<!-- - Swedish Keyboard Layout - - Key positioning: Svensk standard SS 66 22 41 - Foreign letters: Svenska skrivregler (2:a uppl.) §302 - Local additions: €ß ---> - <Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="sv" > - <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_rows_scandinavian" /> </Keyboard> diff --git a/java/res/xml-sv/kbd_qwerty_black.xml b/java/res/xml-sv/kbd_qwerty_black.xml deleted file mode 100644 index d03fb773a..000000000 --- a/java/res/xml-sv/kbd_qwerty_black.xml +++ /dev/null @@ -1,480 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<!-- - Swedish Keyboard Layout - - Key positioning: Svensk standard SS 66 22 41 - Foreign letters: Svenska skrivregler (2:a uppl.) §302 - Local additions: €ß ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.09%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" /> - <Key - android:keyLabel="å" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:keyWidth="8.75%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" /> - <Key - android:keyLabel="ö" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_o_umlaut" /> - <Key - android:keyLabel="ä" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a_umlaut" - android:keyWidth="8.75%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyWidth="10%p" - > - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:keyWidth="10%p" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml-sw600dp-land/kbd_popup_template.xml b/java/res/xml-sw600dp-land/kbd_popup_template.xml new file mode 100644 index 000000000..2c1d1902e --- /dev/null +++ b/java/res/xml-sw600dp-land/kbd_popup_template.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="5%p" + latin:horizontalGap="0px" + latin:verticalGap="0px" + latin:rowHeight="@dimen/popup_key_height" + > +</Keyboard> diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml new file mode 100644 index 000000000..e8e80ac03 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_key_styles.xml @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <!-- Base key style for the functional key --> + <key-style + latin:styleName="functionalKeyStyle" + latin:isFunctional="true" /> + <!-- Base key style for the key which may have settings key as popup key --> + <switch> + <case + latin:clobberSettingsKey="true" + > + <key-style + latin:styleName="settingsPopupStyle" + latin:parentStyle="functionalKeyStyle" /> + </case> + <default> + <key-style + latin:styleName="settingsPopupStyle" + latin:keyLabelOption="popupHint" + latin:popupCharacters="\@icon/5|\@integer/key_settings" + latin:parentStyle="functionalKeyStyle" /> + </default> + </switch> + <!-- Functional key styles --> + <key-style + latin:styleName="shiftKeyStyle" + latin:code="@integer/key_shift" + latin:keyIcon="iconShiftKey" + latin:keyIconShifted="iconShiftedShiftKey" + latin:parentStyle="functionalKeyStyle" + latin:isSticky="true" /> + <key-style + latin:styleName="deleteKeyStyle" + latin:code="@integer/key_delete" + latin:keyIcon="iconDeleteKey" + latin:parentStyle="functionalKeyStyle" + latin:isRepeatable="true" /> + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyIcon="iconReturnKey" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="spaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIconPreview="iconPreviewSpaceKey" /> + <key-style + latin:styleName="nonSpecialBackgroundSpaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIconPreview="iconPreviewSpaceKey" /> + <key-style + latin:styleName="smileyKeyStyle" + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:keyLabelOption="popupHint" + latin:popupCharacters="@string/alternates_for_smiley" + latin:maxPopupKeyboardColumn="5" /> + <key-style + latin:styleName="shortcutKeyStyle" + latin:code="@integer/key_shortcut" + latin:keyIcon="iconShortcutKey" + latin:keyIconPreview="iconPreviewShortcutKey" + latin:parentStyle="settingsPopupStyle" /> + <key-style + latin:styleName="settingsKeyStyle" + latin:code="@integer/key_settings" + latin:keyIcon="iconSettingsKey" + latin:keyIconPreview="iconPreviewSettingsKey" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="tabKeyStyle" + latin:code="@integer/key_tab" + latin:keyIcon="iconTabKey" + latin:keyIconPreview="iconPreviewTabKey" + 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|popupHint" + latin:keyOutputText="@string/keylabel_for_popular_domain" + latin:popupCharacters="@string/alternates_for_popular_domain" /> + <switch> + <case + latin:passwordInput="true" + > + <key-style + latin:styleName="nonPasswordSymbolKeyStyle" + latin:enabled="false" /> + </case> + <!-- latin:passwordInput="false" --> + <default> + <key-style + latin:styleName="nonPasswordSymbolKeyStyle" + latin:enabled="true" /> + </default> + </switch> +</merge> diff --git a/java/res/xml-sw600dp/kbd_number.xml b/java/res/xml-sw600dp/kbd_number.xml new file mode 100644 index 000000000..2c7af0ae2 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_number.xml @@ -0,0 +1,195 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="16.75%p" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_numkey_styles" /> + <switch> + <case + latin:passwordInput="true" + > + <!-- This row is intentionally not marked as a top row --> + <Row> + <Key + latin:keyStyle="num1KeyStyle" + latin:keyXPos="24.875%p" /> + <Key + latin:keyStyle="num2KeyStyle" /> + <Key + latin:keyStyle="num3KeyStyle" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-11.00%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyStyle="num4KeyStyle" + latin:keyXPos="24.875%p" /> + <Key + latin:keyStyle="num5KeyStyle" /> + <Key + latin:keyStyle="num6KeyStyle" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-11.00%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyStyle="num7KeyStyle" + latin:keyXPos="24.875%p" /> + <Key + latin:keyStyle="num8KeyStyle" /> + <Key + latin:keyStyle="num9KeyStyle" /> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <Key + latin:keyStyle="tabKeyStyle" + latin:keyWidth="11.00%p" + latin:keyEdgeFlags="left" /> + <Spacer + latin:keyXPos="24.875%p" /> + <Key + latin:keyStyle="num0KeyStyle" /> + <Spacer + latin:keyXPos="-11.00%p" + latin:keyWidth="0%p" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f2" /> + </Row> + </case> + <!-- latin:passwordInput="false" --> + <default> + <!-- This row is intentionally not marked as a top row --> + <Row> + <Key + latin:keyLabel="-" + latin:keyStyle="numLabelStyle" + latin:keyXPos="11.00%p" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="+" + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="." + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="1" + latin:keyXPos="38.75%p" /> + <Key + latin:keyLabel="2" /> + <Key + latin:keyLabel="3" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-11.00%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyLabel="*" + latin:keyStyle="numLabelStyle" + latin:keyXPos="11.00%p" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="/" + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="," + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="4" + latin:keyXPos="38.75%p" /> + <Key + latin:keyLabel="5" /> + <Key + latin:keyLabel="6" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-11.00%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <!-- There is an empty area below the "More" key and left of the "(" key. To + ignore the touch event on the area, "(" is intentionally not marked as a left + edge key. --> + <Key + latin:keyLabel="(" + latin:keyStyle="numLabelStyle" + latin:keyXPos="11.00%p" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel=")" + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="=" + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="7" + latin:keyXPos="38.75%p" /> + <Key + latin:keyLabel="8" /> + <Key + latin:keyLabel="9" /> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <Key + latin:keyStyle="tabKeyStyle" + latin:keyWidth="11.00%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle" + latin:keyWidth="27.75%p" /> + <Key + latin:keyStyle="numStarKeyStyle" + latin:keyXPos="38.75%p" /> + <Key + latin:keyLabel="0" /> + <Key + latin:keyLabel="#" + latin:keyStyle="numLabelStyle" /> + <Spacer + latin:keyXPos="-11.00%p" + latin:keyWidth="0%p" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f2" /> + </Row> + </default> + </switch> +</Keyboard> diff --git a/java/res/xml-sw600dp/kbd_phone.xml b/java/res/xml-sw600dp/kbd_phone.xml new file mode 100644 index 000000000..4dee882e9 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_phone.xml @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="16.75%p" +> + <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:keyLabel="-" + latin:keyStyle="numLabelStyle" + latin:keyXPos="15.625%p" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="+" + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyStyle="num1KeyStyle" + latin:keyXPos="38.867%p" /> + <Key + latin:keyStyle="num2KeyStyle" /> + <Key + latin:keyStyle="num3KeyStyle" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-11.00%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyLabel="," + latin:keyStyle="numLabelStyle" + latin:keyXPos="15.625%p" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="." + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyStyle="num4KeyStyle" + latin:keyXPos="38.867%p" /> + <Key + latin:keyStyle="num5KeyStyle" /> + <Key + latin:keyStyle="num6KeyStyle" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-11.00%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="11.0%p" + latin:keyEdgeFlags="left" /> + <!-- There is an empty area below the "More" key and left of the "(" key. To ignore + the touch event on the area, "(" is intentionally not marked as a left edge key. --> + <Key + latin:keyLabel="(" + latin:keyStyle="numLabelStyle" + latin:keyXPos="15.625%p" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel=")" + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyStyle="num7KeyStyle" + latin:keyXPos="38.867%p" /> + <Key + latin:keyStyle="num8KeyStyle" /> + <Key + latin:keyStyle="num9KeyStyle" /> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <Key + latin:keyStyle="tabKeyStyle" + latin:keyWidth="11.00%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle" + latin:keyXPos="15.625%p" + latin:keyWidth="18.67%p" /> + <Key + latin:keyStyle="numStarKeyStyle" + latin:keyXPos="38.867%p" /> + <Key + latin:keyStyle="num0KeyStyle" /> + <Key + latin:keyLabel="#" + latin:keyStyle="numLabelStyle" /> + <Spacer + latin:keyXPos="-11.00%p" + latin:keyWidth="0%p" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f2" /> + </Row> +</Keyboard> diff --git a/java/res/xml-sw600dp/kbd_phone_symbols.xml b/java/res/xml-sw600dp/kbd_phone_symbols.xml new file mode 100644 index 000000000..87de880d9 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_phone_symbols.xml @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="16.75%p" +> + <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:keyLabel="-" + latin:keyStyle="numLabelStyle" + latin:keyXPos="11.00%p" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="+" + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:code="44" + latin:keyLabel="@string/label_pause_key" + latin:keyWidth="9.25%p" /> + <Key + latin:keyStyle="num1KeyStyle" + latin:keyXPos="38.867%p" /> + <Key + latin:keyStyle="num2KeyStyle" /> + <Key + latin:keyStyle="num3KeyStyle" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-11.00%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyLabel="," + latin:keyStyle="numLabelStyle" + latin:keyXPos="11.00%p" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="." + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:code="59" + latin:keyLabel="@string/label_wait_key" + latin:keyWidth="9.25%p" /> + <Key + latin:keyStyle="num4KeyStyle" + latin:keyXPos="38.867%p" /> + <Key + latin:keyStyle="num5KeyStyle" /> + <Key + latin:keyStyle="num6KeyStyle" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-11.00%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="11.00%p" + latin:keyEdgeFlags="left" /> + <!-- There is an empty area below the "More" key and left of the "(" key. To ignore + the touch event on the area, "(" is intentionally not marked as a left edge key. --> + <Key + latin:keyLabel="(" + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel=")" + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyLabel="N" + latin:keyStyle="numLabelStyle" + latin:keyWidth="9.25%p" /> + <Key + latin:keyStyle="num7KeyStyle" + latin:keyXPos="38.867%p" /> + <Key + latin:keyStyle="num8KeyStyle" /> + <Key + latin:keyStyle="num9KeyStyle" /> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <Key + latin:keyStyle="tabKeyStyle" + latin:keyWidth="11.00%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle" + latin:keyWidth="27.75%p" /> + <Key + latin:keyStyle="numStarKeyStyle" + latin:keyXPos="38.867%p" /> + <Key + latin:keyStyle="num0KeyStyle" /> + <Key + latin:keyLabel="#" + latin:keyStyle="numLabelStyle" /> + <Spacer + latin:keyXPos="-11.00%p" + latin:keyWidth="0%p" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f2" /> + </Row> +</Keyboard> diff --git a/java/res/xml-sw600dp/kbd_popup_template.xml b/java/res/xml-sw600dp/kbd_popup_template.xml new file mode 100644 index 000000000..fff2659be --- /dev/null +++ b/java/res/xml-sw600dp/kbd_popup_template.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="8%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="0px" + latin:rowHeight="@dimen/popup_key_height" + > +</Keyboard> diff --git a/java/res/xml-sw600dp/kbd_qwerty_f2.xml b/java/res/xml-sw600dp/kbd_qwerty_f2.xml new file mode 100644 index 000000000..7638ee4b4 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_qwerty_f2.xml @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <switch> + <case + latin:f2KeyMode="settings" + > + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </case> + <case + latin:f2KeyMode="shortcutIme" + > + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </case> + <!-- voiceKeyEnabled="false" --> + <default> + <Spacer /> + </default> + </switch> + </case> + <case + latin:f2KeyMode="shortcutImeOrSettings" + > + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </case> + <!-- voiceKeyEnabled="false" --> + <default> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </default> + </switch> + </case> + <!-- f2KeyMode="none" --> + <default> + <Spacer /> + </default> + </switch> +</merge> diff --git a/java/res/xml-sw600dp/kbd_qwerty_row1.xml b/java/res/xml-sw600dp/kbd_qwerty_row1.xml new file mode 100644 index 000000000..b781d681e --- /dev/null +++ b/java/res/xml-sw600dp/kbd_qwerty_row1.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="9.0%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-10.0%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml-sw600dp/kbd_qwerty_row2.xml b/java/res/xml-sw600dp/kbd_qwerty_row2.xml new file mode 100644 index 000000000..05b005af1 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_qwerty_row2.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="9.0%p" + > + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" + latin:keyXPos="4.5%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-14.6%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml-sw600dp/kbd_qwerty_row3.xml b/java/res/xml-sw600dp/kbd_qwerty_row3.xml new file mode 100644 index 000000000..0dbc5cf66 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_qwerty_row3.xml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="8.9%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="10.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="z" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="m" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + </case> + <default> + <Key + latin:keyLabel="," + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="!" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\?" + latin:popupCharacters="\?" /> + </default> + </switch> + <include + latin:keyboardLayout="@xml/kbd_row3_right" /> + </Row> +</merge> diff --git a/java/res/xml-sw600dp/kbd_qwerty_row4.xml b/java/res/xml-sw600dp/kbd_qwerty_row4.xml new file mode 100644 index 000000000..8fd65fe0e --- /dev/null +++ b/java/res/xml-sw600dp/kbd_qwerty_row4.xml @@ -0,0 +1,163 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <!-- This row is intentionally not marked as a bottom row --> + <Row + latin:keyWidth="8.9%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="13.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="tabKeyStyle" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyStyle="comKeyStyle" /> + </case> + <case + latin:mode="url" + > + <Key + latin:keyStyle="comKeyStyle" /> + </case> + <default> + <Key + latin:keyLabel="/" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\@" + latin:popupCharacters="\@" /> + </default> + </switch> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyXPos="30.750%p" + latin:keyWidth="39.750%p" /> + <switch> + <case + latin:languageCode="ru" + > + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="-" + latin:keyWidth="9.750%p" /> + </case> + <case + latin:mode="url" + > + <Key + latin:keyLabel="/" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter=":" + latin:popupCharacters=":" + latin:keyWidth="9.750%p" /> + </case> + <default> + <Key + latin:keyLabel="\?" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="_" + latin:popupCharacters="_" + latin:keyWidth="9.750%p" /> + </default> + </switch> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="_" + latin:keyWidth="9.750%p" /> + </case> + <default> + <Key + latin:keyLabel="!" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\'" + latin:popupCharacters="\'" + latin:keyWidth="9.750%p" /> + </default> + </switch> + </case> + <!-- not languageCode="ru" --> + <default> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="-" + latin:keyWidth="9.750%p" /> + </case> + <case + latin:mode="url" + > + <Key + latin:keyLabel="/" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter=":" + latin:popupCharacters=":" + latin:keyWidth="9.750%p" /> + </case> + <default> + <Key + latin:keyLabel="\'" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter=""" + latin:popupCharacters=""" + latin:keyWidth="9.750%p" /> + </default> + </switch> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="_" + latin:keyWidth="9.750%p" /> + </case> + <default> + <Key + latin:keyLabel="-" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="_" + latin:popupCharacters="_" + latin:keyWidth="9.750%p" /> + </default> + </switch> + </default> + </switch> + <Spacer + latin:keyXPos="-10.00%p" + latin:keyWidth="0%p" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f2" /> + </Row> +</merge> diff --git a/java/res/xml-sw600dp/kbd_row3_right.xml b/java/res/xml-sw600dp/kbd_row3_right.xml new file mode 100644 index 000000000..a9c5eb371 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_row3_right.xml @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="\@" + latin:keyXPos="-8.9%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </case> + <case + latin:mode="url" + > + <Key + latin:keyLabel="-" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="_" + latin:popupCharacters="_" + latin:keyXPos="-8.9%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </case> + <case + latin:imeAction="actionSearch" + > + <Key + latin:keyLabel=":" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="+" + latin:popupCharacters="+" + latin:keyXPos="-8.9%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </case> + <default> + <Key + latin:keyStyle="smileyKeyStyle" + latin:keyXPos="-8.9%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </default> + </switch> +</merge> diff --git a/java/res/xml-sw600dp/kbd_rows_arabic.xml b/java/res/xml-sw600dp/kbd_rows_arabic.xml new file mode 100644 index 000000000..bc37d5a9f --- /dev/null +++ b/java/res/xml-sw600dp/kbd_rows_arabic.xml @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- This file for Arabic layout is an alpha version. It allows to enter --> +<!-- some right-to-left text, but it has gone through no study whatsoever, --> +<!-- and needs to be run through UX. --> +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="8.0%p" + > + <Key + latin:keyLabel="ض" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ص" /> + <Key + latin:keyLabel="ث" /> + <Key + latin:keyLabel="ق" /> + <Key + latin:keyLabel="ف" + latin:popupCharacters="ف,ڤ" /> + <Key + latin:keyLabel="غ" /> + <Key + latin:keyLabel="ع" /> + <Key + latin:keyLabel="ه" + latin:popupCharacters="ه,هـ" /> + <Key + latin:keyLabel="خ" /> + <Key + latin:keyLabel="ح" /> + <Key + latin:keyLabel="ج" + latin:popupCharacters="ج,چ" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-10.0%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.0%p" + > + <Key + latin:keyLabel="ش" + latin:keyXPos="3.0%p" /> + <Key + latin:keyLabel="س" /> + <Key + latin:keyLabel="ي" /> + <Key + latin:keyLabel="ب" + latin:popupCharacters="ب,پ" /> + <Key + latin:keyLabel="ل" + latin:popupCharacters="ل,لا" /> + <Key + latin:keyLabel="ا" + latin:popupCharacters="ا,أ,إ,آ" /> + <Key + latin:keyLabel="ت" /> + <Key + latin:keyLabel="ن" /> + <Key + latin:keyLabel="م" /> + <Key + latin:keyLabel="ك" + latin:popupCharacters="ك,گ" /> + <Key + latin:keyLabel="ط" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-14.6%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.65%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="8.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ئ" /> + <Key + latin:keyLabel="ء" /> + <Key + latin:keyLabel="ؤ" /> + <Key + latin:keyLabel="ر" /> + <Key + latin:keyLabel="ذ" /> + <Key + latin:keyLabel="ى" /> + <Key + latin:keyLabel="ة" /> + <Key + latin:keyLabel="و" /> + <Key + latin:keyLabel="ز" + latin:popupCharacters="ز,ژ" /> + <Key + latin:keyLabel="ظ" /> + <Key + latin:keyLabel="د" /> + <include + latin:keyboardLayout="@xml/kbd_row3_right" /> + </Row> + <include latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw600dp/kbd_rows_azerty.xml b/java/res/xml-sw600dp/kbd_rows_azerty.xml new file mode 100644 index 000000000..b53bbbbf9 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_rows_azerty.xml @@ -0,0 +1,156 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="8.5%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="z" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-10.0%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.5%p" + > + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" + latin:keyXPos="5.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="m" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-14.6%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.5%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="10.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="\'" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + </case> + <default> + <Key + latin:keyLabel="," + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="!" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\?" + latin:popupCharacters="\?" /> + </default> + </switch> + <include + latin:keyboardLayout="@xml/kbd_row3_right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw600dp/kbd_rows_hebrew.xml b/java/res/xml-sw600dp/kbd_rows_hebrew.xml new file mode 100644 index 000000000..a1475376b --- /dev/null +++ b/java/res/xml-sw600dp/kbd_rows_hebrew.xml @@ -0,0 +1,122 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="8.600%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + <Key + latin:keyLabel="ק" /> + <Key + latin:keyLabel="ר" /> + <Key + latin:keyLabel="א" /> + <Key + latin:keyLabel="ט" /> + <Key + latin:keyLabel="ו" /> + <Key + latin:keyLabel="ן" /> + <Key + latin:keyLabel="ם" /> + <Key + latin:keyLabel="פ" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-12.000%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.600%p" + > + <Key + latin:keyLabel="ש" + latin:keyXPos="4.000%p" /> + <Key + latin:keyLabel="ד" /> + <Key + latin:keyLabel="ג" + latin:popupCharacters="ג,ג׳" /> + <Key + latin:keyLabel="כ" /> + <Key + latin:keyLabel="ע" /> + <Key + latin:keyLabel="י" + latin:popupCharacters="י,ײַ" /> + <Key + latin:keyLabel="ח" + latin:popupCharacters="ח,ח׳" /> + <Key + latin:keyLabel="ל" /> + <Key + latin:keyLabel="ך" /> + <Key + latin:keyLabel="ף" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-10.400%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.600%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="10.000%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ז" + latin:popupCharacters="ז,ז׳" /> + <Key + latin:keyLabel="ס" /> + <Key + latin:keyLabel="ב" /> + <Key + latin:keyLabel="ה" /> + <Key + latin:keyLabel="נ" /> + <Key + latin:keyLabel="מ" /> + <Key + latin:keyLabel="צ" + latin:popupCharacters="צ,צ׳" /> + <Key + latin:keyLabel="ת" + latin:popupCharacters="ת,ת׳" /> + <Key + latin:keyLabel="ץ" + latin:popupCharacters="ץ,ץ׳" /> + <include + latin:keyboardLayout="@xml/kbd_row3_right" /> + </Row> + <include latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw600dp/kbd_rows_qwerty.xml b/java/res/xml-sw600dp/kbd_rows_qwerty.xml new file mode 100644 index 000000000..a2d26b3de --- /dev/null +++ b/java/res/xml-sw600dp/kbd_rows_qwerty.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row1" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row2" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row3" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw600dp/kbd_rows_qwertz.xml b/java/res/xml-sw600dp/kbd_rows_qwertz.xml new file mode 100644 index 000000000..7ea9b0f37 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_rows_qwertz.xml @@ -0,0 +1,121 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="9.0%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="z" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-10.0%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row2" /> + <Row + latin:keyWidth="8.9%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="10.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="m" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + </case> + <default> + <Key + latin:keyLabel="," + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="!" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\?" + latin:popupCharacters="\?" /> + </default> + </switch> + <include + latin:keyboardLayout="@xml/kbd_row3_right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw600dp/kbd_rows_russian.xml b/java/res/xml-sw600dp/kbd_rows_russian.xml new file mode 100644 index 000000000..43fa665e6 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_rows_russian.xml @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="8.0%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="й" + latin:keyXPos="2.15%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ц" /> + <Key + latin:keyLabel="у" /> + <Key + latin:keyLabel="к" /> + <Key + latin:keyLabel="е" + latin:popupCharacters="@string/alternates_for_cyrillic_e" /> + <Key + latin:keyLabel="н" /> + <Key + latin:keyLabel="г" /> + <Key + latin:keyLabel="ш" /> + <Key + latin:keyLabel="щ" /> + <Key + latin:keyLabel="з" /> + <Key + latin:keyLabel="х" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-10.0%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.0%p" + > + <Key + latin:keyLabel="ф" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ы" /> + <Key + latin:keyLabel="в" /> + <Key + latin:keyLabel="а" /> + <Key + latin:keyLabel="п" /> + <Key + latin:keyLabel="р" /> + <Key + latin:keyLabel="о" /> + <Key + latin:keyLabel="л" /> + <Key + latin:keyLabel="д" /> + <Key + latin:keyLabel="ж" /> + <Key + latin:keyLabel="э" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-14.6%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.0%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="10.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="я" /> + <Key + latin:keyLabel="ч" /> + <Key + latin:keyLabel="с" /> + <Key + latin:keyLabel="м" /> + <Key + latin:keyLabel="и" /> + <Key + latin:keyLabel="т" /> + <Key + latin:keyLabel="ь" + latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" /> + <Key + latin:keyLabel="б" /> + <Key + latin:keyLabel="ю" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="," + latin:popupCharacters="," /> + <include + latin:keyboardLayout="@xml/kbd_row3_right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw600dp/kbd_rows_scandinavian.xml b/java/res/xml-sw600dp/kbd_rows_scandinavian.xml new file mode 100644 index 000000000..3666ead51 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_rows_scandinavian.xml @@ -0,0 +1,166 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="7.9%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyLabel="å" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-10.0%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.9%p" + > + <Key + latin:keyLabel="a" + latin:keyXPos="3.5%p" + latin:popupCharacters="@string/alternates_for_a" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="@string/keylabel_for_scandinavia_row2_10" + latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" /> + <Key + latin:keyLabel="@string/keylabel_for_scandinavia_row2_11" + latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-14.6%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.9%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="10.0%p" + latin:keyEdgeFlags="left" /> + <Spacer + latin:keyWidth="4.35%p" /> + <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:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="!" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\?" + latin:popupCharacters="\?" /> + </default> + </switch> + <Spacer + latin:keyWidth="4.35%p" /> + <include + latin:keyboardLayout="@xml/kbd_row3_right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw600dp/kbd_rows_serbian.xml b/java/res/xml-sw600dp/kbd_rows_serbian.xml new file mode 100644 index 000000000..80debdadb --- /dev/null +++ b/java/res/xml-sw600dp/kbd_rows_serbian.xml @@ -0,0 +1,144 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="8.0%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="љ" + latin:keyXPos="2.15%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="њ" /> + <Key + latin:keyLabel="е" /> + <Key + latin:keyLabel="р" /> + <Key + latin:keyLabel="т" /> + <Key + latin:keyLabel="з" /> + <Key + latin:keyLabel="у" /> + <Key + latin:keyLabel="и" /> + <Key + latin:keyLabel="о" /> + <Key + latin:keyLabel="п" /> + <Key + latin:keyLabel="ш" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-10.0%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.9%p" + > + <Key + latin:keyLabel="а" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="с" /> + <Key + latin:keyLabel="д" /> + <Key + latin:keyLabel="ф" /> + <Key + latin:keyLabel="г" /> + <Key + latin:keyLabel="х" /> + <Key + latin:keyLabel="ј" /> + <Key + latin:keyLabel="к" /> + <Key + latin:keyLabel="л" /> + <Key + latin:keyLabel="ч" /> + <Key + latin:keyLabel="ћ" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-14.6%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.5%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="8.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ѕ" /> + <Key + latin:keyLabel="џ" /> + <Key + latin:keyLabel="ц" /> + <Key + latin:keyLabel="в" /> + <Key + latin:keyLabel="б" /> + <Key + latin:keyLabel="н" /> + <Key + latin:keyLabel="м" /> + <Key + latin:keyLabel="ђ" /> + <Key + latin:keyLabel="ж" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + </case> + <default> + <Key + latin:keyLabel="," + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="!" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\?" + latin:popupCharacters="\?" /> + </default> + </switch> + <include + latin:keyboardLayout="@xml/kbd_row3_right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw600dp/kbd_rows_spanish.xml b/java/res/xml-sw600dp/kbd_rows_spanish.xml new file mode 100644 index 000000000..7ef44bb53 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_rows_spanish.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row1" /> + <Row + latin:keyWidth="8.5%p" + > + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" + latin:keyXPos="5.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="ñ" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-14.6%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row3" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw600dp/kbd_symbols.xml b/java/res/xml-sw600dp/kbd_symbols.xml new file mode 100644 index 000000000..77849f6fd --- /dev/null +++ b/java/res/xml-sw600dp/kbd_symbols.xml @@ -0,0 +1,218 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_currency_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="9.0%p" + > + <Key + latin:keyLabel="1" + latin:popupCharacters="¹,½,⅓,¼,⅛" /> + <Key + latin:keyLabel="2" + latin:popupCharacters="²,⅔" /> + <Key + latin:keyLabel="3" + latin:popupCharacters="³,¾,⅜" /> + <Key + latin:keyLabel="4" + latin:popupCharacters="⁴" /> + <Key + latin:keyLabel="5" + latin:popupCharacters="⅝" /> + <Key + latin:keyLabel="6" /> + <Key + latin:keyLabel="7" + latin:popupCharacters="⅞" /> + <Key + latin:keyLabel="8" /> + <Key + latin:keyLabel="9" /> + <Key + latin:keyLabel="0" + latin:popupCharacters="ⁿ,∅" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-10.0%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="9.0%p" + > + <Key + latin:keyLabel="#" + latin:keyXPos="4.5%p" /> + <Key + latin:keyStyle="currencyKeyStyle" /> + <Key + latin:keyLabel="%" + latin:popupCharacters="‰" /> + <Key + latin:keyLabel="&" /> + <Key + latin:keyLabel="*" + latin:popupCharacters="†,‡,★" /> + <Key + latin:keyLabel="-" + latin:popupCharacters="_,–,—" /> + <Key + latin:keyLabel="+" + latin:popupCharacters="±" /> + <Key + latin:keyLabel="(" + latin:popupCharacters="[,{,<" /> + <Key + latin:keyLabel=")" + latin:popupCharacters="],},>" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-14.6%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.9%p" + > + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="10.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="<" + latin:popupCharacters="≤,«,‹" /> + <Key + latin:keyLabel=">" + latin:popupCharacters="≥,»,›" /> + <Key + latin:keyLabel="=" + latin:popupCharacters="≠,≈" /> + <switch> + <case + latin:languageCode="ru" + > + <Key + latin:keyLabel=":" /> + </case> + <case + latin:mode="url" + > + <Key + latin:keyLabel="\'" + latin:popupCharacters="‘,’,‚,‛" /> + </case> + <default> + <Key + latin:keyLabel=":" /> + </default> + </switch> + <Key + latin:keyLabel=";" /> + <switch> + <case + latin:languageCode="ru" + > + <Key + latin:keyLabel="\'" + latin:popupCharacters="‘,’,‚,‛" /> + <!-- Note: DroidSans doesn't have double-high-reversed-quotation + '\u201f' glyph. --> + <!-- latin:popupCharacters="“,”,„,‟,«,»" --> + <Key + latin:keyLabel=""" + latin:popupCharacters="“,”,«,»" /> + <Key + latin:keyLabel="." /> + <Key + latin:keyLabel="," /> + </case> + <default> + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + <Key + latin:keyLabel="!" + latin:popupCharacters="¡" /> + <Key + latin:keyLabel="\?" + latin:popupCharacters="¿" /> + </default> + </switch> + <Key + latin:keyLabel="/" + latin:keyWidth="fillRight" /> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row + latin:keyWidth="8.9%p" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="13.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="tabKeyStyle" /> + <Key + latin:keyLabel="\@" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyXPos="30.750%p" + latin:keyWidth="39.750%p" /> + <switch> + <case + latin:languageCode="ru" + > + <Key + latin:keyLabel="_" + latin:keyWidth="9.750%p" /> + <Key + latin:keyLabel="-" + latin:keyWidth="9.750%p" /> + </case> + <default> + <!-- Note: DroidSans doesn't have double-high-reversed-quotation + '\u201f' glyph. --> + <!-- latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" --> + <Key + latin:keyLabel=""" + latin:popupCharacters="“,”,«,»,‘,’,‚,‛" + latin:keyWidth="9.750%p" /> + <Key + latin:keyLabel="_" + latin:keyWidth="9.750%p" /> + </default> + </switch> + <Spacer + latin:keyXPos="-10.00%p" + latin:keyWidth="0%p" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f2" /> + </Row> +</Keyboard> diff --git a/java/res/xml-sw600dp/kbd_symbols_shift.xml b/java/res/xml-sw600dp/kbd_symbols_shift.xml new file mode 100644 index 000000000..b25292f27 --- /dev/null +++ b/java/res/xml-sw600dp/kbd_symbols_shift.xml @@ -0,0 +1,156 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="9.0%p" + > + <Key + latin:keyLabel="~" /> + <Key + latin:keyLabel="`" /> + <Key + latin:keyLabel="|" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="•" + latin:popupCharacters="♪,♥,♠,♦,♣" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="√" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="π" + latin:popupCharacters="Π" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="÷" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="×" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="§" + latin:popupCharacters="¶" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="Δ" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-10.0%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="9.0%p" + > + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="£" + latin:keyXPos="4.5%p" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¢" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="€" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¥" /> + <Key + latin:keyLabel="^" + latin:popupCharacters="↑,↓,←,→" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="°" + latin:popupCharacters="′,″" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="±" + latin:popupCharacters="∞" /> + <Key + latin:keyLabel="{" /> + <Key + latin:keyLabel="}" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-14.6%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.9%p" + > + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="10.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="\\" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="©" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="®" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="™" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="℅" /> + <Key + latin:keyLabel="[" /> + <Key + latin:keyLabel="]" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¡" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¿" /> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row + latin:keyWidth="8.9%p" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="13.0%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="tabKeyStyle" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyXPos="30.750%p" + latin:keyWidth="39.750%p" /> + <Spacer + latin:keyXPos="-10.00%p" + latin:keyWidth="0%p" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f2" /> + </Row> +</Keyboard> diff --git a/java/res/xml/kbd_popup_narrow_template.xml b/java/res/xml-sw768dp-land/kbd_popup_template.xml index 23c686e8b..3caae1a60 100644 --- a/java/res/xml/kbd_popup_narrow_template.xml +++ b/java/res/xml-sw768dp-land/kbd_popup_template.xml @@ -18,10 +18,10 @@ */ --> -<Keyboard xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="9.45%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="3.5%p" + latin:horizontalGap="0px" + latin:verticalGap="0px" + latin:rowHeight="@dimen/popup_key_height" > </Keyboard> diff --git a/java/res/xml-sw768dp/kbd_key_styles.xml b/java/res/xml-sw768dp/kbd_key_styles.xml new file mode 100644 index 000000000..5d8c081a6 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_key_styles.xml @@ -0,0 +1,119 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <!-- Functional key styles --> + <key-style + latin:styleName="functionalKeyStyle" + latin:isFunctional="true" /> + <key-style + latin:styleName="shiftKeyStyle" + latin:code="@integer/key_shift" + latin:keyIcon="iconShiftKey" + latin:keyIconShifted="iconShiftedShiftKey" + latin:parentStyle="functionalKeyStyle" + latin:isSticky="true" /> + <key-style + latin:styleName="deleteKeyStyle" + latin:code="@integer/key_delete" + latin:keyIcon="iconDeleteKey" + latin:parentStyle="functionalKeyStyle" + latin:isRepeatable="true" /> + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyIcon="iconReturnKey" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="spaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIconPreview="iconPreviewSpaceKey" /> + <key-style + latin:styleName="nonSpecialBackgroundSpaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIconPreview="iconPreviewSpaceKey" /> + <key-style + latin:styleName="smileyKeyStyle" + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:keyLabelOption="popupHint" + latin:popupCharacters="@string/alternates_for_smiley" + latin:maxPopupKeyboardColumn="5" /> + <key-style + latin:styleName="settingsKeyStyle" + latin:code="@integer/key_settings" + latin:keyIcon="iconSettingsKey" + latin:keyIconPreview="iconPreviewSettingsKey" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="shortcutKeyStyle" + latin:code="@integer/key_shortcut" + latin:keyIcon="iconShortcutKey" + latin:keyIconPreview="iconPreviewShortcutKey" + latin:parentStyle="functionalKeyStyle" /> + <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|popupHint" + latin:keyOutputText="@string/keylabel_for_popular_domain" + latin:popupCharacters="@string/alternates_for_popular_domain" /> + <switch> + <case + latin:passwordInput="true" + > + <key-style + latin:styleName="nonPasswordSymbolKeyStyle" + latin:enabled="false" /> + </case> + <!-- latin:passwordInput="false" --> + <default> + <key-style + latin:styleName="nonPasswordSymbolKeyStyle" + latin:enabled="true" /> + </default> + </switch> +</merge> diff --git a/java/res/xml-sw768dp/kbd_number.xml b/java/res/xml-sw768dp/kbd_number.xml new file mode 100644 index 000000000..1ae6984a5 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_number.xml @@ -0,0 +1,215 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="13.250%p" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_numkey_styles" /> + <switch> + <case + latin:passwordInput="true" + > + <!-- This row is intentionally not marked as a top row --> + <Row> + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.172%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="num1KeyStyle" + latin:keyXPos="32.076%p" /> + <Key + latin:keyStyle="num2KeyStyle" /> + <Key + latin:keyStyle="num3KeyStyle" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-11.172%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyStyle="num4KeyStyle" + latin:keyXPos="32.076%p" /> + <Key + latin:keyStyle="num5KeyStyle" /> + <Key + latin:keyStyle="num6KeyStyle" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-11.172%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyStyle="num7KeyStyle" + latin:keyXPos="32.076%p" /> + <Key + latin:keyStyle="num8KeyStyle" /> + <Key + latin:keyStyle="num9KeyStyle" /> + <!-- There is an empty area below the "Enter" key and right of the "9" key. To + ignore the touch event on the area, "9" is intentionally not marked as a right + edge key. --> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <Spacer + latin:keyXPos="32.076%p" /> + <Key + latin:keyStyle="num0KeyStyle" /> + <!-- There is an empty area below the "Enter" key and right of the "#" key. To + ignore the touch event on the area, "#" is intentionally not marked as a right + edge key. --> + </Row> + </case> + <!-- latin:passwordInput="false" --> + <default> + <!-- This row is intentionally not marked as a top row --> + <Row> + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.172%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="-" + latin:keyStyle="numLabelStyle" + latin:keyXPos="13.829%p" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="+" + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="." + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="1" + latin:keyXPos="43.125%p" /> + <Key + latin:keyLabel="2" /> + <Key + latin:keyLabel="3" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-11.172%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyLabel="*" + latin:keyStyle="numLabelStyle" + latin:keyXPos="13.829%p" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="/" + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="," + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="4" + latin:keyXPos="43.125%p" /> + <Key + latin:keyLabel="5" /> + <Key + latin:keyLabel="6" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-11.172%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <!-- There is an empty area below the "More" key and left of the "(" key. To + ignore the touch event on the area, "(" is intentionally not marked as a left + edge key. --> + <Key + latin:keyLabel="(" + latin:keyStyle="numLabelStyle" + latin:keyXPos="13.829%p" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel=")" + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="=" + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="7" + latin:keyXPos="43.125%p" /> + <Key + latin:keyLabel="8" /> + <Key + latin:keyLabel="9" /> + <!-- There is an empty area below the "Enter" key and right of the "9" key. To + ignore the touch event on the area, "9" is intentionally not marked as a right + edge key. --> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <switch> + <case latin:hasSettingsKey="true"> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="8.047%p" /> + </case> + </switch> + <Key + latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle" + latin:keyXPos="13.829%p" + latin:keyWidth="24.140%p" /> + <Key + latin:keyLabel="*" + latin:keyStyle="numLabelStyle" + latin:keyXPos="43.125%p" /> + <Key + latin:keyLabel="0" /> + <Key + latin:keyLabel="#" + latin:keyStyle="numLabelStyle" /> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" + latin:keyXPos="-8.047%p" + latin:keyWidth="fillRight" /> + </case> + </switch> + </Row> + </default> + </switch> +</Keyboard> diff --git a/java/res/xml-sw768dp/kbd_phone.xml b/java/res/xml-sw768dp/kbd_phone.xml new file mode 100644 index 000000000..6801ac5cc --- /dev/null +++ b/java/res/xml-sw768dp/kbd_phone.xml @@ -0,0 +1,139 @@ +<?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="13.250%p" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_numkey_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row> + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.172%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="-" + latin:keyStyle="numLabelStyle" + latin:keyXPos="20.400%p" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="+" + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyStyle="num1KeyStyle" + latin:keyXPos="43.125%p" /> + <Key + latin:keyStyle="num2KeyStyle" /> + <Key + latin:keyStyle="num3KeyStyle" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-11.172%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="11.172%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="," + latin:keyStyle="numLabelStyle" + latin:keyXPos="20.400%p" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="." + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyStyle="num4KeyStyle" + latin:keyXPos="43.125%p" /> + <Key + latin:keyStyle="num5KeyStyle" /> + <Key + latin:keyStyle="num6KeyStyle" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-11.172%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <!-- There is an empty area below the "More" key and left of the "(" key. To ignore + the touch event on the area, "(" is intentionally not marked as a left edge key. --> + <Key + latin:keyLabel="(" + latin:keyStyle="numLabelStyle" + latin:keyXPos="20.400%p" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel=")" + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyStyle="num7KeyStyle" + latin:keyXPos="43.125%p" /> + <Key + latin:keyStyle="num8KeyStyle" /> + <Key + latin:keyStyle="num9KeyStyle" /> + <!-- There is an empty area below the "Enter" key and right of the "9" key. To ignore + the touch event on the area, "9" is intentionally not marked as a right edge key. --> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <switch> + <case latin:hasSettingsKey="true"> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="8.047%p" /> + </case> + </switch> + <Key + latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle" + latin:keyXPos="20.400%p" + latin:keyWidth="16.084%p" /> + <Key + latin:keyStyle="numStarKeyStyle" + latin:keyXPos="43.125%p" /> + <Key + latin:keyStyle="num0KeyStyle" /> + <Key + latin:keyLabel="#" + latin:keyStyle="numLabelStyle" /> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" + latin:keyXPos="-8.047%p" + latin:keyWidth="fillRight" /> + </case> + </switch> + </Row> +</Keyboard> diff --git a/java/res/xml-sw768dp/kbd_phone_symbols.xml b/java/res/xml-sw768dp/kbd_phone_symbols.xml new file mode 100644 index 000000000..22f78b6d3 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_phone_symbols.xml @@ -0,0 +1,151 @@ +<?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="13.250%p" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_numkey_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row> + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.172%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="-" + latin:keyStyle="numLabelStyle" + latin:keyXPos="13.829%p" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="+" + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:code="44" + latin:keyLabel="@string/label_pause_key" + latin:keyWidth="8.047%p" /> + <Key + latin:keyStyle="num1KeyStyle" + latin:keyXPos="43.125%p" /> + <Key + latin:keyStyle="num2KeyStyle" /> + <Key + latin:keyStyle="num3KeyStyle" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-11.172%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="11.172%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="," + latin:keyStyle="numLabelStyle" + latin:keyXPos="13.829%p" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="." + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:code="59" + latin:keyLabel="@string/label_wait_key" + latin:keyWidth="8.047%p" /> + <Key + latin:keyStyle="num4KeyStyle" + latin:keyXPos="43.125%p" /> + <Key + latin:keyStyle="num5KeyStyle" /> + <Key + latin:keyStyle="num6KeyStyle" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-11.172%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row> + <!-- There is an empty area below the "More" key and left of the "(" key. To ignore + the touch event on the area, "(" is intentionally not marked as a left edge key. --> + <Key + latin:keyLabel="(" + latin:keyStyle="numLabelStyle" + latin:keyXPos="13.829%p" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel=")" + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyLabel="N" + latin:keyStyle="numLabelStyle" + latin:keyWidth="8.047%p" /> + <Key + latin:keyStyle="num7KeyStyle" + latin:keyXPos="43.125%p" /> + <Key + latin:keyStyle="num8KeyStyle" /> + <Key + latin:keyStyle="num9KeyStyle" /> + <!-- There is an empty area below the "Enter" key and right of the "9" key. To ignore + the touch event on the area, "9" is intentionally not marked as a right edge key. --> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row> + <switch> + <case latin:hasSettingsKey="true"> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="8.047%p" /> + </case> + </switch> + <Key + latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle" + latin:keyXPos="13.829%p" + latin:keyWidth="24.140%p" /> + <Key + latin:keyStyle="numStarKeyStyle" + latin:keyXPos="43.125%p" /> + <Key + latin:keyStyle="num0KeyStyle" /> + <Key + latin:keyLabel="#" + latin:keyStyle="numLabelStyle" /> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" + latin:keyXPos="-8.047%p" + latin:keyWidth="fillRight" /> + </case> + </switch> + </Row> +</Keyboard> diff --git a/java/res/xml-sw768dp/kbd_popup_template.xml b/java/res/xml-sw768dp/kbd_popup_template.xml new file mode 100644 index 000000000..7d39d1a3a --- /dev/null +++ b/java/res/xml-sw768dp/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/xml-sw768dp/kbd_qwerty_row1.xml b/java/res/xml-sw768dp/kbd_qwerty_row1.xml new file mode 100644 index 000000000..3727cf34e --- /dev/null +++ b/java/res/xml-sw768dp/kbd_qwerty_row1.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="8.282%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.969%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-9.219%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml-sw768dp/kbd_qwerty_row2.xml b/java/res/xml-sw768dp/kbd_qwerty_row2.xml new file mode 100644 index 000000000..45af120e2 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_qwerty_row2.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="8.125%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.172%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-15.704%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml-sw768dp/kbd_qwerty_row3.xml b/java/res/xml-sw768dp/kbd_qwerty_row3.xml new file mode 100644 index 000000000..7297ea512 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_qwerty_row3.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="8.047%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="13.829%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="z" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="m" /> + <include + latin:keyboardLayout="@xml/kbd_row3_right2" /> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyXPos="-13.750%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> +</merge> diff --git a/java/res/xml-sw768dp/kbd_qwerty_row4.xml b/java/res/xml-sw768dp/kbd_qwerty_row4.xml new file mode 100644 index 000000000..00eabab9e --- /dev/null +++ b/java/res/xml-sw768dp/kbd_qwerty_row4.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. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <!-- This row is intentionally not marked as a bottom row --> + <Row + latin:keyWidth="8.047%p" + > + <switch> + <case + latin:hasSettingsKey="true" + > + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="8.047%p" /> + </case> + </switch> + <Spacer + latin:keyXPos="15.157%p" + latin:keyWidth="fillRight" /> + <switch> + <case + latin:mode="url" + > + <Key + latin:keyStyle="comKeyStyle" + latin:keyWidth="16.084%p" /> + </case> + <default> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyStyle="comKeyStyle" /> + </case> + <case + latin:imeAction="actionSearch" + > + <Key + latin:keyLabel=":" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="+" + latin:popupCharacters="+" /> + </case> + <default> + <Key + latin:keyStyle="smileyKeyStyle" /> + </default> + </switch> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="\@" /> + </case> + <default> + <Key + latin:keyLabel="/" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\@" + latin:popupCharacters="\@" /> + </default> + </switch> + </default> + </switch> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyXPos="31.250%p" + latin:keyWidth="37.500%p" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="-" /> + </case> + <case + latin:mode="url" + > + <Key + latin:keyLabel="/" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter=":" + latin:popupCharacters=":" /> + </case> + <default> + <Key + latin:keyLabel="\'" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter=""" + latin:popupCharacters=""" /> + </default> + </switch> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="_" /> + </case> + <default> + <Key + latin:keyLabel="-" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="_" + latin:popupCharacters="_" /> + </default> + </switch> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" + latin:keyXPos="-8.047%p" + latin:keyWidth="fillRight" /> + </case> + </switch> + </Row> +</merge> diff --git a/java/res/xml-sw768dp/kbd_row3_right2.xml b/java/res/xml-sw768dp/kbd_row3_right2.xml new file mode 100644 index 000000000..e90de8eec --- /dev/null +++ b/java/res/xml-sw768dp/kbd_row3_right2.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + </case> + <default> + <Key + latin:keyLabel="," + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="!" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\?" + latin:popupCharacters="\?" /> + </default> + </switch> +</merge> diff --git a/java/res/xml-sw768dp/kbd_rows_arabic.xml b/java/res/xml-sw768dp/kbd_rows_arabic.xml new file mode 100644 index 000000000..c1810026b --- /dev/null +++ b/java/res/xml-sw768dp/kbd_rows_arabic.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- This file for Arabic layout is an alpha version. It allows to enter --> +<!-- some right-to-left text, but it has gone through no study whatsoever, --> +<!-- and needs to be run through UX. --> +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="7.375%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.500%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="ع" /> + <Key + latin:keyLabel="ه" + latin:popupCharacters="ه,هـ" /> + <Key + latin:keyLabel="خ" /> + <Key + latin:keyLabel="ح" /> + <Key + latin:keyLabel="ج" + latin:popupCharacters="ج,چ" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-11.500%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.375%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="9.375%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ش" /> + <Key + latin:keyLabel="س" /> + <Key + latin:keyLabel="ي" /> + <Key + latin:keyLabel="ب" + latin:popupCharacters="ب,پ" /> + <Key + latin:keyLabel="ل" + latin:popupCharacters="ل,لا" /> + <Key + latin:keyLabel="ا" + latin:popupCharacters="ا,أ,إ,آ" /> + <Key + latin:keyLabel="ت" /> + <Key + latin:keyLabel="ن" /> + <Key + latin:keyLabel="م" /> + <Key + latin:keyLabel="ك" + latin:popupCharacters="ك,گ" /> + <Key + latin:keyLabel="ط" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-9.375%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.375%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="12.750%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:popupCharacters="ز,ژ" /> + <Key + latin:keyLabel="ظ" /> + <Key + latin:keyLabel="د" /> + </Row> + <include latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw768dp/kbd_rows_azerty.xml b/java/res/xml-sw768dp/kbd_rows_azerty.xml new file mode 100644 index 000000000..3bcba0042 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_rows_azerty.xml @@ -0,0 +1,169 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="8.282%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.969%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" /> + <Key + latin:keyLabel="z" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-9.219%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.125%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="10.167%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="m" + latin:keyEdgeFlags="right" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-15.704%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.047%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="13.829%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="\'" + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter=":" + latin:popupCharacters=":" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + </case> + <default> + <Key + latin:keyLabel="," + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="!" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\?" + latin:popupCharacters="\?" /> + </default> + </switch> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyXPos="-13.750%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw768dp/kbd_rows_hebrew.xml b/java/res/xml-sw768dp/kbd_rows_hebrew.xml new file mode 100644 index 000000000..5275a1f15 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_rows_hebrew.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="8.000%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + <Key + latin:keyLabel="ק" /> + <Key + latin:keyLabel="ר" /> + <Key + latin:keyLabel="א" /> + <Key + latin:keyLabel="ט" /> + <Key + latin:keyLabel="ו" /> + <Key + latin:keyLabel="ן" /> + <Key + latin:keyLabel="ם" /> + <Key + latin:keyLabel="פ" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-12.000%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.000%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="9.600%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ש" /> + <Key + latin:keyLabel="ד" /> + <Key + latin:keyLabel="ג" + latin:popupCharacters="ג,ג׳" /> + <Key + latin:keyLabel="כ" /> + <Key + latin:keyLabel="ע" /> + <Key + latin:keyLabel="י" + latin:popupCharacters="י,ײַ" /> + <Key + latin:keyLabel="ח" + latin:popupCharacters="ח,ח׳" /> + <Key + latin:keyLabel="ל" /> + <Key + latin:keyLabel="ך" /> + <Key + latin:keyLabel="ף" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-10.400%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.000%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="13.200%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ז" + latin:popupCharacters="ז,ז׳" /> + <Key + latin:keyLabel="ס" /> + <Key + latin:keyLabel="ב" /> + <Key + latin:keyLabel="ה" /> + <Key + latin:keyLabel="נ" /> + <Key + latin:keyLabel="מ" /> + <Key + latin:keyLabel="צ" + latin:popupCharacters="צ,צ׳" /> + <Key + latin:keyLabel="ת" + latin:popupCharacters="ת,ת׳" /> + <Key + latin:keyLabel="ץ" + latin:popupCharacters="ץ,ץ׳" /> + </Row> + <include latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw768dp/kbd_rows_qwerty.xml b/java/res/xml-sw768dp/kbd_rows_qwerty.xml new file mode 100644 index 000000000..6237712f6 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_rows_qwerty.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row1" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row2" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row3" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw768dp/kbd_rows_qwertz.xml b/java/res/xml-sw768dp/kbd_rows_qwertz.xml new file mode 100644 index 000000000..8d5f1e6d4 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_rows_qwertz.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.282%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.969%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="z" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-9.219%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row2" /> + <Row + latin:keyWidth="8.047%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="13.829%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="x" /> + <Key + latin:keyLabel="c" + latin:popupCharacters="@string/alternates_for_c" /> + <Key + latin:keyLabel="v" + latin:popupCharacters="@string/alternates_for_v" /> + <Key + latin:keyLabel="b" /> + <Key + latin:keyLabel="n" + latin:popupCharacters="@string/alternates_for_n" /> + <Key + latin:keyLabel="m" /> + <switch> + <case + latin:mode="email" + > + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + </case> + <default> + <Key + latin:keyLabel="," + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="!" + latin:popupCharacters="!" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="hasUppercaseLetter" + latin:keyHintLetter="\?" + latin:popupCharacters="\?" /> + </default> + </switch> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyXPos="-13.750%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw768dp/kbd_rows_russian.xml b/java/res/xml-sw768dp/kbd_rows_russian.xml new file mode 100644 index 000000000..ee91481c1 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_rows_russian.xml @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="7.125%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="й" /> + <Key + latin:keyLabel="ц" /> + <Key + latin:keyLabel="у" /> + <Key + latin:keyLabel="к" /> + <Key + latin:keyLabel="е" + latin:popupCharacters="@string/alternates_for_cyrillic_e" /> + <Key + latin:keyLabel="н" /> + <Key + latin:keyLabel="г" /> + <Key + latin:keyLabel="ш" /> + <Key + latin:keyLabel="щ" /> + <Key + latin:keyLabel="з" /> + <Key + latin:keyLabel="х" /> + <Key + latin:keyLabel="ъ" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.125%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="9.375%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ф" /> + <Key + latin:keyLabel="ы" /> + <Key + latin:keyLabel="в" /> + <Key + latin:keyLabel="а" /> + <Key + latin:keyLabel="п" /> + <Key + latin:keyLabel="р" /> + <Key + latin:keyLabel="о" /> + <Key + latin:keyLabel="л" /> + <Key + latin:keyLabel="д" /> + <Key + latin:keyLabel="ж" /> + <Key + latin:keyLabel="э" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-9.375%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.125%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="12.750%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="ю" /> + <include + latin:keyboardLayout="@xml/kbd_row3_right2" /> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw768dp/kbd_rows_scandinavian.xml b/java/res/xml-sw768dp/kbd_rows_scandinavian.xml new file mode 100644 index 000000000..7e9f604f5 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_rows_scandinavian.xml @@ -0,0 +1,151 @@ +<?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.375%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.500%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" /> + <Key + latin:keyLabel="w" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyLabel="å" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-11.500%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.375%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="9.375%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="@string/keylabel_for_scandinavia_row2_10" + latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" /> + <Key + latin:keyLabel="@string/keylabel_for_scandinavia_row2_11" + latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-9.375%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.375%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="12.750%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" /> + <include + latin:keyboardLayout="@xml/kbd_row3_right2" /> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyXPos="-12.750%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw768dp/kbd_rows_serbian.xml b/java/res/xml-sw768dp/kbd_rows_serbian.xml new file mode 100644 index 000000000..4997dabb9 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_rows_serbian.xml @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="7.125%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + 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:keyLabel="ђ" /> + <Key + latin:keyLabel="ж" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right"/> + </Row> + <Row + latin:keyWidth="7.250%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.172%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="deleteKeyStyle" + latin:keyXPos="-9.219%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="7.250%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="13.829%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="м" /> + <include + latin:keyboardLayout="@xml/kbd_row3_right2" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-13.750%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw768dp/kbd_rows_spanish.xml b/java/res/xml-sw768dp/kbd_rows_spanish.xml new file mode 100644 index 000000000..300592e6a --- /dev/null +++ b/java/res/xml-sw768dp/kbd_rows_spanish.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row1" /> + <Row + latin:keyWidth="8.125%p" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="10.167%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="ñ" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-15.704%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row3" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml-sw768dp/kbd_symbols.xml b/java/res/xml-sw768dp/kbd_symbols.xml new file mode 100644 index 000000000..0e6103ab9 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_symbols.xml @@ -0,0 +1,195 @@ +<?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" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_currency_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="8.282%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.969%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="1" + latin:popupCharacters="¹,½,⅓,¼,⅛" /> + <Key + latin:keyLabel="2" + latin:popupCharacters="²,⅔" /> + <Key + latin:keyLabel="3" + latin:popupCharacters="³,¾,⅜" /> + <Key + latin:keyLabel="4" + latin:popupCharacters="⁴" /> + <Key + latin:keyLabel="5" + latin:popupCharacters="⅝" /> + <Key + latin:keyLabel="6" /> + <Key + latin:keyLabel="7" + latin:popupCharacters="⅞" /> + <Key + latin:keyLabel="8" /> + <Key + latin:keyLabel="9" /> + <Key + latin:keyLabel="0" + latin:popupCharacters="ⁿ,∅" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-9.219%p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.125%p" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.172%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="#" /> + <Key + latin:keyStyle="currencyKeyStyle" /> + <Key + latin:keyLabel="%" + latin:popupCharacters="‰" /> + <Key + latin:keyLabel="&" /> + <Key + latin:keyLabel="*" + latin:popupCharacters="†,‡,★" /> + <Key + latin:keyLabel="-" + latin:popupCharacters="_,–,—" /> + <Key + latin:keyLabel="+" + latin:popupCharacters="±" /> + <Key + latin:keyLabel="(" + latin:popupCharacters="[,{,<" /> + <Key + latin:keyLabel=")" + latin:popupCharacters="],},>" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-15.704%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.047%p" + > + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="13.829%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="<" + latin:popupCharacters="≤,«,‹" /> + <Key + latin:keyLabel=">" + latin:popupCharacters="≥,»,›" /> + <Key + latin:keyLabel="=" + latin:popupCharacters="≠,≈" /> + <switch> + <case + latin:mode="url" + > + <Key + latin:keyLabel="\'" + latin:popupCharacters="‘,’,‚,‛" /> + </case> + <default> + <Key + latin:keyLabel=":" /> + </default> + </switch> + <Key + latin:keyLabel=";" /> + <Key + latin:keyLabel="," /> + <Key + latin:keyLabel="." /> + <Key + latin:keyLabel="!" + latin:popupCharacters="¡" /> + <Key + latin:keyLabel="\?" + latin:popupCharacters="¿" /> + <Key + latin:keyStyle="moreKeyStyle" + latin:keyXPos="-13.750%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row + latin:keyWidth="8.047%p" + > + <switch> + <case + latin:hasSettingsKey="true" + > + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="8.047%p" /> + </case> + </switch> + <Key + latin:keyLabel="/" + latin:keyXPos="15.157%p" /> + <Key + latin:keyLabel="\@" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyXPos="31.250%p" + latin:keyWidth="37.500%p" /> + <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. --> + <!-- latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" --> + <Key + latin:keyLabel=""" + latin:popupCharacters="“,”,«,»,‘,’,‚,‛" /> + <Key + latin:keyLabel="_" /> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" + latin:keyXPos="-8.047%p" + latin:keyWidth="fillRight" /> + </case> + </switch> + </Row> +</Keyboard> diff --git a/java/res/xml-sw768dp/kbd_symbols_shift.xml b/java/res/xml-sw768dp/kbd_symbols_shift.xml new file mode 100644 index 000000000..b36814104 --- /dev/null +++ b/java/res/xml-sw768dp/kbd_symbols_shift.xml @@ -0,0 +1,175 @@ +<?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" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <!-- This row is intentionally not marked as a top row --> + <Row + latin:keyWidth="8.282%p" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="7.969%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="~" /> + <Key + latin:keyLabel="`" /> + <Key + latin:keyLabel="|" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="•" + latin:popupCharacters="♪,♥,♠,♦,♣" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="√" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="π" + latin:popupCharacters="Π" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="÷" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="×" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="§" + latin:popupCharacters="¶" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="Δ" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-9.219%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.125%p" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyLabelOption="alignLeft" + latin:keyWidth="11.172%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="£" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¢" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="€" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¥" /> + <Key + latin:keyLabel="^" + latin:popupCharacters="↑,↓,←,→" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="°" + latin:popupCharacters="′,″" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="±" + latin:popupCharacters="∞" /> + <Key + latin:keyLabel="{" /> + <Key + latin:keyLabel="}" /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyXPos="-15.704%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.047%p" + > + <Key + latin:keyStyle="moreKeyStyle" + latin:keyWidth="13.829%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="\\" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="©" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="®" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="™" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="℅" /> + <Key + latin:keyLabel="[" /> + <Key + latin:keyLabel="]" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¡" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¿" /> + <Key + latin:keyStyle="moreKeyStyle" + latin:keyXPos="-13.750%p" + latin:keyWidth="fillBoth" + latin:keyEdgeFlags="right" /> + </Row> + <!-- This row is intentionally not marked as a bottom row --> + <Row + latin:keyWidth="8.047%p" + > + <switch> + <case latin:hasSettingsKey="true"> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="8.047%p" /> + </case> + </switch> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyXPos="31.250%p" + latin:keyWidth="37.500%p" /> + <switch> + <case + latin:voiceKeyEnabled="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" + latin:keyXPos="-8.047%p" + latin:keyWidth="fillRight" /> + </case> + </switch> + </Row> +</Keyboard> diff --git a/java/res/xml-tr/kbd_qwerty.xml b/java/res/xml-tr/kbd_qwerty.xml new file mode 100644 index 000000000..d2c38f60a --- /dev/null +++ b/java/res/xml-tr/kbd_qwerty.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyboardLocale="tr" +> + <include + latin:keyboardLayout="@xml/kbd_rows_qwerty" /> +</Keyboard> diff --git a/java/res/xml/kbd_currency_key_styles.xml b/java/res/xml/kbd_currency_key_styles.xml new file mode 100644 index 000000000..9d3bb4725 --- /dev/null +++ b/java/res/xml/kbd_currency_key_styles.xml @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <switch> + <case + latin:passwordInput="true" + > + <key-style + latin:styleName="currencyKeyStyle" + latin:keyLabel="$" /> + </case> + <!-- Countries using Euro currency, 23 countries as for January 2011. --> + 1. Andorra (ca_AD, ca_ES) + 2. Austria (de_AT) + 3. Belgium (nl_BE, fr_BE, de_BE) + 4. Cyprus (el_CY, tr_CY) + 5. Estonia (et_EE) + 6. Finland (fi_FI, sv_FI) + 7. France (fr_FR) + 8. Germany (de_DE) + 9. Greece (el_GR) + 10. Ireland (ga_IE, en_IE) + 11. Italy (it_IT) + 12. Kosovo (??_XK) ?? + 13. Luxembourg (lb_LU, fr_LU, de_LU) + 14. Malta (mt_MT, en_MT) + 15. Monaco (fr_MO) + 16. Montenegro (sla_ME) + 17. Netherlands (nl_NL) + 18. Portugal (pt_PT) + 19. San Marino (it_SM) + 20. Slovakia (sk_SK) + 21. Slovenia (sl_SI) + 22. Spain (es_ES, ca_ES) + 23. Vatican City (it_VA) + --> + <!-- Note: Some locales may not have country code, and it it supposed to indicate the + country where the language originally/mainly spoken. --> + <case + latin:localeCode="de|es|el|fi|fr|it|nl|sk|sl|pt_PT" + > + <key-style + latin:styleName="currencyKeyStyle" + latin:keyLabel="€" + latin:popupCharacters="@string/alternates_for_currency_euro" /> + </case> + <case + latin:languageCode="ca|et|lb|mt|sla" + > + <key-style + latin:styleName="currencyKeyStyle" + latin:keyLabel="€" + latin:popupCharacters="@string/alternates_for_currency_euro" /> + </case> + <case + latin:countryCode="AD|AT|BE|CY|EE|FI|FR|DE|GR|IE|IT|XK|LU|MT|MO|ME|NL|PT|SM|SK|SI|ES|VA" + > + <key-style + latin:styleName="currencyKeyStyle" + latin:keyLabel="€" + latin:popupCharacters="@string/alternates_for_currency_euro" /> + </case> + <!-- United Kingdom --> + <case + latin:countryCode="GB" + > + <key-style + latin:styleName="currencyKeyStyle" + latin:keyLabel="£" + latin:popupCharacters="@string/alternates_for_currency_pound" /> + </case> + <default> + <key-style + latin:styleName="currencyKeyStyle" + latin:keyLabel="$" + latin:popupCharacters="@string/alternates_for_currency_dollar" /> + </default> + </switch> +</merge> diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml new file mode 100644 index 000000000..63d519c4c --- /dev/null +++ b/java/res/xml/kbd_key_styles.xml @@ -0,0 +1,216 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <!-- Base key style for the functional key --> + <key-style + latin:styleName="functionalKeyStyle" + latin:isFunctional="true" /> + <!-- Base key style for the key which may have settings key as popup key --> + <switch> + <case + latin:clobberSettingsKey="true" + > + <key-style + latin:styleName="settingsPopupStyle" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:clobberSettingsKey="false" + latin:hasSettingsKey="true" + > + <key-style + latin:styleName="settingsPopupStyle" + latin:parentStyle="functionalKeyStyle" /> + </case> + <!-- clobberSettingsKey="false" and hasSettingsKey="false" --> + <default> + <key-style + latin:styleName="settingsPopupStyle" + latin:keyLabelOption="popupHint" + latin:popupCharacters="\@icon/5|\@integer/key_settings" + latin:parentStyle="functionalKeyStyle" /> + </default> + </switch> + <!-- Functional key styles --> + <key-style + latin:styleName="shiftKeyStyle" + latin:code="@integer/key_shift" + latin:keyIcon="iconShiftKey" + latin:keyIconShifted="iconShiftedShiftKey" + latin:parentStyle="functionalKeyStyle" + latin:isSticky="true" /> + <key-style + latin:styleName="deleteKeyStyle" + latin:code="@integer/key_delete" + latin:keyIcon="iconDeleteKey" + latin:parentStyle="functionalKeyStyle" + latin:isRepeatable="true" /> + <!-- Return key style --> + <switch> + <case + latin:imeAction="actionGo" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyLabel="@string/label_go_key" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:imeAction="actionNext" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyLabel="@string/label_next_key" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:imeAction="actionDone" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyLabel="@string/label_done_key" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:imeAction="actionSend" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyLabel="@string/label_send_key" + latin:parentStyle="functionalKeyStyle" /> + </case> + <case + latin:imeAction="actionSearch" + > + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyIcon="iconSearchKey" + latin:parentStyle="functionalKeyStyle" /> + </case> + <default> + <key-style + latin:styleName="returnKeyStyle" + latin:code="@integer/key_return" + latin:keyIcon="iconReturnKey" + latin:parentStyle="functionalKeyStyle" /> + </default> + </switch> + <key-style + latin:styleName="spaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIconPreview="iconPreviewSpaceKey" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="smileyKeyStyle" + latin:keyLabel=":-)" + latin:keyOutputText=":-) " + latin:keyLabelOption="popupHint" + latin:popupCharacters="@string/alternates_for_smiley" + latin:maxPopupKeyboardColumn="5" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="shortcutKeyStyle" + latin:code="@integer/key_shortcut" + latin:keyIcon="iconShortcutKey" + latin:keyIconPreview="iconPreviewShortcutKey" + latin:parentStyle="settingsPopupStyle" /> + <key-style + latin:styleName="settingsKeyStyle" + latin:code="@integer/key_settings" + latin:keyIcon="iconSettingsKey" + latin:keyIconPreview="iconPreviewSettingsKey" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="tabKeyStyle" + latin:code="@integer/key_tab" + latin:keyIcon="iconTabKey" + latin:keyIconPreview="iconPreviewTabKey" + 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="iconTabKey" + latin:keyIconPreview="iconPreviewTabKey" /> + <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="iconToSymbolKeyWithShortcut" + 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="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" /> + <switch> + <case + latin:passwordInput="true" + > + <key-style + latin:styleName="nonPasswordSymbolKeyStyle" + latin:enabled="false" /> + <key-style + latin:styleName="nonPasswordFunctionalKeyStyle" + latin:enabled="false" + latin:parentStyle="functionalKeyStyle" /> + </case> + <!-- latin:passwordInput="false" --> + <default> + <key-style + latin:styleName="nonPasswordSymbolKeyStyle" + latin:enabled="true" /> + <key-style + latin:styleName="nonPasswordFunctionalKeyStyle" + latin:enabled="true" + latin:parentStyle="functionalKeyStyle" /> + </default> + </switch> +</merge> diff --git a/java/res/xml/kbd_number.xml b/java/res/xml/kbd_number.xml new file mode 100644 index 000000000..429b81846 --- /dev/null +++ b/java/res/xml/kbd_number.xml @@ -0,0 +1,141 @@ +<?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="26.67%p" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_numkey_styles" /> + <switch> + <case + latin:passwordInput="true" + > + <Row + latin:rowEdgeFlags="top" + > + <Key + latin:keyStyle="num1KeyStyle" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="num2KeyStyle" /> + <Key + latin:keyStyle="num3KeyStyle" /> + </Row> + <Row> + <Key + latin:keyStyle="num4KeyStyle" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="num5KeyStyle" /> + <Key + latin:keyStyle="num6KeyStyle" /> + </Row> + <Row> + <Key + latin:keyStyle="num7KeyStyle" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="num8KeyStyle" /> + <Key + latin:keyStyle="num9KeyStyle" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:rowEdgeFlags="bottom" + > + <Spacer /> + <Key + latin:keyStyle="num0KeyStyle" /> + <Spacer /> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + </case> + <!-- latin:passwordInput="false" --> + <default> + <Row + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="1" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="2" /> + <Key + latin:keyLabel="3" /> + <Key + latin:keyLabel="-" + latin:keyStyle="functionalKeyStyle" + latin:keyWidth="fillRight" + 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="fillRight" + 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="fillRight" + 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="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + </default> + </switch> +</Keyboard> diff --git a/java/res/xml/kbd_numkey_styles.xml b/java/res/xml/kbd_numkey_styles.xml new file mode 100644 index 000000000..3a26a022b --- /dev/null +++ b/java/res/xml/kbd_numkey_styles.xml @@ -0,0 +1,95 @@ +<?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" +> + <key-style + latin:styleName="num0KeyStyle" + latin:code="48" + latin:keyIcon="iconNum0Key" /> + <key-style + latin:styleName="num1KeyStyle" + latin:code="49" + latin:keyIcon="iconNum1Key" /> + <key-style + latin:styleName="num2KeyStyle" + latin:code="50" + latin:keyIcon="iconNum2Key" /> + <key-style + latin:styleName="num3KeyStyle" + latin:code="51" + latin:keyIcon="iconNum3Key" /> + <key-style + latin:styleName="num4KeyStyle" + latin:code="52" + latin:keyIcon="iconNum4Key" /> + <key-style + latin:styleName="num5KeyStyle" + latin:code="53" + latin:keyIcon="iconNum5Key" /> + <key-style + latin:styleName="num6KeyStyle" + latin:code="54" + latin:keyIcon="iconNum6Key" /> + <key-style + latin:styleName="num7KeyStyle" + latin:code="55" + latin:keyIcon="iconNum7Key" /> + <key-style + latin:styleName="num8KeyStyle" + latin:code="56" + latin:keyIcon="iconNum8Key" /> + <key-style + latin:styleName="num9KeyStyle" + latin:code="57" + latin:keyIcon="iconNum9Key" /> + <key-style + latin:styleName="numLabelStyle" + latin:keyLabelOption="fontFixedWidth|followKeyLetterRatio" /> + <key-style + latin:styleName="numLabelFunctionalStyle" + latin:keyLabelOption="fontFixedWidth|followKeyLetterRatio" + latin:parentStyle="functionalKeyStyle" /> + <key-style + latin:styleName="numStarKeyStyle" + latin:code="42" + latin:keyLabel="\uff0a" + latin:parentStyle="numLabelStyle" /> + <key-style + latin:styleName="numPoundKeyStyle" + latin:keyLabel="#" + latin:parentStyle="numLabelStyle" /> + <key-style + latin:styleName="numSwitchToAltKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyLabel="@string/label_to_phone_symbols_key" + latin:parentStyle="numLabelStyle" /> + <key-style + latin:styleName="numSwitchToNumericKeyStyle" + latin:code="@integer/key_switch_alpha_symbol" + latin:keyLabel="@string/label_to_phone_numeric_key" + latin:parentStyle="numLabelStyle" /> + <key-style + latin:styleName="numSpaceKeyStyle" + latin:code="@integer/key_space" + latin:keyIcon="iconSpaceKey" + latin:keyIconPreview="iconPreviewSpaceKey" /> +</merge> diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml index 10774c666..794528c2b 100644 --- a/java/res/xml/kbd_phone.xml +++ b/java/res/xml/kbd_phone.xml @@ -19,88 +19,69 @@ --> <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:keyWidth="26.67%p" > + <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="numLabelFunctionalStyle" + latin:keyWidth="fillRight" + 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="numLabelFunctionalStyle" + latin:keyWidth="fillRight" + 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="fillRight" + 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="numSwitchToAltKeyStyle" + 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="fillRight" + 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..1405c3c21 100644 --- a/java/res/xml/kbd_phone_symbols.xml +++ b/java/res/xml/kbd_phone_symbols.xml @@ -19,84 +19,81 @@ --> <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:keyWidth="26.67%p" > + <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:keyStyle="numLabelStyle" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="/" /> + latin:keyLabel="/" + latin:keyStyle="numLabelStyle" /> <Key - android:keyLabel=")" /> + latin:keyLabel=")" + latin:keyStyle="numLabelStyle" /> <Key - android:keyLabel="-" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyLabel="-" + latin:keyStyle="numLabelFunctionalStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:keyLabel="N" - android:keyEdgeFlags="left" /> + latin:keyLabel="N" + latin:keyStyle="numLabelStyle" + 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="," + latin:keyStyle="numLabelStyle" /> <Key - android:keyLabel="." - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyLabel="." + latin:keyStyle="numLabelFunctionalStyle" + latin:keyWidth="fillRight" + 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:keyLabel="#" + latin:keyStyle="numLabelStyle" /> <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="fillRight" + 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:keyStyle="numSwitchToNumericKeyStyle" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="+" /> + latin:keyLabel="+" + latin:keyStyle="numLabelStyle" /> <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="fillRight" + latin:keyEdgeFlags="right" /> </Row> </Keyboard> diff --git a/java/res/xml/kbd_phone_symbols_black.xml b/java/res/xml/kbd_phone_symbols_black.xml deleted file mode 100644 index 4d686e145..000000000 --- a/java/res/xml/kbd_phone_symbols_black.xml +++ /dev/null @@ -1,98 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="26.67%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="(" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="/" /> - <Key - android:keyLabel=")" /> - <Key - android:keyLabel="-" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="N" - android:keyEdgeFlags="left" /> - <!-- Pause is a comma. Check PhoneNumberUtils.java to see if this - has changed. --> - <Key - android:codes="44" - android:keyLabel="Pause" /> - <Key - android:keyLabel="," /> - <Key - android:keyLabel="." - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="42" - android:keyIcon="@drawable/sym_bkeyboard_numstar" - android:keyEdgeFlags="left" /> - <!-- Wait is a semicolon. --> - <Key - android:codes="59" - android:keyLabel="Wait" /> - <Key - android:codes="35" - android:keyIcon="@drawable/sym_bkeyboard_numpound" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="20%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_phone_key" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="+" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml index a287be1fd..9ee27493d 100644 --- a/java/res/xml/kbd_popup_template.xml +++ b/java/res/xml/kbd_popup_template.xml @@ -18,10 +18,10 @@ */ --> -<Keyboard xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:keyWidth="10%p" + latin:horizontalGap="@dimen/key_horizontal_gap" + latin:verticalGap="0px" + latin:rowHeight="@dimen/popup_key_height" > </Keyboard> diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml index a4ab0f8fe..40917b921 100644 --- a/java/res/xml/kbd_qwerty.xml +++ b/java/res/xml/kbd_qwerty.xml @@ -19,487 +19,9 @@ --> <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:keyboardLocale="en_GB,en_US" > - <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_rows_qwerty" /> </Keyboard> diff --git a/java/res/xml/kbd_qwerty_black.xml b/java/res/xml/kbd_qwerty_black.xml deleted file mode 100644 index 787e4ef7c..000000000 --- a/java/res/xml/kbd_qwerty_black.xml +++ /dev/null @@ -1,447 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2008, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="@dimen/key_bottom_gap" - android:keyHeight="@dimen/key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel="q" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_q" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="w" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_w" /> - <Key - android:keyLabel="e" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_e" /> - <Key - android:keyLabel="r" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_r" /> - <Key - android:keyLabel="t" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_t" /> - <Key - android:keyLabel="y" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_y" /> - <Key - android:keyLabel="u" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_u" /> - <Key - android:keyLabel="i" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_i" /> - <Key - android:keyLabel="o" - android:popupKeyboard="@xml/kbd_popup_narrow_template" - android:popupCharacters="@string/alternates_for_o" /> - <Key - android:keyLabel="p" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_p" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:keyLabel="a" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_a" - android:horizontalGap="5%p" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="s" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_s" /> - <Key - android:keyLabel="d" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_d" /> - <Key - android:keyLabel="f" /> - <Key - android:keyLabel="g" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_g" /> - <Key - android:keyLabel="h" /> - <Key - android:keyLabel="j" /> - <Key - android:keyLabel="k" /> - <Key - android:keyLabel="l" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_l" - android:keyEdgeFlags="right" /> - </Row> - <Row> - <Key - android:codes="@integer/key_shift" - android:keyIcon="@drawable/sym_bkeyboard_shift" - android:iconPreview="@drawable/sym_keyboard_feedback_shift" - android:keyWidth="15%p" - android:isModifier="true" - android:isSticky="true" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="z" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_z" /> - <Key - android:keyLabel="x" /> - <Key - android:keyLabel="c" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_c" /> - <Key - android:keyLabel="v" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_v" /> - <Key - android:keyLabel="b" /> - <Key - android:keyLabel="n" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="@string/alternates_for_n" /> - <Key - android:keyLabel="m" /> - <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_bkeyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="20%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="20%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" - android:keyWidth="20%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_normal_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_url_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_email_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_im_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:keyLabel=":-)" - android:keyOutputText=":-) " - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_smileys" - android:keyWidth="25%p" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_webentry_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_symbol_key" - android:keyWidth="15%p" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_bkeyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" /> - <Key - android:codes="@integer/key_f1" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_bkeyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" /> - <Key - android:codes="@integer/key_tab" - android:keyIcon="@drawable/sym_bkeyboard_tab" - android:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_bkeyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="15%p" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/kbd_qwerty_f1.xml b/java/res/xml/kbd_qwerty_f1.xml new file mode 100644 index 000000000..51b9800e0 --- /dev/null +++ b/java/res/xml/kbd_qwerty_f1.xml @@ -0,0 +1,116 @@ +<?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="true" + > + <switch> + <case + latin:mode="url" + > + <Key + latin:keyLabel="/" + latin:keyWidth="9.2%p" + latin:keyStyle="settingsPopupStyle" /> + </case> + <case + latin:mode="email" + > + <Key + latin:keyLabel="\@" + latin:keyWidth="9.2%p" + latin:keyStyle="settingsPopupStyle" /> + </case> + <default> + <switch> + <case + latin:hasVoiceKey="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" + latin:keyWidth="9.2%p" /> + </case> + <!-- latin:hasVoiceKey="false" --> + <case + latin:navigateAction="true" + > + <Key + latin:keyLabel="." + latin:keyWidth="9.2%p" + latin:keyStyle="settingsPopupStyle" /> + </case> + <default> + <Key + latin:keyLabel="," + latin:keyWidth="9.2%p" + latin:keyStyle="settingsPopupStyle" /> + </default> + </switch> + </default> + </switch> + </case> + <!-- hasSettingsKey="false" --> + <default> + <switch> + <case + latin:mode="url" + > + <Key + latin:keyLabel="/" + latin:keyStyle="settingsPopupStyle" /> + </case> + <case + latin:mode="email" + > + <Key + latin:keyLabel="\@" + latin:keyStyle="settingsPopupStyle" /> + </case> + <default> + <switch> + <case + latin:hasVoiceKey="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" /> + </case> + <!-- latin:hasVoiceKey="false" --> + <case + latin:navigateAction="true" + > + <Key + latin:keyLabel="." + latin:keyStyle="settingsPopupStyle" /> + </case> + <default> + <Key + latin:keyLabel="," + latin:keyStyle="settingsPopupStyle" /> + </default> + </switch> + </default> + </switch> + </default> + </switch> +</merge> diff --git a/java/res/xml/kbd_qwerty_row1.xml b/java/res/xml/kbd_qwerty_row1.xml new file mode 100644 index 000000000..8c3669de0 --- /dev/null +++ b/java/res/xml/kbd_qwerty_row1.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="10%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="q" + latin:keyHintLetter="1" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:keyHintLetter="2" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:keyHintLetter="3" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:keyHintLetter="4" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:keyHintLetter="5" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:keyHintLetter="6" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:keyHintLetter="7" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:keyHintLetter="8" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:keyHintLetter="9" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:keyHintLetter="0" + latin:popupCharacters="@string/alternates_for_p" + latin:keyWidth="fillRight" + 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..57bbad75a --- /dev/null +++ b/java/res/xml/kbd_qwerty_row2.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" + latin:keyXPos="5%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" + latin:keyEdgeFlags="right" /> + <!-- Here is 5%p space --> + </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..98f0404c0 --- /dev/null +++ b/java/res/xml/kbd_qwerty_row3.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15%p" + latin:visualInsetsRight="1%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="fillBoth" + latin:visualInsetsLeft="1%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..095133929 --- /dev/null +++ b/java/res/xml/kbd_qwerty_row4.xml @@ -0,0 +1,115 @@ +<?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="true" + > + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyWidth="13.75%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="9.2%p" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f1" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="35.83%p" /> + <switch> + <case + latin:navigateAction="true" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="popupHint" + latin:popupCharacters="@string/alternates_for_web_tab_punctuation" + latin:keyWidth="9.2%p" + latin:maxPopupKeyboardColumn="8" /> + </case> + <default> + <Key + latin:keyLabel="." + latin:keyLabelOption="popupHint" + latin:popupCharacters="@string/alternates_for_punctuation" + latin:keyWidth="9.2%p" + latin:maxPopupKeyboardColumn="7" + latin:keyStyle="functionalKeyStyle" /> + </default> + </switch> + </case> + <!-- latin:hasSettingsKey="false" --> + <default> + <Key + latin:keyStyle="toSymbolKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f1" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="50%p" /> + <switch> + <case + latin:navigateAction="true" + > + <Key + latin:keyStyle="tabKeyStyle" + latin:keyLabelOption="popupHint" + latin:popupCharacters="@string/alternates_for_web_tab_punctuation" + latin:maxPopupKeyboardColumn="8" /> + </case> + <default> + <Key + latin:keyLabel="." + latin:keyLabelOption="popupHint" + latin:popupCharacters="@string/alternates_for_punctuation" + latin:maxPopupKeyboardColumn="7" + latin:keyStyle="functionalKeyStyle" /> + </default> + </switch> + </default> + </switch> + <switch> + <case + latin:mode="im" + > + <Key + latin:keyStyle="smileyKeyStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </case> + <default> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </default> + </switch> + </Row> +</merge> diff --git a/java/res/xml/kbd_rows_arabic.xml b/java/res/xml/kbd_rows_arabic.xml new file mode 100644 index 000000000..a548775a4 --- /dev/null +++ b/java/res/xml/kbd_rows_arabic.xml @@ -0,0 +1,122 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- This file for Arabic layout is an alpha version. It allows to enter --> +<!-- some right-to-left text, but it has gone through no study whatsoever, --> +<!-- and needs to be run through UX. --> +<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" + > + <Key + latin:keyLabel="ض" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ص" /> + <Key + latin:keyLabel="ق" /> + <Key + latin:keyLabel="ف" + latin:popupCharacters="ڤ" /> + <Key + latin:keyLabel="غ" /> + <Key + latin:keyLabel="ع" /> + <Key + latin:keyLabel="ه" + latin:popupCharacters="هـ" /> + <Key + latin:keyLabel="خ" /> + <Key + latin:keyLabel="ح" /> + <Key + latin:keyLabel="ج" + latin:popupCharacters="چ" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyLabel="ش" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="س" /> + <Key + latin:keyLabel="ي" + latin:popupCharacters="ى,ئ" /> + <Key + latin:keyLabel="ب" + latin:popupCharacters="پ" /> + <Key + latin:keyLabel="ل" + latin:popupCharacters="لا" /> + <Key + latin:keyLabel="ا" + latin:popupCharacters="أ,إ,آ,ء" /> + <Key + latin:keyLabel="ت" /> + <Key + latin:keyLabel="ن" /> + <Key + latin:keyLabel="م" /> + <Key + latin:keyLabel="ك" + latin:popupCharacters="گ" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="9.7%p" + > + <Key + latin:keyLabel="ظ" + 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:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" + latin:visualInsetsLeft="1%p" + latin:keyEdgeFlags="right" /> + </Row> + <include latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml/kbd_rows_azerty.xml b/java/res/xml/kbd_rows_azerty.xml new file mode 100644 index 000000000..9825c4a10 --- /dev/null +++ b/java/res/xml/kbd_rows_azerty.xml @@ -0,0 +1,143 @@ +<?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:keyHintLetter="1" + latin:popupCharacters="@string/alternates_for_a" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="z" + latin:keyHintLetter="2" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="e" + latin:keyHintLetter="3" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:keyHintLetter="4" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:keyHintLetter="5" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:keyHintLetter="6" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:keyHintLetter="7" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:keyHintLetter="8" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:keyHintLetter="9" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:keyHintLetter="0" + latin:popupCharacters="@string/alternates_for_p" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyLabel="q" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="m" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15%p" + latin:visualInsetsRight="1%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:popupCharacters="‘,’,‚,‛" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" + latin:visualInsetsLeft="1%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml/kbd_rows_hebrew.xml b/java/res/xml/kbd_rows_hebrew.xml new file mode 100644 index 000000000..c3c8f7d3e --- /dev/null +++ b/java/res/xml/kbd_rows_hebrew.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- This file for Hebrew layout is an alpha version. It allows to enter --> +<!-- some right-to-left text, but it has gone through no study whatsoever, --> +<!-- and needs to be run through UX. --> +<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="ק" + latin:keyXPos="5%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ר" /> + <Key + latin:keyLabel="א" /> + <Key + latin:keyLabel="ט" /> + <Key + latin:keyLabel="ו" /> + <Key + latin:keyLabel="ן" /> + <Key + latin:keyLabel="ם" /> + <Key + latin:keyLabel="פ" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" + latin:visualInsetsLeft="1%p" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyLabel="ש" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ד" /> + <Key + latin:keyLabel="ג" /> + <Key + latin:keyLabel="כ" /> + <Key + latin:keyLabel="ע" /> + <Key + latin:keyLabel="י" /> + <Key + latin:keyLabel="ח" /> + <Key + latin:keyLabel="ל" /> + <Key + latin:keyLabel="ך" /> + <Key + latin:keyLabel="ף" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyLabel="ז" + latin:keyXPos="5%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="ץ" + latin:keyEdgeFlags="right" /> + <!-- Here is 5%p space --> + </Row> + <include latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml/kbd_rows_qwerty.xml b/java/res/xml/kbd_rows_qwerty.xml new file mode 100644 index 000000000..6237712f6 --- /dev/null +++ b/java/res/xml/kbd_rows_qwerty.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_rows_qwertz.xml b/java/res/xml/kbd_rows_qwertz.xml new file mode 100644 index 000000000..0d70b2637 --- /dev/null +++ b/java/res/xml/kbd_rows_qwertz.xml @@ -0,0 +1,110 @@ +<?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:keyHintLetter="1" + latin:popupCharacters="@string/alternates_for_q" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:keyHintLetter="2" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:keyHintLetter="3" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:keyHintLetter="4" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:keyHintLetter="5" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="z" + latin:keyHintLetter="6" + latin:popupCharacters="@string/alternates_for_z" /> + <Key + latin:keyLabel="u" + latin:keyHintLetter="7" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:keyHintLetter="8" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:keyHintLetter="9" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:keyHintLetter="0" + latin:popupCharacters="@string/alternates_for_p" + latin:keyWidth="fillRight" + 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:visualInsetsRight="1%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="fillRight" + latin:visualInsetsLeft="1%p" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml/kbd_rows_russian.xml b/java/res/xml/kbd_rows_russian.xml new file mode 100644 index 000000000..ff9fef409 --- /dev/null +++ b/java/res/xml/kbd_rows_russian.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="9.091%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="й" + latin:keyHintLetter="1" + latin:popupCharacters="1" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ц" + latin:keyHintLetter="2" + latin:popupCharacters="2" /> + <Key + latin:keyLabel="у" + latin:keyHintLetter="3" + latin:popupCharacters="3" /> + <Key + latin:keyLabel="к" + latin:keyHintLetter="4" + latin:popupCharacters="4" /> + <Key + latin:keyLabel="е" + latin:keyHintLetter="5" + latin:popupCharacters="@string/alternates_for_cyrillic_e" /> + <Key + latin:keyLabel="н" + latin:keyHintLetter="6" + latin:popupCharacters="6" /> + <Key + latin:keyLabel="г" + latin:keyHintLetter="7" + latin:popupCharacters="7" /> + <Key + latin:keyLabel="ш" + latin:keyHintLetter="8" + latin:popupCharacters="8" /> + <Key + latin:keyLabel="щ" + latin:keyHintLetter="9" + latin:popupCharacters="9" /> + <Key + latin:keyLabel="з" + latin:keyHintLetter="0" + latin:popupCharacters="0" /> + <Key + latin:keyLabel="х" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="9.091%p" + > + <Key + latin:keyLabel="ф" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ы" /> + <Key + latin:keyLabel="в" /> + <Key + latin:keyLabel="а" /> + <Key + latin:keyLabel="п" /> + <Key + latin:keyLabel="р" /> + <Key + latin:keyLabel="о" /> + <Key + latin:keyLabel="л" /> + <Key + latin:keyLabel="д" /> + <Key + latin:keyLabel="ж" /> + <Key + latin:keyLabel="э" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.5%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="11.75%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="я" /> + <Key + latin:keyLabel="ч" /> + <Key + latin:keyLabel="с" /> + <Key + latin:keyLabel="м" /> + <Key + latin:keyLabel="и" /> + <Key + latin:keyLabel="т" /> + <Key + latin:keyLabel="ь" + latin:popupCharacters="@string/alternates_for_cyrillic_soft_sign" /> + <Key + latin:keyLabel="б" /> + <Key + latin:keyLabel="ю" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml/kbd_rows_scandinavian.xml b/java/res/xml/kbd_rows_scandinavian.xml new file mode 100644 index 000000000..2d7dcde7a --- /dev/null +++ b/java/res/xml/kbd_rows_scandinavian.xml @@ -0,0 +1,119 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="9.09%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="q" + latin:keyHintLetter="1" + latin:popupCharacters="@string/alternates_for_q" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="w" + latin:keyHintLetter="2" + latin:popupCharacters="@string/alternates_for_w" /> + <Key + latin:keyLabel="e" + latin:keyHintLetter="3" + latin:popupCharacters="@string/alternates_for_e" /> + <Key + latin:keyLabel="r" + latin:keyHintLetter="4" + latin:popupCharacters="@string/alternates_for_r" /> + <Key + latin:keyLabel="t" + latin:keyHintLetter="5" + latin:popupCharacters="@string/alternates_for_t" /> + <Key + latin:keyLabel="y" + latin:keyHintLetter="6" + latin:popupCharacters="@string/alternates_for_y" /> + <Key + latin:keyLabel="u" + latin:keyHintLetter="7" + latin:popupCharacters="@string/alternates_for_u" /> + <Key + latin:keyLabel="i" + latin:keyHintLetter="8" + latin:popupCharacters="@string/alternates_for_i" /> + <Key + latin:keyLabel="o" + latin:keyHintLetter="9" + latin:popupCharacters="@string/alternates_for_o" /> + <Key + latin:keyLabel="p" + latin:keyHintLetter="0" + latin:popupCharacters="@string/alternates_for_p" /> + <Key + latin:keyLabel="å" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="9.09%p" + > + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" + latin:keyWidth="8.75%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="@string/keylabel_for_scandinavia_row2_10" + latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" /> + <Key + latin:keyLabel="@string/keylabel_for_scandinavia_row2_11" + latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" + latin:keyWidth="fillRight" + 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_rows_serbian.xml b/java/res/xml/kbd_rows_serbian.xml new file mode 100644 index 000000000..9f4b6a203 --- /dev/null +++ b/java/res/xml/kbd_rows_serbian.xml @@ -0,0 +1,136 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="9.09%p" + latin:rowEdgeFlags="top" + > + <Key + latin:keyLabel="љ" + latin:keyHintLetter="1" + latin:popupCharacters="1" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="њ" + latin:keyHintLetter="2" + latin:popupCharacters="2" /> + <Key + latin:keyLabel="е" + latin:keyHintLetter="3" + latin:popupCharacters="3" /> + <Key + latin:keyLabel="р" + latin:keyHintLetter="4" + latin:popupCharacters="4" /> + <Key + latin:keyLabel="т" + latin:keyHintLetter="5" + latin:popupCharacters="5" /> + <Key + latin:keyLabel="з" + latin:keyHintLetter="6" + latin:popupCharacters="6" /> + <Key + latin:keyLabel="у" + latin:keyHintLetter="7" + latin:popupCharacters="7" /> + <Key + latin:keyLabel="и" + latin:keyHintLetter="8" + latin:popupCharacters="8" /> + <Key + latin:keyLabel="о" + latin:keyHintLetter="9" + latin:popupCharacters="9" /> + <Key + latin:keyLabel="п" + latin:keyHintLetter="0" + latin:popupCharacters="0" /> + <Key + latin:keyLabel="ш" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="9.09%p" + > + <Key + latin:keyLabel="а" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="с" /> + <Key + latin:keyLabel="д" /> + <Key + latin:keyLabel="ф" /> + <Key + latin:keyLabel="г" /> + <Key + latin:keyLabel="х" /> + <Key + latin:keyLabel="ј" /> + <Key + latin:keyLabel="к" /> + <Key + latin:keyLabel="л" /> + <Key + latin:keyLabel="ч" /> + <Key + latin:keyLabel="ћ" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <Row + latin:keyWidth="8.90%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="ѕ" /> + <Key + latin:keyLabel="џ" /> + <Key + latin:keyLabel="ц" /> + <Key + latin:keyLabel="в" /> + <Key + latin:keyLabel="б" /> + <Key + latin:keyLabel="н" /> + <Key + latin:keyLabel="м" /> + <Key + latin:keyLabel="ђ" /> + <Key + latin:keyLabel="ж" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row4" /> +</merge> diff --git a/java/res/xml/kbd_rows_spanish.xml b/java/res/xml/kbd_rows_spanish.xml new file mode 100644 index 000000000..c5ead10da --- /dev/null +++ b/java/res/xml/kbd_rows_spanish.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_row1" /> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyLabel="a" + latin:popupCharacters="@string/alternates_for_a" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="s" + latin:popupCharacters="@string/alternates_for_s" /> + <Key + latin:keyLabel="d" + latin:popupCharacters="@string/alternates_for_d" /> + <Key + latin:keyLabel="f" /> + <Key + latin:keyLabel="g" + latin:popupCharacters="@string/alternates_for_g" /> + <Key + latin:keyLabel="h" /> + <Key + latin:keyLabel="j" /> + <Key + latin:keyLabel="k" + latin:popupCharacters="@string/alternates_for_k" /> + <Key + latin:keyLabel="l" + latin:popupCharacters="@string/alternates_for_l" /> + <Key + latin:keyLabel="ñ" + 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_symbols.xml b/java/res/xml/kbd_symbols.xml index bcb6e8ae8..8e9124f74 100644 --- a/java/res/xml/kbd_symbols.xml +++ b/java/res/xml/kbd_symbols.xml @@ -19,196 +19,110 @@ --> <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:keyWidth="10%p" > + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_currency_key_styles" /> <Row - android:rowEdgeFlags="top" + latin:rowEdgeFlags="top" > <Key - android:keyLabel="1" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¹½⅓¼⅛" - android:keyEdgeFlags="left" /> + latin:keyLabel="1" + latin:popupCharacters="¹,½,⅓,¼,⅛" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="2" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="²⅔" /> + latin:keyLabel="2" + latin:popupCharacters="²,⅔" /> <Key - android:keyLabel="3" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="³¾⅜" /> + latin:keyLabel="3" + latin:popupCharacters="³,¾,⅜" /> <Key - android:keyLabel="4" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="⁴" /> + latin:keyLabel="4" + latin:popupCharacters="⁴" /> <Key - android:keyLabel="5" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="⅝" /> + latin:keyLabel="5" + latin:popupCharacters="⅝" /> <Key - android:keyLabel="6" /> + latin:keyLabel="6" /> <Key - android:keyLabel="7" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="⅞" /> + latin:keyLabel="7" + latin:popupCharacters="⅞" /> <Key - android:keyLabel="8" /> + latin:keyLabel="8" /> <Key - android:keyLabel="9" /> + latin:keyLabel="9" /> <Key - android:keyLabel="0" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="ⁿ∅" - android:keyEdgeFlags="right" /> + latin:keyLabel="0" + latin:popupCharacters="ⁿ,∅" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:keyLabel="\@" - android:keyEdgeFlags="left" /> + latin:keyLabel="\@" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="\#" /> + latin:keyLabel="\#" /> <Key - android:keyLabel="$" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¢£€¥₣₤₱" /> + latin:keyStyle="currencyKeyStyle" /> <Key - android:keyLabel="%" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="‰" /> + latin:keyLabel="%" + latin:popupCharacters="‰" /> <Key - android:keyLabel="&" /> + 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="+" - 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="]}>" - android:keyEdgeFlags="right" /> + latin:keyLabel=")" + latin:popupCharacters="],},>" + latin:keyWidth="fillRight" + 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:visualInsetsRight="1%p" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="!" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¡" /> + latin:keyLabel="!" + latin:popupCharacters="¡" /> + <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. --> + <!-- latin:popupCharacters="“,”,„,‟,«,»" --> <Key - android:keyLabel=""" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="“”«»˝" /> + latin:keyLabel=""" + latin:popupCharacters="“,”,«,»" + latin:maxPopupKeyboardColumn="6" /> <Key - android:keyLabel="\'" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="‘’" /> + latin:keyLabel="\'" + latin:popupCharacters="‘,’,‚,‛" /> <Key - android:keyLabel=":" /> + latin:keyLabel=":" /> <Key - android:keyLabel=";" /> + latin:keyLabel=";" /> <Key - android:keyLabel="/" /> + latin:keyLabel="/" /> <Key - android:keyLabel="\?" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="¿" /> + latin:keyLabel="\?" + latin:popupCharacters="¿" /> <Key - android:codes="@integer/key_delete" - android:keyIcon="@drawable/sym_keyboard_delete" - android:iconPreview="@drawable/sym_keyboard_feedback_delete" - android:keyWidth="15%p" - android:isModifier="true" - android:isRepeatable="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_symbols" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_alpha_key" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="40%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="20%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> - </Row> - <Row - android:keyboardMode="@+id/mode_symbols_with_settings_key" - android:rowEdgeFlags="bottom" - > - <Key - android:codes="@integer/key_symbol" - android:keyLabel="@string/label_alpha_key" - android:keyWidth="15%p" - android:isModifier="true" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:iconPreview="@drawable/sym_keyboard_feedback_settings" - android:isModifier="true" /> - <Key - android:codes="@integer/key_f1" - android:isModifier="true" /> - <Key - android:codes="@integer/key_space" - android:keyIcon="@drawable/sym_keyboard_space" - android:iconPreview="@drawable/sym_keyboard_feedback_space" - android:keyWidth="30%p" - android:isModifier="true" /> - <Key - android:keyLabel="." - android:keyIcon="@drawable/hint_popup" - android:popupKeyboard="@xml/popup_punctuation" - android:isModifier="true" /> - <Key - android:codes="@integer/key_return" - android:keyIcon="@drawable/sym_keyboard_return" - android:iconPreview="@drawable/sym_keyboard_feedback_return" - android:keyWidth="25%p" - android:isModifier="true" - android:keyEdgeFlags="right" /> + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" + latin:visualInsetsLeft="1%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="&" /> - <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="[{<" /> - <Key - android:keyLabel=")" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="]}>" - 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=""" - 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..da5b5fc8d --- /dev/null +++ b/java/res/xml/kbd_symbols_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:hasSettingsKey="true" + > + <switch> + <case + latin:hasVoiceKey="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" + latin:keyWidth="9.2%p" /> + </case> + <!-- latin:hasVoiceKey="false" --> + <default> + <Key + latin:keyLabel="," + latin:keyWidth="9.2%p" + latin:keyStyle="settingsPopupStyle" /> + </default> + </switch> + </case> + <!-- hasSettingsKey="false" --> + <default> + <switch> + <case + latin:hasVoiceKey="true" + > + <Key + latin:keyStyle="shortcutKeyStyle" /> + </case> + <!-- latin:hasVoiceKey="false" --> + <default> + <Key + latin:keyLabel="," + latin:keyStyle="settingsPopupStyle" /> + </default> + </switch> + </default> + </switch> +</merge> diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml new file mode 100644 index 000000000..9323d4fd1 --- /dev/null +++ b/java/res/xml/kbd_symbols_row4.xml @@ -0,0 +1,88 @@ +<?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="true" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyWidth="13.75%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="9.2%p" /> + <include + latin:keyboardLayout="@xml/kbd_qwerty_f1" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="35.83%p" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="popupHint" + latin:popupCharacters="@string/alternates_for_punctuation" + latin:keyWidth="9.2%p" + latin:maxPopupKeyboardColumn="7" + latin:keyStyle="functionalKeyStyle" /> + </case> + <!-- latin:hasSettingsKey="false" --> + <default> + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + <include + latin:keyboardLayout="@xml/kbd_symbols_f1" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="50%p" /> + <Key + latin:keyLabel="." + latin:keyLabelOption="popupHint" + latin:popupCharacters="@string/alternates_for_punctuation" + latin:maxPopupKeyboardColumn="7" + latin:keyStyle="functionalKeyStyle" /> + </default> + </switch> + <switch> + <case + latin:mode="im" + > + <Key + latin:keyStyle="smileyKeyStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </case> + <default> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </default> + </switch> + </Row> +</merge> diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml index 9bee22069..f22d45aff 100644 --- a/java/res/xml/kbd_symbols_shift.xml +++ b/java/res/xml/kbd_symbols_shift.xml @@ -19,171 +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:keyWidth="10%p" > + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> <Row - android:rowEdgeFlags="top" + latin:rowEdgeFlags="top" > <Key - android:keyLabel="~" - android:keyEdgeFlags="left" /> + latin:keyLabel="~" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="`" /> + latin:keyLabel="`" /> <Key - android:keyLabel="|" /> + latin:keyLabel="|" /> <Key - android:keyLabel="•" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="♪♥♠♦♣" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="•" + latin:popupCharacters="♪,♥,♠,♦,♣" /> <Key - android:keyLabel="√" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="√" /> <Key - android:keyLabel="π" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="Π" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="π" + latin:popupCharacters="Π" /> <Key - android:keyLabel="÷" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="÷" /> <Key - android:keyLabel="×" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="×" /> <Key - android:keyLabel="{" /> + latin:keyLabel="{" /> <Key - android:keyLabel="}" - android:keyEdgeFlags="right" /> + latin:keyLabel="}" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> </Row> <Row> <Key - android:codes="@integer/key_tab" - android:keyLabel="\u21E5" - android:keyEdgeFlags="left" /> + latin:keyStyle="nonSpecialBackgroundTabKeyStyle" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="£" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="£" /> <Key - android:keyLabel="¢" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¢" /> <Key - android:keyLabel="€" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="€" /> <Key - android:keyLabel="°" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="°" + latin:popupCharacters="′,″" /> <Key - android:keyLabel="^" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="↑↓←→" /> + latin:keyLabel="^" + latin:popupCharacters="↑,↓,←,→" /> <Key - android:keyLabel="_" /> + latin:keyLabel="_" /> <Key - android:keyLabel="=" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="≠≈∞" /> + latin:keyLabel="=" + latin:popupCharacters="≠,≈,∞" /> <Key - android:keyLabel="[" /> + latin:keyLabel="[" /> <Key - android:keyLabel="]" - android:keyEdgeFlags="right" /> + latin:keyLabel="]" + latin:keyWidth="fillRight" + 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:visualInsetsRight="1%p" + latin:keyEdgeFlags="left" /> <Key - android:keyLabel="™" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="™" /> <Key - android:keyLabel="®" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="®" /> <Key - android:keyLabel="©" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="©" /> <Key - android:keyLabel="¶" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="§" /> + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¶" + latin:popupCharacters="§" /> <Key - android:keyLabel="\\" /> + latin:keyLabel="\\" /> <Key - android:keyLabel="<" - 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: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="fillRight" + latin:visualInsetsLeft="1%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="<" - android:popupKeyboard="@xml/kbd_popup_template" - android:popupCharacters="≤«‹" /> - <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: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..90a96e4bc --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_row4.xml @@ -0,0 +1,87 @@ +<?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="true" + > + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyWidth="13.75%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyStyle="settingsKeyStyle" + latin:keyWidth="9.2%p" /> + <Key + latin:keyLabel="„" + latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" + latin:keyWidth="9.2%p" + latin:keyStyle="nonPasswordFunctionalKeyStyle" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="35.83%p" /> + <Key + latin:keyLabel="…" + latin:keyWidth="9.2%p" + latin:keyStyle="nonPasswordFunctionalKeyStyle" /> + </case> + <!-- latin:hasSettingsKey="false" --> + <default> + <Key + latin:keyStyle="toAlphaKeyStyle" + latin:keyWidth="15%p" + latin:keyEdgeFlags="left" /> + <Key + latin:keyLabel="„" + latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" + latin:keyStyle="nonPasswordFunctionalKeyStyle" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="50%p" /> + <Key + latin:keyLabel="…" + latin:keyStyle="nonPasswordFunctionalKeyStyle" /> + </default> + </switch> + <switch> + <case + latin:mode="im" + > + <Key + latin:keyStyle="smileyKeyStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </case> + <default> + <Key + latin:keyStyle="returnKeyStyle" + latin:keyWidth="fillRight" + latin:keyEdgeFlags="right" /> + </default> + </switch> + </Row> +</merge> diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml index e5654e96d..c9c920378 100644 --- a/java/res/xml/method.xml +++ b/java/res/xml/method.xml @@ -20,7 +20,239 @@ <!-- The attributes in this XML file provide configuration information --> <!-- for the Input Method Manager. --> +<!-- Keyboard: en_US, en_GB, ar, cs, da, de, es, es_US, fi, fr, fr_CA, fr_CH, hr, hu, it, iw, nb, nl, pl, pt, ru, sr, sv, tr --> +<!-- Voice: af, cs, da, de, en, es, fr, it, ja, ko, nl, pl, pt, ru, tr, yue, zh, zu --> +<!-- TODO: use <lang>_keyboard icon instead of a common keyboard icon. --> +<!-- TODO: use <lang>_mic icon instead of a common mic icon. --> +<!-- TODO: remove all comment outed voice subtypes --> +<!-- If IME doesn't have an applicable subtype, the first subtype will be used as a default + subtype.--> <input-method xmlns:android="http://schemas.android.com/apk/res/android" - android:settingsActivity="com.android.inputmethod.latin.LatinIMESettings" - android:isDefault="@bool/im_is_default" -/> + android:settingsActivity="com.android.inputmethod.latin.Settings" + android:isDefault="@bool/im_is_default"> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_en_US_keyboard" + android:imeSubtypeLocale="en_US" + android:imeSubtypeMode="keyboard" + /> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_en_voice" --> +<!-- android:imeSubtypeLocale="en" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_en_GB_keyboard" + android:imeSubtypeLocale="en_GB" + android:imeSubtypeMode="keyboard" + /> + <!-- The file for Arabic layout is an alpha version. It needs to be run through UX. --> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_ar_keyboard" + android:imeSubtypeLocale="ar" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_cs_keyboard" + android:imeSubtypeLocale="cs" + android:imeSubtypeMode="keyboard" + /> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_cs_voice" --> +<!-- android:imeSubtypeLocale="cs" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_da_keyboard" + android:imeSubtypeLocale="da" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_de_keyboard" + android:imeSubtypeLocale="de" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_de_qwerty_keyboard" + android:imeSubtypeLocale="de_ZZ" + android:imeSubtypeMode="keyboard" + /> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_de_voice" --> +<!-- android:imeSubtypeLocale="de" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_es_keyboard" + android:imeSubtypeLocale="es" + android:imeSubtypeMode="keyboard" + /> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_es_voice" --> +<!-- android:imeSubtypeLocale="es" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_fi_keyboard" + android:imeSubtypeLocale="fi" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_fr_keyboard" + android:imeSubtypeLocale="fr" + android:imeSubtypeMode="keyboard" + /> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_fr_voice" --> +<!-- android:imeSubtypeLocale="fr" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_fr_CA_keyboard" + android:imeSubtypeLocale="fr_CA" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_fr_CH_keyboard" + android:imeSubtypeLocale="fr_CH" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_hr_keyboard" + android:imeSubtypeLocale="hr" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_hu_keyboard" + android:imeSubtypeLocale="hu" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_it_keyboard" + android:imeSubtypeLocale="it" + android:imeSubtypeMode="keyboard" + /> + <!-- Java uses the deprecated "iw" code instead of the standard "he" code for Hebrew. --> + <!-- The file for Hebrew layout is an alpha version. It needs to be run through UX. --> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_iw_keyboard" + android:imeSubtypeLocale="iw" + android:imeSubtypeMode="keyboard" + /> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_it_voice" --> +<!-- android:imeSubtypeLocale="it" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_nb_keyboard" + android:imeSubtypeLocale="nb" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_nl_keyboard" + android:imeSubtypeLocale="nl" + android:imeSubtypeMode="keyboard" + /> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_nl_voice" --> +<!-- android:imeSubtypeLocale="nl" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_pl_keyboard" + android:imeSubtypeLocale="pl" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_pt_keyboard" + android:imeSubtypeLocale="pt" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_ru_keyboard" + android:imeSubtypeLocale="ru" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_sr_keyboard" + android:imeSubtypeLocale="sr" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_sv_keyboard" + android:imeSubtypeLocale="sv" + android:imeSubtypeMode="keyboard" + /> + <subtype android:icon="@drawable/ic_subtype_keyboard" + android:label="@string/subtype_mode_tr_keyboard" + android:imeSubtypeLocale="tr" + android:imeSubtypeMode="keyboard" + /> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_af_voice" --> +<!-- android:imeSubtypeLocale="af" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_ja_voice" --> +<!-- android:imeSubtypeLocale="ja" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_ko_voice" --> +<!-- android:imeSubtypeLocale="ko" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_pl_voice" --> +<!-- android:imeSubtypeLocale="pl" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_pt_voice" --> +<!-- android:imeSubtypeLocale="pt" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_ru_voice" --> +<!-- android:imeSubtypeLocale="ru" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_tr_voice" --> +<!-- android:imeSubtypeLocale="tr" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_yue_voice" --> +<!-- android:imeSubtypeLocale="yue" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_zh_voice" --> +<!-- android:imeSubtypeLocale="zh" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> +<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> +<!-- android:label="@string/subtype_mode_zu_voice" --> +<!-- android:imeSubtypeLocale="zu" --> +<!-- android:imeSubtypeMode="voice" --> +<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> +<!-- /> --> +</input-method> diff --git a/java/res/xml/popup_at.xml b/java/res/xml/popup_at.xml deleted file mode 100644 index 197eea445..000000000 --- a/java/res/xml/popup_at.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top|bottom" - > - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="\@" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/popup_comma.xml b/java/res/xml/popup_comma.xml deleted file mode 100644 index 7666f4b62..000000000 --- a/java/res/xml/popup_comma.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top|bottom" - > - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="," - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/popup_domains.xml b/java/res/xml/popup_domains.xml deleted file mode 100644 index 4e9789ff7..000000000 --- a/java/res/xml/popup_domains.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2008, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="15%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top|bottom" - > - <Key - android:keyLabel="@string/popular_domain_1" - android:keyOutputText="@string/popular_domain_1" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="@string/popular_domain_2" - android:keyOutputText="@string/popular_domain_2" /> - <Key - android:keyLabel="@string/popular_domain_3" - android:keyOutputText="@string/popular_domain_3" /> - <Key - android:keyLabel="@string/popular_domain_4" - android:keyOutputText="@string/popular_domain_4" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/popup_mic.xml b/java/res/xml/popup_mic.xml deleted file mode 100644 index 5bbd7dfa5..000000000 --- a/java/res/xml/popup_mic.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top|bottom" - > - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:keyEdgeFlags="left" /> - <Key - android:codes="@integer/key_voice" - android:keyIcon="@drawable/sym_keyboard_mic" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/popup_punctuation.xml b/java/res/xml/popup_punctuation.xml deleted file mode 100644 index c429e38bc..000000000 --- a/java/res/xml/popup_punctuation.xml +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2008, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top" - > - <Key - android:keyLabel=":" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="/" /> - <Key - android:keyLabel="&" /> - <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=""" /> - <Key - android:keyLabel="\?" /> - <Key - android:keyLabel="!" /> - <Key - android:keyLabel="," - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/popup_slash.xml b/java/res/xml/popup_slash.xml deleted file mode 100644 index a38fde0e4..000000000 --- a/java/res/xml/popup_slash.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2010, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<Keyboard - xmlns:android="http://schemas.android.com/apk/res/android" - android:keyWidth="10%p" - android:horizontalGap="0px" - android:verticalGap="0px" - android:keyHeight="@dimen/popup_key_height" -> - <Row - android:rowEdgeFlags="top|bottom" - > - <Key - android:codes="@integer/key_settings" - android:keyIcon="@drawable/sym_keyboard_settings" - android:keyEdgeFlags="left" /> - <Key - android:keyLabel="/" - android:keyEdgeFlags="right" /> - </Row> -</Keyboard> diff --git a/java/res/xml/popup_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..f68ee0168 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -4,9 +4,9 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -14,98 +14,151 @@ limitations under the License. --> -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" - android:title="@string/english_ime_settings" - android:key="english_ime_settings"> - - <CheckBoxPreference +<PreferenceScreen + xmlns:android="http://schemas.android.com/apk/res/android" + android:title="@string/english_ime_settings" + android:key="english_ime_settings"> + <PreferenceCategory + android:title="@string/general_category" + android:key="general_settings"> + <CheckBoxPreference + android:key="auto_cap" + android:title="@string/auto_cap" + android:persistent="true" + android:defaultValue="true" /> + <CheckBoxPreference android:key="vibrate_on" android:title="@string/vibrate_on_keypress" - android:persistent="true" - /> - - <CheckBoxPreference + android:persistent="true" /> + <CheckBoxPreference android:key="sound_on" android:title="@string/sound_on_keypress" - android:persistent="true" - /> - - <CheckBoxPreference + android:defaultValue="@bool/config_default_sound_enabled" + android:persistent="true" /> + <CheckBoxPreference android:key="popup_on" android:title="@string/popup_on_keypress" android:persistent="true" - android:defaultValue="@bool/default_popup_preview" - /> - - <CheckBoxPreference + android:defaultValue="@bool/config_default_popup_preview" /> + <CheckBoxPreference android:key="recorrection_enabled" android:title="@string/prefs_enable_recorrection" android:summary="@string/prefs_enable_recorrection_summary" android:persistent="true" - android:defaultValue="@bool/default_recorrection_enabled" - /> - - <CheckBoxPreference - android:key="auto_cap" - android:title="@string/auto_cap" - android:persistent="true" - android:defaultValue="true" - /> - - <ListPreference + android:defaultValue="@bool/config_default_recorrection_enabled" /> + <ListPreference android:key="settings_key" android:title="@string/prefs_settings_key" android:persistent="true" android:entryValues="@array/settings_key_modes_values" android:entries="@array/settings_key_modes" - android:defaultValue="@string/settings_key_mode_auto" - /> - - <ListPreference + android:defaultValue="@string/settings_key_mode_auto" /> + <ListPreference android:key="voice_mode" android:title="@string/voice_input" android:persistent="true" android:entryValues="@array/voice_input_modes_values" android:entries="@array/voice_input_modes" - android:defaultValue="@string/voice_mode_main" - /> - - - <PreferenceScreen + android:defaultValue="@string/voice_mode_main" /> + <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"/> - </PreferenceScreen> - + android:summary="@string/language_selection_summary" /> + </PreferenceCategory> <PreferenceCategory - android:title="@string/prediction_category" - android:key="prediction_settings"> - + android:title="@string/correction_category" + android:key="correction_settings"> + <PreferenceScreen + android:key="configure_dictionaries_key" + android:title="@string/configure_dictionaries_title"> + <intent + android:action="android.intent.action.MAIN" + android:targetPackage="com.google.android.inputmethod.latin.dictionarypack" + android:targetClass="com.google.android.inputmethod.latin.dictionarypack.DictionarySettings" /> + </PreferenceScreen> <CheckBoxPreference android:key="quick_fixes" android:title="@string/quick_fixes" android:summary="@string/quick_fixes_summary" android:persistent="true" - android:defaultValue="true" - /> - + android:defaultValue="true" /> + <ListPreference + android:key="auto_correction_threshold" + android:title="@string/auto_correction" + android:summary="@string/auto_correction_summary" + android:persistent="true" + android:entryValues="@array/auto_correction_threshold_mode_indexes" + android:entries="@array/auto_correction_threshold_modes" + android:defaultValue="@string/auto_correction_threshold_mode_index_modest" /> + <ListPreference + android:key="show_suggestions_setting" + android:summary="@string/prefs_show_suggestions_summary" + android:title="@string/prefs_show_suggestions" + android:persistent="true" + android:entryValues="@array/prefs_suggestion_visibility_values" + android:entries="@array/prefs_suggestion_visibilities" + android:defaultValue="@string/prefs_suggestion_visibility_default_value" /> + </PreferenceCategory> + <PreferenceCategory + android:title="@string/ngram_category" + android:key="ngram_settings"> <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" - /> - + android:defaultValue="true" /> <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" - /> - </PreferenceCategory> - + android:key="bigram_prediction" + android:dependency="bigram_suggestion" + android:title="@string/bigram_prediction" + android:summary="@string/bigram_prediction_summary" + android:persistent="true" + android:defaultValue="false" /> + </PreferenceCategory> + <PreferenceCategory + android:title="@string/misc_category" + android:key="misc_settings"> + <CheckBoxPreference + android:key="usability_study_mode" + android:title="@string/prefs_usability_study_mode" + android:persistent="true" + android:defaultValue="false" /> + <CheckBoxPreference + android:key="enable_logging" + android:title="@string/prefs_enable_log" + android:summary="@string/prefs_description_log" + android:persistent="true" + android:defaultValue="true" /> + <ListPreference + android:key="pref_keyboard_layout_20100902" + android:title="@string/keyboard_layout" + android:persistent="true" + android:entryValues="@array/keyboard_layout_modes_values" + android:entries="@array/keyboard_layout_modes" + android:defaultValue="@string/config_default_keyboard_theme_id" /> + </PreferenceCategory> + <PreferenceScreen + android:key="pref_advanced_settings" + android:title="@string/advanced_settings" + android:summary="@string/advanced_settings_summary"> + <!-- Values for popup dismiss delay are added programatically --> + <ListPreference + android:key="pref_key_preview_popup_dismiss_delay" + android:title="@string/key_preview_popup_dismiss_delay" /> + <CheckBoxPreference + android:key="pref_key_use_contacts_dict" + android:title="@string/use_contacts_dict" + android:summary="@string/use_contacts_dict_summary" + android:persistent="true" + android:defaultValue="true" /> + </PreferenceScreen> + <!-- <Preference + android:title="Debug Settings" + android:key="debug_settings"> + <intent + android:action="android.intent.action.MAIN" + android:targetPackage="com.android.inputmethod.latin" + android:targetClass="com.android.inputmethod.latin.DebugSettings" /> + </Preference>--> </PreferenceScreen> diff --git a/java/res/xml/prefs_for_debug.xml b/java/res/xml/prefs_for_debug.xml index 8177d3c6a..477461df4 100644 --- a/java/res/xml/prefs_for_debug.xml +++ b/java/res/xml/prefs_for_debug.xml @@ -32,7 +32,14 @@ android:persistent="true" android:entryValues="@array/keyboard_layout_modes_values" android:entries="@array/keyboard_layout_modes" - android:defaultValue="4" + android:defaultValue="@string/config_default_keyboard_theme_id" + /> + + <CheckBoxPreference + android:key="use_spacebar_language_switch" + android:title="@string/prefs_use_spacebar_language_switch" + android:persistent="true" + android:defaultValue="false" /> <CheckBoxPreference diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java new file mode 100644 index 000000000..ae614b7e0 --- /dev/null +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.accessibility; + +import android.accessibilityservice.AccessibilityServiceInfo; +import android.content.Context; +import android.content.SharedPreferences; +import android.inputmethodservice.InputMethodService; +import android.os.SystemClock; +import android.util.Log; +import android.view.MotionEvent; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; + +import com.android.inputmethod.compat.AccessibilityEventCompatUtils; +import com.android.inputmethod.compat.AccessibilityManagerCompatWrapper; +import com.android.inputmethod.compat.MotionEventCompatUtils; + +public class AccessibilityUtils { + private static final String TAG = AccessibilityUtils.class.getSimpleName(); + private static final String CLASS = AccessibilityUtils.class.getClass().getName(); + private static final String PACKAGE = AccessibilityUtils.class.getClass().getPackage() + .getName(); + + private static final AccessibilityUtils sInstance = new AccessibilityUtils(); + + private AccessibilityManager mAccessibilityManager; + private AccessibilityManagerCompatWrapper mCompatManager; + + /* + * Setting this constant to {@code false} will disable all keyboard + * accessibility code, regardless of whether Accessibility is turned on in + * the system settings. It should ONLY be used in the event of an emergency. + */ + private static final boolean ENABLE_ACCESSIBILITY = true; + + public static void init(InputMethodService inputMethod, SharedPreferences prefs) { + if (!ENABLE_ACCESSIBILITY) + return; + + // These only need to be initialized if the kill switch is off. + sInstance.initInternal(inputMethod, prefs); + KeyCodeDescriptionMapper.init(inputMethod, prefs); + AccessibleInputMethodServiceProxy.init(inputMethod, prefs); + AccessibleKeyboardViewProxy.init(inputMethod, prefs); + } + + public static AccessibilityUtils getInstance() { + return sInstance; + } + + private AccessibilityUtils() { + // This class is not publicly instantiable. + } + + private void initInternal(Context context, SharedPreferences prefs) { + mAccessibilityManager = (AccessibilityManager) context + .getSystemService(Context.ACCESSIBILITY_SERVICE); + mCompatManager = new AccessibilityManagerCompatWrapper(mAccessibilityManager); + } + + /** + * Returns {@code true} if touch exploration is enabled. Currently, this + * means that the kill switch is off, the device supports touch exploration, + * and a spoken feedback service is turned on. + * + * @return {@code true} if touch exploration is enabled. + */ + public boolean isTouchExplorationEnabled() { + return ENABLE_ACCESSIBILITY + && AccessibilityEventCompatUtils.supportsTouchExploration() + && mAccessibilityManager.isEnabled() + && !mCompatManager.getEnabledAccessibilityServiceList( + AccessibilityServiceInfo.FEEDBACK_SPOKEN).isEmpty(); + } + + /** + * Returns {@true} if the provided event is a touch exploration (e.g. hover) + * event. This is used to determine whether the event should be processed by + * the touch exploration code within the keyboard. + * + * @param event The event to check. + * @return {@true} is the event is a touch exploration event + */ + public boolean isTouchExplorationEvent(MotionEvent event) { + final int action = event.getAction(); + + return action == MotionEventCompatUtils.ACTION_HOVER_ENTER + || action == MotionEventCompatUtils.ACTION_HOVER_EXIT + || action == MotionEventCompatUtils.ACTION_HOVER_MOVE; + } + + /** + * Sends the specified text to the {@link AccessibilityManager} to be + * spoken. + * + * @param text the text to speak + */ + public void speak(CharSequence text) { + if (!mAccessibilityManager.isEnabled()) { + Log.e(TAG, "Attempted to speak when accessibility was disabled!"); + return; + } + + // The following is a hack to avoid using the heavy-weight TextToSpeech + // class. Instead, we're just forcing a fake AccessibilityEvent into + // the screen reader to make it speak. + final AccessibilityEvent event = AccessibilityEvent + .obtain(AccessibilityEventCompatUtils.TYPE_VIEW_HOVER_ENTER); + + event.setPackageName(PACKAGE); + event.setClassName(CLASS); + event.setEventTime(SystemClock.uptimeMillis()); + event.setEnabled(true); + event.getText().add(text); + + mAccessibilityManager.sendAccessibilityEvent(event); + } +} diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleInputMethodServiceProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleInputMethodServiceProxy.java new file mode 100644 index 000000000..043266c70 --- /dev/null +++ b/java/src/com/android/inputmethod/accessibility/AccessibleInputMethodServiceProxy.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.accessibility; + +import android.content.SharedPreferences; +import android.inputmethodservice.InputMethodService; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.text.TextUtils; +import android.view.inputmethod.ExtractedText; +import android.view.inputmethod.ExtractedTextRequest; + +import com.android.inputmethod.latin.R; + +public class AccessibleInputMethodServiceProxy implements AccessibleKeyboardActionListener { + private static final AccessibleInputMethodServiceProxy sInstance = + new AccessibleInputMethodServiceProxy(); + + /* + * Delay for the handler event that's fired when Accessibility is on and the + * user hovers outside of any valid keys. This is used to let the user know + * that if they lift their finger, nothing will be typed. + */ + private static final long DELAY_NO_HOVER_SELECTION = 250; + + private InputMethodService mInputMethod; + + private AccessibilityHandler mAccessibilityHandler; + + private class AccessibilityHandler extends Handler { + private static final int MSG_NO_HOVER_SELECTION = 0; + + public AccessibilityHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_NO_HOVER_SELECTION: + notifyNoHoverSelection(); + break; + } + } + + public void postNoHoverSelection() { + removeMessages(MSG_NO_HOVER_SELECTION); + sendEmptyMessageDelayed(MSG_NO_HOVER_SELECTION, DELAY_NO_HOVER_SELECTION); + } + + public void cancelNoHoverSelection() { + removeMessages(MSG_NO_HOVER_SELECTION); + } + } + + public static void init(InputMethodService inputMethod, SharedPreferences prefs) { + sInstance.initInternal(inputMethod, prefs); + } + + public static AccessibleInputMethodServiceProxy getInstance() { + return sInstance; + } + + private AccessibleInputMethodServiceProxy() { + // Not publicly instantiable. + } + + private void initInternal(InputMethodService inputMethod, SharedPreferences prefs) { + mInputMethod = inputMethod; + mAccessibilityHandler = new AccessibilityHandler(inputMethod.getMainLooper()); + } + + /** + * If touch exploration is enabled, cancels the event sent by + * {@link AccessibleInputMethodServiceProxy#onHoverExit(int)} because the + * user is currently hovering above a key. + */ + @Override + public void onHoverEnter(int primaryCode) { + mAccessibilityHandler.cancelNoHoverSelection(); + } + + /** + * If touch exploration is enabled, sends a delayed event to notify the user + * that they are not currently hovering above a key. + */ + @Override + public void onHoverExit(int primaryCode) { + mAccessibilityHandler.postNoHoverSelection(); + } + + /** + * When Accessibility is turned on, notifies the user that they are not + * currently hovering above a key. By default this will speak the currently + * entered text. + */ + private void notifyNoHoverSelection() { + final ExtractedText extracted = mInputMethod.getCurrentInputConnection().getExtractedText( + new ExtractedTextRequest(), 0); + + if (extracted == null) + return; + + final CharSequence text; + + if (TextUtils.isEmpty(extracted.text)) { + text = mInputMethod.getString(R.string.spoken_no_text_entered); + } else { + text = mInputMethod.getString(R.string.spoken_current_text_is, extracted.text); + } + + AccessibilityUtils.getInstance().speak(text); + } +} diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardActionListener.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardActionListener.java new file mode 100644 index 000000000..12c59d0fc --- /dev/null +++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardActionListener.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.accessibility; + +public interface AccessibleKeyboardActionListener { + /** + * Called when the user hovers inside a key. This is sent only when + * Accessibility is turned on. For keys that repeat, this is only called + * once. + * + * @param primaryCode the code of the key that was hovered over + */ + public void onHoverEnter(int primaryCode); + + /** + * Called when the user hovers outside a key. This is sent only when + * Accessibility is turned on. For keys that repeat, this is only called + * once. + * + * @param primaryCode the code of the key that was hovered over + */ + public void onHoverExit(int primaryCode); +} diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java new file mode 100644 index 000000000..96f7fc9f2 --- /dev/null +++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.accessibility; + +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.Log; +import android.view.MotionEvent; +import android.view.ViewConfiguration; +import android.view.accessibility.AccessibilityEvent; + +import com.android.inputmethod.compat.AccessibilityEventCompatUtils; +import com.android.inputmethod.compat.MotionEventCompatUtils; +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.KeyDetector; +import com.android.inputmethod.keyboard.KeyboardView; +import com.android.inputmethod.keyboard.PointerTracker; + +public class AccessibleKeyboardViewProxy { + private static final String TAG = AccessibleKeyboardViewProxy.class.getSimpleName(); + private static final AccessibleKeyboardViewProxy sInstance = new AccessibleKeyboardViewProxy(); + + // Delay in milliseconds between key press DOWN and UP events + private static final long DELAY_KEY_PRESS = 10; + + private int mScaledEdgeSlop; + private KeyboardView mView; + private AccessibleKeyboardActionListener mListener; + + private int mLastHoverKeyIndex = KeyDetector.NOT_A_KEY; + private int mLastX = -1; + private int mLastY = -1; + + public static void init(Context context, SharedPreferences prefs) { + sInstance.initInternal(context, prefs); + sInstance.mListener = AccessibleInputMethodServiceProxy.getInstance(); + } + + public static AccessibleKeyboardViewProxy getInstance() { + return sInstance; + } + + public static void setView(KeyboardView view) { + sInstance.mView = view; + } + + private AccessibleKeyboardViewProxy() { + // Not publicly instantiable. + } + + private void initInternal(Context context, SharedPreferences prefs) { + final Paint paint = new Paint(); + paint.setTextAlign(Paint.Align.LEFT); + paint.setTextSize(14.0f); + paint.setAntiAlias(true); + paint.setColor(Color.YELLOW); + + mScaledEdgeSlop = ViewConfiguration.get(context).getScaledEdgeSlop(); + } + + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event, + PointerTracker tracker) { + if (mView == null) { + Log.e(TAG, "No keyboard view set!"); + return false; + } + + switch (event.getEventType()) { + case AccessibilityEventCompatUtils.TYPE_VIEW_HOVER_ENTER: + final Key key = tracker.getKey(mLastHoverKeyIndex); + + if (key == null) + break; + + final CharSequence description = KeyCodeDescriptionMapper.getInstance() + .getDescriptionForKey(mView.getContext(), mView.getKeyboard(), key); + + if (description == null) + return false; + + event.getText().add(description); + + break; + } + + return true; + } + + /** + * Receives hover events when accessibility is turned on in API > 11. In + * earlier API levels, events are manually routed from onTouchEvent. + * + * @param event The hover event. + * @return {@code true} if the event is handled + */ + public boolean onHoverEvent(MotionEvent event, PointerTracker tracker) { + return onTouchExplorationEvent(event, tracker); + } + + public boolean dispatchTouchEvent(MotionEvent event) { + // Since touch exploration translates hover double-tap to a regular + // single-tap, we're going to drop non-touch exploration events. + if (!AccessibilityUtils.getInstance().isTouchExplorationEvent(event)) + return true; + + return false; + } + + /** + * Handles touch exploration events when Accessibility is turned on. + * + * @param event The touch exploration hover event. + * @return {@code true} if the event was handled + */ + private boolean onTouchExplorationEvent(MotionEvent event, PointerTracker tracker) { + final int x = (int) event.getX(); + final int y = (int) event.getY(); + + switch (event.getAction()) { + case MotionEventCompatUtils.ACTION_HOVER_ENTER: + case MotionEventCompatUtils.ACTION_HOVER_MOVE: + final int keyIndex = tracker.getKeyIndexOn(x, y); + + if (keyIndex != mLastHoverKeyIndex) { + fireKeyHoverEvent(tracker, mLastHoverKeyIndex, false); + mLastHoverKeyIndex = keyIndex; + mLastX = x; + mLastY = y; + fireKeyHoverEvent(tracker, mLastHoverKeyIndex, true); + } + + return true; + case MotionEventCompatUtils.ACTION_HOVER_EXIT: + final int width = mView.getWidth(); + final int height = mView.getHeight(); + + if (x < mScaledEdgeSlop || y < mScaledEdgeSlop || x >= (width - mScaledEdgeSlop) + || y >= (height - mScaledEdgeSlop)) { + fireKeyHoverEvent(tracker, mLastHoverKeyIndex, false); + mLastHoverKeyIndex = KeyDetector.NOT_A_KEY; + mLastX = -1; + mLastY = -1; + } else if (mLastHoverKeyIndex != KeyDetector.NOT_A_KEY) { + fireKeyPressEvent(tracker, mLastX, mLastY, event.getEventTime()); + } + + return true; + } + + return false; + } + + private void fireKeyHoverEvent(PointerTracker tracker, int keyIndex, boolean entering) { + if (mListener == null) { + Log.e(TAG, "No accessible keyboard action listener set!"); + return; + } + + if (mView == null) { + Log.e(TAG, "No keyboard view set!"); + return; + } + + if (keyIndex == KeyDetector.NOT_A_KEY) + return; + + final Key key = tracker.getKey(keyIndex); + + if (key == null) + return; + + if (entering) { + mListener.onHoverEnter(key.mCode); + mView.sendAccessibilityEvent(AccessibilityEventCompatUtils.TYPE_VIEW_HOVER_ENTER); + } else { + mListener.onHoverExit(key.mCode); + mView.sendAccessibilityEvent(AccessibilityEventCompatUtils.TYPE_VIEW_HOVER_EXIT); + } + } + + private void fireKeyPressEvent(PointerTracker tracker, int x, int y, long eventTime) { + tracker.onDownEvent(x, y, eventTime, null); + tracker.onUpEvent(x, y, eventTime + DELAY_KEY_PRESS, null); + } +} diff --git a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java new file mode 100644 index 000000000..154f4af91 --- /dev/null +++ b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java @@ -0,0 +1,226 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.accessibility; + +import android.content.Context; +import android.content.SharedPreferences; +import android.text.TextUtils; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardId; +import com.android.inputmethod.latin.R; + +import java.util.HashMap; + +public class KeyCodeDescriptionMapper { + private static KeyCodeDescriptionMapper sInstance = new KeyCodeDescriptionMapper(); + + // Map of key labels to spoken description resource IDs + private final HashMap<CharSequence, Integer> mKeyLabelMap; + + // Map of key codes to spoken description resource IDs + private final HashMap<Integer, Integer> mKeyCodeMap; + + // Map of shifted key codes to spoken description resource IDs + private final HashMap<Integer, Integer> mShiftedKeyCodeMap; + + // Map of shift-locked key codes to spoken description resource IDs + private final HashMap<Integer, Integer> mShiftLockedKeyCodeMap; + + public static void init(Context context, SharedPreferences prefs) { + sInstance.initInternal(context, prefs); + } + + public static KeyCodeDescriptionMapper getInstance() { + return sInstance; + } + + private KeyCodeDescriptionMapper() { + mKeyLabelMap = new HashMap<CharSequence, Integer>(); + mKeyCodeMap = new HashMap<Integer, Integer>(); + mShiftedKeyCodeMap = new HashMap<Integer, Integer>(); + mShiftLockedKeyCodeMap = new HashMap<Integer, Integer>(); + } + + private void initInternal(Context context, SharedPreferences prefs) { + // Manual label substitutions for key labels with no string resource + mKeyLabelMap.put(":-)", R.string.spoken_description_smiley); + + // Symbols that most TTS engines can't speak + mKeyCodeMap.put((int) '.', R.string.spoken_description_period); + mKeyCodeMap.put((int) ',', R.string.spoken_description_comma); + mKeyCodeMap.put((int) '(', R.string.spoken_description_left_parenthesis); + mKeyCodeMap.put((int) ')', R.string.spoken_description_right_parenthesis); + mKeyCodeMap.put((int) ':', R.string.spoken_description_colon); + mKeyCodeMap.put((int) ';', R.string.spoken_description_semicolon); + mKeyCodeMap.put((int) '!', R.string.spoken_description_exclamation_mark); + mKeyCodeMap.put((int) '?', R.string.spoken_description_question_mark); + mKeyCodeMap.put((int) '\"', R.string.spoken_description_double_quote); + mKeyCodeMap.put((int) '\'', R.string.spoken_description_single_quote); + mKeyCodeMap.put((int) '*', R.string.spoken_description_star); + mKeyCodeMap.put((int) '#', R.string.spoken_description_pound); + mKeyCodeMap.put((int) ' ', R.string.spoken_description_space); + + // Non-ASCII symbols (must use escape codes!) + mKeyCodeMap.put((int) '\u2022', R.string.spoken_description_dot); + mKeyCodeMap.put((int) '\u221A', R.string.spoken_description_square_root); + mKeyCodeMap.put((int) '\u03C0', R.string.spoken_description_pi); + mKeyCodeMap.put((int) '\u0394', R.string.spoken_description_delta); + mKeyCodeMap.put((int) '\u2122', R.string.spoken_description_trademark); + mKeyCodeMap.put((int) '\u2105', R.string.spoken_description_care_of); + mKeyCodeMap.put((int) '\u2026', R.string.spoken_description_ellipsis); + mKeyCodeMap.put((int) '\u201E', R.string.spoken_description_low_double_quote); + + // Special non-character codes defined in Keyboard + mKeyCodeMap.put(Keyboard.CODE_DELETE, R.string.spoken_description_delete); + mKeyCodeMap.put(Keyboard.CODE_ENTER, R.string.spoken_description_return); + mKeyCodeMap.put(Keyboard.CODE_SETTINGS, R.string.spoken_description_settings); + mKeyCodeMap.put(Keyboard.CODE_SHIFT, R.string.spoken_description_shift); + mKeyCodeMap.put(Keyboard.CODE_SHORTCUT, R.string.spoken_description_mic); + mKeyCodeMap.put(Keyboard.CODE_SWITCH_ALPHA_SYMBOL, R.string.spoken_description_to_symbol); + mKeyCodeMap.put(Keyboard.CODE_TAB, R.string.spoken_description_tab); + + // Shifted versions of non-character codes defined in Keyboard + mShiftedKeyCodeMap.put(Keyboard.CODE_SHIFT, R.string.spoken_description_shift_shifted); + + // Shift-locked versions of non-character codes defined in Keyboard + mShiftLockedKeyCodeMap.put(Keyboard.CODE_SHIFT, R.string.spoken_description_caps_lock); + } + + /** + * Returns the localized description of the action performed by a specified + * key based on the current keyboard state. + * <p> + * The order of precedence for key descriptions is: + * <ol> + * <li>Manually-defined based on the key label</li> + * <li>Automatic or manually-defined based on the key code</li> + * <li>Automatically based on the key label</li> + * <li>{code null} for keys with no label or key code defined</li> + * </p> + * + * @param context The package's context. + * @param keyboard The keyboard on which the key resides. + * @param key The key from which to obtain a description. + * @return a character sequence describing the action performed by pressing + * the key + */ + public CharSequence getDescriptionForKey(Context context, Keyboard keyboard, Key key) { + if (key.mCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { + final CharSequence description = getDescriptionForSwitchAlphaSymbol(context, keyboard); + if (description != null) + return description; + } + + if (!TextUtils.isEmpty(key.mLabel)) { + final String label = key.mLabel.toString().trim(); + + if (mKeyLabelMap.containsKey(label)) { + return context.getString(mKeyLabelMap.get(label)); + } else if (label.length() == 1 + || (keyboard.isManualTemporaryUpperCase() && !TextUtils + .isEmpty(key.mHintLetter))) { + return getDescriptionForKeyCode(context, keyboard, key); + } else { + return label; + } + } else if (key.mCode != Keyboard.CODE_DUMMY) { + return getDescriptionForKeyCode(context, keyboard, key); + } + + return null; + } + + /** + * Returns a context-specific description for the CODE_SWITCH_ALPHA_SYMBOL + * key or {@code null} if there is not a description provided for the + * current keyboard context. + * + * @param context The package's context. + * @param keyboard The keyboard on which the key resides. + * @return a character sequence describing the action performed by pressing + * the key + */ + private CharSequence getDescriptionForSwitchAlphaSymbol(Context context, Keyboard keyboard) { + final KeyboardId id = keyboard.mId; + + if (id.isAlphabetKeyboard()) { + return context.getString(R.string.spoken_description_to_symbol); + } else if (id.isSymbolsKeyboard()) { + return context.getString(R.string.spoken_description_to_alpha); + } else if (id.isPhoneSymbolsKeyboard()) { + return context.getString(R.string.spoken_description_to_numeric); + } else if (id.isPhoneKeyboard()) { + return context.getString(R.string.spoken_description_to_symbol); + } else { + return null; + } + } + + /** + * Returns the keycode for the specified key given the current keyboard + * state. + * + * @param keyboard The keyboard on which the key resides. + * @param key The key from which to obtain a key code. + * @return the key code for the specified key + */ + private int getCorrectKeyCode(Keyboard keyboard, Key key) { + if (keyboard.isManualTemporaryUpperCase() && !TextUtils.isEmpty(key.mHintLetter)) { + return key.mHintLetter.charAt(0); + } else { + return key.mCode; + } + } + + /** + * Returns a localized character sequence describing what will happen when + * the specified key is pressed based on its key code. + * <p> + * The order of precedence for key code descriptions is: + * <ol> + * <li>Manually-defined shift-locked description</li> + * <li>Manually-defined shifted description</li> + * <li>Manually-defined normal description</li> + * <li>Automatic based on the character represented by the key code</li> + * <li>Fall-back for undefined or control characters</li> + * </ol> + * </p> + * + * @param context The package's context. + * @param keyboard The keyboard on which the key resides. + * @param key The key from which to obtain a description. + * @return a character sequence describing the action performed by pressing + * the key + */ + private CharSequence getDescriptionForKeyCode(Context context, Keyboard keyboard, Key key) { + final int code = getCorrectKeyCode(keyboard, key); + + if (keyboard.isShiftLocked() && mShiftLockedKeyCodeMap.containsKey(code)) { + return context.getString(mShiftLockedKeyCodeMap.get(code)); + } else if (keyboard.isShiftedOrShiftLocked() && mShiftedKeyCodeMap.containsKey(code)) { + return context.getString(mShiftedKeyCodeMap.get(code)); + } else if (mKeyCodeMap.containsKey(code)) { + return context.getString(mKeyCodeMap.get(code)); + } else if (Character.isDefined(code) && !Character.isISOControl(code)) { + return Character.toString((char) code); + } else { + return context.getString(R.string.spoken_description_unknown, code); + } + } +} diff --git a/java/src/com/android/inputmethod/compat/AbstractCompatWrapper.java b/java/src/com/android/inputmethod/compat/AbstractCompatWrapper.java new file mode 100644 index 000000000..65949357f --- /dev/null +++ b/java/src/com/android/inputmethod/compat/AbstractCompatWrapper.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import android.util.Log; + +public abstract class AbstractCompatWrapper { + private static final String TAG = AbstractCompatWrapper.class.getSimpleName(); + protected final Object mObj; + + public AbstractCompatWrapper(Object obj) { + if (obj == null) { + Log.e(TAG, "Invalid input to AbstructCompatWrapper"); + } + mObj = obj; + } + + public Object getOriginalObject() { + return mObj; + } + + public boolean hasOriginalObject() { + return mObj != null; + } +} diff --git a/java/src/com/android/inputmethod/compat/AccessibilityEventCompatUtils.java b/java/src/com/android/inputmethod/compat/AccessibilityEventCompatUtils.java new file mode 100644 index 000000000..50057727a --- /dev/null +++ b/java/src/com/android/inputmethod/compat/AccessibilityEventCompatUtils.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import android.view.accessibility.AccessibilityEvent; + +import java.lang.reflect.Field; + +public class AccessibilityEventCompatUtils { + public static final int TYPE_VIEW_HOVER_ENTER = 0x80; + public static final int TYPE_VIEW_HOVER_EXIT = 0x100; + + private static final Field FIELD_TYPE_VIEW_HOVER_ENTER = CompatUtils.getField( + AccessibilityEvent.class, "TYPE_VIEW_HOVER_ENTER"); + private static final Field FIELD_TYPE_VIEW_HOVER_EXIT = CompatUtils.getField( + AccessibilityEvent.class, "TYPE_VIEW_HOVER_EXIT"); + private static final Integer OBJ_TYPE_VIEW_HOVER_ENTER = (Integer) CompatUtils + .getFieldValue(null, null, FIELD_TYPE_VIEW_HOVER_ENTER); + private static final Integer OBJ_TYPE_VIEW_HOVER_EXIT = (Integer) CompatUtils + .getFieldValue(null, null, FIELD_TYPE_VIEW_HOVER_EXIT); + + public static boolean supportsTouchExploration() { + return OBJ_TYPE_VIEW_HOVER_ENTER != null && OBJ_TYPE_VIEW_HOVER_EXIT != null; + } +} diff --git a/java/src/com/android/inputmethod/compat/AccessibilityManagerCompatWrapper.java b/java/src/com/android/inputmethod/compat/AccessibilityManagerCompatWrapper.java new file mode 100644 index 000000000..4db1c7a24 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/AccessibilityManagerCompatWrapper.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import android.accessibilityservice.AccessibilityServiceInfo; +import android.view.accessibility.AccessibilityManager; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; + +public class AccessibilityManagerCompatWrapper { + private static final Method METHOD_getEnabledAccessibilityServiceList = CompatUtils.getMethod( + AccessibilityManager.class, "getEnabledAccessibilityServiceList", int.class); + + private final AccessibilityManager mManager; + + public AccessibilityManagerCompatWrapper(AccessibilityManager manager) { + mManager = manager; + } + + @SuppressWarnings("unchecked") + public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int feedbackType) { + return (List<AccessibilityServiceInfo>) CompatUtils.invoke(mManager, + Collections.<AccessibilityServiceInfo>emptyList(), + METHOD_getEnabledAccessibilityServiceList, feedbackType); + } +} diff --git a/java/src/com/android/inputmethod/compat/ArraysCompatUtils.java b/java/src/com/android/inputmethod/compat/ArraysCompatUtils.java new file mode 100644 index 000000000..f6afbcfe2 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/ArraysCompatUtils.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import java.lang.reflect.Method; +import java.util.Arrays; + +public class ArraysCompatUtils { + private static final Method METHOD_Arrays_binarySearch = CompatUtils + .getMethod(Arrays.class, "binarySearch", int[].class, int.class, int.class, int.class); + + public static int binarySearch(int[] array, int startIndex, int endIndex, int value) { + if (METHOD_Arrays_binarySearch != null) { + final Object index = CompatUtils.invoke(null, 0, METHOD_Arrays_binarySearch, + array, startIndex, endIndex, value); + return (Integer)index; + } else { + return compatBinarySearch(array, startIndex, endIndex, value); + } + } + + /* package */ static int compatBinarySearch(int[] array, int startIndex, int endIndex, + int value) { + if (startIndex > endIndex) throw new IllegalArgumentException(); + if (startIndex < 0 || endIndex > array.length) throw new ArrayIndexOutOfBoundsException(); + + final int work[] = new int[endIndex - startIndex]; + System.arraycopy(array, startIndex, work, 0, work.length); + final int index = Arrays.binarySearch(work, value); + if (index >= 0) { + return index + startIndex; + } else { + return ~(~index + startIndex); + } + } +} diff --git a/java/src/com/android/inputmethod/compat/CompatUtils.java b/java/src/com/android/inputmethod/compat/CompatUtils.java new file mode 100644 index 000000000..b42633cd9 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/CompatUtils.java @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import android.content.Intent; +import android.text.TextUtils; +import android.util.Log; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +public class CompatUtils { + private static final String TAG = CompatUtils.class.getSimpleName(); + private static final String EXTRA_INPUT_METHOD_ID = "input_method_id"; + // TODO: Can these be constants instead of literal String constants? + private static final String INPUT_METHOD_SUBTYPE_SETTINGS = + "android.settings.INPUT_METHOD_SUBTYPE_SETTINGS"; + private static final String INPUT_LANGUAGE_SELECTION = + "com.android.inputmethod.latin.INPUT_LANGUAGE_SELECTION"; + + public static Intent getInputLanguageSelectionIntent(String inputMethodId, + int flagsForSubtypeSettings) { + final String action; + Intent intent; + if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED + /* android.os.Build.VERSION_CODES.HONEYCOMB */ + && android.os.Build.VERSION.SDK_INT >= 11) { + // Refer to android.provider.Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS + action = INPUT_METHOD_SUBTYPE_SETTINGS; + intent = new Intent(action); + if (!TextUtils.isEmpty(inputMethodId)) { + intent.putExtra(EXTRA_INPUT_METHOD_ID, inputMethodId); + } + if (flagsForSubtypeSettings > 0) { + intent.setFlags(flagsForSubtypeSettings); + } + } else { + action = INPUT_LANGUAGE_SELECTION; + intent = new Intent(action); + } + return intent; + } + + public static Class<?> getClass(String className) { + try { + return Class.forName(className); + } catch (ClassNotFoundException e) { + return null; + } + } + + public static Method getMethod(Class<?> targetClass, String name, + Class<?>... parameterTypes) { + if (targetClass == null || TextUtils.isEmpty(name)) return null; + try { + return targetClass.getMethod(name, parameterTypes); + } catch (SecurityException e) { + // ignore + } catch (NoSuchMethodException e) { + // ignore + } + return null; + } + + public static Field getField(Class<?> targetClass, String name) { + if (targetClass == null || TextUtils.isEmpty(name)) return null; + try { + return targetClass.getField(name); + } catch (SecurityException e) { + // ignore + } catch (NoSuchFieldException e) { + // ignore + } + return null; + } + + public static Constructor<?> getConstructor(Class<?> targetClass, Class<?> ... types) { + if (targetClass == null || types == null) return null; + try { + return targetClass.getConstructor(types); + } catch (SecurityException e) { + // ignore + } catch (NoSuchMethodException e) { + // ignore + } + return null; + } + + public static Object newInstance(Constructor<?> constructor, Object ... args) { + if (constructor == null) return null; + try { + return constructor.newInstance(args); + } catch (Exception e) { + Log.e(TAG, "Exception in newInstance: " + e.getClass().getSimpleName()); + } + return null; + } + + public static Object invoke( + Object receiver, Object defaultValue, Method method, Object... args) { + if (method == null) return defaultValue; + try { + return method.invoke(receiver, args); + } catch (Exception e) { + Log.e(TAG, "Exception in invoke: " + e.getClass().getSimpleName()); + } + return defaultValue; + } + + public static Object getFieldValue(Object receiver, Object defaultValue, Field field) { + if (field == null) return defaultValue; + try { + return field.get(receiver); + } catch (Exception e) { + Log.e(TAG, "Exception in getFieldValue: " + e.getClass().getSimpleName()); + } + return defaultValue; + } + + public static void setFieldValue(Object receiver, Field field, Object value) { + if (field == null) return; + try { + field.set(receiver, value); + } catch (Exception e) { + Log.e(TAG, "Exception in setFieldValue: " + e.getClass().getSimpleName()); + } + } + + public static List<InputMethodSubtypeCompatWrapper> copyInputMethodSubtypeListToWrapper( + Object listObject) { + if (!(listObject instanceof List<?>)) return null; + final List<InputMethodSubtypeCompatWrapper> subtypes = + new ArrayList<InputMethodSubtypeCompatWrapper>(); + for (Object o: (List<?>)listObject) { + subtypes.add(new InputMethodSubtypeCompatWrapper(o)); + } + return subtypes; + } +} diff --git a/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java b/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java new file mode 100644 index 000000000..bcdcef7dc --- /dev/null +++ b/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputConnection; + +import java.lang.reflect.Field; + +public class EditorInfoCompatUtils { + private static final Field FIELD_IME_FLAG_NAVIGATE_NEXT = CompatUtils.getField( + EditorInfo.class, "IME_FLAG_NAVIGATE_NEXT"); + private static final Field FIELD_IME_FLAG_NAVIGATE_PREVIOUS = CompatUtils.getField( + EditorInfo.class, "IME_FLAG_NAVIGATE_PREVIOUS"); + private static final Field FIELD_IME_ACTION_PREVIOUS = CompatUtils.getField( + EditorInfo.class, "IME_ACTION_PREVIOUS"); + private static final Integer OBJ_IME_FLAG_NAVIGATE_NEXT = (Integer) CompatUtils + .getFieldValue(null, null, FIELD_IME_FLAG_NAVIGATE_NEXT); + private static final Integer OBJ_IME_FLAG_NAVIGATE_PREVIOUS = (Integer) CompatUtils + .getFieldValue(null, null, FIELD_IME_FLAG_NAVIGATE_PREVIOUS); + private static final Integer OBJ_IME_ACTION_PREVIOUS = (Integer) CompatUtils + .getFieldValue(null, null, FIELD_IME_ACTION_PREVIOUS); + + public static boolean hasFlagNavigateNext(int imeOptions) { + if (OBJ_IME_FLAG_NAVIGATE_NEXT == null) + return false; + return (imeOptions & OBJ_IME_FLAG_NAVIGATE_NEXT) != 0; + } + + public static boolean hasFlagNavigatePrevious(int imeOptions) { + if (OBJ_IME_FLAG_NAVIGATE_PREVIOUS == null) + return false; + return (imeOptions & OBJ_IME_FLAG_NAVIGATE_PREVIOUS) != 0; + } + + public static void performEditorActionNext(InputConnection ic) { + ic.performEditorAction(EditorInfo.IME_ACTION_NEXT); + } + + public static void performEditorActionPrevious(InputConnection ic) { + if (OBJ_IME_ACTION_PREVIOUS == null) + return; + ic.performEditorAction(OBJ_IME_ACTION_PREVIOUS); + } + + public static String imeOptionsName(int imeOptions) { + if (imeOptions == -1) + return null; + final int actionId = imeOptions & EditorInfo.IME_MASK_ACTION; + final String action; + switch (actionId) { + 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_NEXT: + action = "actionNext"; + break; + case EditorInfo.IME_ACTION_DONE: + action = "actionDone"; + break; + default: { + if (OBJ_IME_ACTION_PREVIOUS != null && actionId == OBJ_IME_ACTION_PREVIOUS) { + action = "actionPrevious"; + } else { + action = "actionUnknown(" + actionId + ")"; + } + break; + } + } + if ((imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) { + return "flagNoEnterAction|" + action; + } else { + return action; + } + } +} diff --git a/java/src/com/android/inputmethod/compat/FrameLayoutCompatUtils.java b/java/src/com/android/inputmethod/compat/FrameLayoutCompatUtils.java new file mode 100644 index 000000000..523bf7d0e --- /dev/null +++ b/java/src/com/android/inputmethod/compat/FrameLayoutCompatUtils.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewGroup.MarginLayoutParams; +import android.widget.FrameLayout; +import android.widget.RelativeLayout; + +public class FrameLayoutCompatUtils { + private static final boolean NEEDS_FRAME_LAYOUT_HACK = ( + android.os.Build.VERSION.SDK_INT < 11 /* Honeycomb */); + + public static ViewGroup getPlacer(ViewGroup container) { + if (NEEDS_FRAME_LAYOUT_HACK) { + // Insert RelativeLayout to be able to setMargin because pre-Honeycomb FrameLayout + // could not handle setMargin properly. + final ViewGroup placer = new RelativeLayout(container.getContext()); + container.addView(placer); + return placer; + } else { + return container; + } + } + + public static MarginLayoutParams newLayoutParam(ViewGroup placer, int width, int height) { + if (placer instanceof FrameLayout) { + return new FrameLayout.LayoutParams(width, height); + } else if (placer instanceof RelativeLayout) { + return new RelativeLayout.LayoutParams(width, height); + } else if (placer == null) { + throw new NullPointerException("placer is null"); + } else { + throw new IllegalArgumentException("placer is neither FrameLayout nor RelativeLayout: " + + placer.getClass().getName()); + } + } + + public static void placeViewAt(View view, int x, int y, int w, int h) { + final ViewGroup.LayoutParams lp = view.getLayoutParams(); + if (lp instanceof MarginLayoutParams) { + final MarginLayoutParams marginLayoutParams = (MarginLayoutParams)lp; + marginLayoutParams.width = w; + marginLayoutParams.height = h; + marginLayoutParams.setMargins(x, y, 0, 0); + } + } +} diff --git a/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java b/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java new file mode 100644 index 000000000..7d00b6007 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/InputConnectionCompatUtils.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import com.android.inputmethod.latin.EditingUtils.SelectedWord; + +import android.view.inputmethod.InputConnection; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +public class InputConnectionCompatUtils { + private static final Class<?> CLASS_CorrectionInfo = CompatUtils + .getClass("android.view.inputmethod.CorrectionInfo"); + private static final Class<?>[] INPUT_TYPE_CorrectionInfo = new Class<?>[] { int.class, + CharSequence.class, CharSequence.class }; + private static final Constructor<?> CONSTRUCTOR_CorrectionInfo = CompatUtils + .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) { + if (ic == null || CONSTRUCTOR_CorrectionInfo == null + || METHOD_InputConnection_commitCorrection == null) { + return; + } + Object[] args = { offset, oldText, newText }; + Object correctionInfo = CompatUtils.newInstance(CONSTRUCTOR_CorrectionInfo, args); + if (correctionInfo != null) { + CompatUtils.invoke(ic, null, METHOD_InputConnection_commitCorrection, + correctionInfo); + } + } + + + /** + * 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/InputMethodInfoCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodInfoCompatWrapper.java new file mode 100644 index 000000000..8e22bbc79 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/InputMethodInfoCompatWrapper.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import android.content.pm.ServiceInfo; +import android.view.inputmethod.InputMethodInfo; + +import java.lang.reflect.Method; + +public class InputMethodInfoCompatWrapper { + private final InputMethodInfo mImi; + private static final Method METHOD_getSubtypeAt = CompatUtils.getMethod( + InputMethodInfo.class, "getSubtypeAt", int.class); + private static final Method METHOD_getSubtypeCount = CompatUtils.getMethod( + InputMethodInfo.class, "getSubtypeCount"); + + public InputMethodInfoCompatWrapper(InputMethodInfo imi) { + mImi = imi; + } + + public InputMethodInfo getInputMethodInfo() { + return mImi; + } + + public String getId() { + return mImi.getId(); + } + + public String getPackageName() { + return mImi.getPackageName(); + } + + public ServiceInfo getServiceInfo() { + return mImi.getServiceInfo(); + } + + public int getSubtypeCount() { + return (Integer) CompatUtils.invoke(mImi, 0, METHOD_getSubtypeCount); + } + + public InputMethodSubtypeCompatWrapper getSubtypeAt(int index) { + return new InputMethodSubtypeCompatWrapper(CompatUtils.invoke(mImi, null, + METHOD_getSubtypeAt, index)); + } +} diff --git a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java new file mode 100644 index 000000000..1cc13f249 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import com.android.inputmethod.deprecated.LanguageSwitcherProxy; +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; + +import java.lang.reflect.Method; +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 +// performance. +public class InputMethodManagerCompatWrapper { + private static final String TAG = InputMethodManagerCompatWrapper.class.getSimpleName(); + private static final Method METHOD_getCurrentInputMethodSubtype = + CompatUtils.getMethod(InputMethodManager.class, "getCurrentInputMethodSubtype"); + private static final Method METHOD_getEnabledInputMethodSubtypeList = + CompatUtils.getMethod(InputMethodManager.class, "getEnabledInputMethodSubtypeList", + InputMethodInfo.class, boolean.class); + private static final Method METHOD_getShortcutInputMethodsAndSubtypes = + CompatUtils.getMethod(InputMethodManager.class, "getShortcutInputMethodsAndSubtypes"); + private static final Method METHOD_setInputMethodAndSubtype = + CompatUtils.getMethod( + InputMethodManager.class, "setInputMethodAndSubtype", IBinder.class, + String.class, InputMethodSubtypeCompatWrapper.CLASS_InputMethodSubtype); + private static final Method METHOD_switchToLastInputMethod = CompatUtils.getMethod( + InputMethodManager.class, "switchToLastInputMethod", IBinder.class); + + private static final InputMethodManagerCompatWrapper sInstance = + new InputMethodManagerCompatWrapper(); + + public static final boolean SUBTYPE_SUPPORTED; + + static { + // This static initializer guarantees that METHOD_getShortcutInputMethodsAndSubtypes is + // already instantiated. + SUBTYPE_SUPPORTED = METHOD_getShortcutInputMethodsAndSubtypes != null; + } + + // 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. + public static final boolean FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES = + !InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED; + private static final String VOICE_MODE = "voice"; + private static final String KEYBOARD_MODE = "keyboard"; + + private InputMethodManager mImm; + private LanguageSwitcherProxy mLanguageSwitcherProxy; + private String mLatinImePackageName; + + private InputMethodManagerCompatWrapper() { + } + + public static InputMethodManagerCompatWrapper getInstance(Context context) { + if (sInstance.mImm == null) { + sInstance.init(context); + } + return sInstance; + } + + private synchronized void init(Context context) { + mImm = (InputMethodManager) context.getSystemService( + Context.INPUT_METHOD_SERVICE); + if (context instanceof LatinIME) { + mLatinImePackageName = context.getPackageName(); + } + mLanguageSwitcherProxy = LanguageSwitcherProxy.getInstance(); + } + + public InputMethodSubtypeCompatWrapper getCurrentInputMethodSubtype() { + if (!SUBTYPE_SUPPORTED) { + return new InputMethodSubtypeCompatWrapper( + 0, 0, mLanguageSwitcherProxy.getInputLocale().toString(), KEYBOARD_MODE, ""); + } + Object o = CompatUtils.invoke(mImm, null, METHOD_getCurrentInputMethodSubtype); + return new InputMethodSubtypeCompatWrapper(o); + } + + public List<InputMethodSubtypeCompatWrapper> getEnabledInputMethodSubtypeList( + InputMethodInfoCompatWrapper imi, boolean allowsImplicitlySelectedSubtypes) { + if (!SUBTYPE_SUPPORTED) { + String[] languages = mLanguageSwitcherProxy.getEnabledLanguages( + allowsImplicitlySelectedSubtypes); + List<InputMethodSubtypeCompatWrapper> subtypeList = + new ArrayList<InputMethodSubtypeCompatWrapper>(); + for (String lang: languages) { + subtypeList.add(new InputMethodSubtypeCompatWrapper(0, 0, lang, KEYBOARD_MODE, "")); + } + return subtypeList; + } + Object retval = CompatUtils.invoke(mImm, null, METHOD_getEnabledInputMethodSubtypeList, + (imi != null ? imi.getInputMethodInfo() : null), allowsImplicitlySelectedSubtypes); + if (retval == null || !(retval instanceof List<?>) || ((List<?>)retval).isEmpty()) { + if (!FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES) { + // Returns an empty list + return Collections.emptyList(); + } + // Creates dummy subtypes + @SuppressWarnings("unused") + List<InputMethodSubtypeCompatWrapper> subtypeList = + new ArrayList<InputMethodSubtypeCompatWrapper>(); + 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(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) && !FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES) + return null; + Locale inputLocale = SubtypeSwitcher.getInstance().getInputLocale(); + if (inputLocale == null) + return null; + return new InputMethodSubtypeCompatWrapper(0, 0, inputLocale.toString(), mode, ""); + } + + public Map<InputMethodInfoCompatWrapper, List<InputMethodSubtypeCompatWrapper>> + getShortcutInputMethodsAndSubtypes() { + Object retval = CompatUtils.invoke(mImm, null, METHOD_getShortcutInputMethodsAndSubtypes); + if (retval == null || !(retval instanceof Map<?, ?>) || ((Map<?, ?>)retval).isEmpty()) { + if (!FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES) { + // Returns an empty map + return Collections.emptyMap(); + } + // Creates dummy subtypes + @SuppressWarnings("unused") + InputMethodInfoCompatWrapper imi = getLatinImeInputMethodInfo(); + InputMethodSubtypeCompatWrapper voiceSubtype = getLastResortSubtype(VOICE_MODE); + if (imi != null && voiceSubtype != null) { + Map<InputMethodInfoCompatWrapper, List<InputMethodSubtypeCompatWrapper>> + shortcutMap = + new HashMap<InputMethodInfoCompatWrapper, + List<InputMethodSubtypeCompatWrapper>>(); + List<InputMethodSubtypeCompatWrapper> subtypeList = + new ArrayList<InputMethodSubtypeCompatWrapper>(); + subtypeList.add(voiceSubtype); + shortcutMap.put(imi, subtypeList); + return shortcutMap; + } else { + return Collections.emptyMap(); + } + } + Map<InputMethodInfoCompatWrapper, List<InputMethodSubtypeCompatWrapper>> shortcutMap = + new HashMap<InputMethodInfoCompatWrapper, List<InputMethodSubtypeCompatWrapper>>(); + final Map<?, ?> retvalMap = (Map<?, ?>)retval; + for (Object key : retvalMap.keySet()) { + if (!(key instanceof InputMethodInfo)) { + Log.e(TAG, "Class type error."); + return null; + } + shortcutMap.put(new InputMethodInfoCompatWrapper((InputMethodInfo)key), + CompatUtils.copyInputMethodSubtypeListToWrapper(retvalMap.get(key))); + } + return shortcutMap; + } + + public void setInputMethodAndSubtype( + IBinder token, String id, InputMethodSubtypeCompatWrapper subtype) { + if (subtype != null && subtype.hasOriginalObject()) { + CompatUtils.invoke(mImm, null, METHOD_setInputMethodAndSubtype, + token, id, subtype.getOriginalObject()); + } + } + + public boolean switchToLastInputMethod(IBinder token) { + if (SubtypeSwitcher.getInstance().isDummyVoiceMode()) { + return true; + } + return (Boolean)CompatUtils.invoke(mImm, false, METHOD_switchToLastInputMethod, token); + } + + public List<InputMethodInfoCompatWrapper> getEnabledInputMethodList() { + if (mImm == null) return null; + List<InputMethodInfoCompatWrapper> imis = new ArrayList<InputMethodInfoCompatWrapper>(); + for (InputMethodInfo imi : mImm.getEnabledInputMethodList()) { + imis.add(new InputMethodInfoCompatWrapper(imi)); + } + return imis; + } + + public void showInputMethodPicker() { + if (mImm == null) return; + mImm.showInputMethodPicker(); + } +} diff --git a/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java new file mode 100644 index 000000000..7d8c745c3 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/InputMethodServiceCompatWrapper.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import android.inputmethodservice.InputMethodService; +import android.view.inputmethod.InputMethodSubtype; + +import com.android.inputmethod.deprecated.LanguageSwitcherProxy; +import com.android.inputmethod.latin.SubtypeSwitcher; + +public class InputMethodServiceCompatWrapper extends InputMethodService { + // CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED needs to be false if the API level is 10 + // or previous. Note that InputMethodSubtype was added in the API level 11. + // For the API level 11 or later, LatinIME should override onCurrentInputMethodSubtypeChanged(). + // For the API level 10 or previous, we handle the "subtype changed" events by ourselves + // without having support from framework -- onCurrentInputMethodSubtypeChanged(). + public static final boolean CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED = true; + + private InputMethodManagerCompatWrapper mImm; + + @Override + public void onCreate() { + super.onCreate(); + mImm = InputMethodManagerCompatWrapper.getInstance(this); + } + + // When the API level is 10 or previous, notifyOnCurrentInputMethodSubtypeChanged should + // handle the event the current subtype was changed. LatinIME calls + // notifyOnCurrentInputMethodSubtypeChanged every time LatinIME + // changes the current subtype. + // This call is required to let LatinIME itself know a subtype changed + // event when the API level is 10 or previous. + @SuppressWarnings("unused") + public void notifyOnCurrentInputMethodSubtypeChanged(InputMethodSubtypeCompatWrapper subtype) { + // Do nothing when the API level is 11 or later + // and FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES is not true + if (CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED && !InputMethodManagerCompatWrapper. + FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES) { + return; + } + if (subtype == null) { + subtype = mImm.getCurrentInputMethodSubtype(); + } + if (subtype != null) { + if (!InputMethodManagerCompatWrapper.FORCE_ENABLE_VOICE_EVEN_WITH_NO_VOICE_SUBTYPES + && !subtype.isDummy()) return; + if (!InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) { + LanguageSwitcherProxy.getInstance().setLocale(subtype.getLocale()); + } + SubtypeSwitcher.getInstance().updateSubtype(subtype); + } + } + + ////////////////////////////////////// + // Functions using API v11 or later // + ////////////////////////////////////// + @Override + public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) { + // Do nothing when the API level is 10 or previous + if (!CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) return; + SubtypeSwitcher.getInstance().updateSubtype( + new InputMethodSubtypeCompatWrapper(subtype)); + } + + protected static void setTouchableRegionCompat(InputMethodService.Insets outInsets, + int x, int y, int width, int height) { + outInsets.touchableInsets = InputMethodService.Insets.TOUCHABLE_INSETS_REGION; + outInsets.touchableRegion.set(x, y, width, height); + } +} diff --git a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java new file mode 100644 index 000000000..667d86c42 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import com.android.inputmethod.latin.LatinImeLogger; + +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. +public final class InputMethodSubtypeCompatWrapper extends AbstractCompatWrapper { + private static final boolean DBG = LatinImeLogger.sDBG; + private static final String TAG = InputMethodSubtypeCompatWrapper.class.getSimpleName(); + private static final String DEFAULT_LOCALE = "en_US"; + private static final String DEFAULT_MODE = "keyboard"; + + public static final Class<?> CLASS_InputMethodSubtype = + CompatUtils.getClass("android.view.inputmethod.InputMethodSubtype"); + private static final Method METHOD_getNameResId = + CompatUtils.getMethod(CLASS_InputMethodSubtype, "getNameResId"); + private static final Method METHOD_getIconResId = + CompatUtils.getMethod(CLASS_InputMethodSubtype, "getIconResId"); + private static final Method METHOD_getLocale = + CompatUtils.getMethod(CLASS_InputMethodSubtype, "getLocale"); + private static final Method METHOD_getMode = + CompatUtils.getMethod(CLASS_InputMethodSubtype, "getMode"); + private static final Method METHOD_getExtraValue = + CompatUtils.getMethod(CLASS_InputMethodSubtype, "getExtraValue"); + private static final Method METHOD_containsExtraValueKey = + CompatUtils.getMethod(CLASS_InputMethodSubtype, "containsExtraValueKey", String.class); + private static final Method METHOD_getExtraValueOf = + CompatUtils.getMethod(CLASS_InputMethodSubtype, "getExtraValueOf", String.class); + private static final Method METHOD_isAuxiliary = + CompatUtils.getMethod(CLASS_InputMethodSubtype, "isAuxiliary"); + + 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); + 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); + } + + public boolean containsExtraValueKey(String key) { + return (Boolean)CompatUtils.invoke(mObj, false, METHOD_containsExtraValueKey, key); + } + + public String getExtraValueOf(String key) { + return (String)CompatUtils.invoke(mObj, null, METHOD_getExtraValueOf, key); + } + + public boolean isAuxiliary() { + return (Boolean)CompatUtils.invoke(mObj, false, METHOD_isAuxiliary); + } + + public boolean isDummy() { + return !hasOriginalObject(); + } + + @Override + 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/compat/InputTypeCompatUtils.java b/java/src/com/android/inputmethod/compat/InputTypeCompatUtils.java new file mode 100644 index 000000000..6c2f0f799 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/InputTypeCompatUtils.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.compat; + +import android.text.InputType; + +import java.lang.reflect.Field; + +public class InputTypeCompatUtils { + private static final Field FIELD_InputType_TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS = + CompatUtils.getField(InputType.class, "TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS"); + private static final Field FIELD_InputType_TYPE_TEXT_VARIATION_WEB_PASSWORD = CompatUtils + .getField(InputType.class, "TYPE_TEXT_VARIATION_WEB_PASSWORD"); + private static final Field FIELD_InputType_TYPE_NUMBER_VARIATION_PASSWORD = CompatUtils + .getField(InputType.class, "TYPE_NUMBER_VARIATION_PASSWORD"); + private static final Integer OBJ_InputType_TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS = + (Integer) CompatUtils.getFieldValue(null, null, + FIELD_InputType_TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS); + private static final Integer OBJ_InputType_TYPE_TEXT_VARIATION_WEB_PASSWORD = + (Integer) CompatUtils.getFieldValue(null, null, + FIELD_InputType_TYPE_TEXT_VARIATION_WEB_PASSWORD); + private static final Integer OBJ_InputType_TYPE_NUMBER_VARIATION_PASSWORD = + (Integer) CompatUtils.getFieldValue(null, null, + FIELD_InputType_TYPE_NUMBER_VARIATION_PASSWORD); + private static final int WEB_TEXT_PASSWORD_INPUT_TYPE; + private static final int WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE; + private static final int NUMBER_PASSWORD_INPUT_TYPE; + private static final int TEXT_PASSWORD_INPUT_TYPE = + InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD; + private static final int TEXT_VISIBLE_PASSWORD_INPUT_TYPE = + InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD; + + static { + WEB_TEXT_PASSWORD_INPUT_TYPE = + OBJ_InputType_TYPE_TEXT_VARIATION_WEB_PASSWORD != null + ? InputType.TYPE_CLASS_TEXT | OBJ_InputType_TYPE_TEXT_VARIATION_WEB_PASSWORD + : 0; + WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE = + OBJ_InputType_TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS != null + ? InputType.TYPE_CLASS_TEXT + | OBJ_InputType_TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS + : 0; + NUMBER_PASSWORD_INPUT_TYPE = + OBJ_InputType_TYPE_NUMBER_VARIATION_PASSWORD != null + ? InputType.TYPE_CLASS_NUMBER | OBJ_InputType_TYPE_NUMBER_VARIATION_PASSWORD + : 0; + } + + private static boolean isWebEditTextInputType(int inputType) { + return inputType == (InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT); + } + + private static boolean isWebPasswordInputType(int inputType) { + return WEB_TEXT_PASSWORD_INPUT_TYPE != 0 + && inputType == WEB_TEXT_PASSWORD_INPUT_TYPE; + } + + private static boolean isWebEmailAddressInputType(int inputType) { + return WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE != 0 + && inputType == WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE; + } + + private static boolean isNumberPasswordInputType(int inputType) { + return NUMBER_PASSWORD_INPUT_TYPE != 0 + && inputType == NUMBER_PASSWORD_INPUT_TYPE; + } + + private static boolean isTextPasswordInputType(int inputType) { + return inputType == TEXT_PASSWORD_INPUT_TYPE; + } + + private static boolean isWebEmailAddressVariation(int variation) { + return OBJ_InputType_TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS != null + && variation == OBJ_InputType_TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS; + } + + public static boolean isEmailVariation(int variation) { + return variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS + || isWebEmailAddressVariation(variation); + } + + public static boolean isWebInputType(int inputType) { + final int maskedInputType = + inputType & (InputType.TYPE_MASK_CLASS | InputType.TYPE_MASK_VARIATION); + return isWebEditTextInputType(maskedInputType) || isWebPasswordInputType(maskedInputType) + || isWebEmailAddressInputType(maskedInputType); + } + + // Please refer to TextView.isPasswordInputType + public static boolean isPasswordInputType(int inputType) { + final int maskedInputType = + inputType & (InputType.TYPE_MASK_CLASS | InputType.TYPE_MASK_VARIATION); + return isTextPasswordInputType(maskedInputType) || isWebPasswordInputType(maskedInputType) + || isNumberPasswordInputType(maskedInputType); + } + + // Please refer to TextView.isVisiblePasswordInputType + public static boolean isVisiblePasswordInputType(int inputType) { + final int maskedInputType = + inputType & (InputType.TYPE_MASK_CLASS | InputType.TYPE_MASK_VARIATION); + return maskedInputType == TEXT_VISIBLE_PASSWORD_INPUT_TYPE; + } +} diff --git a/java/src/com/android/inputmethod/compat/LinearLayoutCompatUtils.java b/java/src/com/android/inputmethod/compat/LinearLayoutCompatUtils.java new file mode 100644 index 000000000..674cbe74b --- /dev/null +++ b/java/src/com/android/inputmethod/compat/LinearLayoutCompatUtils.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.Log; + +import java.lang.reflect.Field; + +public class LinearLayoutCompatUtils { + private static final String TAG = LinearLayoutCompatUtils.class.getSimpleName(); + + private static final Class<?> CLASS_R_STYLEABLE = CompatUtils.getClass( + "com.android.internal.R$styleable"); + private static final Field STYLEABLE_VIEW = CompatUtils.getField( + CLASS_R_STYLEABLE, "View"); + private static final Field STYLEABLE_VIEW_BACKGROUND = CompatUtils.getField( + CLASS_R_STYLEABLE, "View_background"); + private static final Object VALUE_STYLEABLE_VIEW = CompatUtils.getFieldValue( + null, null, STYLEABLE_VIEW); + private static final Integer VALUE_STYLEABLE_VIEW_BACKGROUND = + (Integer)CompatUtils.getFieldValue(null, null, STYLEABLE_VIEW_BACKGROUND); + + public static Drawable getBackgroundDrawable(Context context, AttributeSet attrs, + int defStyleAttr, int defStyleRes) { + if (!(VALUE_STYLEABLE_VIEW instanceof int[]) || VALUE_STYLEABLE_VIEW_BACKGROUND == null) { + Log.w(TAG, "Can't get View background attribute using reflection"); + return null; + } + + final int[] styleableView = (int[])VALUE_STYLEABLE_VIEW; + final TypedArray a = context.obtainStyledAttributes( + attrs, styleableView, defStyleAttr, defStyleRes); + final Drawable background = a.getDrawable(VALUE_STYLEABLE_VIEW_BACKGROUND); + a.recycle(); + return background; + } +} diff --git a/java/src/com/android/inputmethod/compat/MotionEventCompatUtils.java b/java/src/com/android/inputmethod/compat/MotionEventCompatUtils.java new file mode 100644 index 000000000..8518a4a78 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/MotionEventCompatUtils.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +public class MotionEventCompatUtils { + public static final int ACTION_HOVER_MOVE = 0x7; + public static final int ACTION_HOVER_ENTER = 0x9; + public static final int ACTION_HOVER_EXIT = 0xA; +} diff --git a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java new file mode 100644 index 000000000..4929dd948 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import com.android.inputmethod.latin.SuggestedWords; +import com.android.inputmethod.latin.SuggestionSpanPickedNotificationReceiver; + +import android.content.Context; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.Locale; + +public class SuggestionSpanUtils { + // TODO: Use reflection to get field values + public static final String ACTION_SUGGESTION_PICKED = + "android.text.style.SUGGESTION_PICKED"; + public static final String SUGGESTION_SPAN_PICKED_AFTER = "after"; + public static final String SUGGESTION_SPAN_PICKED_BEFORE = "before"; + public static final String SUGGESTION_SPAN_PICKED_HASHCODE = "hashcode"; + public static final int SUGGESTION_MAX_SIZE = 5; + public static final boolean SUGGESTION_SPAN_IS_SUPPORTED; + + private static final Class<?> CLASS_SuggestionSpan = CompatUtils + .getClass("android.text.style.SuggestionSpan"); + private static final Class<?>[] INPUT_TYPE_SuggestionSpan = new Class<?>[] { + Context.class, Locale.class, String[].class, int.class, Class.class }; + private static final Constructor<?> CONSTRUCTOR_SuggestionSpan = CompatUtils + .getConstructor(CLASS_SuggestionSpan, INPUT_TYPE_SuggestionSpan); + static { + SUGGESTION_SPAN_IS_SUPPORTED = + CLASS_SuggestionSpan != null && CONSTRUCTOR_SuggestionSpan != null; + } + + public static CharSequence getTextWithSuggestionSpan(Context context, + CharSequence pickedWord, SuggestedWords suggestedWords) { + if (TextUtils.isEmpty(pickedWord) || CONSTRUCTOR_SuggestionSpan == null + || suggestedWords == null || suggestedWords.size() == 0) { + return pickedWord; + } + + final Spannable spannable; + if (pickedWord instanceof Spannable) { + spannable = (Spannable) pickedWord; + } else { + spannable = new SpannableString(pickedWord); + } + final ArrayList<String> suggestionsList = new ArrayList<String>(); + for (int i = 0; i < suggestedWords.size(); ++i) { + if (suggestionsList.size() >= SUGGESTION_MAX_SIZE) { + break; + } + final CharSequence word = suggestedWords.getWord(i); + if (!TextUtils.equals(pickedWord, word)) { + suggestionsList.add(word.toString()); + } + } + + final Object[] args = + { context, null, suggestionsList.toArray(new String[suggestionsList.size()]), 0, + (Class<?>) SuggestionSpanPickedNotificationReceiver.class }; + final Object ss = CompatUtils.newInstance(CONSTRUCTOR_SuggestionSpan, args); + if (ss == null) { + return pickedWord; + } + spannable.setSpan(ss, 0, pickedWord.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + return spannable; + } +} diff --git a/java/src/com/android/inputmethod/compat/VibratorCompatWrapper.java b/java/src/com/android/inputmethod/compat/VibratorCompatWrapper.java new file mode 100644 index 000000000..8e2a2e0b8 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/VibratorCompatWrapper.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.compat; + +import android.content.Context; +import android.os.Vibrator; + +import java.lang.reflect.Method; + +public class VibratorCompatWrapper { + private static final Method METHOD_hasVibrator = CompatUtils.getMethod(Vibrator.class, + "hasVibrator", int.class); + + private static final VibratorCompatWrapper sInstance = new VibratorCompatWrapper(); + private Vibrator mVibrator; + + private VibratorCompatWrapper() { + } + + public static VibratorCompatWrapper getInstance(Context context) { + if (sInstance.mVibrator == null) { + sInstance.mVibrator = + (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + } + return sInstance; + } + + public boolean hasVibrator() { + if (mVibrator == null) + return false; + return (Boolean) CompatUtils.invoke(mVibrator, true, METHOD_hasVibrator); + } +} diff --git a/java/src/com/android/inputmethod/deprecated/LanguageSwitcherProxy.java b/java/src/com/android/inputmethod/deprecated/LanguageSwitcherProxy.java new file mode 100644 index 000000000..290e6b554 --- /dev/null +++ b/java/src/com/android/inputmethod/deprecated/LanguageSwitcherProxy.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.deprecated; + +import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; +import com.android.inputmethod.deprecated.languageswitcher.LanguageSwitcher; +import com.android.inputmethod.latin.LatinIME; +import com.android.inputmethod.latin.Settings; + +import android.content.SharedPreferences; +import android.content.res.Configuration; + +import java.util.Locale; + +// This class is used only when the IME doesn't use method.xml for language switching. +public class LanguageSwitcherProxy implements SharedPreferences.OnSharedPreferenceChangeListener { + private static final LanguageSwitcherProxy sInstance = new LanguageSwitcherProxy(); + private LatinIME mService; + private LanguageSwitcher mLanguageSwitcher; + private SharedPreferences mPrefs; + + public static LanguageSwitcherProxy getInstance() { + if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return null; + return sInstance; + } + + public static void init(LatinIME service, SharedPreferences prefs) { + if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return; + final Configuration conf = service.getResources().getConfiguration(); + sInstance.mLanguageSwitcher = new LanguageSwitcher(service); + sInstance.mLanguageSwitcher.loadLocales(prefs, conf.locale); + sInstance.mPrefs = prefs; + sInstance.mService = service; + prefs.registerOnSharedPreferenceChangeListener(sInstance); + } + + public static void onConfigurationChanged(Configuration conf) { + if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return; + sInstance.mLanguageSwitcher.onConfigurationChanged(conf, sInstance.mPrefs); + } + + public static void loadSettings() { + if (InputMethodManagerCompatWrapper.SUBTYPE_SUPPORTED) return; + sInstance.mLanguageSwitcher.loadLocales(sInstance.mPrefs, null); + } + + public int getLocaleCount() { + return mLanguageSwitcher.getLocaleCount(); + } + + public String[] getEnabledLanguages(boolean allowImplicitlySelectedLanguages) { + return mLanguageSwitcher.getEnabledLanguages(allowImplicitlySelectedLanguages); + } + + public Locale getInputLocale() { + return mLanguageSwitcher.getInputLocale(); + } + + public void setLocale(String localeStr) { + mLanguageSwitcher.setLocale(localeStr); + mLanguageSwitcher.persist(mPrefs); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + // PREF_SELECTED_LANGUAGES: enabled input subtypes + // PREF_INPUT_LANGUAGE: current input subtype + if (key.equals(Settings.PREF_SELECTED_LANGUAGES) + || key.equals(Settings.PREF_INPUT_LANGUAGE)) { + mLanguageSwitcher.loadLocales(prefs, null); + if (mService != null) { + mService.onRefreshKeyboard(); + } + } + } +} diff --git a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java new file mode 100644 index 000000000..85993ea4d --- /dev/null +++ b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java @@ -0,0 +1,842 @@ +/* + * 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.deprecated; + +import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; +import com.android.inputmethod.deprecated.voice.FieldContext; +import com.android.inputmethod.deprecated.voice.Hints; +import com.android.inputmethod.deprecated.voice.SettingsUtil; +import com.android.inputmethod.deprecated.voice.VoiceInput; +import com.android.inputmethod.deprecated.voice.VoiceInputLogger; +import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.latin.EditingUtils; +import com.android.inputmethod.latin.LatinIME; +import com.android.inputmethod.latin.LatinIME.UIHandler; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SharedPreferencesCompat; +import com.android.inputmethod.latin.SubtypeSwitcher; +import com.android.inputmethod.latin.SuggestedWords; +import com.android.inputmethod.latin.Utils; + +import android.app.AlertDialog; +import android.content.ContentResolver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.IBinder; +import android.preference.PreferenceManager; +import android.provider.Browser; +import android.speech.SpeechRecognizer; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.text.style.URLSpan; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.ExtractedTextRequest; +import android.view.inputmethod.InputConnection; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class VoiceProxy implements VoiceInput.UiListener { + private static final VoiceProxy sInstance = new VoiceProxy(); + + public static final boolean VOICE_INSTALLED = true; + private static final boolean ENABLE_VOICE_BUTTON = true; + private static final String PREF_VOICE_MODE = "voice_mode"; + // Whether or not the user has used voice input before (and thus, whether to show the + // first-run warning dialog or not). + private static final String PREF_HAS_USED_VOICE_INPUT = "has_used_voice_input"; + // Whether or not the user has used voice input from an unsupported locale UI before. + // For example, the user has a Chinese UI but activates voice input. + private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE = + "has_used_voice_input_unsupported_locale"; + private static final int RECOGNITIONVIEW_HEIGHT_THRESHOLD_RATIO = 6; + // 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; + + 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 int mMinimumVoiceRecognitionViewHeightPixel; + private InputMethodManagerCompatWrapper mImm; + private LatinIME mService; + private AlertDialog mVoiceWarningDialog; + private VoiceInput mVoiceInput; + private final VoiceResults mVoiceResults = new VoiceResults(); + private Hints mHints; + private UIHandler mHandler; + private SubtypeSwitcher mSubtypeSwitcher; + + // For each word, a list of potential replacements, usually from voice. + private final Map<String, List<CharSequence>> mWordToSuggestions = + new HashMap<String, List<CharSequence>>(); + + public static VoiceProxy init(LatinIME context, SharedPreferences prefs, UIHandler h) { + sInstance.initInternal(context, prefs, h); + return sInstance; + } + + public static VoiceProxy getInstance() { + return sInstance; + } + + 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) { + mVoiceInput = new VoiceInput(service, this); + mHints = new Hints(service, prefs, new Hints.Display() { + @Override + public void showHint(int viewResource) { + View view = LayoutInflater.from(mService).inflate(viewResource, null); +// mService.setCandidatesView(view); +// mService.setCandidatesViewShown(true); + mIsShowingHint = true; + } + }); + } + } + + private VoiceProxy() { + // Intentional empty constructor for singleton. + } + + public void resetVoiceStates(boolean isPasswordText) { + mAfterVoiceInput = false; + mImmediatelyAfterVoiceInput = false; + mShowingVoiceSuggestions = false; + mVoiceInputHighlighted = false; + mPasswordText = isPasswordText; + } + + public void flushVoiceInputLogs(boolean configurationChanged) { + if (VOICE_INSTALLED && !configurationChanged) { + if (mAfterVoiceInput) { + mVoiceInput.flushAllTextModificationCounters(); + mVoiceInput.logInputEnded(); + } + mVoiceInput.flushLogs(); + mVoiceInput.cancel(); + } + } + + public void flushAndLogAllTextModificationCounters(int index, CharSequence suggestion, + String wordSeparators) { + if (mAfterVoiceInput && mShowingVoiceSuggestions) { + mVoiceInput.flushAllTextModificationCounters(); + // send this intent AFTER logging any prior aggregated edits. + mVoiceInput.logTextModifiedByChooseSuggestion(suggestion.toString(), index, + wordSeparators, mService.getCurrentInputConnection()); + } + } + + private void showVoiceWarningDialog(final boolean swipe, IBinder token) { + if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) { + return; + } + AlertDialog.Builder builder = new UrlLinkAlertDialogBuilder(mService); + builder.setCancelable(true); + builder.setIcon(R.drawable.ic_mic_dialog); + builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int whichButton) { + mVoiceInput.logKeyboardWarningDialogOk(); + reallyStartListening(swipe); + } + }); + builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int whichButton) { + mVoiceInput.logKeyboardWarningDialogCancel(); + switchToLastInputMethod(); + } + }); + // When the dialog is dismissed by user's cancellation, switch back to the last input method + builder.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface arg0) { + mVoiceInput.logKeyboardWarningDialogCancel(); + switchToLastInputMethod(); + } + }); + + final CharSequence message; + if (mLocaleSupportedForVoiceInput) { + message = TextUtils.concat( + mService.getText(R.string.voice_warning_may_not_understand), "\n\n", + mService.getText(R.string.voice_warning_how_to_turn_off)); + } else { + message = TextUtils.concat( + mService.getText(R.string.voice_warning_locale_not_supported), "\n\n", + mService.getText(R.string.voice_warning_may_not_understand), "\n\n", + mService.getText(R.string.voice_warning_how_to_turn_off)); + } + builder.setMessage(message); + builder.setTitle(R.string.voice_warning_title); + mVoiceWarningDialog = builder.create(); + final Window window = mVoiceWarningDialog.getWindow(); + final WindowManager.LayoutParams lp = window.getAttributes(); + lp.token = token; + lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; + window.setAttributes(lp); + window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + mVoiceInput.logKeyboardWarningDialogShown(); + mVoiceWarningDialog.show(); + } + + private static class UrlLinkAlertDialogBuilder extends AlertDialog.Builder { + private AlertDialog mAlertDialog; + + public UrlLinkAlertDialogBuilder(Context context) { + super(context); + } + + @Override + public AlertDialog.Builder setMessage(CharSequence message) { + return super.setMessage(replaceURLSpan(message)); + } + + private Spanned replaceURLSpan(CharSequence message) { + // Replace all spans with the custom span + final SpannableStringBuilder ssb = new SpannableStringBuilder(message); + for (URLSpan span : ssb.getSpans(0, ssb.length(), URLSpan.class)) { + int spanStart = ssb.getSpanStart(span); + int spanEnd = ssb.getSpanEnd(span); + int spanFlags = ssb.getSpanFlags(span); + ssb.removeSpan(span); + ssb.setSpan(new ClickableSpan(span.getURL()), spanStart, spanEnd, spanFlags); + } + return ssb; + } + + @Override + public AlertDialog create() { + final AlertDialog dialog = super.create(); + + dialog.setOnShowListener(new DialogInterface.OnShowListener() { + @Override + public void onShow(DialogInterface dialogInterface) { + // Make URL in the dialog message click-able. + TextView textView = (TextView) mAlertDialog.findViewById(android.R.id.message); + if (textView != null) { + textView.setMovementMethod(LinkMovementMethod.getInstance()); + } + } + }); + mAlertDialog = dialog; + return dialog; + } + + class ClickableSpan extends URLSpan { + public ClickableSpan(String url) { + super(url); + } + + @Override + public void onClick(View widget) { + Uri uri = Uri.parse(getURL()); + Context context = widget.getContext(); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + // Add this flag to start an activity from service + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); + // Dismiss the warning dialog and go back to the previous IME. + // TODO: If we can find a way to bring the new activity to front while keeping + // the warning dialog, we don't need to dismiss it here. + mAlertDialog.cancel(); + context.startActivity(intent); + } + } + } + + public void showPunctuationHintIfNecessary() { + InputConnection ic = mService.getCurrentInputConnection(); + if (!mImmediatelyAfterVoiceInput && mAfterVoiceInput && ic != null) { + if (mHints.showPunctuationHintIfNecessary(ic)) { + mVoiceInput.logPunctuationHintDisplayed(); + } + } + mImmediatelyAfterVoiceInput = false; + } + + public void hideVoiceWindow(boolean configurationChanging) { + if (!configurationChanging) { + if (mAfterVoiceInput) + mVoiceInput.logInputEnded(); + if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) { + mVoiceInput.logKeyboardWarningDialogDismissed(); + mVoiceWarningDialog.dismiss(); + mVoiceWarningDialog = null; + } + if (VOICE_INSTALLED & mRecognizing) { + mVoiceInput.cancel(); + } + } + mWordToSuggestions.clear(); + } + + public void setCursorAndSelection(int newSelEnd, int newSelStart) { + if (mAfterVoiceInput) { + mVoiceInput.setCursorPos(newSelEnd); + mVoiceInput.setSelectionSpan(newSelEnd - newSelStart); + } + } + + public void setVoiceInputHighlighted(boolean b) { + mVoiceInputHighlighted = b; + } + + public void setShowingVoiceSuggestions(boolean b) { + mShowingVoiceSuggestions = b; + } + + public boolean isVoiceButtonEnabled() { + return mVoiceButtonEnabled; + } + + public boolean isVoiceButtonOnPrimary() { + return mVoiceButtonOnPrimary; + } + + public boolean isVoiceInputHighlighted() { + return mVoiceInputHighlighted; + } + + public boolean isRecognizing() { + return mRecognizing; + } + + public boolean needsToShowWarningDialog() { + return !mHasUsedVoiceInput + || (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale); + } + + public boolean getAndResetIsShowingHint() { + boolean ret = mIsShowingHint; + mIsShowingHint = false; + return ret; + } + + private void revertVoiceInput() { + InputConnection ic = mService.getCurrentInputConnection(); + if (ic != null) ic.commitText("", 1); + mService.updateSuggestions(); + mVoiceInputHighlighted = false; + } + + public void commitVoiceInput() { + if (VOICE_INSTALLED && mVoiceInputHighlighted) { + InputConnection ic = mService.getCurrentInputConnection(); + if (ic != null) ic.finishComposingText(); + mService.updateSuggestions(); + mVoiceInputHighlighted = false; + } + } + + public boolean logAndRevertVoiceInput() { + if (VOICE_INSTALLED && mVoiceInputHighlighted) { + mVoiceInput.incrementTextModificationDeleteCount( + mVoiceResults.candidates.get(0).toString().length()); + revertVoiceInput(); + return true; + } else { + return false; + } + } + + public void rememberReplacedWord(CharSequence suggestion,String wordSeparators) { + if (mShowingVoiceSuggestions) { + // Retain the replaced word in the alternatives array. + String wordToBeReplaced = EditingUtils.getWordAtCursor( + mService.getCurrentInputConnection(), wordSeparators); + if (!mWordToSuggestions.containsKey(wordToBeReplaced)) { + wordToBeReplaced = wordToBeReplaced.toLowerCase(); + } + if (mWordToSuggestions.containsKey(wordToBeReplaced)) { + List<CharSequence> suggestions = mWordToSuggestions.get(wordToBeReplaced); + if (suggestions.contains(suggestion)) { + suggestions.remove(suggestion); + } + suggestions.add(wordToBeReplaced); + mWordToSuggestions.remove(wordToBeReplaced); + mWordToSuggestions.put(suggestion.toString(), suggestions); + } + } + } + + /** + * Tries to apply any voice alternatives for the word if this was a spoken word and + * there are voice alternatives. + * @param touching The word that the cursor is touching, with position information + * @return true if an alternative was found, false otherwise. + */ + public boolean applyVoiceAlternatives(EditingUtils.SelectedWord touching) { + // Search for result in spoken word alternatives + String selectedWord = touching.mWord.toString().trim(); + if (!mWordToSuggestions.containsKey(selectedWord)) { + selectedWord = selectedWord.toLowerCase(); + } + if (mWordToSuggestions.containsKey(selectedWord)) { + mShowingVoiceSuggestions = true; + List<CharSequence> suggestions = mWordToSuggestions.get(selectedWord); + SuggestedWords.Builder builder = new SuggestedWords.Builder(); + // If the first letter of touching is capitalized, make all the suggestions + // start with a capital letter. + if (Character.isUpperCase(touching.mWord.charAt(0))) { + for (CharSequence word : suggestions) { + String str = word.toString(); + word = Character.toUpperCase(str.charAt(0)) + str.substring(1); + builder.addWord(word); + } + } else { + builder.addWords(suggestions, null); + } + builder.setTypedWordValid(true).setHasMinimalSuggestion(true); + mService.setSuggestions(builder.build()); +// mService.setCandidatesViewShown(true); + return true; + } + return false; + } + + public void handleBackspace() { + if (mAfterVoiceInput) { + // Don't log delete if the user is pressing delete at + // the beginning of the text box (hence not deleting anything) + if (mVoiceInput.getCursorPos() > 0) { + // If anything was selected before the delete was pressed, increment the + // delete count by the length of the selection + int deleteLen = mVoiceInput.getSelectionSpan() > 0 ? + mVoiceInput.getSelectionSpan() : 1; + mVoiceInput.incrementTextModificationDeleteCount(deleteLen); + } + } + } + + public void handleCharacter() { + commitVoiceInput(); + if (mAfterVoiceInput) { + // Assume input length is 1. This assumption fails for smiley face insertions. + mVoiceInput.incrementTextModificationInsertCount(1); + } + } + + public void handleSeparator() { + commitVoiceInput(); + if (mAfterVoiceInput){ + // Assume input length is 1. This assumption fails for smiley face insertions. + mVoiceInput.incrementTextModificationInsertPunctuationCount(1); + } + } + + public void handleClose() { + if (VOICE_INSTALLED & mRecognizing) { + mVoiceInput.cancel(); + } + } + + + public void handleVoiceResults(boolean capitalizeFirstWord) { + mAfterVoiceInput = true; + mImmediatelyAfterVoiceInput = true; + + InputConnection ic = mService.getCurrentInputConnection(); + if (!mService.isFullscreenMode()) { + // Start listening for updates to the text from typing, etc. + if (ic != null) { + ExtractedTextRequest req = new ExtractedTextRequest(); + ic.getExtractedText(req, InputConnection.GET_EXTRACTED_TEXT_MONITOR); + } + } + mService.vibrate(); + + final List<CharSequence> nBest = new ArrayList<CharSequence>(); + for (String c : mVoiceResults.candidates) { + if (capitalizeFirstWord) { + c = Character.toUpperCase(c.charAt(0)) + c.substring(1, c.length()); + } + nBest.add(c); + } + if (nBest.size() == 0) { + return; + } + String bestResult = nBest.get(0).toString(); + mVoiceInput.logVoiceInputDelivered(bestResult.length()); + mHints.registerVoiceResult(bestResult); + + if (ic != null) ic.beginBatchEdit(); // To avoid extra updates on committing older text + mService.commitTyped(ic); + EditingUtils.appendText(ic, bestResult); + if (ic != null) ic.endBatchEdit(); + + mVoiceInputHighlighted = true; + mWordToSuggestions.putAll(mVoiceResults.alternatives); + onCancelVoice(); + } + + public void switchToRecognitionStatusView(final Configuration configuration) { + mHandler.post(new Runnable() { + @Override + public void run() { +// mService.setCandidatesViewShown(false); + mRecognizing = true; + mVoiceInput.newView(); + View v = mVoiceInput.getView(); + + ViewParent p = v.getParent(); + if (p != null && p instanceof ViewGroup) { + ((ViewGroup) p).removeView(v); + } + + View keyboardView = KeyboardSwitcher.getInstance().getKeyboardView(); + + // The full height of the keyboard is difficult to calculate + // as the dimension is expressed in "mm" and not in "pixel" + // As we add mm, we don't know how the rounding is going to work + // thus we may end up with few pixels extra (or less). + if (keyboardView != null) { + View popupLayout = v.findViewById(R.id.popup_layout); + final int displayHeight = + mService.getResources().getDisplayMetrics().heightPixels; + final int currentHeight = popupLayout.getLayoutParams().height; + final int keyboardHeight = keyboardView.getHeight(); + if (mMinimumVoiceRecognitionViewHeightPixel > keyboardHeight + || mMinimumVoiceRecognitionViewHeightPixel > currentHeight) { + popupLayout.getLayoutParams().height = + mMinimumVoiceRecognitionViewHeightPixel; + } else if (keyboardHeight > currentHeight || keyboardHeight + > (displayHeight / RECOGNITIONVIEW_HEIGHT_THRESHOLD_RATIO)) { + popupLayout.getLayoutParams().height = keyboardHeight; + } + } + mService.setInputView(v); + mService.updateInputViewShown(); + + if (configuration != null) { + mVoiceInput.onConfigurationChanged(configuration); + } + }}); + } + + private void switchToLastInputMethod() { + final IBinder token = mService.getWindow().getWindow().getAttributes().token; + new AsyncTask<Void, Void, Boolean>() { + @Override + protected Boolean doInBackground(Void... params) { + return mImm.switchToLastInputMethod(token); + } + + @Override + protected void onPostExecute(Boolean result) { + // Calls in this method need to be done in the same thread as the thread which + // called switchToLastInputMethod() + if (!result) { + if (DEBUG) { + Log.d(TAG, "Couldn't switch back to last IME."); + } + // Because the current IME and subtype failed to switch to any other IME and + // subtype by switchToLastInputMethod, the current IME and subtype should keep + // being LatinIME and voice subtype in the next time. And for re-showing voice + // mode, the state of voice input should be reset and the voice view should be + // hidden. + mVoiceInput.reset(); + mService.requestHideSelf(0); + } else { + // Notify an event that the current subtype was changed. This event will be + // handled if "onCurrentInputMethodSubtypeChanged" can't be implemented + // when the API level is 10 or previous. + mService.notifyOnCurrentInputMethodSubtypeChanged(null); + } + } + }.execute(); + } + + private void reallyStartListening(boolean swipe) { + if (!VOICE_INSTALLED) { + return; + } + if (!mHasUsedVoiceInput) { + // The user has started a voice input, so remember that in the + // future (so we don't show the warning dialog after the first run). + SharedPreferences.Editor editor = + PreferenceManager.getDefaultSharedPreferences(mService).edit(); + editor.putBoolean(PREF_HAS_USED_VOICE_INPUT, true); + SharedPreferencesCompat.apply(editor); + mHasUsedVoiceInput = true; + } + + if (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale) { + // The user has started a voice input from an unsupported locale, so remember that + // in the future (so we don't show the warning dialog the next time they do this). + SharedPreferences.Editor editor = + PreferenceManager.getDefaultSharedPreferences(mService).edit(); + editor.putBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, true); + SharedPreferencesCompat.apply(editor); + mHasUsedVoiceInputUnsupportedLocale = true; + } + + // Clear N-best suggestions + mService.clearSuggestions(); + + FieldContext context = makeFieldContext(); + mVoiceInput.startListening(context, swipe); + switchToRecognitionStatusView(null); + } + + public void startListening(final boolean swipe, IBinder token) { + // TODO: remove swipe which is no longer used. + if (VOICE_INSTALLED) { + if (needsToShowWarningDialog()) { + // Calls reallyStartListening if user clicks OK, does nothing if user clicks Cancel. + showVoiceWarningDialog(swipe, token); + } else { + reallyStartListening(swipe); + } + } + } + + private boolean fieldCanDoVoice(FieldContext fieldContext) { + return !mPasswordText + && mVoiceInput != null + && !mVoiceInput.isBlacklistedField(fieldContext); + } + + private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) { + @SuppressWarnings("deprecation") + final boolean noMic = Utils.inPrivateImeOptions(null, + LatinIME.IME_OPTION_NO_MICROPHONE_COMPAT, attribute) + || Utils.inPrivateImeOptions(mService.getPackageName(), + LatinIME.IME_OPTION_NO_MICROPHONE, attribute); + return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext) && !noMic + && SpeechRecognizer.isRecognitionAvailable(mService); + } + + public void loadSettings(EditorInfo attribute, SharedPreferences sp) { + mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false); + mHasUsedVoiceInputUnsupportedLocale = + sp.getBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, false); + + mLocaleSupportedForVoiceInput = SubtypeSwitcher.getInstance().isVoiceSupported( + SubtypeSwitcher.getInstance().getInputLocaleStr()); + + if (VOICE_INSTALLED) { + final String voiceMode = sp.getString(PREF_VOICE_MODE, + mService.getString(R.string.voice_mode_main)); + mVoiceButtonEnabled = !voiceMode.equals(mService.getString(R.string.voice_mode_off)) + && shouldShowVoiceButton(makeFieldContext(), attribute); + mVoiceButtonOnPrimary = voiceMode.equals(mService.getString(R.string.voice_mode_main)); + } + } + + public void destroy() { + if (VOICE_INSTALLED && mVoiceInput != null) { + mVoiceInput.destroy(); + } + } + + public void onStartInputView(IBinder keyboardViewToken) { + // If keyboardViewToken is null, keyboardView is not attached but voiceView is attached. + IBinder windowToken = keyboardViewToken != null ? keyboardViewToken + : mVoiceInput.getView().getWindowToken(); + // If IME is in voice mode, but still needs to show the voice warning dialog, + // keep showing the warning. + if (mSubtypeSwitcher.isVoiceMode() && windowToken != null) { + // Close keyboard view if it is been shown. + if (KeyboardSwitcher.getInstance().isInputViewShown()) + KeyboardSwitcher.getInstance().getKeyboardView().purgeKeyboardAndClosing(); + startListening(false, windowToken); + } + // If we have no token, onAttachedToWindow will take care of showing dialog and start + // listening. + } + + public void onAttachedToWindow() { + // After onAttachedToWindow, we can show the voice warning dialog. See startListening() + // above. + VoiceInputWrapper.getInstance().setVoiceInput(mVoiceInput, mSubtypeSwitcher); + } + + public void onConfigurationChanged(Configuration configuration) { + if (mRecognizing) { + switchToRecognitionStatusView(configuration); + } + } + + @Override + public void onCancelVoice() { + if (mRecognizing) { + if (mSubtypeSwitcher.isVoiceMode()) { + // If voice mode is being canceled within LatinIME (i.e. time-out or user + // cancellation etc.), onCancelVoice() will be called first. LatinIME thinks it's + // still in voice mode. LatinIME needs to call switchToLastInputMethod(). + // Note that onCancelVoice() will be called again from SubtypeSwitcher. + switchToLastInputMethod(); + } else if (mSubtypeSwitcher.isKeyboardMode()) { + // If voice mode is being canceled out of LatinIME (i.e. by user's IME switching or + // as a result of switchToLastInputMethod() etc.), + // onCurrentInputMethodSubtypeChanged() will be called first. LatinIME will know + // that it's in keyboard mode and SubtypeSwitcher will call onCancelVoice(). + mRecognizing = false; + mService.switchToKeyboardView(); + } + } + } + + @Override + public void onVoiceResults(List<String> candidates, + Map<String, List<CharSequence>> alternatives) { + if (!mRecognizing) { + return; + } + mVoiceResults.candidates = candidates; + mVoiceResults.alternatives = alternatives; + mHandler.updateVoiceResults(); + } + + private FieldContext makeFieldContext() { + SubtypeSwitcher switcher = SubtypeSwitcher.getInstance(); + return new FieldContext(mService.getCurrentInputConnection(), + mService.getCurrentInputEditorInfo(), switcher.getInputLocaleStr(), + switcher.getEnabledLanguages()); + } + + private class VoiceResults { + List<String> candidates; + Map<String, List<CharSequence>> alternatives; + } + + public static class VoiceLoggerWrapper { + private static final VoiceLoggerWrapper sLoggerWrapperInstance = new VoiceLoggerWrapper(); + private VoiceInputLogger mLogger; + + public static VoiceLoggerWrapper getInstance(Context context) { + if (sLoggerWrapperInstance.mLogger == null) { + // Not thread safe, but it's ok. + sLoggerWrapperInstance.mLogger = VoiceInputLogger.getLogger(context); + } + return sLoggerWrapperInstance; + } + + // private for the singleton + private VoiceLoggerWrapper() { + } + + public void settingsWarningDialogCancel() { + mLogger.settingsWarningDialogCancel(); + } + + public void settingsWarningDialogOk() { + mLogger.settingsWarningDialogOk(); + } + + public void settingsWarningDialogShown() { + mLogger.settingsWarningDialogShown(); + } + + public void settingsWarningDialogDismissed() { + mLogger.settingsWarningDialogDismissed(); + } + + public void voiceInputSettingEnabled(boolean enabled) { + if (enabled) { + mLogger.voiceInputSettingEnabled(); + } else { + mLogger.voiceInputSettingDisabled(); + } + } + } + + public static class VoiceInputWrapper { + private static final VoiceInputWrapper sInputWrapperInstance = new VoiceInputWrapper(); + private VoiceInput mVoiceInput; + public static VoiceInputWrapper getInstance() { + return sInputWrapperInstance; + } + public void setVoiceInput(VoiceInput voiceInput, SubtypeSwitcher switcher) { + if (mVoiceInput == null && voiceInput != null) { + mVoiceInput = voiceInput; + } + switcher.setVoiceInputWrapper(this); + } + + private VoiceInputWrapper() { + } + + public void cancel() { + if (mVoiceInput != null) mVoiceInput.cancel(); + } + + public void reset() { + if (mVoiceInput != null) mVoiceInput.reset(); + } + } + + // 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 static String getSupportedLocalesString (ContentResolver resolver) { + return SettingsUtil.getSettingsString( + resolver, + SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES, + DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES); + } +} diff --git a/java/src/com/android/inputmethod/deprecated/compat/VoiceInputLoggerCompatUtils.java b/java/src/com/android/inputmethod/deprecated/compat/VoiceInputLoggerCompatUtils.java new file mode 100644 index 000000000..488390fbc --- /dev/null +++ b/java/src/com/android/inputmethod/deprecated/compat/VoiceInputLoggerCompatUtils.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.deprecated.compat; + +import com.android.common.userhappiness.UserHappinessSignals; +import com.android.inputmethod.compat.CompatUtils; + +import java.lang.reflect.Method; + +public class VoiceInputLoggerCompatUtils { + public static final String EXTRA_TEXT_REPLACED_LENGTH = "length"; + public static final String EXTRA_BEFORE_N_BEST_CHOOSE = "before"; + public static final String EXTRA_AFTER_N_BEST_CHOOSE = "after"; + private static final Method METHOD_UserHappinessSignals_setHasVoiceLoggingInfo = + CompatUtils.getMethod(UserHappinessSignals.class, "setHasVoiceLoggingInfo", + boolean.class); + + public static void setHasVoiceLoggingInfoCompat(boolean hasLoggingInfo) { + CompatUtils.invoke(null, null, METHOD_UserHappinessSignals_setHasVoiceLoggingInfo, + hasLoggingInfo); + } +} diff --git a/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java b/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java new file mode 100644 index 000000000..cf6cd0f5e --- /dev/null +++ b/java/src/com/android/inputmethod/deprecated/languageswitcher/InputLanguageSelection.java @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2008-2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * 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.deprecated.languageswitcher; + +import com.android.inputmethod.keyboard.internal.KeyboardParser; +import com.android.inputmethod.latin.DictionaryFactory; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.Settings; +import com.android.inputmethod.latin.SharedPreferencesCompat; +import com.android.inputmethod.latin.SubtypeSwitcher; +import com.android.inputmethod.latin.Utils; + +import org.xmlpull.v1.XmlPullParserException; + +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.content.res.Resources; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.PreferenceActivity; +import android.preference.PreferenceGroup; +import android.preference.PreferenceManager; +import android.text.TextUtils; +import android.util.Pair; + +import java.io.IOException; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map.Entry; +import java.util.TreeMap; + +public class InputLanguageSelection extends PreferenceActivity { + + private SharedPreferences mPrefs; + private String mSelectedLanguages; + private HashMap<CheckBoxPreference, Locale> mLocaleMap = + new HashMap<CheckBoxPreference, Locale>(); + + private static class LocaleEntry implements Comparable<Object> { + private static Collator sCollator = Collator.getInstance(); + + private String mLabel; + public final Locale mLocale; + + public LocaleEntry(String label, Locale locale) { + this.mLabel = label; + this.mLocale = locale; + } + + @Override + public String toString() { + return this.mLabel; + } + + @Override + public int compareTo(Object o) { + return sCollator.compare(this.mLabel, ((LocaleEntry) o).mLabel); + } + } + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + addPreferencesFromResource(R.xml.language_prefs); + // Get the settings preferences + mPrefs = PreferenceManager.getDefaultSharedPreferences(this); + mSelectedLanguages = mPrefs.getString(Settings.PREF_SELECTED_LANGUAGES, ""); + String[] languageList = mSelectedLanguages.split(","); + ArrayList<LocaleEntry> availableLanguages = getUniqueLocales(); + PreferenceGroup parent = getPreferenceScreen(); + final HashMap<Long, LocaleEntry> dictionaryIdLocaleMap = new HashMap<Long, LocaleEntry>(); + final TreeMap<LocaleEntry, Boolean> localeHasDictionaryMap = + new TreeMap<LocaleEntry, Boolean>(); + for (int i = 0; i < availableLanguages.size(); i++) { + LocaleEntry loc = availableLanguages.get(i); + Locale locale = loc.mLocale; + final Pair<Long, Boolean> hasDictionaryOrLayout = hasDictionaryOrLayout(locale); + final Long dictionaryId = hasDictionaryOrLayout.first; + final boolean hasLayout = hasDictionaryOrLayout.second; + final boolean hasDictionary = dictionaryId != null; + // Add this locale to the supported list if: + // 1) this locale has a layout/ 2) this locale has a dictionary + // If some locales have no layout but have a same dictionary, the shortest locale + // will be added to the supported list. + if (!hasLayout && !hasDictionary) { + continue; + } + if (hasLayout) { + localeHasDictionaryMap.put(loc, hasDictionary); + } + if (!hasDictionary) { + continue; + } + if (dictionaryIdLocaleMap.containsKey(dictionaryId)) { + final String newLocale = locale.toString(); + final String oldLocale = + dictionaryIdLocaleMap.get(dictionaryId).mLocale.toString(); + // Check if this locale is more appropriate to be the candidate of the input locale. + if (oldLocale.length() <= newLocale.length() && !hasLayout) { + // Don't add this new locale to the map<dictionary id, locale> if: + // 1) the new locale's name is longer than the existing one, and + // 2) the new locale doesn't have its layout + continue; + } + } + dictionaryIdLocaleMap.put(dictionaryId, loc); + } + + for (LocaleEntry localeEntry : dictionaryIdLocaleMap.values()) { + if (!localeHasDictionaryMap.containsKey(localeEntry)) { + localeHasDictionaryMap.put(localeEntry, true); + } + } + + for (Entry<LocaleEntry, Boolean> entry : localeHasDictionaryMap.entrySet()) { + final LocaleEntry localeEntry = entry.getKey(); + final Locale locale = localeEntry.mLocale; + final Boolean hasDictionary = entry.getValue(); + CheckBoxPreference pref = new CheckBoxPreference(this); + pref.setTitle(localeEntry.mLabel); + boolean checked = isLocaleIn(locale, languageList); + pref.setChecked(checked); + if (hasDictionary) { + pref.setSummary(R.string.has_dictionary); + } + mLocaleMap.put(pref, locale); + parent.addPreference(pref); + } + } + + private boolean isLocaleIn(Locale locale, String[] list) { + String lang = get5Code(locale); + for (int i = 0; i < list.length; i++) { + if (lang.equalsIgnoreCase(list[i])) return true; + } + return false; + } + + private Pair<Long, Boolean> hasDictionaryOrLayout(Locale locale) { + if (locale == null) return new Pair<Long, Boolean>(null, false); + final Resources res = getResources(); + final Locale saveLocale = Utils.setSystemLocale(res, locale); + final Long dictionaryId = DictionaryFactory.getDictionaryId(this, locale); + boolean hasLayout = false; + + try { + final String localeStr = locale.toString(); + final String[] layoutCountryCodes = KeyboardParser.parseKeyboardLocale( + this, R.xml.kbd_qwerty).split(",", -1); + if (!TextUtils.isEmpty(localeStr) && layoutCountryCodes.length > 0) { + for (String s : layoutCountryCodes) { + if (s.equals(localeStr)) { + hasLayout = true; + break; + } + } + } + } catch (XmlPullParserException e) { + } catch (IOException e) { + } + Utils.setSystemLocale(res, saveLocale); + return new Pair<Long, Boolean>(dictionaryId, hasLayout); + } + + private String get5Code(Locale locale) { + String country = locale.getCountry(); + return locale.getLanguage() + + (TextUtils.isEmpty(country) ? "" : "_" + country); + } + + @Override + protected void onResume() { + super.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + // Save the selected languages + String checkedLanguages = ""; + PreferenceGroup parent = getPreferenceScreen(); + int count = parent.getPreferenceCount(); + for (int i = 0; i < count; i++) { + CheckBoxPreference pref = (CheckBoxPreference) parent.getPreference(i); + if (pref.isChecked()) { + checkedLanguages += get5Code(mLocaleMap.get(pref)) + ","; + } + } + if (checkedLanguages.length() < 1) checkedLanguages = null; // Save null + Editor editor = mPrefs.edit(); + editor.putString(Settings.PREF_SELECTED_LANGUAGES, checkedLanguages); + SharedPreferencesCompat.apply(editor); + } + + public ArrayList<LocaleEntry> getUniqueLocales() { + String[] locales = getAssets().getLocales(); + Arrays.sort(locales); + ArrayList<LocaleEntry> uniqueLocales = new ArrayList<LocaleEntry>(); + + final int origSize = locales.length; + LocaleEntry[] preprocess = new LocaleEntry[origSize]; + int finalSize = 0; + for (int i = 0 ; i < origSize; i++ ) { + String s = locales[i]; + int len = s.length(); + String language = ""; + String country = ""; + if (len == 5) { + language = s.substring(0, 2); + country = s.substring(3, 5); + } else if (len < 5) { + language = s; + } + Locale l = new Locale(language, country); + + // Exclude languages that are not relevant to LatinIME + if (TextUtils.isEmpty(language)) { + continue; + } + + if (finalSize == 0) { + preprocess[finalSize++] = + new LocaleEntry(SubtypeSwitcher.getFullDisplayName(l, false), l); + } else { + if (s.equals("zz_ZZ")) { + // ignore this locale + } else { + final String displayName = SubtypeSwitcher.getFullDisplayName(l, false); + preprocess[finalSize++] = new LocaleEntry(displayName, l); + } + } + } + for (int i = 0; i < finalSize ; i++) { + uniqueLocales.add(preprocess[i]); + } + return uniqueLocales; + } +} diff --git a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java b/java/src/com/android/inputmethod/deprecated/languageswitcher/LanguageSwitcher.java index 226b4c690..1eedb5ee1 100644 --- a/java/src/com/android/inputmethod/latin/LanguageSwitcher.java +++ b/java/src/com/android/inputmethod/deprecated/languageswitcher/LanguageSwitcher.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Google Inc. + * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,13 +14,21 @@ * the License. */ -package com.android.inputmethod.latin; +package com.android.inputmethod.deprecated.languageswitcher; + +import com.android.inputmethod.latin.LatinIME; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.Settings; +import com.android.inputmethod.latin.SharedPreferencesCompat; +import com.android.inputmethod.latin.Utils; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; -import android.preference.PreferenceManager; +import android.content.res.Configuration; import android.text.TextUtils; +import android.util.Log; +import java.util.ArrayList; import java.util.Locale; /** @@ -28,10 +36,15 @@ import java.util.Locale; * input language that the user has selected. */ public class LanguageSwitcher { + private static final String TAG = LanguageSwitcher.class.getSimpleName(); + + @SuppressWarnings("unused") + private static final String KEYBOARD_MODE = "keyboard"; + private static final String[] EMPTY_STIRNG_ARRAY = new String[0]; - private Locale[] mLocales; - private LatinIME mIme; - private String[] mSelectedLanguageArray; + private final ArrayList<Locale> mLocales = new ArrayList<Locale>(); + private final LatinIME mIme; + private String[] mSelectedLanguageArray = EMPTY_STIRNG_ARRAY; private String mSelectedLanguages; private int mCurrentIndex = 0; private String mDefaultInputLanguage; @@ -40,31 +53,43 @@ public class LanguageSwitcher { public LanguageSwitcher(LatinIME ime) { mIme = ime; - mLocales = new Locale[0]; } - public Locale[] getLocales() { - return mLocales; + public int getLocaleCount() { + return mLocales.size(); } - public int getLocaleCount() { - return mLocales.length; + public void onConfigurationChanged(Configuration conf, SharedPreferences prefs) { + final Locale newLocale = conf.locale; + if (!getSystemLocale().toString().equals(newLocale.toString())) { + loadLocales(prefs, newLocale); + } } /** * Loads the currently selected input languages from shared preferences. - * @param sp + * @param sp shared preference for getting the current input language and enabled languages + * @param systemLocale the current system locale, stored for changing the current input language + * based on the system current system locale. * @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); - if (selectedLanguages == null || selectedLanguages.length() < 1) { + public boolean loadLocales(SharedPreferences sp, Locale systemLocale) { + if (LatinImeLogger.sDBG) { + Log.d(TAG, "load locales"); + } + if (systemLocale != null) { + setSystemLocale(systemLocale); + } + String selectedLanguages = sp.getString(Settings.PREF_SELECTED_LANGUAGES, null); + String currentLanguage = sp.getString(Settings.PREF_INPUT_LANGUAGE, null); + if (TextUtils.isEmpty(selectedLanguages)) { + mSelectedLanguageArray = EMPTY_STIRNG_ARRAY; + mSelectedLanguages = null; 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 +102,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; @@ -89,6 +114,9 @@ public class LanguageSwitcher { } private void loadDefaults() { + if (LatinImeLogger.sDBG) { + Log.d(TAG, "load default locales:"); + } mDefaultInputLocale = mIme.getResources().getConfiguration().locale; String country = mDefaultInputLocale.getCountry(); mDefaultInputLanguage = mDefaultInputLocale.getLanguage() + @@ -96,11 +124,10 @@ 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), - lang.length() > 4 ? lang.substring(3, 5) : ""); + mLocales.clear(); + for (final String lang : mSelectedLanguageArray) { + final Locale locale = Utils.constructLocaleFromString(lang); + mLocales.add(locale); } } @@ -117,37 +144,47 @@ public class LanguageSwitcher { /** * Returns the list of enabled language codes. */ - public String[] getEnabledLanguages() { + public String[] getEnabledLanguages(boolean allowImplicitlySelectedLanguages) { + if (mSelectedLanguageArray.length == 0 && allowImplicitlySelectedLanguages) { + return new String[] { mDefaultInputLanguage }; + } return mSelectedLanguageArray; } /** * Returns the currently selected input locale, or the display locale if no specific * locale was selected for input. - * @return */ 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; } /** * Returns the next input locale in the list. Wraps around to the beginning of the * list if we're at the end of the list. - * @return */ public Locale getNextInputLocale() { if (getLocaleCount() == 0) return mDefaultInputLocale; - - return mLocales[(mCurrentIndex + 1) % mLocales.length]; + return mLocales.get(nextLocaleIndex()); } /** * Sets the system locale (display UI) used for comparing with the input language. * @param locale the locale of the system */ - public void setSystemLocale(Locale locale) { + private void setSystemLocale(Locale locale) { mSystemLocale = locale; } @@ -155,19 +192,17 @@ public class LanguageSwitcher { * Returns the system locale. * @return the system locale */ - public Locale getSystemLocale() { + private Locale getSystemLocale() { return mSystemLocale; } /** * Returns the previous input locale in the list. Wraps around to the end of the * list if we're at the beginning of the list. - * @return */ 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 +210,25 @@ 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 - } - - public void persist() { - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mIme); - Editor editor = sp.edit(); - editor.putString(LatinIME.PREF_INPUT_LANGUAGE, getInputLanguage()); - SharedPreferencesCompat.apply(editor); + mCurrentIndex = prevLocaleIndex(); } - static String toTitleCase(String s, Locale locale) { - if (s.length() == 0) { - return s; + public void setLocale(String localeStr) { + final int N = mLocales.size(); + for (int i = 0; i < N; ++i) { + if (mLocales.get(i).toString().equals(localeStr)) { + mCurrentIndex = i; + } } + } - return s.toUpperCase(locale).charAt(0) + s.substring(1); + public void persist(SharedPreferences prefs) { + Editor editor = prefs.edit(); + editor.putString(Settings.PREF_INPUT_LANGUAGE, getInputLanguage()); + SharedPreferencesCompat.apply(editor); } } diff --git a/java/src/com/android/inputmethod/deprecated/recorrection/Recorrection.java b/java/src/com/android/inputmethod/deprecated/recorrection/Recorrection.java new file mode 100644 index 000000000..d40728d25 --- /dev/null +++ b/java/src/com/android/inputmethod/deprecated/recorrection/Recorrection.java @@ -0,0 +1,287 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.deprecated.recorrection; + +import com.android.inputmethod.compat.InputConnectionCompatUtils; +import com.android.inputmethod.compat.SuggestionSpanUtils; +import com.android.inputmethod.deprecated.VoiceProxy; +import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.latin.AutoCorrection; +import com.android.inputmethod.latin.CandidateView; +import com.android.inputmethod.latin.EditingUtils; +import com.android.inputmethod.latin.LatinIME; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.Settings; +import com.android.inputmethod.latin.Suggest; +import com.android.inputmethod.latin.SuggestedWords; +import com.android.inputmethod.latin.TextEntryState; +import com.android.inputmethod.latin.WordComposer; + +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.text.TextUtils; +import android.view.inputmethod.ExtractedText; +import android.view.inputmethod.ExtractedTextRequest; +import android.view.inputmethod.InputConnection; + +import java.util.ArrayList; + +/** + * Manager of re-correction functionalities + */ +public class Recorrection implements SharedPreferences.OnSharedPreferenceChangeListener { + private static final Recorrection sInstance = new Recorrection(); + + private LatinIME mService; + private boolean mRecorrectionEnabled = false; + private final ArrayList<RecorrectionSuggestionEntries> mRecorrectionSuggestionsList = + new ArrayList<RecorrectionSuggestionEntries>(); + + public static Recorrection getInstance() { + return sInstance; + } + + public static void init(LatinIME context, SharedPreferences prefs) { + if (context == null || prefs == null) { + return; + } + sInstance.initInternal(context, prefs); + } + + private Recorrection() { + } + + public boolean isRecorrectionEnabled() { + return mRecorrectionEnabled; + } + + private void initInternal(LatinIME context, SharedPreferences prefs) { + if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED) { + mRecorrectionEnabled = false; + return; + } + updateRecorrectionEnabled(context.getResources(), prefs); + mService = context; + prefs.registerOnSharedPreferenceChangeListener(this); + } + + public void checkRecorrectionOnStart() { + if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED || !mRecorrectionEnabled) return; + + final InputConnection ic = mService.getCurrentInputConnection(); + if (ic == null) return; + // There could be a pending composing span. Clean it up first. + ic.finishComposingText(); + + if (mService.isShowingSuggestionsStrip() && mService.isSuggestionsRequested()) { + // First get the cursor position. This is required by setOldSuggestions(), so that + // it can pass the correct range to setComposingRegion(). At this point, we don't + // have valid values for mLastSelectionStart/End because onUpdateSelection() has + // not been called yet. + ExtractedTextRequest etr = new ExtractedTextRequest(); + etr.token = 0; // anything is fine here + ExtractedText et = ic.getExtractedText(etr, 0); + if (et == null) return; + mService.setLastSelection( + et.startOffset + et.selectionStart, et.startOffset + et.selectionEnd); + + // Then look for possible corrections in a delayed fashion + if (!TextUtils.isEmpty(et.text) && mService.isCursorTouchingWord()) { + mService.mHandler.postUpdateOldSuggestions(); + } + } + } + + public void updateRecorrectionSelection(KeyboardSwitcher keyboardSwitcher, + CandidateView candidateView, int candidatesStart, int candidatesEnd, + int newSelStart, int newSelEnd, int oldSelStart, int lastSelectionStart, + int lastSelectionEnd, boolean hasUncommittedTypedChars) { + if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED || !mRecorrectionEnabled) return; + if (!mService.isShowingSuggestionsStrip()) return; + if (!keyboardSwitcher.isInputViewShown()) return; + if (!mService.isSuggestionsRequested()) return; + // Don't look for corrections if the keyboard is not visible + // Check if we should go in or out of correction mode. + if ((candidatesStart == candidatesEnd || newSelStart != oldSelStart || TextEntryState + .isRecorrecting()) + && (newSelStart < newSelEnd - 1 || !hasUncommittedTypedChars)) { + if (mService.isCursorTouchingWord() || lastSelectionStart < lastSelectionEnd) { + mService.mHandler.cancelUpdateBigramPredictions(); + mService.mHandler.postUpdateOldSuggestions(); + } else { + abortRecorrection(false); + // If showing the "touch again to save" hint, do not replace it. Else, + // show the bigrams if we are at the end of the text, punctuation + // otherwise. + if (candidateView != null && !candidateView.isShowingAddToDictionaryHint()) { + InputConnection ic = mService.getCurrentInputConnection(); + if (null == ic || !TextUtils.isEmpty(ic.getTextAfterCursor(1, 0))) { + if (!mService.isShowingPunctuationList()) { + mService.setPunctuationSuggestions(); + } + } else { + mService.mHandler.postUpdateBigramPredictions(); + } + } + } + } + } + + public void saveRecorrectionSuggestion(WordComposer word, CharSequence result) { + if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED || !mRecorrectionEnabled) return; + if (word.size() <= 1) { + return; + } + // Skip if result is null. It happens in some edge case. + if (TextUtils.isEmpty(result)) { + return; + } + + // Make a copy of the CharSequence, since it is/could be a mutable CharSequence + final String resultCopy = result.toString(); + RecorrectionSuggestionEntries entry = new RecorrectionSuggestionEntries( + resultCopy, new WordComposer(word)); + mRecorrectionSuggestionsList.add(entry); + } + + public void clearWordsInHistory() { + mRecorrectionSuggestionsList.clear(); + } + + /** + * Tries to apply any typed alternatives for the word if we have any cached alternatives, + * otherwise tries to find new corrections and completions for the word. + * @param touching The word that the cursor is touching, with position information + * @return true if an alternative was found, false otherwise. + */ + public boolean applyTypedAlternatives(WordComposer word, Suggest suggest, + KeyboardSwitcher keyboardSwitcher, EditingUtils.SelectedWord touching) { + if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED || !mRecorrectionEnabled) return false; + // If we didn't find a match, search for result in typed word history + WordComposer foundWord = null; + RecorrectionSuggestionEntries alternatives = null; + // Search old suggestions to suggest re-corrected suggestions. + for (RecorrectionSuggestionEntries entry : mRecorrectionSuggestionsList) { + if (TextUtils.equals(entry.getChosenWord(), touching.mWord)) { + foundWord = entry.mWordComposer; + alternatives = entry; + break; + } + } + // If we didn't find a match, at least suggest corrections as re-corrected suggestions. + if (foundWord == null + && (AutoCorrection.isValidWord(suggest.getUnigramDictionaries(), + touching.mWord, true))) { + foundWord = new WordComposer(); + for (int i = 0; i < touching.mWord.length(); i++) { + foundWord.add(touching.mWord.charAt(i), + new int[] { touching.mWord.charAt(i) }, WordComposer.NOT_A_COORDINATE, + WordComposer.NOT_A_COORDINATE); + } + foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.mWord.charAt(0))); + } + // Found a match, show suggestions + if (foundWord != null || alternatives != null) { + if (alternatives == null) { + alternatives = new RecorrectionSuggestionEntries(touching.mWord, foundWord); + } + showRecorrections(suggest, keyboardSwitcher, alternatives); + if (foundWord != null) { + word.init(foundWord); + } else { + word.reset(); + } + return true; + } + return false; + } + + + private void showRecorrections(Suggest suggest, KeyboardSwitcher keyboardSwitcher, + RecorrectionSuggestionEntries entries) { + SuggestedWords.Builder builder = entries.getAlternatives(suggest, keyboardSwitcher); + builder.setTypedWordValid(false).setHasMinimalSuggestion(false); + mService.showSuggestions(builder.build(), entries.getOriginalWord()); + } + + public void fetchAndDisplayRecorrectionSuggestions(VoiceProxy voiceProxy, + CandidateView candidateView, Suggest suggest, KeyboardSwitcher keyboardSwitcher, + WordComposer word, boolean hasUncommittedTypedChars, int lastSelectionStart, + int lastSelectionEnd, String wordSeparators) { + if (!InputConnectionCompatUtils.RECORRECTION_SUPPORTED) return; + if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED || !mRecorrectionEnabled) return; + voiceProxy.setShowingVoiceSuggestions(false); + if (candidateView != null && candidateView.isShowingAddToDictionaryHint()) { + return; + } + InputConnection ic = mService.getCurrentInputConnection(); + if (ic == null) return; + if (!hasUncommittedTypedChars) { + // Extract the selected or touching text + EditingUtils.SelectedWord touching = EditingUtils.getWordAtCursorOrSelection(ic, + lastSelectionStart, lastSelectionEnd, wordSeparators); + + if (touching != null && touching.mWord.length() > 1) { + ic.beginBatchEdit(); + + if (applyTypedAlternatives(word, suggest, keyboardSwitcher, touching) + || voiceProxy.applyVoiceAlternatives(touching)) { + TextEntryState.selectedForRecorrection(); + InputConnectionCompatUtils.underlineWord(ic, touching); + } else { + abortRecorrection(true); + } + + ic.endBatchEdit(); + } else { + abortRecorrection(true); + mService.updateBigramPredictions(); + } + } else { + abortRecorrection(true); + } + } + + public void abortRecorrection(boolean force) { + if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED) return; + if (force || TextEntryState.isRecorrecting()) { + TextEntryState.onAbortRecorrection(); + mService.setCandidatesViewShown(mService.isCandidateStripVisible()); + mService.getCurrentInputConnection().finishComposingText(); + mService.clearSuggestions(); + } + } + + public void updateRecorrectionEnabled(Resources res, SharedPreferences prefs) { + // If the option should not be shown, do not read the re-correction preference + // but always use the default setting defined in the resources. + if (res.getBoolean(R.bool.config_enable_show_recorrection_option)) { + mRecorrectionEnabled = prefs.getBoolean(Settings.PREF_RECORRECTION_ENABLED, + res.getBoolean(R.bool.config_default_recorrection_enabled)); + } else { + mRecorrectionEnabled = res.getBoolean(R.bool.config_default_recorrection_enabled); + } + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + if (SuggestionSpanUtils.SUGGESTION_SPAN_IS_SUPPORTED) return; + if (key.equals(Settings.PREF_RECORRECTION_ENABLED)) { + updateRecorrectionEnabled(mService.getResources(), prefs); + } + } +} diff --git a/java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java b/java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java new file mode 100644 index 000000000..5e6c87044 --- /dev/null +++ b/java/src/com/android/inputmethod/deprecated/recorrection/RecorrectionSuggestionEntries.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.deprecated.recorrection; + +import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.latin.Suggest; +import com.android.inputmethod.latin.SuggestedWords; +import com.android.inputmethod.latin.WordComposer; + +import android.text.TextUtils; + +public class RecorrectionSuggestionEntries { + public final CharSequence mChosenWord; + public final WordComposer mWordComposer; + + public RecorrectionSuggestionEntries(CharSequence chosenWord, WordComposer wordComposer) { + mChosenWord = chosenWord; + mWordComposer = wordComposer; + } + + public CharSequence getChosenWord() { + return mChosenWord; + } + + public CharSequence getOriginalWord() { + return mWordComposer.getTypedWord(); + } + + public SuggestedWords.Builder getAlternatives( + Suggest suggest, KeyboardSwitcher keyboardSwitcher) { + return getTypedSuggestions(suggest, keyboardSwitcher, mWordComposer); + } + + @Override + public int hashCode() { + return mChosenWord.hashCode(); + } + + @Override + public boolean equals(Object o) { + return o instanceof CharSequence && TextUtils.equals(mChosenWord, (CharSequence)o); + } + + private static SuggestedWords.Builder getTypedSuggestions( + Suggest suggest, KeyboardSwitcher keyboardSwitcher, WordComposer word) { + return suggest.getSuggestedWordBuilder(keyboardSwitcher.getKeyboardView(), word, null); + } +} diff --git a/java/src/com/android/inputmethod/voice/FieldContext.java b/java/src/com/android/inputmethod/deprecated/voice/FieldContext.java index 5fbacfb6c..3c79cc218 100644 --- a/java/src/com/android/inputmethod/voice/FieldContext.java +++ b/java/src/com/android/inputmethod/deprecated/voice/FieldContext.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Google Inc. + * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,7 +14,7 @@ * the License. */ -package com.android.inputmethod.voice; +package com.android.inputmethod.deprecated.voice; import android.os.Bundle; import android.util.Log; @@ -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/deprecated/voice/Hints.java index c467365e7..06b234381 100644 --- a/java/src/com/android/inputmethod/latin/Hints.java +++ b/java/src/com/android/inputmethod/deprecated/voice/Hints.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Google Inc. + * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,14 +14,14 @@ * the License. */ -package com.android.inputmethod.latin; +package com.android.inputmethod.deprecated.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/deprecated/voice/RecognitionView.java index 7cec0b04a..dcb826e8f 100644 --- a/java/src/com/android/inputmethod/voice/RecognitionView.java +++ b/java/src/com/android/inputmethod/deprecated/voice/RecognitionView.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Google Inc. + * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,16 +14,11 @@ * the License. */ -package com.android.inputmethod.voice; +package com.android.inputmethod.deprecated.voice; -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.ShortBuffer; -import java.util.ArrayList; -import java.util.List; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SubtypeSwitcher; -import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; @@ -34,16 +29,20 @@ import android.graphics.Path; import android.graphics.PathEffect; import android.graphics.drawable.Drawable; import android.os.Handler; -import android.util.TypedValue; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; -import android.view.ViewGroup.MarginLayoutParams; +import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; -import com.android.inputmethod.latin.R; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.ShortBuffer; +import java.util.Locale; /** * The user interface for the "Speak now" and "working" states. @@ -57,80 +56,57 @@ public class RecognitionView { private View mView; private Context mContext; - private ImageView mImage; private TextView mText; - private View mButton; - private TextView mButtonText; + private ImageView mImage; private View mProgress; + private SoundIndicator mSoundIndicator; + private TextView mLanguage; + private Button mButton; private Drawable mInitializing; private Drawable mError; - private List<Drawable> mSpeakNow; - - private float mVolume = 0.0f; - private int mLevel = 0; - - private enum State {LISTENING, WORKING, READY} - private State mState = State.READY; - - private float mMinMicrophoneLevel; - private float mMaxMicrophoneLevel; - /** Updates the microphone icon to show user their volume.*/ - private Runnable mUpdateVolumeRunnable = new Runnable() { - public void run() { - if (mState != State.LISTENING) { - return; - } - - final float min = mMinMicrophoneLevel; - final float max = mMaxMicrophoneLevel; - final int maxLevel = mSpeakNow.size() - 1; + private static final int INIT = 0; + private static final int LISTENING = 1; + private static final int WORKING = 2; + private static final int READY = 3; + + private int mState = INIT; - int index = (int) ((mVolume - min) / (max - min) * maxLevel); - final int level = Math.min(Math.max(0, index), maxLevel); + private final View mPopupLayout; - if (level != mLevel) { - mImage.setImageDrawable(mSpeakNow.get(level)); - mLevel = level; - } - mUiHandler.postDelayed(mUpdateVolumeRunnable, 50); - } - }; + private final Drawable mListeningBorder; + private final Drawable mWorkingBorder; + private final Drawable mErrorBorder; public RecognitionView(Context context, OnClickListener clickListener) { mUiHandler = new Handler(); LayoutInflater inflater = (LayoutInflater) context.getSystemService( - Context.LAYOUT_INFLATER_SERVICE); + Context.LAYOUT_INFLATER_SERVICE); + mView = inflater.inflate(R.layout.recognition_status, null); - ContentResolver cr = context.getContentResolver(); - mMinMicrophoneLevel = SettingsUtil.getSettingsFloat( - cr, SettingsUtil.LATIN_IME_MIN_MICROPHONE_LEVEL, 15.f); - mMaxMicrophoneLevel = SettingsUtil.getSettingsFloat( - cr, SettingsUtil.LATIN_IME_MAX_MICROPHONE_LEVEL, 30.f); + + mPopupLayout= mView.findViewById(R.id.popup_layout); // Pre-load volume level images Resources r = context.getResources(); - mSpeakNow = new ArrayList<Drawable>(); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level0)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level1)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level2)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level3)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level4)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level5)); - mSpeakNow.add(r.getDrawable(R.drawable.speak_now_level6)); + mListeningBorder = r.getDrawable(R.drawable.vs_dialog_red); + mWorkingBorder = r.getDrawable(R.drawable.vs_dialog_blue); + mErrorBorder = r.getDrawable(R.drawable.vs_dialog_yellow); mInitializing = r.getDrawable(R.drawable.mic_slash); mError = r.getDrawable(R.drawable.caution); mImage = (ImageView) mView.findViewById(R.id.image); - mButton = mView.findViewById(R.id.button); + mProgress = mView.findViewById(R.id.progress); + mSoundIndicator = (SoundIndicator) mView.findViewById(R.id.sound_indicator); + + mButton = (Button) mView.findViewById(R.id.button); mButton.setOnClickListener(clickListener); mText = (TextView) mView.findViewById(R.id.text); - mButtonText = (TextView) mView.findViewById(R.id.button_text); - mProgress = mView.findViewById(R.id.progress); + mLanguage = (TextView) mView.findViewById(R.id.language); mContext = context; } @@ -141,11 +117,12 @@ public class RecognitionView { public void restoreState() { mUiHandler.post(new Runnable() { + @Override public void run() { // Restart the spinner - if (mState == State.WORKING) { - ((ProgressBar)mProgress).setIndeterminate(false); - ((ProgressBar)mProgress).setIndeterminate(true); + if (mState == WORKING) { + ((ProgressBar) mProgress).setIndeterminate(false); + ((ProgressBar) mProgress).setIndeterminate(true); } } }); @@ -153,46 +130,50 @@ public class RecognitionView { public void showInitializing() { mUiHandler.post(new Runnable() { + @Override public void run() { - prepareDialog(false, mContext.getText(R.string.voice_initializing), mInitializing, - mContext.getText(R.string.cancel)); + mState = INIT; + prepareDialog(mContext.getText(R.string.voice_initializing), mInitializing, + mContext.getText(R.string.cancel)); } }); } public void showListening() { + Log.d(TAG, "#showListening"); mUiHandler.post(new Runnable() { + @Override public void run() { - mState = State.LISTENING; - prepareDialog(false, mContext.getText(R.string.voice_listening), mSpeakNow.get(0), + mState = LISTENING; + prepareDialog(mContext.getText(R.string.voice_listening), null, mContext.getText(R.string.cancel)); } }); - mUiHandler.postDelayed(mUpdateVolumeRunnable, 50); } - public void updateVoiceMeter(final float rmsdB) { - mVolume = rmsdB; + public void updateVoiceMeter(float rmsdB) { + mSoundIndicator.setRmsdB(rmsdB); } public void showError(final String message) { mUiHandler.post(new Runnable() { + @Override public void run() { - mState = State.READY; - prepareDialog(false, message, mError, mContext.getText(R.string.ok)); + mState = READY; + prepareDialog(message, mError, mContext.getText(R.string.ok)); } - }); + }); } public void showWorking( final ByteArrayOutputStream waveBuffer, final int speechStartPosition, final int speechEndPosition) { - mUiHandler.post(new Runnable() { + @Override public void run() { - mState = State.WORKING; - prepareDialog(true, mContext.getText(R.string.voice_working), null, mContext + mState = WORKING; + prepareDialog(mContext.getText(R.string.voice_working), null, mContext .getText(R.string.cancel)); final ShortBuffer buf = ByteBuffer.wrap(waveBuffer.toByteArray()).order( ByteOrder.nativeOrder()).asShortBuffer(); @@ -200,21 +181,87 @@ public class RecognitionView { waveBuffer.reset(); showWave(buf, speechStartPosition / 2, speechEndPosition / 2); } - }); + }); } - private void prepareDialog(boolean spinVisible, CharSequence text, Drawable image, + private void prepareDialog(CharSequence text, Drawable image, CharSequence btnTxt) { - if (spinVisible) { - mProgress.setVisibility(View.VISIBLE); - mImage.setVisibility(View.GONE); - } else { - mProgress.setVisibility(View.GONE); - mImage.setImageDrawable(image); - mImage.setVisibility(View.VISIBLE); + + /* + * The mic of INIT and of LISTENING has to be displayed in the same position. To accomplish + * that, some text visibility are not set as GONE but as INVISIBLE. + */ + switch (mState) { + case INIT: + mText.setVisibility(View.INVISIBLE); + + mProgress.setVisibility(View.GONE); + + mImage.setVisibility(View.VISIBLE); + mImage.setImageResource(R.drawable.mic_slash); + + mSoundIndicator.setVisibility(View.GONE); + mSoundIndicator.stop(); + + mLanguage.setVisibility(View.INVISIBLE); + + mPopupLayout.setBackgroundDrawable(mListeningBorder); + break; + case LISTENING: + mText.setVisibility(View.VISIBLE); + mText.setText(text); + + mProgress.setVisibility(View.GONE); + + mImage.setVisibility(View.GONE); + + mSoundIndicator.setVisibility(View.VISIBLE); + mSoundIndicator.start(); + + Locale locale = SubtypeSwitcher.getInstance().getInputLocale(); + + mLanguage.setVisibility(View.VISIBLE); + mLanguage.setText(SubtypeSwitcher.getFullDisplayName(locale, true)); + + mPopupLayout.setBackgroundDrawable(mListeningBorder); + break; + case WORKING: + + mText.setVisibility(View.VISIBLE); + mText.setText(text); + + mProgress.setVisibility(View.VISIBLE); + + mImage.setVisibility(View.VISIBLE); + + mSoundIndicator.setVisibility(View.GONE); + mSoundIndicator.stop(); + + mLanguage.setVisibility(View.GONE); + + mPopupLayout.setBackgroundDrawable(mWorkingBorder); + break; + case READY: + mText.setVisibility(View.VISIBLE); + mText.setText(text); + + mProgress.setVisibility(View.GONE); + + mImage.setVisibility(View.VISIBLE); + mImage.setImageResource(R.drawable.caution); + + mSoundIndicator.setVisibility(View.GONE); + mSoundIndicator.stop(); + + mLanguage.setVisibility(View.GONE); + + mPopupLayout.setBackgroundDrawable(mErrorBorder); + break; + default: + Log.w(TAG, "Unknown state " + mState); } - mText.setText(text); - mButtonText.setText(btnTxt); + mPopupLayout.requestLayout(); + mButton.setText(btnTxt); } /** @@ -241,7 +288,7 @@ public class RecognitionView { */ private void showWave(ShortBuffer waveBuffer, int startPosition, int endPosition) { final int w = ((View) mImage.getParent()).getWidth(); - final int h = mImage.getHeight(); + final int h = ((View) mImage.getParent()).getHeight(); if (w <= 0 || h <= 0) { // view is not visible this time. Skip drawing. return; @@ -252,7 +299,7 @@ public class RecognitionView { paint.setColor(0xFFFFFFFF); // 0xAARRGGBB paint.setAntiAlias(true); paint.setStyle(Paint.Style.STROKE); - paint.setAlpha(0x90); + paint.setAlpha(80); final PathEffect effect = new CornerPathEffect(3); paint.setPathEffect(effect); @@ -274,7 +321,7 @@ public class RecognitionView { final int count = (endIndex - startIndex) / numSamplePerWave; final float deltaX = 1.0f * w / count; - int yMax = h / 2 - 8; + int yMax = h / 2; Path path = new Path(); c.translate(0, yMax); float x = 0; @@ -288,36 +335,20 @@ public class RecognitionView { path.lineTo(x, y); } if (deltaX > 4) { - paint.setStrokeWidth(3); + paint.setStrokeWidth(2); } else { - paint.setStrokeWidth(Math.max(1, (int) (deltaX -.05))); + paint.setStrokeWidth(Math.max(0, (int) (deltaX -.05))); } c.drawPath(path, paint); mImage.setImageBitmap(b); - mImage.setVisibility(View.VISIBLE); - MarginLayoutParams mProgressParams = (MarginLayoutParams)mProgress.getLayoutParams(); - mProgressParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, - -h , mContext.getResources().getDisplayMetrics()); - - // Tweak the padding manually to fill out the whole view horizontally. - // TODO: Do this in the xml layout instead. - ((View) mImage.getParent()).setPadding(4, ((View) mImage.getParent()).getPaddingTop(), 3, - ((View) mImage.getParent()).getPaddingBottom()); - mProgress.setLayoutParams(mProgressParams); } - public void finish() { mUiHandler.post(new Runnable() { + @Override public void run() { - mState = State.READY; - exitWorking(); + mSoundIndicator.stop(); } - }); - } - - private void exitWorking() { - mProgress.setVisibility(View.GONE); - mImage.setVisibility(View.VISIBLE); + }); } } diff --git a/java/src/com/android/inputmethod/voice/SettingsUtil.java b/java/src/com/android/inputmethod/deprecated/voice/SettingsUtil.java index abf52047f..855a09a1d 100644 --- a/java/src/com/android/inputmethod/voice/SettingsUtil.java +++ b/java/src/com/android/inputmethod/deprecated/voice/SettingsUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Google Inc. + * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,13 +14,10 @@ * the License. */ -package com.android.inputmethod.voice; +package com.android.inputmethod.deprecated.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/deprecated/voice/SoundIndicator.java b/java/src/com/android/inputmethod/deprecated/voice/SoundIndicator.java new file mode 100644 index 000000000..25b314085 --- /dev/null +++ b/java/src/com/android/inputmethod/deprecated/voice/SoundIndicator.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.deprecated.voice; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.util.AttributeSet; +import android.widget.ImageView; + +import com.android.inputmethod.latin.R; + +/** + * A widget which shows the volume of audio using a microphone icon + */ +public class SoundIndicator extends ImageView { + @SuppressWarnings("unused") + private static final String TAG = "SoundIndicator"; + + private static final float UP_SMOOTHING_FACTOR = 0.9f; + private static final float DOWN_SMOOTHING_FACTOR = 0.4f; + + private static final float AUDIO_METER_MIN_DB = 7.0f; + private static final float AUDIO_METER_DB_RANGE = 20.0f; + + private static final long FRAME_DELAY = 50; + + private Bitmap mDrawingBuffer; + private Canvas mBufferCanvas; + private Bitmap mEdgeBitmap; + private float mLevel = 0.0f; + private Drawable mFrontDrawable; + private Paint mClearPaint; + private Paint mMultPaint; + private int mEdgeBitmapOffset; + + private Handler mHandler; + + private Runnable mDrawFrame = new Runnable() { + public void run() { + invalidate(); + mHandler.postDelayed(mDrawFrame, FRAME_DELAY); + } + }; + + public SoundIndicator(Context context) { + this(context, null); + } + + public SoundIndicator(Context context, AttributeSet attrs) { + super(context, attrs); + + mFrontDrawable = getDrawable(); + BitmapDrawable edgeDrawable = + (BitmapDrawable) context.getResources().getDrawable(R.drawable.vs_popup_mic_edge); + mEdgeBitmap = edgeDrawable.getBitmap(); + mEdgeBitmapOffset = mEdgeBitmap.getHeight() / 2; + + mDrawingBuffer = + Bitmap.createBitmap(mFrontDrawable.getIntrinsicWidth(), + mFrontDrawable.getIntrinsicHeight(), Config.ARGB_8888); + + mBufferCanvas = new Canvas(mDrawingBuffer); + + // Initialize Paints. + mClearPaint = new Paint(); + mClearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + + mMultPaint = new Paint(); + mMultPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); + + mHandler = new Handler(); + } + + @Override + public void onDraw(Canvas canvas) { + //super.onDraw(canvas); + + float w = getWidth(); + float h = getHeight(); + + // Clear the buffer canvas + mBufferCanvas.drawRect(0, 0, w, h, mClearPaint); + + // Set its clip so we don't draw the front image all the way to the top + Rect clip = new Rect(0, + (int) ((1.0 - mLevel) * (h + mEdgeBitmapOffset)) - mEdgeBitmapOffset, + (int) w, + (int) h); + + mBufferCanvas.save(); + mBufferCanvas.clipRect(clip); + + // Draw the front image + mFrontDrawable.setBounds(new Rect(0, 0, (int) w, (int) h)); + mFrontDrawable.draw(mBufferCanvas); + + mBufferCanvas.restore(); + + // Draw the edge image on top of the buffer image with a multiply mode + mBufferCanvas.drawBitmap(mEdgeBitmap, 0, clip.top, mMultPaint); + + // Draw the buffer image (on top of the background image) + canvas.drawBitmap(mDrawingBuffer, 0, 0, null); + } + + /** + * Sets the sound level + * + * @param rmsdB The level of the sound, in dB. + */ + public void setRmsdB(float rmsdB) { + float level = ((rmsdB - AUDIO_METER_MIN_DB) / AUDIO_METER_DB_RANGE); + + level = Math.min(Math.max(0.0f, level), 1.0f); + + // We smooth towards the new level + if (level > mLevel) { + mLevel = (level - mLevel) * UP_SMOOTHING_FACTOR + mLevel; + } else { + mLevel = (level - mLevel) * DOWN_SMOOTHING_FACTOR + mLevel; + } + invalidate(); + } + + public void start() { + mHandler.post(mDrawFrame); + } + + public void stop() { + mHandler.removeCallbacks(mDrawFrame); + } +} diff --git a/java/src/com/android/inputmethod/voice/VoiceInput.java b/java/src/com/android/inputmethod/deprecated/voice/VoiceInput.java index 4c54dd3c5..b718ebbb7 100644 --- a/java/src/com/android/inputmethod/voice/VoiceInput.java +++ b/java/src/com/android/inputmethod/deprecated/voice/VoiceInput.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Google Inc. + * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,26 +14,28 @@ * the License. */ -package com.android.inputmethod.voice; +package com.android.inputmethod.deprecated.voice; -import com.android.inputmethod.latin.EditingUtil; +import com.android.inputmethod.latin.EditingUtils; +import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.speech.RecognitionListener; -import android.speech.SpeechRecognizer; import android.speech.RecognizerIntent; +import android.speech.SpeechRecognizer; import android.util.Log; -import android.view.inputmethod.InputConnection; import android.view.View; import android.view.View.OnClickListener; +import android.view.inputmethod.InputConnection; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -57,6 +59,7 @@ public class VoiceInput implements OnClickListener { private static final String EXTRA_CALLING_PACKAGE = "calling_package"; private static final String EXTRA_ALTERNATES = "android.speech.extra.ALTERNATES"; private static final int MAX_ALT_LIST_LENGTH = 6; + private static boolean DBG = LatinImeLogger.sDBG; private static final String DEFAULT_RECOMMENDED_PACKAGES = "com.android.mms " + @@ -86,6 +89,7 @@ public class VoiceInput implements OnClickListener { private static final String ALTERNATES_BUNDLE = "alternates_bundle"; // This is copied from the VoiceSearch app. + @SuppressWarnings("unused") private static final class AlternatesBundleKeys { public static final String ALTERNATES = "alternates"; public static final String CONFIDENCE = "confidence"; @@ -125,13 +129,13 @@ public class VoiceInput implements OnClickListener { private int mAfterVoiceInputSelectionSpan = 0; private int mState = DEFAULT; - - private final static int MSG_CLOSE_ERROR_DIALOG = 1; + + private final static int MSG_RESET = 1; private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { - if (msg.what == MSG_CLOSE_ERROR_DIALOG) { + if (msg.what == MSG_RESET) { mState = DEFAULT; mRecognitionView.finish(); mUiListener.onCancelVoice(); @@ -188,7 +192,7 @@ public class VoiceInput implements OnClickListener { } mBlacklist = new Whitelist(); - mBlacklist.addApp("com.android.setupwizard"); + mBlacklist.addApp("com.google.android.setupwizard"); } public void setCursorPos(int pos) { @@ -240,7 +244,7 @@ public class VoiceInput implements OnClickListener { } public void incrementTextModificationInsertPunctuationCount(int count){ - mAfterVoiceInputInsertPunctuationCount += 1; + mAfterVoiceInputInsertPunctuationCount += count; if (mAfterVoiceInputSelectionSpan > 0) { // If text was highlighted before inserting the char, count this as // a delete. @@ -276,8 +280,9 @@ public class VoiceInput implements OnClickListener { * The configuration of the IME changed and may have caused the views to be layed out * again. Restore the state of the recognition view. */ - public void onConfigurationChanged() { + public void onConfigurationChanged(Configuration configuration) { mRecognitionView.restoreState(); + mRecognitionView.getView().dispatchConfigurationChanged(configuration); } /** @@ -305,8 +310,18 @@ public class VoiceInput implements OnClickListener { * @param swipe whether this voice input was started by swipe, for logging purposes */ public void startListening(FieldContext context, boolean swipe) { - mState = DEFAULT; - + if (DBG) { + Log.d(TAG, "startListening: " + context); + } + + if (mState != DEFAULT) { + Log.w(TAG, "startListening in the wrong status " + mState); + } + + // If everything works ok, the voice input should be already in the correct state. As this + // class can be called by third-party, we call reset just to be on the safe side. + reset(); + Locale locale = Locale.getDefault(); String localeString = locale.getLanguage() + "-" + locale.getCountry(); @@ -405,6 +420,7 @@ public class VoiceInput implements OnClickListener { /** * Handle the cancel button. */ + @Override public void onClick(View view) { switch(view.getId()) { case R.id.button: @@ -427,8 +443,7 @@ public class VoiceInput implements OnClickListener { public void logTextModifiedByChooseSuggestion(String suggestion, int index, String wordSeparators, InputConnection ic) { - EditingUtil.Range range = new EditingUtil.Range(); - String wordToBeReplaced = EditingUtil.getWordAtCursor(ic, wordSeparators, range); + String wordToBeReplaced = EditingUtils.getWordAtCursor(ic, wordSeparators); // If we enable phrase-based alternatives, only send up the first word // in suggestion and wordToBeReplaced. mLogger.textModifiedByChooseSuggestion(suggestion.length(), wordToBeReplaced.length(), @@ -491,6 +506,21 @@ public class VoiceInput implements OnClickListener { } /** + * Reset the current voice recognition. + */ + public void reset() { + if (mState != DEFAULT) { + mState = DEFAULT; + + // Remove all pending tasks (e.g., timers to cancel voice input) + mHandler.removeMessages(MSG_RESET); + + mSpeechRecognizer.cancel(); + mRecognitionView.finish(); + } + } + + /** * Cancel in-progress speech recognition. */ public void cancel() { @@ -505,14 +535,9 @@ public class VoiceInput implements OnClickListener { mLogger.cancelDuringError(); break; } - mState = DEFAULT; - // Remove all pending tasks (e.g., timers to cancel voice input) - mHandler.removeMessages(MSG_CLOSE_ERROR_DIALOG); - - mSpeechRecognizer.cancel(); + reset(); mUiListener.onCancelVoice(); - mRecognitionView.finish(); } private int getErrorStringId(int errorType, boolean endpointed) { @@ -547,7 +572,7 @@ public class VoiceInput implements OnClickListener { mState = ERROR; mRecognitionView.showError(error); // Wait a couple seconds and then automatically dismiss message. - mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_CLOSE_ERROR_DIALOG), 2000); + mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_RESET), 2000); } private class ImeRecognitionListener implements RecognitionListener { @@ -556,36 +581,45 @@ public class VoiceInput implements OnClickListener { int mSpeechStart; private boolean mEndpointed = false; + @Override public void onReadyForSpeech(Bundle noiseParams) { mRecognitionView.showListening(); } + @Override public void onBeginningOfSpeech() { mEndpointed = false; mSpeechStart = mWaveBuffer.size(); } + @Override public void onRmsChanged(float rmsdB) { mRecognitionView.updateVoiceMeter(rmsdB); } + @Override public void onBufferReceived(byte[] buf) { try { mWaveBuffer.write(buf); - } catch (IOException e) {} + } catch (IOException e) { + // ignore. + } } + @Override public void onEndOfSpeech() { mEndpointed = true; mState = WORKING; mRecognitionView.showWorking(mWaveBuffer, mSpeechStart, mWaveBuffer.size()); } + @Override public void onError(int errorType) { mState = ERROR; VoiceInput.this.onError(errorType, mEndpointed); } + @Override public void onResults(Bundle resultsBundle) { List<String> results = resultsBundle .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); @@ -638,10 +672,12 @@ public class VoiceInput implements OnClickListener { mRecognitionView.finish(); } + @Override public void onPartialResults(final Bundle partialResults) { // currently - do nothing } + @Override public void onEvent(int eventType, Bundle params) { // do nothing - reserved for events that might be added in the future } diff --git a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java b/java/src/com/android/inputmethod/deprecated/voice/VoiceInputLogger.java index 0d21133e0..22e8207bf 100644 --- a/java/src/com/android/inputmethod/voice/VoiceInputLogger.java +++ b/java/src/com/android/inputmethod/deprecated/voice/VoiceInputLogger.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Google Inc. + * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,10 +14,10 @@ * the License. */ -package com.android.inputmethod.voice; +package com.android.inputmethod.deprecated.voice; import com.android.common.speech.LoggingEvents; -import com.android.common.userhappiness.UserHappinessSignals; +import com.android.inputmethod.deprecated.compat.VoiceInputLoggerCompatUtils; import android.content.Context; import android.content.Intent; @@ -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,17 +206,18 @@ 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(VoiceInputLoggerCompatUtils.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); + i.putExtra(VoiceInputLoggerCompatUtils.EXTRA_BEFORE_N_BEST_CHOOSE, before); + i.putExtra(VoiceInputLoggerCompatUtils.EXTRA_AFTER_N_BEST_CHOOSE, after); mContext.sendBroadcast(i); } @@ -254,7 +256,7 @@ public class VoiceInputLogger { // 2. type subject in subject field // 3. speak message in message field // 4. press send - UserHappinessSignals.setHasVoiceLoggingInfo(hasLoggingInfo); + VoiceInputLoggerCompatUtils.setHasVoiceLoggingInfoCompat(hasLoggingInfo); } private boolean hasLoggingInfo(){ diff --git a/java/src/com/android/inputmethod/voice/WaveformImage.java b/java/src/com/android/inputmethod/deprecated/voice/WaveformImage.java index 08d87c8f3..8ed279f42 100644 --- a/java/src/com/android/inputmethod/voice/WaveformImage.java +++ b/java/src/com/android/inputmethod/deprecated/voice/WaveformImage.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2009 Google Inc. + * Copyright (C) 2008-2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,7 +14,7 @@ * the License. */ -package com.android.inputmethod.voice; +package com.android.inputmethod.deprecated.voice; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -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/deprecated/voice/Whitelist.java index 167b688ca..6c5f52ae2 100644 --- a/java/src/com/android/inputmethod/voice/Whitelist.java +++ b/java/src/com/android/inputmethod/deprecated/voice/Whitelist.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Google Inc. + * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,9 +14,10 @@ * the License. */ -package com.android.inputmethod.voice; +package com.android.inputmethod.deprecated.voice; import android.os.Bundle; + import java.util.ArrayList; import java.util.List; 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..2850c95df --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -0,0 +1,474 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.Xml; + +import com.android.inputmethod.keyboard.internal.KeyStyles; +import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; +import com.android.inputmethod.keyboard.internal.KeyboardParser; +import com.android.inputmethod.keyboard.internal.PopupCharactersParser; +import com.android.inputmethod.keyboard.internal.Row; +import com.android.inputmethod.keyboard.internal.KeyStyles.KeyStyle; +import com.android.inputmethod.keyboard.internal.KeyboardParser.ParseException; +import com.android.inputmethod.latin.R; + +import java.util.ArrayList; + +/** + * Class for describing the position and characteristics of a single key in the keyboard. + */ +public class Key { + /** + * The key code (unicode or custom code) that this key generates. + */ + public final int mCode; + + /** Label to display */ + public final CharSequence mLabel; + /** Hint letter to display on the key in conjunction with the label */ + public final CharSequence mHintLetter; + /** Option of the label */ + public final int mLabelOption; + public static final int LABEL_OPTION_ALIGN_LEFT = 0x01; + public static final int LABEL_OPTION_ALIGN_RIGHT = 0x02; + public static final int LABEL_OPTION_ALIGN_BOTTOM = 0x08; + public static final int LABEL_OPTION_FONT_NORMAL = 0x10; + public static final int LABEL_OPTION_FONT_FIXED_WIDTH = 0x20; + public static final int LABEL_OPTION_FOLLOW_KEY_LETTER_RATIO = 0x40; + private static final int LABEL_OPTION_POPUP_HINT = 0x80; + private static final int LABEL_OPTION_HAS_UPPERCASE_LETTER = 0x100; + + /** 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; + + /** 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 around this key */ + public final int mGap; + /** The visual insets */ + public final int mVisualInsetsLeft; + public final int mVisualInsetsRight; + /** 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 functional key which has different key top than normal key */ + public final boolean mFunctional; + /** 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 */ + private boolean mPressed; + /** If this is a sticky key, is its highlight on? */ + private boolean mHighlightOn; + /** Key is enabled and responds on press */ + private boolean mEnabled = true; + + // keyWidth constants + private static final int KEYWIDTH_FILL_RIGHT = 0; + private static final int KEYWIDTH_FILL_BOTH = -1; + + private final static int[] KEY_STATE_NORMAL_ON = { + android.R.attr.state_checkable, + android.R.attr.state_checked + }; + + private final static int[] KEY_STATE_PRESSED_ON = { + android.R.attr.state_pressed, + android.R.attr.state_checkable, + android.R.attr.state_checked + }; + + private final static int[] KEY_STATE_NORMAL_OFF = { + android.R.attr.state_checkable + }; + + private final static int[] KEY_STATE_PRESSED_OFF = { + android.R.attr.state_pressed, + android.R.attr.state_checkable + }; + + private final static int[] KEY_STATE_NORMAL = { + }; + + private final static int[] KEY_STATE_PRESSED = { + android.R.attr.state_pressed + }; + + // functional normal state (with properties) + private static final int[] KEY_STATE_FUNCTIONAL_NORMAL = { + android.R.attr.state_single + }; + + // functional pressed state (with properties) + private static final int[] KEY_STATE_FUNCTIONAL_PRESSED = { + android.R.attr.state_single, + android.R.attr.state_pressed + }; + + /** + * This constructor is being used only for key in popup mini keyboard. + */ + public Key(Resources res, Keyboard keyboard, CharSequence popupCharacter, int x, int y, + int width, int height, int edgeFlags) { + mKeyboard = keyboard; + mHeight = height - keyboard.getVerticalGap(); + mGap = keyboard.getHorizontalGap(); + mVisualInsetsLeft = mVisualInsetsRight = 0; + mWidth = width - mGap; + mEdgeFlags = edgeFlags; + mHintLetter = null; + mLabelOption = 0; + mFunctional = 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 = keyboard.mIconsSet.getIcon(PopupCharactersParser.getIconId(popupSpecification)); + // Horizontal gap is divided equally to both sides of the key. + mX = x + mGap / 2; + mY = y; + } + + /** + * Create a key with the given top-left coordinate and extract its attributes from the XML + * parser. + * @param res resources associated with the caller's context + * @param row the row that this key belongs to. The row must already be attached to + * a {@link Keyboard}. + * @param x the x coordinate of the top-left + * @param y the y coordinate of the top-left + * @param parser the XML parser containing the attributes for this key + * @param keyStyles active key styles set + */ + public Key(Resources res, Row row, int x, int y, XmlResourceParser parser, + KeyStyles keyStyles) { + mKeyboard = row.getKeyboard(); + + final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard); + int keyWidth; + try { + mHeight = KeyboardParser.getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_rowHeight, + mKeyboard.getKeyboardHeight(), row.mDefaultHeight) - row.mVerticalGap; + mGap = KeyboardParser.getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_horizontalGap, + mKeyboard.getDisplayWidth(), row.mDefaultHorizontalGap); + keyWidth = KeyboardParser.getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_keyWidth, + mKeyboard.getDisplayWidth(), row.mDefaultWidth); + } finally { + keyboardAttr.recycle(); + } + + final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_Key); + try { + final KeyStyle style; + if (keyAttr.hasValue(R.styleable.Keyboard_Key_keyStyle)) { + String styleName = keyAttr.getString(R.styleable.Keyboard_Key_keyStyle); + style = keyStyles.getKeyStyle(styleName); + if (style == null) + throw new ParseException("Unknown key style: " + styleName, parser); + } else { + style = keyStyles.getEmptyKeyStyle(); + } + + final int keyboardWidth = mKeyboard.getDisplayWidth(); + int keyXPos = KeyboardParser.getDimensionOrFraction(keyAttr, + R.styleable.Keyboard_Key_keyXPos, keyboardWidth, x); + if (keyXPos < 0) { + // If keyXPos is negative, the actual x-coordinate will be k + keyXPos. + keyXPos += keyboardWidth; + if (keyXPos < x) { + // keyXPos shouldn't be less than x because drawable area for this key starts + // at x. Or, this key will overlaps the adjacent key on its left hand side. + keyXPos = x; + } + } + if (keyWidth == KEYWIDTH_FILL_RIGHT) { + // If keyWidth is zero, the actual key width will be determined to fill out the + // area up to the right edge of the keyboard. + keyWidth = keyboardWidth - keyXPos; + } else if (keyWidth <= KEYWIDTH_FILL_BOTH) { + // If keyWidth is negative, the actual key width will be determined to fill out the + // area between the nearest key on the left hand side and the right edge of the + // keyboard. + keyXPos = x; + keyWidth = keyboardWidth - keyXPos; + } + + // Horizontal gap is divided equally to both sides of the key. + mX = keyXPos + mGap / 2; + mY = y; + mWidth = keyWidth - mGap; + + final CharSequence[] popupCharacters = style.getTextArray(keyAttr, + R.styleable.Keyboard_Key_popupCharacters); + if (res.getBoolean(R.bool.config_digit_popup_characters_enabled)) { + mPopupCharacters = popupCharacters; + } else { + mPopupCharacters = filterOutDigitPopupCharacters(popupCharacters); + } + mMaxPopupColumn = style.getInt(keyboardAttr, + R.styleable.Keyboard_Key_maxPopupKeyboardColumn, + mKeyboard.getMaxPopupKeyboardColumn()); + + mRepeatable = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable, false); + mFunctional = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isFunctional, false); + mSticky = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky, false); + mEnabled = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_enabled, true); + mEdgeFlags = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyEdgeFlags, 0) + | row.mRowEdgeFlags; + + final KeyboardIconsSet iconsSet = mKeyboard.mIconsSet; + mVisualInsetsLeft = KeyboardParser.getDimensionOrFraction(keyAttr, + R.styleable.Keyboard_Key_visualInsetsLeft, mKeyboard.getDisplayHeight(), 0); + mVisualInsetsRight = KeyboardParser.getDimensionOrFraction(keyAttr, + R.styleable.Keyboard_Key_visualInsetsRight, mKeyboard.getDisplayHeight(), 0); + mPreviewIcon = iconsSet.getIcon(style.getInt( + keyAttr, R.styleable.Keyboard_Key_keyIconPreview, + KeyboardIconsSet.ICON_UNDEFINED)); + Keyboard.setDefaultBounds(mPreviewIcon); + mIcon = iconsSet.getIcon(style.getInt( + keyAttr, R.styleable.Keyboard_Key_keyIcon, + KeyboardIconsSet.ICON_UNDEFINED)); + Keyboard.setDefaultBounds(mIcon); + mHintLetter = style.getText(keyAttr, R.styleable.Keyboard_Key_keyHintLetter); + + mLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyLabel); + mLabelOption = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption, 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 = iconsSet.getIcon(style.getInt( + keyAttr, R.styleable.Keyboard_Key_keyIconShifted, + KeyboardIconsSet.ICON_UNDEFINED)); + if (shiftedIcon != null) + mKeyboard.getShiftedIcons().put(this, shiftedIcon); + } finally { + keyAttr.recycle(); + } + } + + public boolean hasPopupHint() { + return (mLabelOption & LABEL_OPTION_POPUP_HINT) != 0; + } + + public boolean hasUppercaseLetter() { + return (mLabelOption & LABEL_OPTION_HAS_UPPERCASE_LETTER) != 0; + } + + private static boolean isDigitPopupCharacter(CharSequence label) { + return label != null && label.length() == 1 && Character.isDigit(label.charAt(0)); + } + + private static CharSequence[] filterOutDigitPopupCharacters(CharSequence[] popupCharacters) { + if (popupCharacters == null || popupCharacters.length < 1) + return null; + if (popupCharacters.length == 1 && isDigitPopupCharacter( + PopupCharactersParser.getLabel(popupCharacters[0].toString()))) + return null; + ArrayList<CharSequence> filtered = null; + for (int i = 0; i < popupCharacters.length; i++) { + final CharSequence popupSpec = popupCharacters[i]; + if (isDigitPopupCharacter(PopupCharactersParser.getLabel(popupSpec.toString()))) { + if (filtered == null) { + filtered = new ArrayList<CharSequence>(); + for (int j = 0; j < i; j++) + filtered.add(popupCharacters[j]); + } + } else if (filtered != null) { + filtered.add(popupSpec); + } + } + if (filtered == null) + return popupCharacters; + if (filtered.size() == 0) + return null; + return filtered.toArray(new CharSequence[filtered.size()]); + } + + public Drawable getIcon() { + return mIcon; + } + + public Drawable getPreviewIcon() { + return mPreviewIcon; + } + + public void setIcon(Drawable icon) { + mIcon = icon; + } + + public void setPreviewIcon(Drawable icon) { + mPreviewIcon = icon; + } + + /** + * Informs the key that it has been pressed, in case it needs to change its appearance or + * state. + * @see #onReleased() + */ + public void onPressed() { + mPressed = true; + } + + /** + * Informs the key that it has been released, in case it needs to change its appearance or + * state. + * @see #onPressed() + */ + public void onReleased() { + mPressed = false; + } + + public void setHighlightOn(boolean highlightOn) { + mHighlightOn = highlightOn; + } + + public boolean isEnabled() { + return mEnabled; + } + + public void setEnabled(boolean enabled) { + mEnabled = enabled; + } + + /** + * Detects if a point falls on this key. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return whether or not the point falls on the key. If the key is attached to an edge, it will + * assume that all points between the key and the edge are considered to be on the key. + */ + public boolean isOnKey(int x, int y) { + final int flags = mEdgeFlags; + final boolean leftEdge = (flags & Keyboard.EDGE_LEFT) != 0; + final boolean rightEdge = (flags & Keyboard.EDGE_RIGHT) != 0; + final boolean topEdge = (flags & Keyboard.EDGE_TOP) != 0; + final boolean bottomEdge = (flags & Keyboard.EDGE_BOTTOM) != 0; + final int left = mX - mGap / 2; + final int right = left + mWidth + mGap; + final int top = mY; + final int bottom = top + mHeight + mKeyboard.getVerticalGap(); + // In order to mitigate rounding errors, we use (left <= x <= right) here. + return (x >= left || leftEdge) && (x <= right || rightEdge) + && (y >= top || topEdge) && (y <= bottom || bottomEdge); + } + + /** + * Returns the square of the distance to the nearest edge of the key and the given point. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return the square of the distance of the point from the nearest edge of the key + */ + public int squaredDistanceToEdge(int x, int y) { + final int left = mX; + final int right = left + mWidth; + final int top = mY; + final int bottom = top + mHeight; + final int edgeX = x < left ? left : (x > right ? right : x); + final int edgeY = y < top ? top : (y > bottom ? bottom : y); + final int dx = x - edgeX; + final int dy = y - edgeY; + return dx * dx + dy * dy; + } + + /** + * Returns the drawable state for the key, based on the current state and type of the key. + * @return the drawable state of the key. + * @see android.graphics.drawable.StateListDrawable#setState(int[]) + */ + public int[] getCurrentDrawableState() { + final boolean pressed = mPressed; + if (!mSticky && mFunctional) { + if (pressed) { + return KEY_STATE_FUNCTIONAL_PRESSED; + } else { + return KEY_STATE_FUNCTIONAL_NORMAL; + } + } + + int[] states = KEY_STATE_NORMAL; + + if (mHighlightOn) { + if (pressed) { + states = KEY_STATE_PRESSED_ON; + } else { + states = KEY_STATE_NORMAL_ON; + } + } else { + if (mSticky) { + if (pressed) { + states = KEY_STATE_PRESSED_OFF; + } else { + states = KEY_STATE_NORMAL_OFF; + } + } else { + if (pressed) { + states = KEY_STATE_PRESSED; + } + } + } + return states; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java new file mode 100644 index 000000000..7add43a6d --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +import android.util.Log; + +import java.util.Arrays; +import java.util.List; + +public class KeyDetector { + private static final String TAG = KeyDetector.class.getSimpleName(); + private static final boolean DEBUG = false; + + public static final int NOT_A_CODE = -1; + public static final int NOT_A_KEY = -1; + + private Keyboard mKeyboard; + private int mCorrectionX; + private int mCorrectionY; + private boolean mProximityCorrectOn; + private int mProximityThresholdSquare; + + // working area + private static final int MAX_NEARBY_KEYS = 12; + private final int[] mDistances = new int[MAX_NEARBY_KEYS]; + private final int[] mIndices = new int[MAX_NEARBY_KEYS]; + + public void setKeyboard(Keyboard keyboard, float correctionX, float correctionY) { + if (keyboard == null) + throw new NullPointerException(); + mCorrectionX = (int)correctionX; + mCorrectionY = (int)correctionY; + mKeyboard = keyboard; + } + + protected int getTouchX(int x) { + return x + mCorrectionX; + } + + protected int getTouchY(int y) { + return y + mCorrectionY; + } + + protected List<Key> getKeys() { + if (mKeyboard == null) + throw new IllegalStateException("keyboard isn't set"); + // mKeyboard is guaranteed not to be null at setKeybaord() method if mKeys is not null + return mKeyboard.getKeys(); + } + + public void setProximityCorrectionEnabled(boolean enabled) { + mProximityCorrectOn = enabled; + } + + public boolean isProximityCorrectionEnabled() { + return mProximityCorrectOn; + } + + public void setProximityThreshold(int threshold) { + mProximityThresholdSquare = threshold * threshold; + } + + /** + * Computes maximum size of the array that can contain all nearby key indices returned by + * {@link #getKeyIndexAndNearbyCodes}. + * + * @return Returns maximum size of the array that can contain all nearby key indices returned + * by {@link #getKeyIndexAndNearbyCodes}. + */ + protected int getMaxNearbyKeys() { + return MAX_NEARBY_KEYS; + } + + /** + * Allocates array that can hold all key indices returned by {@link #getKeyIndexAndNearbyCodes} + * method. The maximum size of the array should be computed by {@link #getMaxNearbyKeys}. + * + * @return Allocates and returns an array that can hold all key indices returned by + * {@link #getKeyIndexAndNearbyCodes} method. All elements in the returned array are + * initialized by {@link #NOT_A_CODE} value. + */ + public int[] newCodeArray() { + int[] codes = new int[getMaxNearbyKeys()]; + Arrays.fill(codes, NOT_A_CODE); + return codes; + } + + private void initializeNearbyKeys() { + Arrays.fill(mDistances, Integer.MAX_VALUE); + Arrays.fill(mIndices, NOT_A_KEY); + } + + /** + * Insert the key into nearby keys buffer and sort nearby keys by ascending order of distance. + * If the distance of two keys are the same, the key which the point is on should be considered + * as a closer one. + * + * @param keyIndex index of the key. + * @param distance distance between the key's edge and user touched point. + * @param isOnKey true if the point is on the key. + * @return order of the key in the nearby buffer, 0 if it is the nearest key. + */ + private int sortNearbyKeys(int keyIndex, int distance, boolean isOnKey) { + final int[] distances = mDistances; + final int[] indices = mIndices; + for (int insertPos = 0; insertPos < distances.length; insertPos++) { + final int comparingDistance = distances[insertPos]; + if (distance < comparingDistance || (distance == comparingDistance && isOnKey)) { + final int nextPos = insertPos + 1; + if (nextPos < distances.length) { + System.arraycopy(distances, insertPos, distances, nextPos, + distances.length - nextPos); + System.arraycopy(indices, insertPos, indices, nextPos, + indices.length - nextPos); + } + distances[insertPos] = distance; + indices[insertPos] = keyIndex; + return insertPos; + } + } + return distances.length; + } + + private void getNearbyKeyCodes(final int[] allCodes) { + final List<Key> keys = getKeys(); + final int[] indices = mIndices; + + // allCodes[0] should always have the key code even if it is a non-letter key. + if (indices[0] == NOT_A_KEY) { + allCodes[0] = NOT_A_CODE; + return; + } + + int numCodes = 0; + for (int j = 0; j < indices.length && numCodes < allCodes.length; j++) { + final int index = indices[j]; + if (index == NOT_A_KEY) + break; + final int code = keys.get(index).mCode; + // filter out a non-letter key from nearby keys + if (code < Keyboard.CODE_SPACE) + continue; + allCodes[numCodes++] = code; + } + } + + /** + * Finds all possible nearby key indices around a touch event point and returns the nearest key + * index. The algorithm to determine the nearby keys depends on the threshold set by + * {@link #setProximityThreshold(int)} and the mode set by + * {@link #setProximityCorrectionEnabled(boolean)}. + * + * @param x The x-coordinate of a touch point + * @param y The y-coordinate of a touch point + * @param allCodes All nearby key code except functional key are returned in this array + * @return The nearest key index + */ + public int getKeyIndexAndNearbyCodes(int x, int y, final int[] allCodes) { + final List<Key> keys = getKeys(); + final int touchX = getTouchX(x); + final int touchY = getTouchY(y); + + initializeNearbyKeys(); + int primaryIndex = NOT_A_KEY; + for (final int index : mKeyboard.getNearestKeys(touchX, touchY)) { + final Key key = keys.get(index); + final boolean isOnKey = key.isOnKey(touchX, touchY); + final int distance = key.squaredDistanceToEdge(touchX, touchY); + if (isOnKey || (mProximityCorrectOn && distance < mProximityThresholdSquare)) { + final int insertedPosition = sortNearbyKeys(index, distance, isOnKey); + if (insertedPosition == 0 && isOnKey) + primaryIndex = index; + } + } + + if (allCodes != null && allCodes.length > 0) { + getNearbyKeyCodes(allCodes); + if (DEBUG) { + Log.d(TAG, "x=" + x + " y=" + y + + " primary=" + + (primaryIndex == NOT_A_KEY ? "none" : keys.get(primaryIndex).mCode) + + " codes=" + Arrays.toString(allCodes)); + } + } + + return primaryIndex; + } +} 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..20327c5b2 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java @@ -0,0 +1,461 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.util.Log; + +import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; +import com.android.inputmethod.keyboard.internal.KeyboardParser; +import com.android.inputmethod.keyboard.internal.KeyboardShiftState; +import com.android.inputmethod.latin.R; + +import org.xmlpull.v1.XmlPullParserException; + +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> + * <Keyboard + * latin:keyWidth="%10p" + * latin:keyHeight="50px" + * latin:horizontalGap="2px" + * latin:verticalGap="2px" > + * <Row latin:keyWidth="32px" > + * <Key latin:keyLabel="A" /> + * ... + * </Row> + * ... + * </Keyboard> + * </pre> + */ +public class Keyboard { + private static final String TAG = Keyboard.class.getSimpleName(); + + 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 = '.'; + public static final int CODE_DASH = '-'; + public static final int CODE_SINGLE_QUOTE = '\''; + public static final int CODE_DOUBLE_QUOTE = '"'; + + /** 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_CAPSLOCK = -3; + public static final int CODE_CANCEL = -4; + public static final int CODE_DELETE = -5; + public static final int CODE_SETTINGS = -6; + public static final int CODE_SETTINGS_LONGPRESS = -7; + public static final int CODE_SHORTCUT = -8; + // Code value representing the code is not specified. + public static final int CODE_UNSPECIFIED = -99; + + /** Horizontal gap default for all rows */ + private int mDefaultHorizontalGap; + + /** Default key width */ + private int mDefaultWidth; + + /** Default key height */ + private int mDefaultHeight; + + /** Default gap between rows */ + private int mDefaultVerticalGap; + + /** Popup keyboard template */ + private int mPopupKeyboardResId; + + /** Maximum column for popup keyboard */ + private int mMaxPopupColumn; + + /** List of shift keys in this keyboard and its icons and state */ + private final List<Key> mShiftKeys = new ArrayList<Key>(); + private final HashMap<Key, Drawable> mShiftedIcons = new HashMap<Key, Drawable>(); + private final HashMap<Key, Drawable> mNormalShiftIcons = new HashMap<Key, Drawable>(); + private final HashSet<Key> mShiftLockEnabled = new HashSet<Key>(); + private final KeyboardShiftState mShiftState = new KeyboardShiftState(); + + /** Total height of the keyboard, including the padding and keys */ + private int mTotalHeight; + + /** + * Total width (minimum width) of the keyboard, including left side gaps and keys, but not any + * gaps on the right side. + */ + private int mMinWidth; + + /** List of keys in this keyboard */ + private final List<Key> mKeys = new ArrayList<Key>(); + + /** Width of the screen available to fit the keyboard */ + private final int mDisplayWidth; + + /** Height of the screen */ + private final int mDisplayHeight; + + /** Height of keyboard */ + private int mKeyboardHeight; + + private int mMostCommonKeyWidth = 0; + + public final KeyboardId mId; + + public final KeyboardIconsSet mIconsSet = new KeyboardIconsSet(); + + // Variables for pre-computing nearest keys. + + // TODO: Change GRID_WIDTH and GRID_HEIGHT to private. + public final int GRID_WIDTH; + public final int GRID_HEIGHT; + private final int GRID_SIZE; + private int mCellWidth; + private int mCellHeight; + private int[][] mGridNeighbors; + private int mProximityThreshold; + private static int[] EMPTY_INT_ARRAY = new int[0]; + /** Number of key widths from current touch point to search for nearest keys. */ + private static float SEARCH_DISTANCE = 1.2f; + + private final ProximityInfo mProximityInfo; + + /** + * Creates a keyboard from the given xml key layout file. + * @param context the application or service context + * @param xmlLayoutResId the resource file that contains the keyboard layout and keys. + * @param id keyboard identifier + * @param width keyboard width + */ + + public Keyboard(Context context, int xmlLayoutResId, KeyboardId id, int width) { + final 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; + + final int horizontalEdgesPadding = (int)res.getDimension( + R.dimen.keyboard_horizontal_edges_padding); + mDisplayWidth = width - horizontalEdgesPadding * 2; + // TODO: Adjust the height by referring to the height of area available for drawing as well. + mDisplayHeight = res.getDisplayMetrics().heightPixels; + + mDefaultHorizontalGap = 0; + setKeyWidth(mDisplayWidth / 10); + mDefaultVerticalGap = 0; + mDefaultHeight = mDefaultWidth; + mId = id; + mProximityInfo = new ProximityInfo(GRID_WIDTH, GRID_HEIGHT); + loadKeyboard(context, xmlLayoutResId); + } + + public int getProximityInfo() { + return mProximityInfo.getNativeProximityInfo(this); + } + + public List<Key> getKeys() { + return mKeys; + } + + public int getHorizontalGap() { + return mDefaultHorizontalGap; + } + + public void setHorizontalGap(int gap) { + mDefaultHorizontalGap = gap; + } + + public int getVerticalGap() { + return mDefaultVerticalGap; + } + + public void setVerticalGap(int gap) { + mDefaultVerticalGap = gap; + } + + public int getRowHeight() { + return mDefaultHeight; + } + + public void setRowHeight(int height) { + mDefaultHeight = height; + } + + public int getKeyWidth() { + return mDefaultWidth; + } + + public void setKeyWidth(int width) { + mDefaultWidth = width; + final int threshold = (int) (width * SEARCH_DISTANCE); + mProximityThreshold = threshold * threshold; + } + + /** + * Returns the total height of the keyboard + * @return the total height of the keyboard + */ + public int getHeight() { + return mTotalHeight; + } + + public void setHeight(int height) { + mTotalHeight = height; + } + + public int getMinWidth() { + return mMinWidth; + } + + public void setMinWidth(int minWidth) { + mMinWidth = minWidth; + } + + public int getDisplayHeight() { + return mDisplayHeight; + } + + public int getDisplayWidth() { + return mDisplayWidth; + } + + public int getKeyboardHeight() { + return mKeyboardHeight; + } + + public void setKeyboardHeight(int height) { + mKeyboardHeight = height; + } + + public int getPopupKeyboardResId() { + return mPopupKeyboardResId; + } + + public void setPopupKeyboardResId(int resId) { + mPopupKeyboardResId = resId; + } + + public int getMaxPopupKeyboardColumn() { + return mMaxPopupColumn; + } + + public void setMaxPopupKeyboardColumn(int column) { + mMaxPopupColumn = column; + } + + public List<Key> getShiftKeys() { + return mShiftKeys; + } + + public Map<Key, Drawable> getShiftedIcons() { + return mShiftedIcons; + } + + public void enableShiftLock() { + for (final Key key : getShiftKeys()) { + mShiftLockEnabled.add(key); + mNormalShiftIcons.put(key, key.getIcon()); + } + } + + public boolean isShiftLockEnabled(Key key) { + return mShiftLockEnabled.contains(key); + } + + public boolean setShiftLocked(boolean newShiftLockState) { + final Map<Key, Drawable> shiftedIcons = getShiftedIcons(); + for (final Key key : getShiftKeys()) { + key.setHighlightOn(newShiftLockState); + key.setIcon(newShiftLockState ? shiftedIcons.get(key) : mNormalShiftIcons.get(key)); + } + mShiftState.setShiftLocked(newShiftLockState); + return true; + } + + public boolean isShiftLocked() { + return mShiftState.isShiftLocked(); + } + + public boolean setShifted(boolean newShiftState) { + final Map<Key, Drawable> shiftedIcons = getShiftedIcons(); + for (final Key key : getShiftKeys()) { + if (!newShiftState && !mShiftState.isShiftLocked()) { + key.setIcon(mNormalShiftIcons.get(key)); + } else if (newShiftState && !mShiftState.isShiftedOrShiftLocked()) { + key.setIcon(shiftedIcons.get(key)); + } + } + return mShiftState.setShifted(newShiftState); + } + + public boolean isShiftedOrShiftLocked() { + return mShiftState.isShiftedOrShiftLocked(); + } + + public void setAutomaticTemporaryUpperCase() { + setShifted(true); + mShiftState.setAutomaticTemporaryUpperCase(); + } + + public boolean isAutomaticTemporaryUpperCase() { + return isAlphaKeyboard() && mShiftState.isAutomaticTemporaryUpperCase(); + } + + public boolean isManualTemporaryUpperCase() { + return isAlphaKeyboard() && mShiftState.isManualTemporaryUpperCase(); + } + + public boolean isManualTemporaryUpperCaseFromAuto() { + return isAlphaKeyboard() && mShiftState.isManualTemporaryUpperCaseFromAuto(); + } + + public KeyboardShiftState getKeyboardShiftState() { + return mShiftState; + } + + public boolean isAlphaKeyboard() { + return mId != null && mId.isAlphabetKeyboard(); + } + + public boolean isPhoneKeyboard() { + return mId != null && mId.isPhoneKeyboard(); + } + + public boolean isNumberKeyboard() { + return mId != null && mId.isNumberKeyboard(); + } + + // TODO: Move this function to ProximityInfo and make this private. + public void computeNearestNeighbors() { + // Round-up so we don't have any pixels outside the grid + mCellWidth = (getMinWidth() + GRID_WIDTH - 1) / GRID_WIDTH; + mCellHeight = (getHeight() + GRID_HEIGHT - 1) / GRID_HEIGHT; + mGridNeighbors = new int[GRID_SIZE][]; + final int[] indices = new int[mKeys.size()]; + final int gridWidth = GRID_WIDTH * mCellWidth; + final int gridHeight = GRID_HEIGHT * mCellHeight; + final int threshold = mProximityThreshold; + for (int x = 0; x < gridWidth; x += mCellWidth) { + for (int y = 0; y < gridHeight; y += mCellHeight) { + final int centerX = x + mCellWidth / 2; + final int centerY = y + mCellHeight / 2; + int count = 0; + for (int i = 0; i < mKeys.size(); i++) { + final Key key = mKeys.get(i); + if (key.squaredDistanceToEdge(centerX, centerY) < threshold) + indices[count++] = i; + } + final int[] cell = new int[count]; + System.arraycopy(indices, 0, cell, 0, count); + mGridNeighbors[(y / mCellHeight) * GRID_WIDTH + (x / mCellWidth)] = cell; + } + } + mProximityInfo.setProximityInfo(mGridNeighbors, getMinWidth(), getHeight(), mKeys); + } + + /** + * 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; + } + + /** + * Compute the most common key width in order to use it as proximity key detection threshold. + * + * @return The most common key width in the keyboard + */ + public int getMostCommonKeyWidth() { + if (mMostCommonKeyWidth == 0) { + final HashMap<Integer, Integer> histogram = new HashMap<Integer, Integer>(); + int maxCount = 0; + int mostCommonWidth = 0; + for (final Key key : mKeys) { + 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; + } + } + mMostCommonKeyWidth = mostCommonWidth; + } + return mMostCommonKeyWidth; + } + + /** + * Return true if spacebar needs showing preview even when "popup on keypress" is off. + * @param keyIndex index of the pressing key + * @return true if spacebar needs showing preview + */ + public boolean needSpacebarPreview(int keyIndex) { + return false; + } + + private void loadKeyboard(Context context, int xmlLayoutResId) { + try { + KeyboardParser parser = new KeyboardParser(this, context); + 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); + } + } + + public static void setDefaultBounds(Drawable drawable) { + if (drawable != null) + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), + drawable.getIntrinsicHeight()); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java new file mode 100644 index 000000000..7e67d6f6b --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +public interface KeyboardActionListener { + + /** + * Called when the user presses a key. This is sent before the {@link #onCodeInput} is called. + * For keys that repeat, this is only called once. + * + * @param primaryCode the unicode of the key being pressed. If the touch is not on a valid key, + * the value will be zero. + * @param withSliding true if pressing has occurred because the user slid finger from other key + * to this key without releasing the finger. + */ + public void onPress(int primaryCode, boolean withSliding); + + /** + * Called when the user releases a key. This is sent after the {@link #onCodeInput} is called. + * For keys that repeat, this is only called once. + * + * @param primaryCode the code of the key that was released + * @param withSliding true if releasing has occurred because the user slid finger from the key + * to other key without releasing the finger. + */ + public void onRelease(int primaryCode, boolean withSliding); + + /** + * Send a key code to the listener. + * + * @param primaryCode this is the code of the key that was pressed + * @param keyCodes the codes for all the possible alternative keys with the primary code being + * the first. If the primary key code is a single character such as an alphabet or + * number or symbol, the alternatives will include other characters that may be on + * the same key or adjacent keys. These codes are useful to correct for accidental + * presses of a key adjacent to the intended key. + * @param x x-coordinate pixel of touched event. If {@link #onCodeInput} is not called by + * {@link PointerTracker#onTouchEvent} or so, the value should be + * {@link #NOT_A_TOUCH_COORDINATE}. + * @param y y-coordinate pixel of touched event. If {@link #onCodeInput} is not called by + * {@link PointerTracker#onTouchEvent} or so, the value should be + * {@link #NOT_A_TOUCH_COORDINATE}. + */ + public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y); + + public static final int NOT_A_TOUCH_COORDINATE = -1; + + /** + * Sends a sequence of characters to the listener. + * + * @param text the sequence of characters to be displayed. + */ + public void onTextInput(CharSequence text); + + /** + * Called when user released a finger outside any key. + */ + public void onCancelInput(); + + /** + * Called when the user quickly moves the finger from up to down. + */ + public void onSwipeDown(); +} diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java new file mode 100644 index 000000000..9c63c198c --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +import android.view.inputmethod.EditorInfo; + +import com.android.inputmethod.compat.EditorInfoCompatUtils; +import com.android.inputmethod.compat.InputTypeCompatUtils; +import com.android.inputmethod.latin.R; + +import java.util.Arrays; +import java.util.Locale; + +/** + * Represents the parameters necessary to construct a new LatinKeyboard, + * which also serve as a unique identifier for each keyboard type. + */ +public class KeyboardId { + public static final int MODE_TEXT = 0; + public static final int MODE_URL = 1; + public static final int MODE_EMAIL = 2; + public static final int MODE_IM = 3; + public static final int MODE_PHONE = 4; + public static final int MODE_NUMBER = 5; + + public static final int F2KEY_MODE_NONE = 0; + public static final int F2KEY_MODE_SETTINGS = 1; + public static final int F2KEY_MODE_SHORTCUT_IME = 2; + public static final int F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS = 3; + + public final Locale mLocale; + public final int mOrientation; + public final int mWidth; + public final int mMode; + public final int mXmlId; + public final boolean mNavigateAction; + public final boolean mPasswordInput; + // TODO: Clean up these booleans and modes. + public final boolean mHasSettingsKey; + public final int mF2KeyMode; + public final boolean mClobberSettingsKey; + public final boolean mVoiceKeyEnabled; + public final boolean mHasVoiceKey; + public final int mImeAction; + public final boolean mEnableShiftLock; + + public final String mXmlName; + public final EditorInfo mAttribute; + + private final int mHashCode; + + public KeyboardId(String xmlName, int xmlId, Locale locale, int orientation, int width, + int mode, EditorInfo attribute, boolean hasSettingsKey, int f2KeyMode, + boolean clobberSettingsKey, boolean voiceKeyEnabled, boolean hasVoiceKey, + boolean enableShiftLock) { + final int inputType = (attribute != null) ? attribute.inputType : 0; + final int imeOptions = (attribute != null) ? attribute.imeOptions : 0; + this.mLocale = locale; + this.mOrientation = orientation; + this.mWidth = width; + this.mMode = mode; + this.mXmlId = xmlId; + // Note: Turn off checking navigation flag to show TAB key for now. + this.mNavigateAction = InputTypeCompatUtils.isWebInputType(inputType); +// || EditorInfoCompatUtils.hasFlagNavigateNext(imeOptions) +// || EditorInfoCompatUtils.hasFlagNavigatePrevious(imeOptions); + this.mPasswordInput = InputTypeCompatUtils.isPasswordInputType(inputType) + || InputTypeCompatUtils.isVisiblePasswordInputType(inputType); + this.mHasSettingsKey = hasSettingsKey; + this.mF2KeyMode = f2KeyMode; + this.mClobberSettingsKey = clobberSettingsKey; + this.mVoiceKeyEnabled = voiceKeyEnabled; + this.mHasVoiceKey = hasVoiceKey; + // We are interested only in {@link EditorInfo#IME_MASK_ACTION} enum value and + // {@link EditorInfo#IME_FLAG_NO_ENTER_ACTION}. + this.mImeAction = imeOptions & ( + EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION); + this.mEnableShiftLock = enableShiftLock; + + this.mXmlName = xmlName; + this.mAttribute = attribute; + + this.mHashCode = Arrays.hashCode(new Object[] { + locale, + orientation, + width, + mode, + xmlId, + mNavigateAction, + mPasswordInput, + hasSettingsKey, + f2KeyMode, + clobberSettingsKey, + voiceKeyEnabled, + hasVoiceKey, + mImeAction, + enableShiftLock, + }); + } + + public KeyboardId cloneWithNewLayout(String xmlName, int xmlId) { + return new KeyboardId(xmlName, xmlId, mLocale, mOrientation, mWidth, mMode, mAttribute, + mHasSettingsKey, mF2KeyMode, mClobberSettingsKey, mVoiceKeyEnabled, mHasVoiceKey, + mEnableShiftLock); + } + + public KeyboardId cloneWithNewGeometry(int width) { + if (mWidth == width) + return this; + return new KeyboardId(mXmlName, mXmlId, mLocale, mOrientation, width, mMode, mAttribute, + mHasSettingsKey, mF2KeyMode, mClobberSettingsKey, mVoiceKeyEnabled, mHasVoiceKey, + mEnableShiftLock); + } + + public int getXmlId() { + return mXmlId; + } + + public boolean isAlphabetKeyboard() { + return mXmlId == R.xml.kbd_qwerty; + } + + public boolean isSymbolsKeyboard() { + return mXmlId == R.xml.kbd_symbols || mXmlId == R.xml.kbd_symbols_shift; + } + + public boolean isPhoneKeyboard() { + return mMode == MODE_PHONE; + } + + public boolean isPhoneSymbolsKeyboard() { + return mXmlId == R.xml.kbd_phone_symbols; + } + + 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.mWidth == this.mWidth + && other.mMode == this.mMode + && other.mXmlId == this.mXmlId + && other.mNavigateAction == this.mNavigateAction + && other.mPasswordInput == this.mPasswordInput + && other.mHasSettingsKey == this.mHasSettingsKey + && other.mF2KeyMode == this.mF2KeyMode + && other.mClobberSettingsKey == this.mClobberSettingsKey + && other.mVoiceKeyEnabled == this.mVoiceKeyEnabled + && other.mHasVoiceKey == this.mHasVoiceKey + && other.mImeAction == this.mImeAction + && other.mEnableShiftLock == this.mEnableShiftLock; + } + + @Override + public int hashCode() { + return mHashCode; + } + + @Override + public String toString() { + return String.format("[%s.xml %s %s%d %s %s %s%s%s%s%s%s%s%s]", + mXmlName, + mLocale, + (mOrientation == 1 ? "port" : "land"), mWidth, + modeName(mMode), + EditorInfoCompatUtils.imeOptionsName(mImeAction), + f2KeyModeName(mF2KeyMode), + (mClobberSettingsKey ? " clobberSettingsKey" : ""), + (mNavigateAction ? " navigateAction" : ""), + (mPasswordInput ? " passwordInput" : ""), + (mHasSettingsKey ? " hasSettingsKey" : ""), + (mVoiceKeyEnabled ? " voiceKeyEnabled" : ""), + (mHasVoiceKey ? " hasVoiceKey" : ""), + (mEnableShiftLock ? " enableShiftLock" : "") + ); + } + + public static String modeName(int mode) { + switch (mode) { + case MODE_TEXT: return "text"; + case MODE_URL: return "url"; + case MODE_EMAIL: return "email"; + case MODE_IM: return "im"; + case MODE_PHONE: return "phone"; + case MODE_NUMBER: return "number"; + default: return null; + } + } + + public static String f2KeyModeName(int f2KeyMode) { + switch (f2KeyMode) { + case F2KEY_MODE_NONE: return "none"; + case F2KEY_MODE_SETTINGS: return "settings"; + case F2KEY_MODE_SHORTCUT_IME: return "shortcutIme"; + case F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS: return "shortcutImeOrSettings"; + default: return null; + } + } +} 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..275e9d1fe --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -0,0 +1,849 @@ +/* + * 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 android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.util.Log; +import android.view.ContextThemeWrapper; +import android.view.InflateException; +import android.view.LayoutInflater; +import android.view.View; +import android.view.inputmethod.EditorInfo; + +import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy; +import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; +import com.android.inputmethod.keyboard.internal.ModifierKeyState; +import com.android.inputmethod.keyboard.internal.ShiftKeyState; +import com.android.inputmethod.latin.LatinIME; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.Settings; +import com.android.inputmethod.latin.SubtypeSwitcher; +import com.android.inputmethod.latin.Utils; + +import java.lang.ref.SoftReference; +import java.util.HashMap; +import java.util.Locale; + +public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener { + private static final String TAG = KeyboardSwitcher.class.getSimpleName(); + private static final boolean DEBUG_CACHE = LatinImeLogger.sDBG; + public static final boolean DEBUG_STATE = false; + + public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20100902"; + private static final int[] KEYBOARD_THEMES = { + R.style.KeyboardTheme, + R.style.KeyboardTheme_HighContrast, + R.style.KeyboardTheme_Stone, + R.style.KeyboardTheme_Stone_Bold, + R.style.KeyboardTheme_Gingerbread, + R.style.KeyboardTheme_IceCreamSandwich, + }; + + private SubtypeSwitcher mSubtypeSwitcher; + private SharedPreferences mPrefs; + + private View mCurrentInputView; + private LatinKeyboardView mKeyboardView; + private LatinIME mInputMethodService; + + // TODO: Combine these key state objects with auto mode switch state. + private ShiftKeyState mShiftKeyState = new ShiftKeyState("Shift"); + private ModifierKeyState mSymbolKeyState = new ModifierKeyState("Symbol"); + + private KeyboardId mSymbolsId; + private KeyboardId mSymbolsShiftedId; + + private KeyboardId mCurrentId; + private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboardCache = + new HashMap<KeyboardId, SoftReference<LatinKeyboard>>(); + + private EditorInfo mAttribute; + private boolean mIsSymbols; + /** mIsAutoCorrectionActive indicates that auto corrected word will be input instead of + * what user actually typed. */ + private boolean mIsAutoCorrectionActive; + private boolean mVoiceKeyEnabled; + private boolean mVoiceButtonOnPrimary; + + // TODO: Encapsulate these state handling to separate class and combine with ShiftKeyState + // and ModifierKeyState. + private static final int SWITCH_STATE_ALPHA = 0; + private static final int SWITCH_STATE_SYMBOL_BEGIN = 1; + private static final int SWITCH_STATE_SYMBOL = 2; + // The following states are used only on the distinct multi-touch panel devices. + private static final int SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL = 3; + private static final int SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE = 4; + private static final int SWITCH_STATE_CHORDING_ALPHA = 5; + private static final int SWITCH_STATE_CHORDING_SYMBOL = 6; + private int mSwitchState = SWITCH_STATE_ALPHA; + + // Indicates whether or not we have the settings key in option of settings + private boolean mSettingsKeyEnabledInSettings; + private static final int SETTINGS_KEY_MODE_AUTO = R.string.settings_key_mode_auto; + private static final int SETTINGS_KEY_MODE_ALWAYS_SHOW = + R.string.settings_key_mode_always_show; + // NOTE: No need to have SETTINGS_KEY_MODE_ALWAYS_HIDE here because it's not being referred to + // in the source code now. + // Default is SETTINGS_KEY_MODE_AUTO. + private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO; + + private int mThemeIndex = -1; + private Context mThemeContext; + private int mKeyboardWidth; + + 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.setContextThemeWrapper(ims, getKeyboardThemeIndex(ims, prefs)); + prefs.registerOnSharedPreferenceChangeListener(sInstance); + } + + private static int getKeyboardThemeIndex(Context context, SharedPreferences prefs) { + final String defaultThemeId = context.getString(R.string.config_default_keyboard_theme_id); + final String themeId = prefs.getString(PREF_KEYBOARD_LAYOUT, defaultThemeId); + try { + final int themeIndex = Integer.valueOf(themeId); + if (themeIndex >= 0 && themeIndex < KEYBOARD_THEMES.length) + return themeIndex; + } catch (NumberFormatException e) { + // Format error, keyboard theme is default to 0. + } + Log.w(TAG, "Illegal keyboard theme in preference: " + themeId + ", default to 0"); + return 0; + } + + private void setContextThemeWrapper(Context context, int themeIndex) { + if (mThemeIndex != themeIndex) { + mThemeIndex = themeIndex; + mThemeContext = new ContextThemeWrapper(context, KEYBOARD_THEMES[themeIndex]); + mKeyboardCache.clear(); + } + } + + public void loadKeyboard(EditorInfo attribute, boolean voiceKeyEnabled, + boolean voiceButtonOnPrimary) { + mSwitchState = SWITCH_STATE_ALPHA; + try { + loadKeyboardInternal(attribute, voiceKeyEnabled, voiceButtonOnPrimary, false); + } catch (RuntimeException e) { + // Get KeyboardId to record which keyboard has been failed to load. + final KeyboardId id = getKeyboardId(attribute, false); + Log.w(TAG, "loading keyboard failed: " + id, e); + LatinImeLogger.logOnException(id.toString(), e); + } + } + + private void loadKeyboardInternal(EditorInfo attribute, boolean voiceButtonEnabled, + boolean voiceButtonOnPrimary, boolean isSymbols) { + if (mKeyboardView == null) return; + + mAttribute = attribute; + mVoiceKeyEnabled = voiceButtonEnabled; + mVoiceButtonOnPrimary = voiceButtonOnPrimary; + mIsSymbols = isSymbols; + // Update the settings key state because number of enabled IMEs could have been changed + mSettingsKeyEnabledInSettings = getSettingsKeyMode(mPrefs, mInputMethodService); + final KeyboardId id = getKeyboardId(attribute, isSymbols); + + // 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. + mSymbolsId = makeSiblingKeyboardId(id, R.xml.kbd_symbols, R.xml.kbd_phone); + mSymbolsShiftedId = makeSiblingKeyboardId( + id, R.xml.kbd_symbols_shift, R.xml.kbd_phone_symbols); + + setKeyboard(getKeyboard(id)); + } + + public void onSizeChanged() { + final int width = mInputMethodService.getWindow().getWindow().getDecorView().getWidth(); + if (width == 0 || mCurrentId == null) + return; + mKeyboardWidth = width; + // Set keyboard with new width. + final KeyboardId newId = mCurrentId.cloneWithNewGeometry(width); + setKeyboard(getKeyboard(newId)); + } + + private void setKeyboard(final Keyboard newKeyboard) { + final Keyboard oldKeyboard = mKeyboardView.getKeyboard(); + mKeyboardView.setKeyboard(newKeyboard); + mCurrentId = newKeyboard.mId; + final Resources res = mInputMethodService.getResources(); + mKeyboardView.setKeyPreviewPopupEnabled( + Settings.Values.isKeyPreviewPopupEnabled(mPrefs, res), + Settings.Values.getKeyPreviewPopupDismissDelay(mPrefs, res)); + final boolean localeChanged = (oldKeyboard == null) + || !newKeyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale); + mInputMethodService.mHandler.startDisplayLanguageOnSpacebar(localeChanged); + } + + private LatinKeyboard getKeyboard(KeyboardId id) { + final SoftReference<LatinKeyboard> ref = mKeyboardCache.get(id); + LatinKeyboard keyboard = (ref == null) ? null : ref.get(); + if (keyboard == null) { + final Resources res = mInputMethodService.getResources(); + final Locale savedLocale = Utils.setSystemLocale(res, + mSubtypeSwitcher.getInputLocale()); + + keyboard = new LatinKeyboard(mThemeContext, id, id.mWidth); + + if (id.mEnableShiftLock) { + keyboard.enableShiftLock(); + } + + mKeyboardCache.put(id, new SoftReference<LatinKeyboard>(keyboard)); + if (DEBUG_CACHE) + Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": " + + ((ref == null) ? "LOAD" : "GCed") + " id=" + id); + + Utils.setSystemLocale(res, savedLocale); + } else if (DEBUG_CACHE) { + Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": HIT id=" + id); + } + + keyboard.onAutoCorrectionStateChanged(mIsAutoCorrectionActive); + keyboard.setShifted(false); + // If the cached keyboard had been switched to another keyboard while the language was + // displayed on its spacebar, it might have had arbitrary text fade factor. In such case, + // we should reset the text fade factor. It is also applicable to shortcut key. + keyboard.setSpacebarTextFadeFactor(0.0f, null); + keyboard.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady(), null); + keyboard.setSpacebarSlidingLanguageSwitchDiff(0); + return keyboard; + } + + private boolean hasVoiceKey(boolean isSymbols) { + return mVoiceKeyEnabled && (isSymbols != mVoiceButtonOnPrimary); + } + + private boolean hasSettingsKey(EditorInfo attribute) { + return mSettingsKeyEnabledInSettings + && !Utils.inPrivateImeOptions(mInputMethodService.getPackageName(), + LatinIME.IME_OPTION_NO_SETTINGS_KEY, attribute); + } + + private KeyboardId getKeyboardId(EditorInfo attribute, boolean isSymbols) { + final int mode = Utils.getKeyboardMode(attribute); + final boolean hasVoiceKey = hasVoiceKey(isSymbols); + final int xmlId; + final boolean enableShiftLock; + + if (isSymbols) { + if (mode == KeyboardId.MODE_PHONE) { + xmlId = R.xml.kbd_phone_symbols; + } else if (mode == KeyboardId.MODE_NUMBER) { + // Note: MODE_NUMBER keyboard layout has no "switch alpha symbol" key. + xmlId = R.xml.kbd_number; + } else { + xmlId = R.xml.kbd_symbols; + } + enableShiftLock = false; + } else { + if (mode == KeyboardId.MODE_PHONE) { + xmlId = R.xml.kbd_phone; + enableShiftLock = false; + } else if (mode == KeyboardId.MODE_NUMBER) { + xmlId = R.xml.kbd_number; + enableShiftLock = false; + } else { + xmlId = R.xml.kbd_qwerty; + enableShiftLock = true; + } + } + final boolean hasSettingsKey = hasSettingsKey(attribute); + final int f2KeyMode = getF2KeyMode(mPrefs, mInputMethodService, attribute); + final boolean clobberSettingsKey = Utils.inPrivateImeOptions( + mInputMethodService.getPackageName(), LatinIME.IME_OPTION_NO_SETTINGS_KEY, + attribute); + final Resources res = mInputMethodService.getResources(); + final int orientation = res.getConfiguration().orientation; + if (mKeyboardWidth == 0) + mKeyboardWidth = res.getDisplayMetrics().widthPixels; + final Locale locale = mSubtypeSwitcher.getInputLocale(); + return new KeyboardId( + res.getResourceEntryName(xmlId), xmlId, locale, orientation, mKeyboardWidth, + mode, attribute, hasSettingsKey, f2KeyMode, clobberSettingsKey, mVoiceKeyEnabled, + hasVoiceKey, enableShiftLock); + } + + private KeyboardId makeSiblingKeyboardId(KeyboardId base, int alphabet, int phone) { + final int xmlId = base.mMode == KeyboardId.MODE_PHONE ? phone : alphabet; + final String xmlName = mInputMethodService.getResources().getResourceEntryName(xmlId); + return base.cloneWithNewLayout(xmlName, xmlId); + } + + public int getKeyboardMode() { + return mCurrentId != null ? mCurrentId.mMode : KeyboardId.MODE_TEXT; + } + + public boolean isAlphabetMode() { + return mCurrentId != null && mCurrentId.isAlphabetKeyboard(); + } + + public boolean isInputViewShown() { + return mCurrentInputView != null && mCurrentInputView.isShown(); + } + + public boolean isKeyboardAvailable() { + if (mKeyboardView != null) + return mKeyboardView.getKeyboard() != null; + return false; + } + + public LatinKeyboard getLatinKeyboard() { + if (mKeyboardView != null) { + final Keyboard keyboard = mKeyboardView.getKeyboard(); + if (keyboard instanceof LatinKeyboard) + return (LatinKeyboard)keyboard; + } + return null; + } + + public boolean isShiftedOrShiftLocked() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + return latinKeyboard.isShiftedOrShiftLocked(); + return false; + } + + public boolean isShiftLocked() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + return latinKeyboard.isShiftLocked(); + return false; + } + + public boolean isAutomaticTemporaryUpperCase() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + return latinKeyboard.isAutomaticTemporaryUpperCase(); + return false; + } + + public boolean isManualTemporaryUpperCase() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + return latinKeyboard.isManualTemporaryUpperCase(); + return false; + } + + private boolean isManualTemporaryUpperCaseFromAuto() { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) + return latinKeyboard.isManualTemporaryUpperCaseFromAuto(); + return false; + } + + private void setManualTemporaryUpperCase(boolean shifted) { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null) { + // On non-distinct multi touch panel device, we should also turn off the shift locked + // state when shift key is pressed to go to normal mode. + // On the other hand, on distinct multi touch panel device, turning off the shift locked + // state with shift key pressing is handled by onReleaseShift(). + if (!hasDistinctMultitouch() && !shifted && latinKeyboard.isShiftLocked()) { + latinKeyboard.setShiftLocked(false); + } + if (latinKeyboard.setShifted(shifted)) { + mKeyboardView.invalidateAllKeys(); + } + } + } + + private void setShiftLocked(boolean shiftLocked) { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null && latinKeyboard.setShiftLocked(shiftLocked)) { + mKeyboardView.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(); + mKeyboardView.invalidateAllKeys(); + } + } + + /** + * Update keyboard shift state triggered by connected EditText status change. + */ + public void updateShiftState() { + final ShiftKeyState shiftKeyState = mShiftKeyState; + if (DEBUG_STATE) + Log.d(TAG, "updateShiftState:" + + " autoCaps=" + mInputMethodService.getCurrentAutoCapsState() + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + shiftKeyState); + if (isAlphabetMode()) { + if (!isShiftLocked() && !shiftKeyState.isIgnoring()) { + if (shiftKeyState.isReleasing() && mInputMethodService.getCurrentAutoCapsState()) { + // Only when shift key is releasing, automatic temporary upper case will be set. + setAutomaticTemporaryUpperCase(); + } else { + setManualTemporaryUpperCase(shiftKeyState.isMomentary()); + } + } + } else { + // In symbol keyboard mode, we should clear shift key state because only alphabet + // keyboard has shift key. + shiftKeyState.onRelease(); + } + } + + public void changeKeyboardMode() { + if (DEBUG_STATE) + Log.d(TAG, "changeKeyboardMode:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + mShiftKeyState); + toggleKeyboardMode(); + if (isShiftLocked() && isAlphabetMode()) + setShiftLocked(true); + updateShiftState(); + } + + public void onPressShift(boolean withSliding) { + if (!isKeyboardAvailable()) + return; + ShiftKeyState shiftKeyState = mShiftKeyState; + if (DEBUG_STATE) + Log.d(TAG, "onPressShift:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + shiftKeyState + " sliding=" + withSliding); + if (isAlphabetMode()) { + if (isShiftLocked()) { + // Shift key is pressed while caps lock state, we will treat this state as shifted + // caps lock state and mark as if shift key pressed while normal state. + shiftKeyState.onPress(); + setManualTemporaryUpperCase(true); + } else if (isAutomaticTemporaryUpperCase()) { + // Shift key is pressed while automatic temporary upper case, we have to move to + // manual temporary upper case. + shiftKeyState.onPress(); + setManualTemporaryUpperCase(true); + } else if (isShiftedOrShiftLocked()) { + // In manual upper case state, we just record shift key has been pressing while + // shifted state. + shiftKeyState.onPressOnShifted(); + } else { + // In base layout, chording or manual temporary upper case mode is started. + shiftKeyState.onPress(); + toggleShift(); + } + } else { + // In symbol mode, just toggle symbol and symbol more keyboard. + shiftKeyState.onPress(); + toggleShift(); + mSwitchState = SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE; + } + } + + public void onReleaseShift(boolean withSliding) { + if (!isKeyboardAvailable()) + return; + ShiftKeyState shiftKeyState = mShiftKeyState; + if (DEBUG_STATE) + Log.d(TAG, "onReleaseShift:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + shiftKeyState + " sliding=" + withSliding); + if (isAlphabetMode()) { + if (shiftKeyState.isMomentary()) { + // After chording input while normal state. + toggleShift(); + } else if (isShiftLocked() && !shiftKeyState.isIgnoring() && !withSliding) { + // Shift has been pressed without chording while caps lock state. + toggleCapsLock(); + // To be able to turn off caps lock by "double tap" on shift key, we should ignore + // the second tap of the "double tap" from now for a while because we just have + // already turned off caps lock above. + mKeyboardView.startIgnoringDoubleTap(); + } else if (isShiftedOrShiftLocked() && shiftKeyState.isPressingOnShifted() + && !withSliding) { + // Shift has been pressed without chording while shifted state. + toggleShift(); + } else if (isManualTemporaryUpperCaseFromAuto() && shiftKeyState.isPressing() + && !withSliding) { + // Shift has been pressed without chording while manual temporary upper case + // transited from automatic temporary upper case. + toggleShift(); + } + } else { + // In symbol mode, snap back to the previous keyboard mode if the user chords the shift + // key and another key, then releases the shift key. + if (mSwitchState == SWITCH_STATE_CHORDING_SYMBOL) { + toggleShift(); + } + } + shiftKeyState.onRelease(); + } + + public void onPressSymbol() { + if (DEBUG_STATE) + Log.d(TAG, "onPressSymbol:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " symbolKeyState=" + mSymbolKeyState); + changeKeyboardMode(); + mSymbolKeyState.onPress(); + mSwitchState = SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL; + } + + 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 + // another key, then releases the mode change key. + if (mSwitchState == SWITCH_STATE_CHORDING_ALPHA) { + changeKeyboardMode(); + } + mSymbolKeyState.onRelease(); + } + + public void onOtherKeyPressed() { + if (DEBUG_STATE) + Log.d(TAG, "onOtherKeyPressed:" + + " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + + " shiftKeyState=" + mShiftKeyState + + " symbolKeyState=" + mSymbolKeyState); + mShiftKeyState.onOtherKeyPressed(); + mSymbolKeyState.onOtherKeyPressed(); + } + + public void onCancelInput() { + // Snap back to the previous keyboard mode if the user cancels sliding input. + if (getPointerCount() == 1) { + if (mSwitchState == SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL) { + changeKeyboardMode(); + } else if (mSwitchState == SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE) { + toggleShift(); + } + } + } + + private void toggleShiftInSymbol() { + if (isAlphabetMode()) + return; + final LatinKeyboard keyboard; + if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) { + keyboard = getKeyboard(mSymbolsShiftedId); + // Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To + // enable the indicator, we need to call setShiftLocked(true). + keyboard.setShiftLocked(true); + } else { + keyboard = getKeyboard(mSymbolsId); + // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the + // indicator, we need to call setShiftLocked(false). + keyboard.setShiftLocked(false); + } + setKeyboard(keyboard); + } + + public boolean isInMomentarySwitchState() { + return mSwitchState == SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL + || mSwitchState == SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE; + } + + public boolean isVibrateAndSoundFeedbackRequired() { + return mKeyboardView == null || !mKeyboardView.isInSlidingKeyInput(); + } + + private int getPointerCount() { + return mKeyboardView == null ? 0 : mKeyboardView.getPointerCount(); + } + + private void toggleKeyboardMode() { + loadKeyboardInternal(mAttribute, mVoiceKeyEnabled, mVoiceButtonOnPrimary, !mIsSymbols); + if (mIsSymbols) { + mSwitchState = SWITCH_STATE_SYMBOL_BEGIN; + } else { + mSwitchState = SWITCH_STATE_ALPHA; + } + } + + public boolean hasDistinctMultitouch() { + return mKeyboardView != null && mKeyboardView.hasDistinctMultitouch(); + } + + private static boolean isSpaceCharacter(int c) { + return c == Keyboard.CODE_SPACE || c == Keyboard.CODE_ENTER; + } + + private static boolean isQuoteCharacter(int c) { + // Apostrophe, quotation mark. + if (c == Keyboard.CODE_SINGLE_QUOTE || c == Keyboard.CODE_DOUBLE_QUOTE) + return true; + // \u2018: Left single quotation mark + // \u2019: Right single quotation mark + // \u201a: Single low-9 quotation mark + // \u201b: Single high-reversed-9 quotation mark + // \u201c: Left double quotation mark + // \u201d: Right double quotation mark + // \u201e: Double low-9 quotation mark + // \u201f: Double high-reversed-9 quotation mark + if (c >= '\u2018' && c <= '\u201f') + return true; + // \u00ab: Left-pointing double angle quotation mark + // \u00bb: Right-pointing double angle quotation mark + if (c == '\u00ab' || c == '\u00bb') + return true; + return false; + } + + /** + * Updates state machine to figure out when to automatically snap back to the previous mode. + */ + public void onKey(int code) { + if (DEBUG_STATE) + Log.d(TAG, "onKey: code=" + code + " switchState=" + mSwitchState + + " pointers=" + getPointerCount()); + switch (mSwitchState) { + case SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL: + // Only distinct multi touch devices can be in this state. + // On non-distinct multi touch devices, mode change key is handled by + // {@link LatinIME#onCodeInput}, not by {@link LatinIME#onPress} and + // {@link LatinIME#onRelease}. So, on such devices, {@link #mSwitchState} starts + // from {@link #SWITCH_STATE_SYMBOL_BEGIN}, or {@link #SWITCH_STATE_ALPHA}, not from + // {@link #SWITCH_STATE_MOMENTARY}. + if (code == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { + // Detected only the mode change key has been pressed, and then released. + if (mIsSymbols) { + mSwitchState = SWITCH_STATE_SYMBOL_BEGIN; + } else { + mSwitchState = SWITCH_STATE_ALPHA; + } + } else if (getPointerCount() == 1) { + // Snap back to the previous keyboard mode if the user pressed the mode change key + // and slid to other key, then released the finger. + // If the user cancels the sliding input, snapping back to the previous keyboard + // mode is handled by {@link #onCancelInput}. + changeKeyboardMode(); + } else { + // Chording input is being started. The keyboard mode will be snapped back to the + // previous mode in {@link onReleaseSymbol} when the mode change key is released. + mSwitchState = SWITCH_STATE_CHORDING_ALPHA; + } + break; + case SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE: + if (code == Keyboard.CODE_SHIFT) { + // Detected only the shift key has been pressed on symbol layout, and then released. + mSwitchState = SWITCH_STATE_SYMBOL_BEGIN; + } else if (getPointerCount() == 1) { + // Snap back to the previous keyboard mode if the user pressed the shift key on + // symbol mode and slid to other key, then released the finger. + toggleShift(); + mSwitchState = SWITCH_STATE_SYMBOL; + } else { + // Chording input is being started. The keyboard mode will be snapped back to the + // previous mode in {@link onReleaseShift} when the shift key is released. + mSwitchState = SWITCH_STATE_CHORDING_SYMBOL; + } + break; + case SWITCH_STATE_SYMBOL_BEGIN: + if (!isSpaceCharacter(code) && code >= 0) { + mSwitchState = SWITCH_STATE_SYMBOL; + } + // Snap back to alpha keyboard mode immediately if user types a quote character. + if (isQuoteCharacter(code)) { + changeKeyboardMode(); + } + break; + case SWITCH_STATE_SYMBOL: + case SWITCH_STATE_CHORDING_SYMBOL: + // Snap back to alpha keyboard mode if user types one or more non-space/enter + // characters followed by a space/enter or a quote character. + if (isSpaceCharacter(code) || isQuoteCharacter(code)) { + changeKeyboardMode(); + } + break; + } + } + + public LatinKeyboardView getKeyboardView() { + return mKeyboardView; + } + + public View onCreateInputView() { + return createInputView(mThemeIndex, true); + } + + private View createInputView(final int newThemeIndex, final boolean forceRecreate) { + if (mCurrentInputView != null && mThemeIndex == newThemeIndex && !forceRecreate) + return mCurrentInputView; + + if (mKeyboardView != null) { + mKeyboardView.closing(); + } + + final int oldThemeIndex = mThemeIndex; + Utils.GCUtils.getInstance().reset(); + boolean tryGC = true; + for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { + try { + setContextThemeWrapper(mInputMethodService, newThemeIndex); + mCurrentInputView = LayoutInflater.from(mThemeContext).inflate( + R.layout.input_view, null); + tryGC = false; + } catch (OutOfMemoryError e) { + Log.w(TAG, "load keyboard failed: " + e); + tryGC = Utils.GCUtils.getInstance().tryGCOrWait( + oldThemeIndex + "," + newThemeIndex, e); + } catch (InflateException e) { + Log.w(TAG, "load keyboard failed: " + e); + tryGC = Utils.GCUtils.getInstance().tryGCOrWait( + oldThemeIndex + "," + newThemeIndex, e); + } + } + + mKeyboardView = (LatinKeyboardView) mCurrentInputView.findViewById(R.id.keyboard_view); + mKeyboardView.setOnKeyboardActionListener(mInputMethodService); + + // This always needs to be set since the accessibility state can + // potentially change without the input view being re-created. + AccessibleKeyboardViewProxy.setView(mKeyboardView); + + return mCurrentInputView; + } + + private void postSetInputView(final View newInputView) { + mInputMethodService.mHandler.post(new Runnable() { + @Override + public void run() { + if (newInputView != null) { + mInputMethodService.setInputView(newInputView); + } + mInputMethodService.updateInputViewShown(); + } + }); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (PREF_KEYBOARD_LAYOUT.equals(key)) { + final int layoutId = getKeyboardThemeIndex(mInputMethodService, sharedPreferences); + postSetInputView(createInputView(layoutId, false)); + } else if (Settings.PREF_SETTINGS_KEY.equals(key)) { + mSettingsKeyEnabledInSettings = getSettingsKeyMode(sharedPreferences, + mInputMethodService); + postSetInputView(createInputView(mThemeIndex, true)); + } + } + + public void onAutoCorrectionStateChanged(boolean isAutoCorrection) { + if (mIsAutoCorrectionActive != isAutoCorrection) { + mIsAutoCorrectionActive = isAutoCorrection; + final LatinKeyboard keyboard = getLatinKeyboard(); + if (keyboard != null && keyboard.needsAutoCorrectionSpacebarLed()) { + final Key invalidatedKey = keyboard.onAutoCorrectionStateChanged(isAutoCorrection); + final LatinKeyboardView keyboardView = getKeyboardView(); + if (keyboardView != null) + keyboardView.invalidateKey(invalidatedKey); + } + } + } + + private static boolean getSettingsKeyMode(SharedPreferences prefs, Context context) { + final Resources res = context.getResources(); + final boolean showSettingsKeyOption = res.getBoolean( + R.bool.config_enable_show_settings_key_option); + if (showSettingsKeyOption) { + final String settingsKeyMode = prefs.getString(Settings.PREF_SETTINGS_KEY, + res.getString(DEFAULT_SETTINGS_KEY_MODE)); + // We show the settings key when 1) SETTINGS_KEY_MODE_ALWAYS_SHOW or + // 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system + if (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW)) + || (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_AUTO)) + && Utils.hasMultipleEnabledIMEsOrSubtypes( + (InputMethodManagerCompatWrapper.getInstance(context))))) { + return true; + } + return false; + } + // If the show settings key option is disabled, we always try showing the settings key. + return true; + } + + private static int getF2KeyMode(SharedPreferences prefs, Context context, + EditorInfo attribute) { + final boolean clobberSettingsKey = Utils.inPrivateImeOptions( + context.getPackageName(), LatinIME.IME_OPTION_NO_SETTINGS_KEY, attribute); + final Resources res = context.getResources(); + final String settingsKeyMode = prefs.getString(Settings.PREF_SETTINGS_KEY, + res.getString(DEFAULT_SETTINGS_KEY_MODE)); + if (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_AUTO))) { + return clobberSettingsKey ? KeyboardId.F2KEY_MODE_SHORTCUT_IME + : KeyboardId.F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS; + } else if (settingsKeyMode.equals(res.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW))) { + return clobberSettingsKey ? KeyboardId.F2KEY_MODE_NONE : KeyboardId.F2KEY_MODE_SETTINGS; + } else { // SETTINGS_KEY_MODE_ALWAYS_HIDE + return KeyboardId.F2KEY_MODE_SHORTCUT_IME; + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java new file mode 100644 index 000000000..9dc019c61 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -0,0 +1,1364 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Paint.Align; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.Region.Op; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.util.TypedValue; +import android.view.GestureDetector; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.widget.PopupWindow; +import android.widget.TextView; + +import com.android.inputmethod.accessibility.AccessibilityUtils; +import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy; +import com.android.inputmethod.compat.FrameLayoutCompatUtils; +import com.android.inputmethod.keyboard.internal.MiniKeyboardBuilder; +import com.android.inputmethod.keyboard.internal.PointerTrackerQueue; +import com.android.inputmethod.keyboard.internal.SwipeTracker; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.R; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.WeakHashMap; + +/** + * A view that renders a virtual {@link Keyboard}. It handles rendering of keys and detecting key + * presses and touch movements. + * + * @attr ref R.styleable#KeyboardView_backgroundDimAmount + * @attr ref R.styleable#KeyboardView_keyBackground + * @attr ref R.styleable#KeyboardView_keyHysteresisDistance + * @attr ref R.styleable#KeyboardView_keyLetterRatio + * @attr ref R.styleable#KeyboardView_keyLabelRatio + * @attr ref R.styleable#KeyboardView_keyHintLetterRatio + * @attr ref R.styleable#KeyboardView_keyUppercaseLetterRatio + * @attr ref R.styleable#KeyboardView_keyTextStyle + * @attr ref R.styleable#KeyboardView_keyPreviewLayout + * @attr ref R.styleable#KeyboardView_keyPreviewOffset + * @attr ref R.styleable#KeyboardView_keyPreviewHeight + * @attr ref R.styleable#KeyboardView_keyTextColor + * @attr ref R.styleable#KeyboardView_keyTextColorDisabled + * @attr ref R.styleable#KeyboardView_keyHintLetterColor + * @attr ref R.styleable#KeyboardView_keyUppercaseLetterInactivatedColor + * @attr ref R.styleable#KeyboardView_keyUppercaseLetterActivatedColor + * @attr ref R.styleable#KeyboardView_verticalCorrection + * @attr ref R.styleable#KeyboardView_popupLayout + * @attr ref R.styleable#KeyboardView_shadowColor + * @attr ref R.styleable#KeyboardView_shadowRadius + */ +public class KeyboardView extends View implements PointerTracker.UIProxy { + private static final String TAG = KeyboardView.class.getSimpleName(); + private static final boolean DEBUG_SHOW_ALIGN = false; + private static final boolean DEBUG_KEYBOARD_GRID = false; + + private static final boolean ENABLE_CAPSLOCK_BY_LONGPRESS = true; + private static final boolean ENABLE_CAPSLOCK_BY_DOUBLETAP = true; + + // Timing constants + private final int mKeyRepeatInterval; + + // Miscellaneous constants + private static final int[] LONG_PRESSABLE_STATE_SET = { android.R.attr.state_long_pressable }; + private static final int HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL = -1; + + // XML attribute + private final float mKeyLetterRatio; + private final int mKeyTextColor; + private final int mKeyTextInactivatedColor; + private final Typeface mKeyTextStyle; + private final float mKeyLabelRatio; + private final float mKeyHintLetterRatio; + private final float mKeyUppercaseLetterRatio; + private final int mShadowColor; + private final float mShadowRadius; + private final Drawable mKeyBackground; + private final float mBackgroundDimAmount; + private final float mKeyHysteresisDistance; + private final float mVerticalCorrection; + private final int mPreviewOffset; + private final int mPreviewHeight; + private final int mPopupLayout; + private final Drawable mKeyPopupHintIcon; + private final int mKeyHintLetterColor; + private final int mKeyUppercaseLetterInactivatedColor; + private final int mKeyUppercaseLetterActivatedColor; + + // Main keyboard + private Keyboard mKeyboard; + private int mKeyLetterSize; + private int mKeyLabelSize; + private int mKeyHintLetterSize; + private int mKeyUppercaseLetterSize; + + // Key preview + private boolean mInForeground; + private TextView mPreviewText; + private Drawable mPreviewBackground; + private float mPreviewTextRatio; + private int mPreviewTextSize; + private boolean mShowKeyPreviewPopup = true; + private final int mDelayBeforePreview; + private int mDelayAfterPreview; + private ViewGroup mPreviewPlacer; + private final int[] mCoordinates = new int[2]; + + // Mini keyboard + private PopupWindow mPopupWindow; + private PopupPanel mPopupMiniKeyboardPanel; + private final WeakHashMap<Key, PopupPanel> mPopupPanelCache = + new WeakHashMap<Key, PopupPanel>(); + + /** 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 PointerTrackerQueue mPointerQueue = new PointerTrackerQueue(); + + private final boolean mHasDistinctMultitouch; + private int mOldPointerCount = 1; + private int mOldKeyIndex; + + protected KeyDetector mKeyDetector = new KeyDetector(); + + // Swipe gesture detector + protected GestureDetector mGestureDetector; + private final SwipeTracker mSwipeTracker = new SwipeTracker(); + private final int mSwipeThreshold; + private final boolean mDisambiguateSwipe; + + // Drawing + /** Whether the keyboard bitmap needs to be redrawn before it's blitted. **/ + private boolean mDrawPending; + /** Notes if the keyboard just changed, so that we could possibly reallocate the mBuffer. */ + private boolean mKeyboardChanged; + /** The dirty region in the keyboard bitmap */ + private final Rect mDirtyRect = new Rect(); + /** The key to invalidate. */ + private Key mInvalidatedKey; + /** The dirty region for single key drawing */ + private final Rect mInvalidatedKeyRect = new Rect(); + /** The keyboard bitmap for faster updates */ + private Bitmap mBuffer; + /** The canvas for the above mutable keyboard bitmap */ + private Canvas mCanvas; + private final Paint mPaint = new Paint(); + private final Rect mPadding = new Rect(); + private final Rect mTextBounds = new Rect(); + // 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>(); + // This map caches key label text width in pixel as value and key label text size as map key. + private final HashMap<Integer, Integer> mTextWidthCache = new HashMap<Integer, Integer>(); + // Distance from horizontal center of the key, proportional to key label text height and width. + private static final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER = 0.45f; + private static final float KEY_LABEL_VERTICAL_PADDING_FACTOR = 1.60f; + private static final String KEY_LABEL_REFERENCE_CHAR = "M"; + private final int mKeyLabelHorizontalPadding; + + private final UIHandler mHandler = new UIHandler(); + + class UIHandler extends Handler { + private static final int MSG_SHOW_KEY_PREVIEW = 1; + private static final int MSG_DISMISS_KEY_PREVIEW = 2; + private static final int MSG_REPEAT_KEY = 3; + private static final int MSG_LONGPRESS_KEY = 4; + private static final int MSG_LONGPRESS_SHIFT_KEY = 5; + private static final int MSG_IGNORE_DOUBLE_TAP = 6; + + private boolean mInKeyRepeat; + + @Override + public void handleMessage(Message msg) { + final PointerTracker tracker = (PointerTracker) msg.obj; + switch (msg.what) { + case MSG_SHOW_KEY_PREVIEW: + showKey(msg.arg1, tracker); + break; + case MSG_DISMISS_KEY_PREVIEW: + mPreviewText.setVisibility(View.INVISIBLE); + break; + case MSG_REPEAT_KEY: + tracker.onRepeatKey(msg.arg1); + startKeyRepeatTimer(mKeyRepeatInterval, msg.arg1, tracker); + break; + case MSG_LONGPRESS_KEY: + openMiniKeyboardIfRequired(msg.arg1, tracker); + break; + case MSG_LONGPRESS_SHIFT_KEY: + onLongPressShiftKey(tracker); + break; + } + } + + public void showKeyPreview(long delay, int keyIndex, PointerTracker tracker) { + removeMessages(MSG_SHOW_KEY_PREVIEW); + if (mPreviewText.getVisibility() == VISIBLE || delay == 0) { + // Show right away, if it's already visible and finger is moving around + showKey(keyIndex, tracker); + } else { + sendMessageDelayed( + obtainMessage(MSG_SHOW_KEY_PREVIEW, keyIndex, 0, tracker), delay); + } + } + + public void cancelShowKeyPreview(PointerTracker tracker) { + removeMessages(MSG_SHOW_KEY_PREVIEW, tracker); + } + + public void cancelAllShowKeyPreviews() { + removeMessages(MSG_SHOW_KEY_PREVIEW); + } + + public void dismissKeyPreview(long delay, PointerTracker tracker) { + sendMessageDelayed(obtainMessage(MSG_DISMISS_KEY_PREVIEW, tracker), delay); + } + + public void cancelDismissKeyPreview(PointerTracker tracker) { + removeMessages(MSG_DISMISS_KEY_PREVIEW, tracker); + } + + public void cancelAllDismissKeyPreviews() { + removeMessages(MSG_DISMISS_KEY_PREVIEW); + } + + public void startKeyRepeatTimer(long delay, int keyIndex, PointerTracker tracker) { + mInKeyRepeat = true; + sendMessageDelayed(obtainMessage(MSG_REPEAT_KEY, keyIndex, 0, tracker), delay); + } + + public void cancelKeyRepeatTimer() { + mInKeyRepeat = false; + removeMessages(MSG_REPEAT_KEY); + } + + public boolean isInKeyRepeat() { + return mInKeyRepeat; + } + + public void startLongPressTimer(long delay, int keyIndex, PointerTracker tracker) { + cancelLongPressTimers(); + sendMessageDelayed(obtainMessage(MSG_LONGPRESS_KEY, keyIndex, 0, tracker), delay); + } + + 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(); + cancelLongPressTimers(); + removeMessages(MSG_IGNORE_DOUBLE_TAP); + } + + public void startIgnoringDoubleTap() { + sendMessageDelayed(obtainMessage(MSG_IGNORE_DOUBLE_TAP), + ViewConfiguration.getDoubleTapTimeout()); + } + + public boolean isIgnoringDoubleTap() { + return hasMessages(MSG_IGNORE_DOUBLE_TAP); + } + + public void cancelAllMessages() { + cancelKeyTimers(); + cancelAllShowKeyPreviews(); + cancelAllDismissKeyPreviews(); + } + } + + public KeyboardView(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.keyboardViewStyle); + } + + public KeyboardView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + final TypedArray a = context.obtainStyledAttributes( + attrs, R.styleable.KeyboardView, defStyle, R.style.KeyboardView); + + mKeyBackground = a.getDrawable(R.styleable.KeyboardView_keyBackground); + mKeyHysteresisDistance = a.getDimensionPixelOffset( + R.styleable.KeyboardView_keyHysteresisDistance, 0); + mVerticalCorrection = a.getDimensionPixelOffset( + R.styleable.KeyboardView_verticalCorrection, 0); + final int previewLayout = a.getResourceId(R.styleable.KeyboardView_keyPreviewLayout, 0); + mPreviewOffset = a.getDimensionPixelOffset(R.styleable.KeyboardView_keyPreviewOffset, 0); + mPreviewHeight = a.getDimensionPixelSize(R.styleable.KeyboardView_keyPreviewHeight, 80); + mKeyLetterRatio = getRatio(a, R.styleable.KeyboardView_keyLetterRatio); + mKeyLabelRatio = getRatio(a, R.styleable.KeyboardView_keyLabelRatio); + mKeyHintLetterRatio = getRatio(a, R.styleable.KeyboardView_keyHintLetterRatio); + mKeyUppercaseLetterRatio = getRatio(a, + R.styleable.KeyboardView_keyUppercaseLetterRatio); + mKeyTextColor = a.getColor(R.styleable.KeyboardView_keyTextColor, 0xFF000000); + mKeyTextInactivatedColor = a.getColor( + R.styleable.KeyboardView_keyTextInactivatedColor, 0xFF000000); + mKeyPopupHintIcon = a.getDrawable(R.styleable.KeyboardView_keyPopupHintIcon); + mKeyHintLetterColor = a.getColor(R.styleable.KeyboardView_keyHintLetterColor, 0); + mKeyUppercaseLetterInactivatedColor = a.getColor( + R.styleable.KeyboardView_keyUppercaseLetterInactivatedColor, 0); + mKeyUppercaseLetterActivatedColor = a.getColor( + R.styleable.KeyboardView_keyUppercaseLetterActivatedColor, 0); + mKeyTextStyle = Typeface.defaultFromStyle( + a.getInt(R.styleable.KeyboardView_keyTextStyle, Typeface.NORMAL)); + mPopupLayout = a.getResourceId(R.styleable.KeyboardView_popupLayout, 0); + mShadowColor = a.getColor(R.styleable.KeyboardView_shadowColor, 0); + mShadowRadius = a.getFloat(R.styleable.KeyboardView_shadowRadius, 0f); + // TODO: Use Theme (android.R.styleable.Theme_backgroundDimAmount) + mBackgroundDimAmount = a.getFloat(R.styleable.KeyboardView_backgroundDimAmount, 0.5f); + a.recycle(); + + final Resources res = getResources(); + + if (previewLayout != 0) { + mPreviewText = (TextView) LayoutInflater.from(context).inflate(previewLayout, null); + mPreviewBackground = mPreviewText.getBackground(); + mPreviewTextRatio = getRatio(res, R.fraction.key_preview_text_ratio); + } else { + mShowKeyPreviewPopup = false; + } + 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); + + mPaint.setAntiAlias(true); + mPaint.setTextAlign(Align.CENTER); + mPaint.setAlpha(255); + + mKeyBackground.getPadding(mPadding); + + mSwipeThreshold = (int) (500 * res.getDisplayMetrics().density); + // TODO: Refer to frameworks/base/core/res/res/values/config.xml + mDisambiguateSwipe = res.getBoolean(R.bool.config_swipeDisambiguation); + + GestureDetector.SimpleOnGestureListener listener = + new GestureDetector.SimpleOnGestureListener() { + private boolean mProcessingShiftDoubleTapEvent = false; + + @Override + public boolean onFling(MotionEvent me1, MotionEvent me2, float velocityX, + float velocityY) { + final float absX = Math.abs(velocityX); + final float absY = Math.abs(velocityY); + float deltaY = me2.getY() - me1.getY(); + int travelY = getHeight() / 2; // Half the keyboard height + mSwipeTracker.computeCurrentVelocity(1000); + final float endingVelocityY = mSwipeTracker.getYVelocity(); + if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) { + if (mDisambiguateSwipe && endingVelocityY >= velocityY / 4) { + onSwipeDown(); + return true; + } + } + return false; + } + + @Override + public boolean onDoubleTap(MotionEvent firstDown) { + if (ENABLE_CAPSLOCK_BY_DOUBLETAP && mKeyboard instanceof LatinKeyboard + && ((LatinKeyboard) mKeyboard).isAlphaKeyboard()) { + final int pointerIndex = firstDown.getActionIndex(); + final int id = firstDown.getPointerId(pointerIndex); + final PointerTracker tracker = getPointerTracker(id); + // If the first down event is on shift key. + if (tracker.isOnShiftKey((int)firstDown.getX(), (int)firstDown.getY())) { + mProcessingShiftDoubleTapEvent = true; + return true; + } + } + mProcessingShiftDoubleTapEvent = false; + return false; + } + + @Override + public boolean onDoubleTapEvent(MotionEvent secondTap) { + if (mProcessingShiftDoubleTapEvent + && secondTap.getAction() == MotionEvent.ACTION_DOWN) { + final MotionEvent secondDown = secondTap; + final int pointerIndex = secondDown.getActionIndex(); + final int id = secondDown.getPointerId(pointerIndex); + final PointerTracker tracker = getPointerTracker(id); + // If the second down event is also on shift key. + if (tracker.isOnShiftKey((int)secondDown.getX(), (int)secondDown.getY())) { + // Detected a double tap on shift key. If we are in the ignoring double tap + // mode, it means we have already turned off caps lock in + // {@link KeyboardSwitcher#onReleaseShift} . + final boolean ignoringDoubleTap = mHandler.isIgnoringDoubleTap(); + if (!ignoringDoubleTap) + onDoubleTapShiftKey(tracker); + return true; + } + // Otherwise these events should not be handled as double tap. + mProcessingShiftDoubleTapEvent = false; + } + return mProcessingShiftDoubleTapEvent; + } + }; + + final boolean ignoreMultitouch = true; + mGestureDetector = new GestureDetector(getContext(), listener, null, ignoreMultitouch); + mGestureDetector.setIsLongpressEnabled(false); + + mHasDistinctMultitouch = context.getPackageManager() + .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT); + mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); + } + + // Read fraction value in TypedArray as float. + private static float getRatio(TypedArray a, int index) { + return a.getFraction(index, 1000, 1000, 1) / 1000.0f; + } + + // Read fraction value in resource as float. + private static float getRatio(Resources res, int id) { + return res.getFraction(id, 1000, 1000) / 1000.0f; + } + + public void startIgnoringDoubleTap() { + if (ENABLE_CAPSLOCK_BY_DOUBLETAP) + mHandler.startIgnoringDoubleTap(); + } + + public void setOnKeyboardActionListener(KeyboardActionListener listener) { + mKeyboardActionListener = listener; + for (PointerTracker tracker : mPointerTrackers) { + tracker.setOnKeyboardActionListener(listener); + } + } + + /** + * Returns the {@link KeyboardActionListener} object. + * @return the listener attached to this keyboard + */ + protected KeyboardActionListener getOnKeyboardActionListener() { + return mKeyboardActionListener; + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + // TODO: Should notify InputMethodService instead? + KeyboardSwitcher.getInstance().onSizeChanged(); + } + + /** + * Attaches a keyboard to this view. The keyboard can be switched at any time and the + * view will re-layout itself to accommodate the keyboard. + * @see Keyboard + * @see #getKeyboard() + * @param keyboard the keyboard to display in this view + */ + public void setKeyboard(Keyboard keyboard) { + if (mKeyboard != null) { + dismissAllKeyPreviews(); + } + // Remove any pending messages, except dismissing preview + mHandler.cancelKeyTimers(); + mHandler.cancelAllShowKeyPreviews(); + mKeyboard = keyboard; + LatinImeLogger.onSetKeyboard(keyboard); + mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(), + -getPaddingTop() + mVerticalCorrection); + for (PointerTracker tracker : mPointerTrackers) { + tracker.setKeyboard(keyboard, mKeyHysteresisDistance); + } + requestLayout(); + mKeyboardChanged = true; + invalidateAllKeys(); + mKeyDetector.setProximityThreshold(keyboard.getMostCommonKeyWidth()); + mPopupPanelCache.clear(); + final int keyHeight = keyboard.getRowHeight() - keyboard.getVerticalGap(); + mKeyLetterSize = (int)(keyHeight * mKeyLetterRatio); + mKeyLabelSize = (int)(keyHeight * mKeyLabelRatio); + mKeyHintLetterSize = (int)(keyHeight * mKeyHintLetterRatio); + mKeyUppercaseLetterSize = (int)( + keyHeight * mKeyUppercaseLetterRatio); + mPreviewTextSize = (int)(keyHeight * mPreviewTextRatio); + } + + /** + * Returns the current keyboard being displayed by this view. + * @return the currently attached keyboard + * @see #setKeyboard(Keyboard) + */ + public Keyboard getKeyboard() { + return mKeyboard; + } + + /** + * Returns whether the device has distinct multi-touch panel. + * @return true if the device has distinct multi-touch panel. + */ + @Override + public boolean hasDistinctMultitouch() { + return mHasDistinctMultitouch; + } + + /** + * 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 preview + * @param delay the delay after which the preview is dismissed + * @see #isKeyPreviewPopupEnabled() + */ + public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) { + mShowKeyPreviewPopup = previewEnabled; + mDelayAfterPreview = delay; + } + + /** + * Returns the enabled state of the key feedback preview + * @return whether or not the key feedback preview is enabled + * @see #setKeyPreviewPopupEnabled(boolean, int) + */ + public boolean isKeyPreviewPopupEnabled() { + return mShowKeyPreviewPopup; + } + + /** + * When enabled, calls to {@link KeyboardActionListener#onCodeInput} will include key + * codes for adjacent keys. When disabled, only the primary key code will be + * reported. + * @param enabled whether or not the proximity correction is enabled + */ + public void setProximityCorrectionEnabled(boolean enabled) { + mKeyDetector.setProximityCorrectionEnabled(enabled); + } + + /** + * Returns true if proximity correction is enabled. + */ + public boolean isProximityCorrectionEnabled() { + return mKeyDetector.isProximityCorrectionEnabled(); + } + + protected CharSequence adjustCase(CharSequence label) { + if (mKeyboard.isShiftedOrShiftLocked() && label != null && label.length() < 3 + && Character.isLowerCase(label.charAt(0))) { + return label.toString().toUpperCase(); + } + return label; + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // Round up a little + if (mKeyboard == null) { + setMeasuredDimension( + getPaddingLeft() + getPaddingRight(), getPaddingTop() + getPaddingBottom()); + } else { + int width = mKeyboard.getMinWidth() + getPaddingLeft() + getPaddingRight(); + if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) { + width = MeasureSpec.getSize(widthMeasureSpec); + } + setMeasuredDimension( + width, mKeyboard.getHeight() + getPaddingTop() + getPaddingBottom()); + } + } + + @Override + public void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (mDrawPending || mBuffer == null || mKeyboardChanged) { + onBufferDraw(); + } + canvas.drawBitmap(mBuffer, 0, 0, null); + } + + private void onBufferDraw() { + final int width = getWidth(); + final int height = getHeight(); + if (width == 0 || height == 0) + return; + if (mBuffer == null || mKeyboardChanged) { + mKeyboardChanged = false; + mDirtyRect.union(0, 0, width, height); + } + if (mBuffer == null || mBuffer.getWidth() != width || mBuffer.getHeight() != height) { + if (mBuffer != null) + mBuffer.recycle(); + mBuffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + if (mCanvas != null) { + mCanvas.setBitmap(mBuffer); + } else { + mCanvas = new Canvas(mBuffer); + } + } + final Canvas canvas = mCanvas; + canvas.clipRect(mDirtyRect, Op.REPLACE); + canvas.drawColor(Color.BLACK, PorterDuff.Mode.CLEAR); + + if (mKeyboard == null) return; + + if (mInvalidatedKey != null && mInvalidatedKeyRect.contains(mDirtyRect)) { + // Draw a single key. + onBufferDrawKey(canvas, mInvalidatedKey); + } else { + // Draw all keys. + for (final Key key : mKeyboard.getKeys()) { + onBufferDrawKey(canvas, key); + } + } + + // TODO: Move this function to ProximityInfo for getting rid of + // public declarations for + // GRID_WIDTH and GRID_HEIGHT + if (DEBUG_KEYBOARD_GRID) { + Paint p = new Paint(); + p.setStyle(Paint.Style.STROKE); + p.setStrokeWidth(1.0f); + p.setColor(0x800000c0); + int cw = (mKeyboard.getMinWidth() + mKeyboard.GRID_WIDTH - 1) + / mKeyboard.GRID_WIDTH; + int ch = (mKeyboard.getHeight() + mKeyboard.GRID_HEIGHT - 1) + / mKeyboard.GRID_HEIGHT; + for (int i = 0; i <= mKeyboard.GRID_WIDTH; i++) + canvas.drawLine(i * cw, 0, i * cw, ch * mKeyboard.GRID_HEIGHT, p); + for (int i = 0; i <= mKeyboard.GRID_HEIGHT; i++) + canvas.drawLine(0, i * ch, cw * mKeyboard.GRID_WIDTH, i * ch, p); + } + + // Overlay a dark rectangle to dim the keyboard + if (mPopupMiniKeyboardPanel != null) { + mPaint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24); + canvas.drawRect(0, 0, width, height, mPaint); + } + + mInvalidatedKey = null; + mDrawPending = false; + mDirtyRect.setEmpty(); + } + + private void onBufferDrawKey(final Canvas canvas, final Key key) { + final Paint paint = mPaint; + final Drawable keyBackground = mKeyBackground; + final Rect padding = mPadding; + final int kbdPaddingLeft = getPaddingLeft(); + final int kbdPaddingTop = getPaddingTop(); + final int keyDrawX = key.mX + key.mVisualInsetsLeft; + final int keyDrawWidth = key.mWidth - key.mVisualInsetsLeft - key.mVisualInsetsRight; + final int rowHeight = padding.top + key.mHeight; + final boolean isManualTemporaryUpperCase = mKeyboard.isManualTemporaryUpperCase(); + + canvas.translate(keyDrawX + kbdPaddingLeft, key.mY + kbdPaddingTop); + + // Draw key background. + final int[] drawableState = key.getCurrentDrawableState(); + keyBackground.setState(drawableState); + final Rect bounds = keyBackground.getBounds(); + if (keyDrawWidth != bounds.right || key.mHeight != bounds.bottom) { + keyBackground.setBounds(0, 0, keyDrawWidth, key.mHeight); + } + keyBackground.draw(canvas); + + // Draw key label. + if (key.mLabel != null) { + // Switch the character to uppercase if shift is pressed + final String label = key.mLabel == null ? null : adjustCase(key.mLabel).toString(); + // For characters, use large font. For labels like "Done", use small font. + final int labelSize = getLabelSizeAndSetPaint(label, key.mLabelOption, paint); + final int labelCharHeight = getLabelCharHeight(labelSize, paint); + + // Vertical label text alignment. + final float baseline; + if ((key.mLabelOption & Key.LABEL_OPTION_ALIGN_BOTTOM) != 0) { + baseline = key.mHeight - labelCharHeight * KEY_LABEL_VERTICAL_PADDING_FACTOR; + if (DEBUG_SHOW_ALIGN) + drawHorizontalLine(canvas, (int)baseline, keyDrawWidth, 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, keyDrawWidth, 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 = keyDrawWidth - mKeyLabelHorizontalPadding - padding.right; + paint.setTextAlign(Align.RIGHT); + if (DEBUG_SHOW_ALIGN) + drawVerticalLine(canvas, positionX, rowHeight, 0xc0808000, new Paint()); + } else { + positionX = (keyDrawWidth + padding.left - padding.right) / 2; + paint.setTextAlign(Align.CENTER); + if (DEBUG_SHOW_ALIGN) { + if (label.length() > 1) + drawVerticalLine(canvas, positionX, rowHeight, 0xc0008080, new Paint()); + } + } + if (key.hasUppercaseLetter() && isManualTemporaryUpperCase) { + paint.setColor(mKeyTextInactivatedColor); + } else { + paint.setColor(mKeyTextColor); + } + if (key.isEnabled()) { + // Set a drop shadow for the text + paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor); + } else { + // Make label invisible + paint.setColor(Color.TRANSPARENT); + } + canvas.drawText(label, positionX, baseline, paint); + // Turn off drop shadow + paint.setShadowLayer(0, 0, 0, 0); + } + + // Draw hint letter. + if (key.mHintLetter != null) { + final String label = key.mHintLetter.toString(); + final int textColor; + final int textSize; + if (key.hasUppercaseLetter()) { + textColor = isManualTemporaryUpperCase ? mKeyUppercaseLetterActivatedColor + : mKeyUppercaseLetterInactivatedColor; + textSize = mKeyUppercaseLetterSize; + } else { + textColor = mKeyHintLetterColor; + textSize = mKeyHintLetterSize; + } + paint.setColor(textColor); + paint.setTextSize(textSize); + // Note: padding.right for drawX? + final float drawX = keyDrawWidth - getLabelCharWidth(textSize, paint); + final float drawY = -paint.ascent() + padding.top; + canvas.drawText(label, drawX, drawY, paint); + } + + // 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 = (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 = keyDrawWidth - padding.right - mKeyLabelHorizontalPadding + - drawableWidth; + if (DEBUG_SHOW_ALIGN) + drawVerticalLine(canvas, drawableX + drawableWidth, rowHeight, + 0xc0808000, new Paint()); + } else { // Align center + drawableX = (keyDrawWidth + padding.left - padding.right - drawableWidth) / 2; + if (DEBUG_SHOW_ALIGN) + drawVerticalLine(canvas, drawableX + drawableWidth / 2, rowHeight, + 0xc0008080, new Paint()); + } + drawIcon(canvas, icon, drawableX, drawableY, drawableWidth, drawableHeight); + if (DEBUG_SHOW_ALIGN) + drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight, + 0x80c00000, new Paint()); + } + + // Draw popup hint icon "...". + // TODO: Draw "..." by text. + if (key.hasPopupHint()) { + final int drawableWidth = keyDrawWidth; + final int drawableHeight = key.mHeight; + final int drawableX = 0; + final int drawableY = HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL; + final Drawable hintIcon = mKeyPopupHintIcon; + drawIcon(canvas, hintIcon, drawableX, drawableY, drawableWidth, drawableHeight); + if (DEBUG_SHOW_ALIGN) + drawRectangle(canvas, drawableX, drawableY, drawableWidth, drawableHeight, + 0x80c0c000, new Paint()); + } + + canvas.translate(-keyDrawX - kbdPaddingLeft, -key.mY - kbdPaddingTop); + } + + public int getLabelSizeAndSetPaint(CharSequence label, int keyLabelOption, Paint paint) { + // For characters, use large font. For labels like "Done", use small font. + final int labelSize; + final Typeface labelStyle; + if ((keyLabelOption & Key.LABEL_OPTION_FONT_NORMAL) != 0) { + labelStyle = Typeface.DEFAULT; + } else if ((keyLabelOption & Key.LABEL_OPTION_FONT_FIXED_WIDTH) != 0) { + labelStyle = Typeface.MONOSPACE; + } else { + labelStyle = mKeyTextStyle; + } + if (label.length() > 1) { + labelSize = (keyLabelOption & Key.LABEL_OPTION_FOLLOW_KEY_LETTER_RATIO) != 0 + ? mKeyLetterSize : mKeyLabelSize; + } else { + labelSize = mKeyLetterSize; + } + 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 { + paint.getTextBounds(KEY_LABEL_REFERENCE_CHAR, 0, 1, mTextBounds); + labelCharHeight = mTextBounds.height(); + mTextHeightCache.put(labelSize, labelCharHeight); + } + return labelCharHeight; + } + + private int getLabelCharWidth(int labelSize, Paint paint) { + Integer labelWidthValue = mTextWidthCache.get(labelSize); + final int labelCharWidth; + if (labelWidthValue != null) { + labelCharWidth = labelWidthValue; + } else { + paint.getTextBounds(KEY_LABEL_REFERENCE_CHAR, 0, 1, mTextBounds); + labelCharWidth = mTextBounds.width(); + mTextWidthCache.put(labelSize, labelCharWidth); + } + return labelCharWidth; + } + + 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 dismissAllKeyPreviews() { + for (PointerTracker tracker : mPointerTrackers) { + tracker.setReleasedKeyGraphics(); + dismissKeyPreview(tracker); + } + } + + @Override + public void showKeyPreview(int keyIndex, PointerTracker tracker) { + if (mShowKeyPreviewPopup) { + mHandler.showKeyPreview(mDelayBeforePreview, keyIndex, tracker); + } else if (mKeyboard.needSpacebarPreview(keyIndex)) { + // Show key preview (in this case, slide language switcher) without any delay. + showKey(keyIndex, tracker); + } + } + + @Override + public void dismissKeyPreview(PointerTracker tracker) { + if (mShowKeyPreviewPopup) { + mHandler.cancelShowKeyPreview(tracker); + mHandler.dismissKeyPreview(mDelayAfterPreview, tracker); + } else if (mKeyboard.needSpacebarPreview(KeyDetector.NOT_A_KEY)) { + // Dismiss key preview (in this case, slide language switcher) without any delay. + mPreviewText.setVisibility(View.INVISIBLE); + } + } + + private void addKeyPreview(TextView keyPreview) { + if (mPreviewPlacer == null) { + mPreviewPlacer = FrameLayoutCompatUtils.getPlacer( + (ViewGroup)getRootView().findViewById(android.R.id.content)); + } + final ViewGroup placer = mPreviewPlacer; + placer.addView(keyPreview, FrameLayoutCompatUtils.newLayoutParam(placer, 0, 0)); + } + + // TODO: Introduce minimum duration for displaying key previews + // TODO: Display up to two key previews when the user presses two keys at the same time + private void showKey(final int keyIndex, PointerTracker tracker) { + final TextView previewText = mPreviewText; + // If the key preview has no parent view yet, add it to the ViewGroup which can place + // key preview absolutely in SoftInputWindow. + if (previewText.getParent() == null) { + addKeyPreview(previewText); + } + + final Key key = tracker.getKey(keyIndex); + // If keyIndex is invalid or IME is already closed, we must not show key preview. + // Trying to show key preview while root window is closed causes + // WindowManager.BadTokenException. + if (key == null || !mInForeground) + return; + + mHandler.cancelAllDismissKeyPreviews(); + + final int keyDrawX = key.mX + key.mVisualInsetsLeft; + final int keyDrawWidth = key.mWidth - key.mVisualInsetsLeft - key.mVisualInsetsRight; + // 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. + previewText.setCompoundDrawables(null, null, null, null); + if (key.mLabel.length() > 1) { + previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyLetterSize); + previewText.setTypeface(Typeface.DEFAULT_BOLD); + } else { + previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSize); + previewText.setTypeface(mKeyTextStyle); + } + previewText.setText(adjustCase(tracker.getPreviewText(key))); + } else { + final Drawable previewIcon = key.getPreviewIcon(); + previewText.setCompoundDrawables(null, null, null, + previewIcon != null ? previewIcon : key.getIcon()); + previewText.setText(null); + } + if (key.mCode == Keyboard.CODE_SPACE) { + previewText.setBackgroundColor(Color.TRANSPARENT); + } else { + previewText.setBackgroundDrawable(mPreviewBackground); + } + // Set the preview background state + previewText.getBackground().setState( + key.mPopupCharacters != null ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET); + + previewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + final int previewWidth = Math.max(previewText.getMeasuredWidth(), keyDrawWidth + + previewText.getPaddingLeft() + previewText.getPaddingRight()); + final int previewHeight = mPreviewHeight; + getLocationInWindow(mCoordinates); + final int previewX = keyDrawX - (previewWidth - keyDrawWidth) / 2 + mCoordinates[0]; + final int previewY = key.mY - previewHeight + mCoordinates[1] + mPreviewOffset; + + // Place the key preview. + // TODO: Adjust position of key previews which touch screen edges + FrameLayoutCompatUtils.placeViewAt( + previewText, previewX, previewY, previewWidth, previewHeight); + previewText.setVisibility(VISIBLE); + } + + /** + * Requests a redraw of the entire keyboard. Calling {@link #invalidate} is not sufficient + * because the keyboard renders the keys to an off-screen buffer and an invalidate() only + * draws the cached buffer. + * @see #invalidateKey(Key) + */ + public void invalidateAllKeys() { + mDirtyRect.union(0, 0, getWidth(), getHeight()); + mDrawPending = true; + invalidate(); + } + + /** + * Invalidates a key so that it will be redrawn on the next repaint. Use this method if only + * one key is changing it's content. Any changes that affect the position or size of the key + * may not be honored. + * @param key key in the attached {@link Keyboard}. + * @see #invalidateAllKeys + */ + @Override + public void invalidateKey(Key key) { + if (key == null) + return; + mInvalidatedKey = key; + final int x = key.mX + getPaddingLeft(); + final int y = key.mY + getPaddingTop(); + mInvalidatedKeyRect.set(x, y, x + key.mWidth, y + key.mHeight); + mDirtyRect.union(mInvalidatedKeyRect); + onBufferDraw(); + invalidate(mInvalidatedKeyRect); + } + + private boolean openMiniKeyboardIfRequired(int keyIndex, PointerTracker tracker) { + // Check if we have a popup layout specified first. + if (mPopupLayout == 0) { + return false; + } + + final Key parentKey = tracker.getKey(keyIndex); + if (parentKey == null) + return false; + boolean result = onLongPress(parentKey, tracker); + if (result) { + dismissAllKeyPreviews(); + tracker.onLongPressed(mPointerQueue); + } + return result; + } + + private void onLongPressShiftKey(PointerTracker tracker) { + tracker.onLongPressed(mPointerQueue); + 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); + } + + // This default implementation returns a popup mini keyboard panel. + // A derived class may return a language switcher popup panel, for instance. + protected PopupPanel onCreatePopupPanel(Key parentKey) { + if (parentKey.mPopupCharacters == null) + return null; + + final View container = LayoutInflater.from(getContext()).inflate(mPopupLayout, null); + if (container == null) + throw new NullPointerException(); + + final PopupMiniKeyboardView miniKeyboardView = + (PopupMiniKeyboardView)container.findViewById(R.id.mini_keyboard_view); + miniKeyboardView.setOnKeyboardActionListener(new KeyboardActionListener() { + @Override + public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) { + mKeyboardActionListener.onCodeInput(primaryCode, keyCodes, x, y); + dismissMiniKeyboard(); + } + + @Override + public void onTextInput(CharSequence text) { + mKeyboardActionListener.onTextInput(text); + dismissMiniKeyboard(); + } + + @Override + public void onCancelInput() { + mKeyboardActionListener.onCancelInput(); + dismissMiniKeyboard(); + } + + @Override + public void onSwipeDown() { + // Nothing to do. + } + @Override + public void onPress(int primaryCode, boolean withSliding) { + mKeyboardActionListener.onPress(primaryCode, withSliding); + } + @Override + public void onRelease(int primaryCode, boolean withSliding) { + mKeyboardActionListener.onRelease(primaryCode, withSliding); + } + }); + + final Keyboard keyboard = new MiniKeyboardBuilder(this, mKeyboard.getPopupKeyboardResId(), + parentKey, mKeyboard).build(); + miniKeyboardView.setKeyboard(keyboard); + + container.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + + return miniKeyboardView; + } + + /** + * Called when a key is long pressed. By default this will open mini keyboard associated + * with this key. + * @param parentKey the key that was long pressed + * @param tracker the pointer tracker which pressed the parent key + * @return true if the long press is handled, false otherwise. Subclasses should call the + * method on the base class if the subclass doesn't wish to handle the call. + */ + protected boolean onLongPress(Key parentKey, PointerTracker tracker) { + PopupPanel popupPanel = mPopupPanelCache.get(parentKey); + if (popupPanel == null) { + popupPanel = onCreatePopupPanel(parentKey); + if (popupPanel == null) + return false; + mPopupPanelCache.put(parentKey, popupPanel); + } + if (mPopupWindow == null) { + mPopupWindow = new PopupWindow(getContext()); + mPopupWindow.setBackgroundDrawable(null); + mPopupWindow.setAnimationStyle(R.style.PopupMiniKeyboardAnimation); + // Allow popup window to be drawn off the screen. + mPopupWindow.setClippingEnabled(false); + } + mPopupMiniKeyboardPanel = popupPanel; + popupPanel.showPanel(this, parentKey, tracker, mPopupWindow); + + invalidateAllKeys(); + return true; + } + + private PointerTracker getPointerTracker(final int id) { + final ArrayList<PointerTracker> pointers = mPointerTrackers; + 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, this, mHandler, mKeyDetector, this); + if (mKeyboard != null) + tracker.setKeyboard(mKeyboard, mKeyHysteresisDistance); + if (listener != null) + tracker.setOnKeyboardActionListener(listener); + pointers.add(tracker); + } + + return pointers.get(id); + } + + public boolean isInSlidingKeyInput() { + if (mPopupMiniKeyboardPanel != null) { + return mPopupMiniKeyboardPanel.isInSlidingKeyInput(); + } else { + return mPointerQueue.isInSlidingKeyInput(); + } + } + + public int getPointerCount() { + return mOldPointerCount; + } + + @Override + public boolean onTouchEvent(MotionEvent me) { + 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 && oldPointerCount > 1) { + return true; + } + + // Track the last few movements to look for spurious swipes. + mSwipeTracker.addMovement(me); + + // Gesture detector must be enabled only when mini-keyboard is not on the screen. + if (mPopupMiniKeyboardPanel == null && mGestureDetector != null + && mGestureDetector.onTouchEvent(me)) { + dismissAllKeyPreviews(); + mHandler.cancelKeyTimers(); + return true; + } + + final long eventTime = me.getEventTime(); + final int index = me.getActionIndex(); + final int id = me.getPointerId(index); + final int x = (int)me.getX(index); + final int y = (int)me.getY(index); + + // Needs to be called after the gesture detector gets a turn, as it may have displayed the + // mini keyboard + if (mPopupMiniKeyboardPanel != null) { + return mPopupMiniKeyboardPanel.onTouchEvent(me); + } + + if (mHandler.isInKeyRepeat()) { + final PointerTracker tracker = getPointerTracker(id); + // Key repeating timer will be canceled if 2 or more keys are in action, and current + // event (UP or DOWN) is non-modifier key. + if (pointerCount > 1 && !tracker.isModifier()) { + mHandler.cancelKeyRepeatTimer(); + } + // Up event will pass through. + } + + // TODO: cleanup this code into a multi-touch to single-touch event converter class? + // Translate mutli-touch event to single-touch events on the device that has no distinct + // multi-touch panel. + if (!mHasDistinctMultitouch) { + // Use only main (id=0) pointer tracker. + PointerTracker tracker = getPointerTracker(0); + if (pointerCount == 1 && oldPointerCount == 2) { + // Multi-touch to single touch transition. + // Send a down event for the latest pointer if the key is different from the + // previous key. + final int newKeyIndex = tracker.getKeyIndexOn(x, y); + if (mOldKeyIndex != newKeyIndex) { + tracker.onDownEvent(x, y, eventTime, null); + if (action == MotionEvent.ACTION_UP) + tracker.onUpEvent(x, y, eventTime, null); + } + } else if (pointerCount == 2 && oldPointerCount == 1) { + // Single-touch to multi-touch transition. + // Send an up event for the last pointer. + final int lastX = tracker.getLastX(); + final int lastY = tracker.getLastY(); + mOldKeyIndex = tracker.getKeyIndexOn(lastX, lastY); + tracker.onUpEvent(lastX, lastY, eventTime, null); + } else if (pointerCount == 1 && oldPointerCount == 1) { + tracker.onTouchEvent(action, x, y, eventTime, null); + } else { + Log.w(TAG, "Unknown touch panel behavior: pointer count is " + pointerCount + + " (old " + oldPointerCount + ")"); + } + return true; + } + + final PointerTrackerQueue queue = mPointerQueue; + if (action == MotionEvent.ACTION_MOVE) { + for (int i = 0; i < pointerCount; i++) { + final PointerTracker tracker = getPointerTracker(me.getPointerId(i)); + tracker.onMoveEvent((int)me.getX(i), (int)me.getY(i), eventTime, queue); + } + } else { + final PointerTracker tracker = getPointerTracker(id); + switch (action) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + tracker.onDownEvent(x, y, eventTime, queue); + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + tracker.onUpEvent(x, y, eventTime, queue); + break; + case MotionEvent.ACTION_CANCEL: + tracker.onCancelEvent(x, y, eventTime, queue); + break; + } + } + + return true; + } + + protected void onSwipeDown() { + mKeyboardActionListener.onSwipeDown(); + } + + public void closing() { + mPreviewText.setVisibility(View.GONE); + mHandler.cancelAllMessages(); + + dismissMiniKeyboard(); + mDirtyRect.union(0, 0, getWidth(), getHeight()); + mPopupPanelCache.clear(); + requestLayout(); + } + + public void purgeKeyboardAndClosing() { + mKeyboard = null; + closing(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + closing(); + } + + private boolean dismissMiniKeyboard() { + if (mPopupWindow != null && mPopupWindow.isShowing()) { + mPopupWindow.dismiss(); + mPopupMiniKeyboardPanel = null; + invalidateAllKeys(); + return true; + } + return false; + } + + public boolean handleBack() { + return dismissMiniKeyboard(); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { + return AccessibleKeyboardViewProxy.getInstance().dispatchTouchEvent(event) + || super.dispatchTouchEvent(event); + } + + return super.dispatchTouchEvent(event); + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { + final PointerTracker tracker = getPointerTracker(0); + return AccessibleKeyboardViewProxy.getInstance().dispatchPopulateAccessibilityEvent( + event, tracker) || super.dispatchPopulateAccessibilityEvent(event); + } + + return super.dispatchPopulateAccessibilityEvent(event); + } + + public boolean onHoverEvent(MotionEvent event) { + // Since reflection doesn't support calling superclass methods, this + // method checks for the existence of onHoverEvent() in the View class + // before returning a value. + if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { + final PointerTracker tracker = getPointerTracker(0); + return AccessibleKeyboardViewProxy.getInstance().onHoverEvent(event, tracker); + } + + return false; + } +} 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..00bf348f2 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java @@ -0,0 +1,425 @@ +/* + * 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 android.content.Context; +import android.content.res.Resources; +import android.content.res.Resources.Theme; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.ColorMatrix; +import android.graphics.ColorMatrixColorFilter; +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 com.android.inputmethod.keyboard.internal.SlidingLocaleDrawable; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SubtypeSwitcher; + +import java.lang.ref.SoftReference; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; + +// TODO: We should remove this class +public class LatinKeyboard extends Keyboard { + private static final int SPACE_LED_LENGTH_PERCENT = 80; + + public static final int CODE_NEXT_LANGUAGE = -100; + public static final int CODE_PREV_LANGUAGE = -101; + + private final Resources mRes; + private final Theme mTheme; + private final SubtypeSwitcher mSubtypeSwitcher = SubtypeSwitcher.getInstance(); + + /* Space key and its icons, drawables and colors. */ + private final Key mSpaceKey; + private final Drawable mSpaceIcon; + private final Drawable mSpacePreviewIcon; + private final int mSpaceKeyIndex; + private final boolean mAutoCorrectionSpacebarLedEnabled; + private final Drawable mAutoCorrectionSpacebarLedIcon; + private final Drawable mSpacebarArrowLeftIcon; + private final Drawable mSpacebarArrowRightIcon; + private final int mSpacebarTextColor; + private final int mSpacebarTextShadowColor; + private float mSpacebarTextFadeFactor = 0.0f; + private final int mSpacebarLanguageSwitchThreshold; + private int mSpacebarSlidingLanguageSwitchDiff; + private final SlidingLocaleDrawable mSlidingLocaleIcon; + private final HashMap<Integer, SoftReference<BitmapDrawable>> mSpaceDrawableCache = + new HashMap<Integer, SoftReference<BitmapDrawable>>(); + + /* Shortcut key and its icons if available */ + private final Key mShortcutKey; + private final Drawable mEnabledShortcutIcon; + private final Drawable mDisabledShortcutIcon; + + // Minimum width of spacebar dragging to trigger the language switch (represented by the number + // of the most common key width of this keyboard). + private static final int SPACEBAR_DRAG_WIDTH = 3; + // Minimum width of space key preview (proportional to keyboard width). + private static final float SPACEBAR_POPUP_MIN_RATIO = 0.5f; + // Height in space key the language name will be drawn. (proportional to space key height) + public static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f; + // If the full language name needs to be smaller than this value to be drawn on space key, + // its short language name will be used instead. + private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f; + + private static final String SMALL_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR = "small"; + private static final String MEDIUM_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR = "medium"; + + public LatinKeyboard(Context context, KeyboardId id, int width) { + super(context, id.getXmlId(), id, width); + mRes = context.getResources(); + mTheme = context.getTheme(); + + final List<Key> keys = getKeys(); + int spaceKeyIndex = -1; + int shortcutKeyIndex = -1; + final int keyCount = keys.size(); + for (int index = 0; index < keyCount; index++) { + // For now, assuming there are up to one space key and one shortcut key respectively. + switch (keys.get(index).mCode) { + case CODE_SPACE: + spaceKeyIndex = index; + break; + case CODE_SHORTCUT: + shortcutKeyIndex = index; + break; + } + } + + // The index of space key is available only after Keyboard constructor has finished. + mSpaceKey = (spaceKeyIndex >= 0) ? keys.get(spaceKeyIndex) : null; + mSpaceIcon = (mSpaceKey != null) ? mSpaceKey.getIcon() : null; + mSpacePreviewIcon = (mSpaceKey != null) ? mSpaceKey.getPreviewIcon() : null; + mSpaceKeyIndex = spaceKeyIndex; + + mShortcutKey = (shortcutKeyIndex >= 0) ? keys.get(shortcutKeyIndex) : null; + mEnabledShortcutIcon = (mShortcutKey != null) ? mShortcutKey.getIcon() : null; + + final TypedArray a = context.obtainStyledAttributes( + null, R.styleable.LatinKeyboard, R.attr.latinKeyboardStyle, R.style.LatinKeyboard); + mAutoCorrectionSpacebarLedEnabled = a.getBoolean( + R.styleable.LatinKeyboard_autoCorrectionSpacebarLedEnabled, false); + mAutoCorrectionSpacebarLedIcon = a.getDrawable( + R.styleable.LatinKeyboard_autoCorrectionSpacebarLedIcon); + mDisabledShortcutIcon = a.getDrawable(R.styleable.LatinKeyboard_disabledShortcutIcon); + mSpacebarTextColor = a.getColor(R.styleable.LatinKeyboard_spacebarTextColor, 0); + mSpacebarTextShadowColor = a.getColor( + R.styleable.LatinKeyboard_spacebarTextShadowColor, 0); + mSpacebarArrowLeftIcon = a.getDrawable( + R.styleable.LatinKeyboard_spacebarArrowLeftIcon); + mSpacebarArrowRightIcon = a.getDrawable( + R.styleable.LatinKeyboard_spacebarArrowRightIcon); + a.recycle(); + + // The threshold is "key width" x 1.25 + mSpacebarLanguageSwitchThreshold = (getMostCommonKeyWidth() * 5) / 4; + + if (mSpaceKey != null && mSpacePreviewIcon != null) { + final int slidingIconWidth = Math.max(mSpaceKey.mWidth, + (int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO)); + final int spaceKeyheight = mSpacePreviewIcon.getIntrinsicHeight(); + mSlidingLocaleIcon = new SlidingLocaleDrawable( + context, mSpacePreviewIcon, slidingIconWidth, spaceKeyheight); + mSlidingLocaleIcon.setBounds(0, 0, slidingIconWidth, spaceKeyheight); + } else { + mSlidingLocaleIcon = null; + } + } + + public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboardView view) { + mSpacebarTextFadeFactor = fadeFactor; + updateSpacebarForLocale(false); + if (view != null) + view.invalidateKey(mSpaceKey); + } + + private static int getSpacebarTextColor(int color, float fadeFactor) { + final int newColor = Color.argb((int)(Color.alpha(color) * fadeFactor), + Color.red(color), Color.green(color), Color.blue(color)); + return newColor; + } + + private static ColorFilter getSpacebarDrawableFilter(float fadeFactor) { + final ColorMatrix colorMatrix = new ColorMatrix(); + colorMatrix.setScale(1, 1, 1, fadeFactor); + return new ColorMatrixColorFilter(colorMatrix); + } + + public void updateShortcutKey(boolean available, LatinKeyboardView view) { + if (mShortcutKey == null) + return; + mShortcutKey.setEnabled(available); + mShortcutKey.setIcon(available ? mEnabledShortcutIcon : mDisabledShortcutIcon); + if (view != null) + view.invalidateKey(mShortcutKey); + } + + public boolean needsAutoCorrectionSpacebarLed() { + return mAutoCorrectionSpacebarLedEnabled; + } + + /** + * @return a key which should be invalidated. + */ + public Key onAutoCorrectionStateChanged(boolean isAutoCorrection) { + updateSpacebarForLocale(isAutoCorrection); + return mSpaceKey; + } + + private void updateSpacebarForLocale(boolean isAutoCorrection) { + if (mSpaceKey == null) + return; + // If application locales are explicitly selected. + if (mSubtypeSwitcher.needsToDisplayLanguage()) { + mSpaceKey.setIcon(getSpaceDrawable( + mSubtypeSwitcher.getInputLocale(), isAutoCorrection)); + } else if (isAutoCorrection) { + mSpaceKey.setIcon(getSpaceDrawable(null, true)); + } else { + mSpaceKey.setIcon(mSpaceIcon); + } + } + + // Compute width of text with specified text size using paint. + private static int getTextWidth(Paint paint, String text, float textSize, Rect bounds) { + paint.setTextSize(textSize); + paint.getTextBounds(text, 0, text.length(), bounds); + return bounds.width(); + } + + // Layout local language name and left and right arrow on spacebar. + private static String layoutSpacebar(Paint paint, Locale locale, Drawable icon, Drawable lArrow, + Drawable rArrow, int width, int height, float origTextSize) { + final float arrowWidth = lArrow.getIntrinsicWidth(); + final float arrowHeight = lArrow.getIntrinsicHeight(); + final float maxTextWidth = width - (arrowWidth + arrowWidth); + final Rect bounds = new Rect(); + + // Estimate appropriate language name text size to fit in maxTextWidth. + String language = SubtypeSwitcher.getFullDisplayName(locale, true); + int textWidth = getTextWidth(paint, language, origTextSize, bounds); + // Assuming text width and text size are proportional to each other. + float textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f); + // allow variable text size + textWidth = getTextWidth(paint, language, textSize, bounds); + // If text size goes too small or text does not fit, use middle or short name + final boolean useMiddleName = (textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME) + || (textWidth > maxTextWidth); + + final boolean useShortName; + if (useMiddleName) { + language = SubtypeSwitcher.getMiddleDisplayLanguage(locale); + textWidth = getTextWidth(paint, language, origTextSize, bounds); + textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f); + useShortName = (textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME) + || (textWidth > maxTextWidth); + } else { + useShortName = false; + } + + 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 textHeight = -paint.ascent() + paint.descent(); + final float baseline = (icon != null) ? height * SPACEBAR_LANGUAGE_BASELINE + : height / 2 + textHeight / 2; + 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 BitmapDrawable getSpaceDrawable(Locale locale, boolean isAutoCorrection) { + final Integer hashCode = Arrays.hashCode( + new Object[] { locale, isAutoCorrection, mSpacebarTextFadeFactor }); + final SoftReference<BitmapDrawable> ref = mSpaceDrawableCache.get(hashCode); + BitmapDrawable drawable = (ref == null) ? null : ref.get(); + if (drawable == null) { + drawable = new BitmapDrawable(mRes, drawSpacebar( + locale, isAutoCorrection, mSpacebarTextFadeFactor)); + mSpaceDrawableCache.put(hashCode, new SoftReference<BitmapDrawable>(drawable)); + } + return drawable; + } + + private Bitmap drawSpacebar(Locale inputLocale, boolean isAutoCorrection, + float textFadeFactor) { + final int width = mSpaceKey.mWidth; + final int height = mSpaceIcon != null ? mSpaceIcon.getIntrinsicHeight() : mSpaceKey.mHeight; + final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(buffer); + final Resources res = mRes; + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + + // If application locales are explicitly selected. + if (inputLocale != null) { + final Paint paint = new Paint(); + 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 String language = layoutSpacebar(paint, inputLocale, mSpaceIcon, + mSpacebarArrowLeftIcon, mSpacebarArrowRightIcon, width, height, + getTextSizeFromTheme(mTheme, textStyle, defaultTextSize)); + + // Draw language text with shadow + // In case there is no space icon, we will place the language text at the center of + // spacebar. + final float descent = paint.descent(); + final float textHeight = -paint.ascent() + descent; + final float baseline = (mSpaceIcon != null) ? height * SPACEBAR_LANGUAGE_BASELINE + : height / 2 + textHeight / 2; + paint.setColor(getSpacebarTextColor(mSpacebarTextShadowColor, textFadeFactor)); + canvas.drawText(language, width / 2, baseline - descent - 1, paint); + paint.setColor(getSpacebarTextColor(mSpacebarTextColor, textFadeFactor)); + canvas.drawText(language, width / 2, baseline - descent, paint); + + // Put arrows that are already laid out on either side of the text + // Because language switch is disabled on phone and number layouts, hide arrows. + // TODO: Sort out how to enable language switch on these layouts. + if (mSubtypeSwitcher.useSpacebarLanguageSwitcher() + && mSubtypeSwitcher.getEnabledKeyboardLocaleCount() > 1 + && !(isPhoneKeyboard() || isNumberKeyboard())) { + mSpacebarArrowLeftIcon.setColorFilter(getSpacebarDrawableFilter(textFadeFactor)); + mSpacebarArrowRightIcon.setColorFilter(getSpacebarDrawableFilter(textFadeFactor)); + mSpacebarArrowLeftIcon.draw(canvas); + mSpacebarArrowRightIcon.draw(canvas); + } + } + + // Draw the spacebar icon at the bottom + if (isAutoCorrection) { + final int iconWidth = width * SPACE_LED_LENGTH_PERCENT / 100; + final int iconHeight = mAutoCorrectionSpacebarLedIcon.getIntrinsicHeight(); + int x = (width - iconWidth) / 2; + int y = height - iconHeight; + mAutoCorrectionSpacebarLedIcon.setBounds(x, y, x + iconWidth, y + iconHeight); + mAutoCorrectionSpacebarLedIcon.draw(canvas); + } else if (mSpaceIcon != null) { + final int iconWidth = mSpaceIcon.getIntrinsicWidth(); + final int iconHeight = mSpaceIcon.getIntrinsicHeight(); + int x = (width - iconWidth) / 2; + int y = height - iconHeight; + mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight); + mSpaceIcon.draw(canvas); + } + return buffer; + } + + public void setSpacebarSlidingLanguageSwitchDiff(int diff) { + mSpacebarSlidingLanguageSwitchDiff = diff; + } + + public void updateSpacebarPreviewIcon(int diff) { + if (mSpacebarSlidingLanguageSwitchDiff == diff) + return; + mSpacebarSlidingLanguageSwitchDiff = diff; + if (mSlidingLocaleIcon == null) + return; + mSlidingLocaleIcon.setDiff(diff); + if (Math.abs(diff) == Integer.MAX_VALUE) { + mSpaceKey.setPreviewIcon(mSpacePreviewIcon); + } else { + mSpaceKey.setPreviewIcon(mSlidingLocaleIcon); + } + mSpaceKey.getPreviewIcon().invalidateSelf(); + } + + public boolean shouldTriggerSpacebarSlidingLanguageSwitch(int diff) { + // On phone and number layouts, sliding language switch is disabled. + // TODO: Sort out how to enable language switch on these layouts. + if (isPhoneKeyboard() || isNumberKeyboard()) + return false; + return Math.abs(diff) > mSpacebarLanguageSwitchThreshold; + } + + /** + * Return true if spacebar needs showing preview even when "popup on keypress" is off. + * @param keyIndex index of the pressing key + * @return true if spacebar needs showing preview + */ + @Override + public boolean needSpacebarPreview(int keyIndex) { + // This method is called when "popup on keypress" is off. + if (!mSubtypeSwitcher.useSpacebarLanguageSwitcher()) + return false; + // Dismiss key preview. + if (keyIndex == KeyDetector.NOT_A_KEY) + return true; + // Key is not a spacebar. + if (keyIndex != mSpaceKeyIndex) + return false; + // The language switcher will be displayed only when the dragging distance is greater + // than the threshold. + return shouldTriggerSpacebarSlidingLanguageSwitch(mSpacebarSlidingLanguageSwitchDiff); + } + + public int getLanguageChangeDirection() { + if (mSpaceKey == null || mSubtypeSwitcher.getEnabledKeyboardLocaleCount() <= 1 + || Math.abs(mSpacebarSlidingLanguageSwitchDiff) + < getMostCommonKeyWidth() * SPACEBAR_DRAG_WIDTH) { + return 0; // No change + } + return mSpacebarSlidingLanguageSwitchDiff > 0 ? 1 : -1; + } + + @Override + public int[] getNearestKeys(int x, int y) { + // 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))); + } + + public static int getTextSizeFromTheme(Theme theme, int style, int defValue) { + TypedArray array = theme.obtainStyledAttributes( + style, new int[] { android.R.attr.textSize }); + int textSize = array.getDimensionPixelSize(array.getResourceId(0, 0), defValue); + return textSize; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java new file mode 100644 index 000000000..901df6ab7 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java @@ -0,0 +1,242 @@ +/* + * 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 android.content.Context; +import android.graphics.Canvas; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; + +import com.android.inputmethod.deprecated.VoiceProxy; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.Utils; + +// TODO: We should remove this class +public class LatinKeyboardView extends KeyboardView { + private static final String TAG = LatinKeyboardView.class.getSimpleName(); + private static boolean DEBUG_MODE = LatinImeLogger.sDBG; + + /** Whether we've started dropping move events because we found a big jump */ + private boolean mDroppingEvents; + /** + * Whether multi-touch disambiguation needs to be disabled if a real multi-touch event has + * occured + */ + private boolean mDisableDisambiguation; + /** The distance threshold at which we start treating the touch session as a multi-touch */ + private int mJumpThresholdSquare = Integer.MAX_VALUE; + /** The y coordinate of the last row */ + private int mLastRowY; + private int mLastX; + private int mLastY; + + public LatinKeyboardView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) { + LatinKeyboard latinKeyboard = getLatinKeyboard(); + if (latinKeyboard != null + && (latinKeyboard.isPhoneKeyboard() || latinKeyboard.isNumberKeyboard())) { + // Phone and number keyboard never shows popup preview (except language switch). + super.setKeyPreviewPopupEnabled(false, delay); + } else { + super.setKeyPreviewPopupEnabled(previewEnabled, delay); + } + } + + @Override + public void setKeyboard(Keyboard newKeyboard) { + super.setKeyboard(newKeyboard); + // One-seventh of the keyboard width seems like a reasonable threshold + mJumpThresholdSquare = newKeyboard.getMinWidth() / 7; + mJumpThresholdSquare *= mJumpThresholdSquare; + // Assuming there are 4 rows, this is the coordinate of the last row + mLastRowY = (newKeyboard.getHeight() * 3) / 4; + } + + private LatinKeyboard getLatinKeyboard() { + Keyboard keyboard = getKeyboard(); + if (keyboard instanceof LatinKeyboard) { + return (LatinKeyboard)keyboard; + } else { + return null; + } + } + + public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboard oldKeyboard) { + final LatinKeyboard currentKeyboard = getLatinKeyboard(); + // We should not set text fade factor to the keyboard which does not display the language on + // its spacebar. + if (currentKeyboard != null && currentKeyboard == oldKeyboard) + currentKeyboard.setSpacebarTextFadeFactor(fadeFactor, this); + } + + @Override + protected boolean onLongPress(Key key, PointerTracker tracker) { + int primaryCode = key.mCode; + if (primaryCode == Keyboard.CODE_SETTINGS) { + return invokeOnKey(Keyboard.CODE_SETTINGS_LONGPRESS); + } else if (primaryCode == '0' && getLatinKeyboard().isPhoneKeyboard()) { + // Long pressing on 0 in phone number keypad gives you a '+'. + return invokeOnKey('+'); + } else { + return super.onLongPress(key, tracker); + } + } + + private boolean invokeOnKey(int primaryCode) { + getOnKeyboardActionListener().onCodeInput(primaryCode, null, + KeyboardActionListener.NOT_A_TOUCH_COORDINATE, + KeyboardActionListener.NOT_A_TOUCH_COORDINATE); + return true; + } + + @Override + protected CharSequence adjustCase(CharSequence label) { + LatinKeyboard keyboard = getLatinKeyboard(); + if (keyboard.isAlphaKeyboard() + && keyboard.isShiftedOrShiftLocked() + && !TextUtils.isEmpty(label) && label.length() < 3 + && Character.isLowerCase(label.charAt(0))) { + return label.toString().toUpperCase(keyboard.mId.mLocale); + } + return label; + } + + /** + * This function checks to see if we need to handle any sudden jumps in the pointer location + * that could be due to a multi-touch being treated as a move by the firmware or hardware. + * Once a sudden jump is detected, all subsequent move events are discarded + * until an UP is received.<P> + * When a sudden jump is detected, an UP event is simulated at the last position and when + * the sudden moves subside, a DOWN event is simulated for the second key. + * @param me the motion event + * @return true if the event was consumed, so that it doesn't continue to be handled by + * KeyboardView. + */ + private boolean handleSuddenJump(MotionEvent me) { + // If device has distinct multi touch panel, there is no need to check sudden jump. + if (hasDistinctMultitouch()) + return false; + 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) { + if (getLatinKeyboard() == null) return true; + + // If there was a sudden jump, return without processing the actual motion event. + if (handleSuddenJump(me)) { + if (DEBUG_MODE) + Log.w(TAG, "onTouchEvent: ignore sudden jump " + me); + return true; + } + + 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. + VoiceProxy.getInstance().onAttachedToWindow(); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java new file mode 100644 index 000000000..2d6766f2d --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +import android.content.Context; + +import java.util.List; + +public class MiniKeyboard extends Keyboard { + private int mDefaultKeyCoordX; + + public MiniKeyboard(Context context, int xmlLayoutResId, Keyboard parentKeyboard) { + super(context, xmlLayoutResId, null, parentKeyboard.getMinWidth()); + } + + public void setDefaultCoordX(int pos) { + mDefaultKeyCoordX = pos; + } + + public int getDefaultCoordX() { + return mDefaultKeyCoordX; + } + + public boolean isOneRowKeyboard() { + final List<Key> keys = getKeys(); + if (keys.size() == 0) return false; + final int edgeFlags = keys.get(0).mEdgeFlags; + // HACK: The first key of mini keyboard which was inflated from xml and has multiple rows, + // does not have both top and bottom edge flags on at the same time. On the other hand, + // the first key of mini keyboard that was created with popupCharacters must have both top + // and bottom edge flags on. + // When you want to use one row mini-keyboard from xml file, make sure that the row has + // both top and bottom edge flags set. + return (edgeFlags & Keyboard.EDGE_TOP) != 0 + && (edgeFlags & Keyboard.EDGE_BOTTOM) != 0; + + } +} diff --git a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java index 356e62d48..cc5c3bbfe 100644 --- a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java +++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Google Inc. + * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,13 +14,11 @@ * the License. */ -package com.android.inputmethod.latin; +package com.android.inputmethod.keyboard; -import android.inputmethodservice.Keyboard.Key; - -class MiniKeyboardKeyDetector extends KeyDetector { - private static final int MAX_NEARBY_KEYS = 1; +import java.util.List; +public class MiniKeyboardKeyDetector extends KeyDetector { private final int mSlideAllowanceSquare; private final int mSlideAllowanceSquareTop; @@ -33,27 +31,29 @@ class MiniKeyboardKeyDetector extends KeyDetector { @Override protected int getMaxNearbyKeys() { - return MAX_NEARBY_KEYS; + // No nearby key will be returned. + return 1; } @Override - public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) { - final Key[] keys = getKeys(); + public int getKeyIndexAndNearbyCodes(int x, int y, final int[] allCodes) { + final List<Key> keys = getKeys(); final int touchX = getTouchX(x); final int touchY = getTouchY(y); - int closestKeyIndex = LatinKeyboardBaseView.NOT_A_KEY; - int closestKeyDist = (y < 0) ? mSlideAllowanceSquareTop : mSlideAllowanceSquare; - final int keyCount = keys.length; - for (int i = 0; i < keyCount; i++) { - final Key key = keys[i]; - int dist = key.squaredDistanceFrom(touchX, touchY); - if (dist < closestKeyDist) { - closestKeyIndex = i; - closestKeyDist = dist; + + int nearestIndex = NOT_A_KEY; + int nearestDist = (y < 0) ? mSlideAllowanceSquareTop : mSlideAllowanceSquare; + final int keyCount = keys.size(); + for (int index = 0; index < keyCount; index++) { + final int dist = keys.get(index).squaredDistanceToEdge(touchX, touchY); + if (dist < nearestDist) { + nearestIndex = index; + nearestDist = dist; } } - if (allKeys != null && closestKeyIndex != LatinKeyboardBaseView.NOT_A_KEY) - allKeys[0] = keys[closestKeyIndex].codes[0]; - return closestKeyIndex; + + if (allCodes != null && nearestIndex != NOT_A_KEY) + allCodes[0] = keys.get(nearestIndex).mCode; + return nearestIndex; } } 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..c7620f946 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -0,0 +1,709 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +import android.content.res.Resources; +import android.os.SystemClock; +import android.util.Log; +import android.view.MotionEvent; + +import com.android.inputmethod.keyboard.KeyboardView.UIHandler; +import com.android.inputmethod.keyboard.internal.PointerTrackerKeyState; +import com.android.inputmethod.keyboard.internal.PointerTrackerQueue; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SubtypeSwitcher; + +import java.util.Arrays; +import java.util.List; + +public class PointerTracker { + private static final String TAG = PointerTracker.class.getSimpleName(); + private static final boolean ENABLE_ASSERTION = false; + private static final boolean DEBUG_EVENT = false; + private static final boolean DEBUG_MOVE_EVENT = false; + private static final boolean DEBUG_LISTENER = false; + private static boolean DEBUG_MODE = LatinImeLogger.sDBG; + + public interface UIProxy { + public void invalidateKey(Key key); + public void showKeyPreview(int keyIndex, PointerTracker tracker); + public void dismissKeyPreview(PointerTracker tracker); + public boolean hasDistinctMultitouch(); + } + + public final int mPointerId; + + // Timing constants + private final int mDelayBeforeKeyRepeatStart; + private final int mLongPressKeyTimeout; + private final int mLongPressShiftKeyTimeout; + + private final KeyboardView mKeyboardView; + private final UIProxy mProxy; + private final UIHandler mHandler; + private final KeyDetector mKeyDetector; + private KeyboardActionListener mListener = EMPTY_LISTENER; + private final KeyboardSwitcher mKeyboardSwitcher; + private final boolean mHasDistinctMultitouch; + private final boolean mConfigSlidingKeyInputEnabled; + + private final int mTouchNoiseThresholdMillis; + private final int mTouchNoiseThresholdDistanceSquared; + + private Keyboard mKeyboard; + private List<Key> mKeys; + private int mKeyHysteresisDistanceSquared = -1; + private int mKeyQuarterWidthSquared; + + private final PointerTrackerKeyState mKeyState; + + // true if keyboard layout has been changed. + private boolean mKeyboardLayoutHasBeenChanged; + + // true if event is already translated to a key action (long press or mini-keyboard) + private boolean mKeyAlreadyProcessed; + + // true if this pointer is repeatable key + private boolean mIsRepeatableKey; + + // true if this pointer is in sliding key input + private boolean mIsInSlidingKeyInput; + + // true if sliding key is allowed. + private boolean mIsAllowedSlidingKeyInput; + + // ignore modifier key if true + private boolean mIgnoreModifierKey; + + // TODO: Remove these hacking variables + // true if this pointer is in sliding language switch + private boolean mIsInSlidingLanguageSwitch; + private int mSpaceKeyIndex; + private final SubtypeSwitcher mSubtypeSwitcher; + + // Empty {@link KeyboardActionListener} + private static final KeyboardActionListener EMPTY_LISTENER = new KeyboardActionListener() { + @Override + public void onPress(int primaryCode, boolean withSliding) {} + @Override + public void onRelease(int primaryCode, boolean withSliding) {} + @Override + public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) {} + @Override + public void onTextInput(CharSequence text) {} + @Override + public void onCancelInput() {} + @Override + public void onSwipeDown() {} + }; + + public PointerTracker(int id, KeyboardView keyboardView, UIHandler handler, + KeyDetector keyDetector, UIProxy proxy) { + if (proxy == null || handler == null || keyDetector == null) + throw new NullPointerException(); + mPointerId = id; + mKeyboardView = keyboardView; + mProxy = proxy; + mHandler = handler; + mKeyDetector = keyDetector; + mKeyboardSwitcher = KeyboardSwitcher.getInstance(); + mKeyState = new PointerTrackerKeyState(keyDetector); + mHasDistinctMultitouch = proxy.hasDistinctMultitouch(); + final Resources res = mKeyboardView.getResources(); + mConfigSlidingKeyInputEnabled = res.getBoolean(R.bool.config_sliding_key_input_enabled); + mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start); + mLongPressKeyTimeout = res.getInteger(R.integer.config_long_press_key_timeout); + mLongPressShiftKeyTimeout = res.getInteger(R.integer.config_long_press_shift_key_timeout); + mTouchNoiseThresholdMillis = res.getInteger(R.integer.config_touch_noise_threshold_millis); + final float touchNoiseThresholdDistance = res.getDimension( + R.dimen.config_touch_noise_threshold_distance); + mTouchNoiseThresholdDistanceSquared = (int)( + touchNoiseThresholdDistance * touchNoiseThresholdDistance); + mSubtypeSwitcher = SubtypeSwitcher.getInstance(); + } + + public void setOnKeyboardActionListener(KeyboardActionListener listener) { + mListener = listener; + } + + // Returns true if keyboard has been changed by this callback. + private boolean callListenerOnPressAndCheckKeyboardLayoutChange(Key key, boolean withSliding) { + final boolean ignoreModifierKey = mIgnoreModifierKey && isModifierCode(key.mCode); + if (DEBUG_LISTENER) + Log.d(TAG, "onPress : " + keyCodePrintable(key.mCode) + " sliding=" + withSliding + + " ignoreModifier=" + ignoreModifierKey); + if (ignoreModifierKey) + return false; + if (key.isEnabled()) { + mListener.onPress(key.mCode, withSliding); + final boolean keyboardLayoutHasBeenChanged = mKeyboardLayoutHasBeenChanged; + mKeyboardLayoutHasBeenChanged = false; + return keyboardLayoutHasBeenChanged; + } + return false; + } + + // Note that we need primaryCode argument because the keyboard may in shifted state and the + // primaryCode is different from {@link Key#mCode}. + private void callListenerOnCodeInput(Key key, int primaryCode, int[] keyCodes, int x, int y) { + final boolean ignoreModifierKey = mIgnoreModifierKey && isModifierCode(key.mCode); + if (DEBUG_LISTENER) + Log.d(TAG, "onCodeInput: " + keyCodePrintable(primaryCode) + + " codes="+ Arrays.toString(keyCodes) + " x=" + x + " y=" + y + + " ignoreModifier=" + ignoreModifierKey); + if (ignoreModifierKey) + return; + if (key.isEnabled()) + mListener.onCodeInput(primaryCode, keyCodes, x, y); + } + + private void callListenerOnTextInput(Key key) { + if (DEBUG_LISTENER) + Log.d(TAG, "onTextInput: text=" + key.mOutputText); + if (key.isEnabled()) + mListener.onTextInput(key.mOutputText); + } + + // Note that we need primaryCode argument because the keyboard may in shifted state and the + // primaryCode is different from {@link Key#mCode}. + private void callListenerOnRelease(Key key, int primaryCode, boolean withSliding) { + final boolean ignoreModifierKey = mIgnoreModifierKey && isModifierCode(key.mCode); + if (DEBUG_LISTENER) + Log.d(TAG, "onRelease : " + keyCodePrintable(primaryCode) + " sliding=" + + withSliding + " ignoreModifier=" + ignoreModifierKey); + if (ignoreModifierKey) + return; + if (key.isEnabled()) + mListener.onRelease(primaryCode, withSliding); + } + + private void callListenerOnCancelInput() { + if (DEBUG_LISTENER) + Log.d(TAG, "onCancelInput"); + mListener.onCancelInput(); + } + + public void setKeyboard(Keyboard keyboard, float keyHysteresisDistance) { + if (keyboard == null || keyHysteresisDistance < 0) + throw new IllegalArgumentException(); + mKeyboard = keyboard; + mKeys = keyboard.getKeys(); + mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance); + final int keyQuarterWidth = keyboard.getKeyWidth() / 4; + mKeyQuarterWidthSquared = keyQuarterWidth * keyQuarterWidth; + // Mark that keyboard layout has been changed. + mKeyboardLayoutHasBeenChanged = true; + } + + public boolean isInSlidingKeyInput() { + return mIsInSlidingKeyInput; + } + + private boolean isValidKeyIndex(int keyIndex) { + return keyIndex >= 0 && keyIndex < mKeys.size(); + } + + public Key getKey(int keyIndex) { + return isValidKeyIndex(keyIndex) ? mKeys.get(keyIndex) : null; + } + + private static boolean isModifierCode(int primaryCode) { + return primaryCode == Keyboard.CODE_SHIFT + || primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL; + } + + private boolean isModifierInternal(int keyIndex) { + final Key key = getKey(keyIndex); + return key == null ? false : isModifierCode(key.mCode); + } + + public boolean isModifier() { + return isModifierInternal(mKeyState.getKeyIndex()); + } + + private boolean isOnModifierKey(int x, int y) { + return isModifierInternal(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null)); + } + + public boolean isOnShiftKey(int x, int y) { + final Key key = getKey(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null)); + return key != null && key.mCode == Keyboard.CODE_SHIFT; + } + + public int getKeyIndexOn(int x, int y) { + return mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); + } + + public boolean isSpaceKey(int keyIndex) { + Key key = getKey(keyIndex); + return key != null && key.mCode == Keyboard.CODE_SPACE; + } + + public void setReleasedKeyGraphics() { + setReleasedKeyGraphics(mKeyState.getKeyIndex()); + } + + private void setReleasedKeyGraphics(int keyIndex) { + final Key key = getKey(keyIndex); + if (key != null) { + key.onReleased(); + mProxy.invalidateKey(key); + } + } + + private void setPressedKeyGraphics(int keyIndex) { + final Key key = getKey(keyIndex); + if (key != null && key.isEnabled()) { + key.onPressed(); + mProxy.invalidateKey(key); + } + } + + private void checkAssertion(PointerTrackerQueue queue) { + if (mHasDistinctMultitouch && queue == null) + throw new RuntimeException( + "PointerTrackerQueue must be passed on distinct multi touch device"); + if (!mHasDistinctMultitouch && queue != null) + throw new RuntimeException( + "PointerTrackerQueue must be null on non-distinct multi touch device"); + } + + public void onTouchEvent(int action, int x, int y, long eventTime, PointerTrackerQueue queue) { + switch (action) { + case MotionEvent.ACTION_MOVE: + onMoveEvent(x, y, eventTime, queue); + break; + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + onDownEvent(x, y, eventTime, queue); + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + onUpEvent(x, y, eventTime, queue); + break; + case MotionEvent.ACTION_CANCEL: + onCancelEvent(x, y, eventTime, queue); + break; + } + } + + public void onDownEvent(int x, int y, long eventTime, PointerTrackerQueue queue) { + if (ENABLE_ASSERTION) checkAssertion(queue); + if (DEBUG_EVENT) + printTouchEvent("onDownEvent:", x, y, eventTime); + + // Naive up-to-down noise filter. + final long deltaT = eventTime - mKeyState.getUpTime(); + if (deltaT < mTouchNoiseThresholdMillis) { + final int dx = x - mKeyState.getLastX(); + final int dy = y - mKeyState.getLastY(); + final int distanceSquared = (dx * dx + dy * dy); + if (distanceSquared < mTouchNoiseThresholdDistanceSquared) { + if (DEBUG_MODE) + Log.w(TAG, "onDownEvent: ignore potential noise: time=" + deltaT + + " distance=" + distanceSquared); + mKeyAlreadyProcessed = true; + return; + } + } + + if (queue != null) { + if (isOnModifierKey(x, y)) { + // Before processing a down event of modifier key, all pointers already being + // tracked should be released. + queue.releaseAllPointers(eventTime); + } + queue.add(this); + } + onDownEventInternal(x, y, eventTime); + } + + private void onDownEventInternal(int x, int y, long eventTime) { + int keyIndex = mKeyState.onDownKey(x, y, eventTime); + // Sliding key is allowed when 1) enabled by configuration, 2) this pointer starts sliding + // from modifier key, or 3) this pointer is on mini-keyboard. + mIsAllowedSlidingKeyInput = mConfigSlidingKeyInputEnabled || isModifierInternal(keyIndex) + || mKeyDetector instanceof MiniKeyboardKeyDetector; + mKeyboardLayoutHasBeenChanged = false; + mKeyAlreadyProcessed = false; + mIsRepeatableKey = false; + mIsInSlidingKeyInput = false; + mIsInSlidingLanguageSwitch = false; + mIgnoreModifierKey = false; + if (isValidKeyIndex(keyIndex)) { + // This onPress call may have changed keyboard layout. Those cases are detected at + // {@link #setKeyboard}. In those cases, we should update keyIndex according to the new + // keyboard layout. + if (callListenerOnPressAndCheckKeyboardLayoutChange(getKey(keyIndex), false)) + keyIndex = mKeyState.onDownKey(x, y, eventTime); + + startRepeatKey(keyIndex); + startLongPressTimer(keyIndex); + showKeyPreview(keyIndex); + setPressedKeyGraphics(keyIndex); + } + } + + private void startSlidingKeyInput(Key key) { + if (!mIsInSlidingKeyInput) + mIgnoreModifierKey = isModifierCode(key.mCode); + mIsInSlidingKeyInput = true; + } + + public void onMoveEvent(int x, int y, long eventTime, PointerTrackerQueue queue) { + if (ENABLE_ASSERTION) checkAssertion(queue); + if (DEBUG_MOVE_EVENT) + printTouchEvent("onMoveEvent:", x, y, eventTime); + if (mKeyAlreadyProcessed) + return; + final PointerTrackerKeyState keyState = mKeyState; + + // TODO: Remove this hacking code + if (mIsInSlidingLanguageSwitch) { + ((LatinKeyboard)mKeyboard).updateSpacebarPreviewIcon(x - keyState.getKeyX()); + showKeyPreview(mSpaceKeyIndex); + return; + } + final int lastX = keyState.getLastX(); + final int lastY = keyState.getLastY(); + final int oldKeyIndex = keyState.getKeyIndex(); + final Key oldKey = getKey(oldKeyIndex); + int keyIndex = keyState.onMoveKey(x, y); + if (isValidKeyIndex(keyIndex)) { + if (oldKey == null) { + // The pointer has been slid in to the new key, but the finger was not on any keys. + // In this case, we must call onPress() to notify that the new key is being pressed. + // This onPress call may have changed keyboard layout. Those cases are detected at + // {@link #setKeyboard}. In those cases, we should update keyIndex according to the + // new keyboard layout. + if (callListenerOnPressAndCheckKeyboardLayoutChange(getKey(keyIndex), true)) + keyIndex = keyState.onMoveKey(x, y); + keyState.onMoveToNewKey(keyIndex, x, y); + startLongPressTimer(keyIndex); + showKeyPreview(keyIndex); + setPressedKeyGraphics(keyIndex); + } else if (isMajorEnoughMoveToBeOnNewKey(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. + setReleasedKeyGraphics(oldKeyIndex); + callListenerOnRelease(oldKey, oldKey.mCode, true); + startSlidingKeyInput(oldKey); + mHandler.cancelKeyTimers(); + startRepeatKey(keyIndex); + if (mIsAllowedSlidingKeyInput) { + // This onPress call may have changed keyboard layout. Those cases are detected + // at {@link #setKeyboard}. In those cases, we should update keyIndex according + // to the new keyboard layout. + if (callListenerOnPressAndCheckKeyboardLayoutChange(getKey(keyIndex), true)) + keyIndex = keyState.onMoveKey(x, y); + keyState.onMoveToNewKey(keyIndex, x, y); + startLongPressTimer(keyIndex); + setPressedKeyGraphics(keyIndex); + showKeyPreview(keyIndex); + } else { + // HACK: On some devices, quick successive touches may be translated to sudden + // move by touch panel firmware. This hack detects the case and translates the + // move event to successive up and down events. + final int dx = x - lastX; + final int dy = y - lastY; + final int lastMoveSquared = dx * dx + dy * dy; + if (lastMoveSquared >= mKeyQuarterWidthSquared) { + if (DEBUG_MODE) + Log.w(TAG, String.format("onMoveEvent: sudden move is translated to " + + "up[%d,%d]/down[%d,%d] events", lastX, lastY, x, y)); + onUpEventInternal(lastX, lastY, eventTime, true); + onDownEventInternal(x, y, eventTime); + } else { + mKeyAlreadyProcessed = true; + dismissKeyPreview(); + setReleasedKeyGraphics(oldKeyIndex); + } + } + } + // TODO: Remove this hack code + else if (isSpaceKey(keyIndex) && !mIsInSlidingLanguageSwitch + && mKeyboard instanceof LatinKeyboard) { + final LatinKeyboard keyboard = ((LatinKeyboard)mKeyboard); + if (mSubtypeSwitcher.useSpacebarLanguageSwitcher() + && mSubtypeSwitcher.getEnabledKeyboardLocaleCount() > 1) { + final int diff = x - keyState.getKeyX(); + if (keyboard.shouldTriggerSpacebarSlidingLanguageSwitch(diff)) { + // Detect start sliding language switch. + mIsInSlidingLanguageSwitch = true; + mSpaceKeyIndex = keyIndex; + keyboard.updateSpacebarPreviewIcon(diff); + // Display spacebar slide language switcher. + showKeyPreview(keyIndex); + if (queue != null) + queue.releaseAllPointersExcept(this, eventTime, true); + } + } + } + } else { + if (oldKey != null && isMajorEnoughMoveToBeOnNewKey(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. + setReleasedKeyGraphics(oldKeyIndex); + callListenerOnRelease(oldKey, oldKey.mCode, true); + startSlidingKeyInput(oldKey); + mHandler.cancelLongPressTimers(); + if (mIsAllowedSlidingKeyInput) { + keyState.onMoveToNewKey(keyIndex, x, y); + } else { + mKeyAlreadyProcessed = true; + dismissKeyPreview(); + } + } + } + } + + public void onUpEvent(int x, int y, long eventTime, PointerTrackerQueue queue) { + if (ENABLE_ASSERTION) checkAssertion(queue); + if (DEBUG_EVENT) + printTouchEvent("onUpEvent :", x, y, eventTime); + + if (queue != null) { + if (isModifier()) { + // Before processing an up event of modifier key, all pointers already being + // tracked should be released. + queue.releaseAllPointersExcept(this, eventTime, true); + } else { + queue.releaseAllPointersOlderThan(this, eventTime); + } + queue.remove(this); + } + onUpEventInternal(x, y, eventTime, true); + } + + // Let this pointer tracker know that one of newer-than-this pointer trackers got an up event. + // This pointer tracker needs to keep the key top graphics "pressed", but needs to get a + // "virtual" up event. + public void onPhantomUpEvent(int x, int y, long eventTime, boolean updateReleasedKeyGraphics) { + if (DEBUG_EVENT) + printTouchEvent("onPhntEvent:", x, y, eventTime); + onUpEventInternal(x, y, eventTime, updateReleasedKeyGraphics); + mKeyAlreadyProcessed = true; + } + + private void onUpEventInternal(int x, int y, long eventTime, + boolean updateReleasedKeyGraphics) { + mHandler.cancelKeyTimers(); + mHandler.cancelShowKeyPreview(this); + mIsInSlidingKeyInput = false; + final PointerTrackerKeyState keyState = mKeyState; + final int keyX, keyY; + if (isMajorEnoughMoveToBeOnNewKey(x, y, keyState.onMoveKey(x, y))) { + keyX = x; + keyY = y; + } else { + // Use previous fixed key coordinates. + keyX = keyState.getKeyX(); + keyY = keyState.getKeyY(); + } + final int keyIndex = keyState.onUpKey(keyX, keyY, eventTime); + dismissKeyPreview(); + if (updateReleasedKeyGraphics) + setReleasedKeyGraphics(keyIndex); + if (mKeyAlreadyProcessed) + return; + // TODO: Remove this hacking code + if (mIsInSlidingLanguageSwitch) { + setReleasedKeyGraphics(mSpaceKeyIndex); + final int languageDir = ((LatinKeyboard)mKeyboard).getLanguageChangeDirection(); + if (languageDir != 0) { + final int code = (languageDir == 1) + ? LatinKeyboard.CODE_NEXT_LANGUAGE : LatinKeyboard.CODE_PREV_LANGUAGE; + // This will change keyboard layout. + mListener.onCodeInput(code, new int[] {code}, keyX, keyY); + } + mIsInSlidingLanguageSwitch = false; + ((LatinKeyboard)mKeyboard).setSpacebarSlidingLanguageSwitchDiff(0); + return; + } + if (!mIsRepeatableKey) { + detectAndSendKey(keyIndex, keyX, keyY); + } + } + + public void onLongPressed(PointerTrackerQueue queue) { + mKeyAlreadyProcessed = true; + if (queue != null) { + // TODO: Support chording + long-press input. + queue.releaseAllPointersExcept(this, SystemClock.uptimeMillis(), true); + queue.remove(this); + } + } + + public void onCancelEvent(int x, int y, long eventTime, PointerTrackerQueue queue) { + if (ENABLE_ASSERTION) checkAssertion(queue); + if (DEBUG_EVENT) + printTouchEvent("onCancelEvt:", x, y, eventTime); + + if (queue != null) { + queue.releaseAllPointersExcept(this, eventTime, true); + queue.remove(this); + } + onCancelEventInternal(); + } + + private void onCancelEventInternal() { + mHandler.cancelKeyTimers(); + mHandler.cancelShowKeyPreview(this); + dismissKeyPreview(); + setReleasedKeyGraphics(mKeyState.getKeyIndex()); + mIsInSlidingKeyInput = false; + } + + private void startRepeatKey(int keyIndex) { + final Key key = getKey(keyIndex); + if (key != null && key.mRepeatable) { + dismissKeyPreview(); + onRepeatKey(keyIndex); + mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this); + mIsRepeatableKey = true; + } else { + mIsRepeatableKey = false; + } + } + + public void onRepeatKey(int keyIndex) { + Key key = getKey(keyIndex); + if (key != null) { + detectAndSendKey(keyIndex, key.mX, key.mY); + } + } + + public int getLastX() { + return mKeyState.getLastX(); + } + + public int getLastY() { + return mKeyState.getLastY(); + } + + public long getDownTime() { + return mKeyState.getDownTime(); + } + + private boolean isMajorEnoughMoveToBeOnNewKey(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 false; + } else if (isValidKeyIndex(curKey)) { + return mKeys.get(curKey).squaredDistanceToEdge(x, y) >= mKeyHysteresisDistanceSquared; + } else { + return true; + } + } + + // The modifier key, such as shift key, should not show its key preview. + private boolean isKeyPreviewNotRequired(int keyIndex) { + final Key key = getKey(keyIndex); + if (key == null || !key.isEnabled()) + return true; + // Such as spacebar sliding language switch. + if (mKeyboard.needSpacebarPreview(keyIndex)) + return false; + final int code = key.mCode; + return isModifierCode(code) || code == Keyboard.CODE_DELETE + || code == Keyboard.CODE_ENTER || code == Keyboard.CODE_SPACE; + } + + private void showKeyPreview(int keyIndex) { + if (isKeyPreviewNotRequired(keyIndex)) + return; + mProxy.showKeyPreview(keyIndex, this); + } + + private void dismissKeyPreview() { + mProxy.dismissKeyPreview(this); + } + + private void startLongPressTimer(int keyIndex) { + Key key = getKey(keyIndex); + if (key.mCode == Keyboard.CODE_SHIFT) { + mHandler.startLongPressShiftTimer(mLongPressShiftKeyTimeout, keyIndex, this); + } else if (key.hasUppercaseLetter() && mKeyboard.isManualTemporaryUpperCase()) { + // We need not start long press timer on the key which has manual temporary upper case + // code defined and the keyboard is in manual temporary upper case mode. + return; + } else if (mKeyboardSwitcher.isInMomentarySwitchState()) { + // We use longer timeout for sliding finger input started from the symbols mode key. + mHandler.startLongPressTimer(mLongPressKeyTimeout * 3, keyIndex, this); + } else { + mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); + } + } + + private void detectAndSendKey(int index, int x, int y) { + final Key key = getKey(index); + if (key == null) { + callListenerOnCancelInput(); + return; + } + if (key.mOutputText != null) { + callListenerOnTextInput(key); + callListenerOnRelease(key, key.mCode, false); + } else { + int code = key.mCode; + final int[] codes = mKeyDetector.newCodeArray(); + mKeyDetector.getKeyIndexAndNearbyCodes(x, y, codes); + + // If keyboard is in manual temporary upper case state and key has manual temporary + // uppercase letter as key hint letter, alternate character code should be sent. + if (mKeyboard.isManualTemporaryUpperCase() && key.hasUppercaseLetter()) { + code = key.mHintLetter.charAt(0); + codes[0] = code; + } + + // Swap the first and second values in the codes array if the primary code is not the + // first value but the second value in the array. This happens when key debouncing is + // in effect. + if (codes.length >= 2 && codes[0] != code && codes[1] == code) { + codes[1] = codes[0]; + codes[0] = code; + } + callListenerOnCodeInput(key, code, codes, x, y); + callListenerOnRelease(key, code, false); + } + } + + public CharSequence getPreviewText(Key key) { + return key.mLabel; + } + + private long mPreviousEventTime; + + private void printTouchEvent(String title, int x, int y, long eventTime) { + final int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); + final Key key = getKey(keyIndex); + final String code = (key == null) ? "----" : keyCodePrintable(key.mCode); + final long delta = eventTime - mPreviousEventTime; + Log.d(TAG, String.format("%s%s[%d] %4d %4d %5d %3d(%s)", title, + (mKeyAlreadyProcessed ? "-" : " "), mPointerId, x, y, delta, keyIndex, code)); + mPreviousEventTime = eventTime; + } + + private static String keyCodePrintable(int primaryCode) { + final String modifier = isModifierCode(primaryCode) ? " modifier" : ""; + return String.format((primaryCode < 0) ? "%4d" : "0x%02x", primaryCode) + modifier; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java new file mode 100644 index 000000000..3b8c36487 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard; + +import android.content.Context; +import android.content.res.Resources; +import android.os.SystemClock; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.widget.PopupWindow; + +import com.android.inputmethod.latin.R; + +/** + * A view that renders a virtual {@link MiniKeyboard}. It handles rendering of keys and detecting + * key presses and touch movements. + */ +public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel { + private final int[] mCoordinates = new int[2]; + private final boolean mConfigShowMiniKeyboardAtTouchedPoint; + + private int mOriginX; + private int mOriginY; + private long mDownTime; + + public PopupMiniKeyboardView(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.popupMiniKeyboardViewStyle); + } + + public PopupMiniKeyboardView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + final Resources res = context.getResources(); + mConfigShowMiniKeyboardAtTouchedPoint = res.getBoolean( + R.bool.config_show_mini_keyboard_at_touched_point); + // Override default ProximityKeyDetector. + mKeyDetector = new MiniKeyboardKeyDetector(res.getDimension( + R.dimen.mini_keyboard_slide_allowance)); + // Remove gesture detector on mini-keyboard + mGestureDetector = null; + setKeyPreviewPopupEnabled(false, 0); + } + + @Override + public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) { + // Mini keyboard needs no pop-up key preview displayed, so we pass always false with a + // delay of 0. The delay does not matter actually since the popup is not shown anyway. + super.setKeyPreviewPopupEnabled(false, 0); + } + + @Override + public void showPanel(KeyboardView parentKeyboardView, Key parentKey, + PointerTracker tracker, PopupWindow window) { + final View container = (View)getParent(); + final MiniKeyboard miniKeyboard = (MiniKeyboard)getKeyboard(); + final Keyboard parentKeyboard = parentKeyboardView.getKeyboard(); + + parentKeyboardView.getLocationInWindow(mCoordinates); + final int pointX = (mConfigShowMiniKeyboardAtTouchedPoint) ? tracker.getLastX() + : parentKey.mX + parentKey.mWidth / 2; + final int pointY = parentKey.mY; + final int miniKeyboardLeft = pointX - miniKeyboard.getDefaultCoordX() + + parentKeyboardView.getPaddingLeft(); + final int x = Math.max(0, Math.min(miniKeyboardLeft, + parentKeyboardView.getWidth() - miniKeyboard.getMinWidth())) + - container.getPaddingLeft() + mCoordinates[0]; + final int y = pointY - parentKeyboard.getVerticalGap() + - (container.getMeasuredHeight() - container.getPaddingBottom()) + + parentKeyboardView.getPaddingTop() + mCoordinates[1]; + + if (miniKeyboard.setShifted(parentKeyboard.isShiftedOrShiftLocked())) { + invalidateAllKeys(); + } + window.setContentView(container); + window.setWidth(container.getMeasuredWidth()); + window.setHeight(container.getMeasuredHeight()); + window.showAtLocation(parentKeyboardView, Gravity.NO_GRAVITY, x, y); + + mOriginX = x + container.getPaddingLeft() - mCoordinates[0]; + mOriginY = y + container.getPaddingTop() - mCoordinates[1]; + mDownTime = SystemClock.uptimeMillis(); + + // Inject down event on the key to mini keyboard. + final MotionEvent downEvent = MotionEvent.obtain(mDownTime, mDownTime, + MotionEvent.ACTION_DOWN, pointX - mOriginX, + pointY + parentKey.mHeight / 2 - mOriginY, 0); + onTouchEvent(downEvent); + downEvent.recycle(); + } + + @Override + public boolean onTouchEvent(MotionEvent me) { + me.offsetLocation(-mOriginX, -mOriginY); + return super.onTouchEvent(me); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/PopupPanel.java b/java/src/com/android/inputmethod/keyboard/PopupPanel.java new file mode 100644 index 000000000..386e11f2c --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/PopupPanel.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard; + +import android.view.MotionEvent; +import android.widget.PopupWindow; + +public interface PopupPanel { + /** + * Show popup panel. + * @param parentKeyboardView the parent KeyboardView that has the parent key. + * @param parentKey the parent key that is the source of this popup panel + * @param tracker the pointer tracker that pressesd the parent key + * @param window PopupWindow to be used to show this popup panel + */ + public void showPanel(KeyboardView parentKeyboardView, Key parentKey, + PointerTracker tracker, PopupWindow window); + + /** + * Check if the pointer is in siding key input mode. + * @return true if the pointer is sliding key input mode. + */ + public boolean isInSlidingKeyInput(); + + /** + * The motion event handler. + * @param me the MotionEvent to be processed. + * @return true if the motion event is processed and should be consumed. + */ + public boolean onTouchEvent(MotionEvent me); +} diff --git a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java new file mode 100644 index 000000000..33acc6907 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard; + +import com.android.inputmethod.latin.Utils; + +import java.util.Arrays; +import java.util.List; + +public class ProximityInfo { + public static final int MAX_PROXIMITY_CHARS_SIZE = 16; + + private final int mGridWidth; + private final int mGridHeight; + private final int mGridSize; + + ProximityInfo(int gridWidth, int gridHeight) { + mGridWidth = gridWidth; + mGridHeight = gridHeight; + mGridSize = mGridWidth * mGridHeight; + } + + private int mNativeProximityInfo; + static { + Utils.loadNativeLibrary(); + } + private native int setProximityInfoNative(int maxProximityCharsSize, int displayWidth, + int displayHeight, int gridWidth, int gridHeight, int[] proximityCharsArray); + private native void releaseProximityInfoNative(int nativeProximityInfo); + + public final void setProximityInfo(int[][] gridNeighborKeyIndexes, int keyboardWidth, + int keyboardHeight, List<Key> keys) { + int[] proximityCharsArray = new int[mGridSize * MAX_PROXIMITY_CHARS_SIZE]; + Arrays.fill(proximityCharsArray, KeyDetector.NOT_A_CODE); + for (int i = 0; i < mGridSize; ++i) { + final int proximityCharsLength = gridNeighborKeyIndexes[i].length; + for (int j = 0; j < proximityCharsLength; ++j) { + proximityCharsArray[i * MAX_PROXIMITY_CHARS_SIZE + j] = + keys.get(gridNeighborKeyIndexes[i][j]).mCode; + } + } + mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE, + keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, proximityCharsArray); + } + + // TODO: Get rid of this function's input (keyboard). + public int getNativeProximityInfo(Keyboard keyboard) { + if (mNativeProximityInfo == 0) { + // TODO: Move this function to ProximityInfo and make this private. + keyboard.computeNearestNeighbors(); + } + return mNativeProximityInfo; + } + + @Override + protected void finalize() throws Throwable { + try { + if (mNativeProximityInfo != 0) { + releaseProximityInfoNative(mNativeProximityInfo); + mNativeProximityInfo = 0; + } + } finally { + super.finalize(); + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java new file mode 100644 index 000000000..983f0649d --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.util.Log; + +import com.android.inputmethod.keyboard.internal.KeyboardParser.ParseException; +import com.android.inputmethod.latin.R; + +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 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 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 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); + readText(keyAttr, R.styleable.Keyboard_Key_keyOutputText); + readText(keyAttr, R.styleable.Keyboard_Key_keyHintLetter); + readTextArray(keyAttr, R.styleable.Keyboard_Key_popupCharacters); + readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption); + readInt(keyAttr, R.styleable.Keyboard_Key_keyIcon); + readInt(keyAttr, R.styleable.Keyboard_Key_keyIconPreview); + readInt(keyAttr, R.styleable.Keyboard_Key_keyIconShifted); + readInt(keyAttr, R.styleable.Keyboard_Key_maxPopupKeyboardColumn); + readBoolean(keyAttr, R.styleable.Keyboard_Key_isFunctional); + readBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky); + readBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable); + readBoolean(keyAttr, R.styleable.Keyboard_Key_enabled); + } + + 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/internal/KeyboardIconsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java new file mode 100644 index 000000000..37b36825a --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.Log; + +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.latin.R; + +public class KeyboardIconsSet { + private static final String TAG = KeyboardIconsSet.class.getSimpleName(); + + public static final int ICON_UNDEFINED = 0; + + // This should be aligned with Keyboard.keyIcon enum. + private static final int ICON_SHIFT_KEY = 1; + private static final int ICON_TO_SYMBOL_KEY = 2; + private static final int ICON_TO_SYMBOL_KEY_WITH_SHORTCUT = 3; + private static final int ICON_DELETE_KEY = 4; + private static final int ICON_SETTINGS_KEY = 5; + private static final int ICON_SHORTCUT_KEY = 6; + private static final int ICON_SPACE_KEY = 7; + private static final int ICON_RETURN_KEY = 8; + private static final int ICON_SEARCH_KEY = 9; + private static final int ICON_TAB_KEY = 10; + private static final int ICON_NUM1_KEY = 11; + private static final int ICON_NUM2_KEY = 12; + private static final int ICON_NUM3_KEY = 13; + private static final int ICON_NUM4_KEY = 14; + private static final int ICON_NUM5_KEY = 15; + private static final int ICON_NUM6_KEY = 16; + private static final int ICON_NUM7_KEY = 17; + private static final int ICON_NUM8_KEY = 18; + private static final int ICON_NUM9_KEY = 19; + private static final int ICON_NUM0_KEY = 20; + // This should be aligned with Keyboard.keyIconShifted enum. + private static final int ICON_SHIFTED_SHIFT_KEY = 21; + // This should be aligned with Keyboard.keyIconPreview enum. + private static final int ICON_PREVIEW_SPACE_KEY = 22; + private static final int ICON_PREVIEW_TAB_KEY = 23; + private static final int ICON_PREVIEW_SETTINGS_KEY = 24; + private static final int ICON_PREVIEW_SHORTCUT_KEY = 25; + + private static final int ICON_LAST = 25; + + private final Drawable mIcons[] = new Drawable[ICON_LAST + 1]; + + private static final int getIconId(int attrIndex) { + switch (attrIndex) { + case R.styleable.Keyboard_iconShiftKey: + return ICON_SHIFT_KEY; + case R.styleable.Keyboard_iconToSymbolKey: + return ICON_TO_SYMBOL_KEY; + case R.styleable.Keyboard_iconToSymbolKeyWithShortcut: + return ICON_TO_SYMBOL_KEY_WITH_SHORTCUT; + case R.styleable.Keyboard_iconDeleteKey: + return ICON_DELETE_KEY; + case R.styleable.Keyboard_iconSettingsKey: + return ICON_SETTINGS_KEY; + case R.styleable.Keyboard_iconShortcutKey: + return ICON_SHORTCUT_KEY; + case R.styleable.Keyboard_iconSpaceKey: + return ICON_SPACE_KEY; + case R.styleable.Keyboard_iconReturnKey: + return ICON_RETURN_KEY; + case R.styleable.Keyboard_iconSearchKey: + return ICON_SEARCH_KEY; + case R.styleable.Keyboard_iconTabKey: + return ICON_TAB_KEY; + case R.styleable.Keyboard_iconNum1Key: + return ICON_NUM1_KEY; + case R.styleable.Keyboard_iconNum2Key: + return ICON_NUM2_KEY; + case R.styleable.Keyboard_iconNum3Key: + return ICON_NUM3_KEY; + case R.styleable.Keyboard_iconNum4Key: + return ICON_NUM4_KEY; + case R.styleable.Keyboard_iconNum5Key: + return ICON_NUM5_KEY; + case R.styleable.Keyboard_iconNum6Key: + return ICON_NUM6_KEY; + case R.styleable.Keyboard_iconNum7Key: + return ICON_NUM7_KEY; + case R.styleable.Keyboard_iconNum8Key: + return ICON_NUM8_KEY; + case R.styleable.Keyboard_iconNum9Key: + return ICON_NUM9_KEY; + case R.styleable.Keyboard_iconNum0Key: + return ICON_NUM0_KEY; + case R.styleable.Keyboard_iconShiftedShiftKey: + return ICON_SHIFTED_SHIFT_KEY; + case R.styleable.Keyboard_iconPreviewSpaceKey: + return ICON_PREVIEW_SPACE_KEY; + case R.styleable.Keyboard_iconPreviewTabKey: + return ICON_PREVIEW_TAB_KEY; + case R.styleable.Keyboard_iconPreviewSettingsKey: + return ICON_PREVIEW_SETTINGS_KEY; + case R.styleable.Keyboard_iconPreviewShortcutKey: + return ICON_PREVIEW_SHORTCUT_KEY; + default: + return ICON_UNDEFINED; + } + } + + public void loadIcons(TypedArray keyboardAttrs) { + final int count = keyboardAttrs.getIndexCount(); + for (int i = 0; i < count; i++) { + final int attrIndex = keyboardAttrs.getIndex(i); + final int iconId = getIconId(attrIndex); + if (iconId != ICON_UNDEFINED) { + try { + final Drawable icon = keyboardAttrs.getDrawable(attrIndex); + Keyboard.setDefaultBounds(icon); + mIcons[iconId] = icon; + } catch (Resources.NotFoundException e) { + Log.w(TAG, "Drawable resource for icon #" + iconId + " not found"); + } + } + } + } + + public Drawable getIcon(int iconId) { + if (iconId == ICON_UNDEFINED) + return null; + if (iconId < 0 || iconId >= mIcons.length) + throw new IllegalArgumentException("icon id is out of range: " + iconId); + return mIcons[iconId]; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java new file mode 100644 index 000000000..a6708171f --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java @@ -0,0 +1,726 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.Context; +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 com.android.inputmethod.compat.EditorInfoCompatUtils; +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardId; +import com.android.inputmethod.latin.R; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +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> + * >!-- xml/keyboard.xml --< + * >Keyboard keyboard_attributes*< + * >!-- Keyboard Content --< + * >Row row_attributes*< + * >!-- Row Content --< + * >Key key_attributes* /< + * >Spacer horizontalGap="0.2in" /< + * >include keyboardLayout="@xml/other_keys"< + * ... + * >/Row< + * >include keyboardLayout="@xml/other_rows"< + * ... + * >/Keyboard< + * </pre> + * The XML file which is included in other file must have >merge< as root element, such as: + * <pre> + * >!-- xml/other_keys.xml --< + * >merge< + * >Key key_attributes* /< + * ... + * >/merge< + * </pre> + * and + * <pre> + * >!-- xml/other_rows.xml --< + * >merge< + * >Row row_attributes*< + * >Key key_attributes* /< + * >/Row< + * ... + * >/merge< + * </pre> + * You can also use switch-case-default tags to select Rows and Keys. + * <pre> + * >switch< + * >case case_attribute*< + * >!-- Any valid tags at switch position --< + * >/case< + * ... + * >default< + * >!-- Any valid tags at switch position --< + * >/default< + * >/switch< + * </pre> + * You can declare Key style and specify styles within Key tags. + * <pre> + * >switch< + * >case mode="email"< + * >key-style styleName="f1-key" parentStyle="modifier-key" + * keyLabel=".com" + * /< + * >/case< + * >case mode="url"< + * >key-style styleName="f1-key" parentStyle="modifier-key" + * keyLabel="http://" + * /< + * >/case< + * >/switch< + * ... + * >Key keyStyle="shift-key" ... /< + * </pre> + */ + +public class KeyboardParser { + private static final String TAG = KeyboardParser.class.getSimpleName(); + private static final boolean DEBUG = false; + + // Keyboard XML Tags + private static final String TAG_KEYBOARD = "Keyboard"; + private static final String TAG_ROW = "Row"; + private static final String TAG_KEY = "Key"; + private static final String TAG_SPACER = "Spacer"; + private static final String TAG_INCLUDE = "include"; + private static final String TAG_MERGE = "merge"; + private static final String TAG_SWITCH = "switch"; + private static final String TAG_CASE = "case"; + private static final String TAG_DEFAULT = "default"; + public static final String TAG_KEY_STYLE = "key-style"; + + private final Keyboard mKeyboard; + private final Context mContext; + private final Resources mResources; + + private int mKeyboardTopPadding; + private int mKeyboardBottomPadding; + private int mHorizontalEdgesPadding; + 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, Context context) { + mKeyboard = keyboard; + mContext = context; + final Resources res = context.getResources(); + mResources = res; + mHorizontalEdgesPadding = (int)res.getDimension(R.dimen.keyboard_horizontal_edges_padding); + } + + 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); + startKeyboard(); + parseKeyboardContent(parser, mKeyboard.getKeys()); + break; + } else { + throw new IllegalStartTag(parser, TAG_KEYBOARD); + } + } + } + } + + public static String parseKeyboardLocale( + Context context, int resId) throws XmlPullParserException, IOException { + final Resources res = context.getResources(); + final XmlResourceParser parser = res.getXml(resId); + if (parser == null) return ""; + int event; + while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (event == XmlPullParser.START_TAG) { + final String tag = parser.getName(); + if (TAG_KEYBOARD.equals(tag)) { + final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard); + return keyboardAttr.getString(R.styleable.Keyboard_keyboardLocale); + } else { + throw new IllegalStartTag(parser, TAG_KEYBOARD); + } + } + } + return ""; + } + + private void parseKeyboardAttributes(XmlResourceParser parser) { + final Keyboard keyboard = mKeyboard; + final TypedArray keyboardAttr = mContext.obtainStyledAttributes( + Xml.asAttributeSet(parser), R.styleable.Keyboard, R.attr.keyboardStyle, + R.style.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); + int minKeyboardHeight = getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_minKeyboardHeight, displayHeight, displayHeight / 2); + if (minKeyboardHeight < 0) { + // Specified fraction was negative, so it should be calculated against display + // width. + final int displayWidth = keyboard.getDisplayWidth(); + minKeyboardHeight = -getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_minKeyboardHeight, displayWidth, displayWidth / 2); + } + // Keyboard height will not exceed maxKeyboardHeight and will not be less than + // minKeyboardHeight. + final int height = Math.max( + Math.min(keyboardHeight, maxKeyboardHeight), minKeyboardHeight); + 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)); + + mKeyboard.mIconsSet.loadIcons(keyboardAttr); + mKeyboardTopPadding = keyboardAttr.getDimensionPixelSize( + R.styleable.Keyboard_keyboardTopPadding, 0); + mKeyboardBottomPadding = keyboardAttr.getDimensionPixelSize( + R.styleable.Keyboard_keyboardBottomPadding, 0); + } finally { + keyAttr.recycle(); + keyboardAttr.recycle(); + } + } + + private void parseKeyboardContent(XmlResourceParser parser, List<Key> keys) + throws XmlPullParserException, IOException { + int event; + while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (event == XmlPullParser.START_TAG) { + final String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + Row row = new Row(mResources, mKeyboard, parser); + if (DEBUG) Log.d(TAG, String.format("<%s>", TAG_ROW)); + if (keys != null) + startRow(row); + parseRowContent(parser, row, keys); + } else if (TAG_INCLUDE.equals(tag)) { + parseIncludeKeyboardContent(parser, keys); + } else if (TAG_SWITCH.equals(tag)) { + parseSwitchKeyboardContent(parser, keys); + } else if (TAG_KEY_STYLE.equals(tag)) { + parseKeyStyle(parser, keys); + } else { + throw new IllegalStartTag(parser, TAG_ROW); + } + } else if (event == XmlPullParser.END_TAG) { + final String tag = parser.getName(); + if (TAG_KEYBOARD.equals(tag)) { + endKeyboard(mKeyboard.getVerticalGap()); + break; + } else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag) + || TAG_MERGE.equals(tag)) { + if (DEBUG) Log.d(TAG, String.format("</%s>", tag)); + break; + } else if (TAG_KEY_STYLE.equals(tag)) { + continue; + } else { + throw new IllegalEndTag(parser, TAG_ROW); + } + } + } + } + + private void parseRowContent(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + int event; + while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (event == XmlPullParser.START_TAG) { + final String tag = parser.getName(); + if (TAG_KEY.equals(tag)) { + parseKey(parser, row, keys); + } else if (TAG_SPACER.equals(tag)) { + parseSpacer(parser, row, keys); + } else if (TAG_INCLUDE.equals(tag)) { + parseIncludeRowContent(parser, row, keys); + } else if (TAG_SWITCH.equals(tag)) { + parseSwitchRowContent(parser, row, keys); + } else if (TAG_KEY_STYLE.equals(tag)) { + parseKeyStyle(parser, keys); + } else { + throw new IllegalStartTag(parser, TAG_KEY); + } + } else if (event == XmlPullParser.END_TAG) { + final String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + if (DEBUG) Log.d(TAG, String.format("</%s>", TAG_ROW)); + if (keys != null) + endRow(); + break; + } else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag) + || TAG_MERGE.equals(tag)) { + if (DEBUG) Log.d(TAG, String.format("</%s>", tag)); + break; + } else if (TAG_KEY_STYLE.equals(tag)) { + continue; + } else { + throw new IllegalEndTag(parser, TAG_KEY); + } + } + } + } + + private void parseKey(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + if (keys == null) { + checkEndTag(TAG_KEY, parser); + } else { + Key key = new Key(mResources, row, mCurrentX, mCurrentY, parser, mKeyStyles); + if (DEBUG) Log.d(TAG, String.format("<%s%s keyLabel=%s code=%d popupCharacters=%s />", + TAG_KEY, (key.isEnabled() ? "" : " disabled"), key.mLabel, key.mCode, + Arrays.toString(key.mPopupCharacters))); + checkEndTag(TAG_KEY, parser); + keys.add(key); + if (key.mCode == Keyboard.CODE_SHIFT) + mKeyboard.getShiftKeys().add(key); + endKey(key); + } + } + + private void parseSpacer(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + if (keys == null) { + checkEndTag(TAG_SPACER, parser); + } else { + if (DEBUG) Log.d(TAG, String.format("<%s />", TAG_SPACER)); + final TypedArray keyboardAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard); + if (keyboardAttr.hasValue(R.styleable.Keyboard_horizontalGap)) + throw new IllegalAttribute(parser, "horizontalGap"); + final int defaultWidth = (row != null) ? row.mDefaultWidth : 0; + final int keyWidth = getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyWidth, + mKeyboard.getDisplayWidth(), defaultWidth); + keyboardAttr.recycle(); + + final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_Key); + int keyXPos = KeyboardParser.getDimensionOrFraction(keyAttr, + R.styleable.Keyboard_Key_keyXPos, mKeyboard.getDisplayWidth(), mCurrentX); + if (keyXPos < 0) { + // If keyXPos is negative, the actual x-coordinate will be display_width + keyXPos. + keyXPos += mKeyboard.getDisplayWidth(); + } + + checkEndTag(TAG_SPACER, parser); + setSpacer(keyXPos, keyWidth); + } + } + + private void parseIncludeKeyboardContent(XmlResourceParser parser, List<Key> keys) + throws XmlPullParserException, IOException { + parseIncludeInternal(parser, null, keys); + } + + private void parseIncludeRowContent(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + parseIncludeInternal(parser, row, keys); + } + + private void parseIncludeInternal(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + if (keys == null) { + checkEndTag(TAG_INCLUDE, parser); + } else { + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_Include); + final int keyboardLayout = a.getResourceId( + R.styleable.Keyboard_Include_keyboardLayout, 0); + a.recycle(); + + checkEndTag(TAG_INCLUDE, parser); + if (keyboardLayout == 0) + throw new ParseException("No keyboardLayout attribute in <include/>", parser); + if (DEBUG) Log.d(TAG, String.format("<%s keyboardLayout=%s />", + TAG_INCLUDE, mResources.getResourceEntryName(keyboardLayout))); + parseMerge(mResources.getLayout(keyboardLayout), row, keys); + } + } + + private void parseMerge(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + int event; + while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (event == XmlPullParser.START_TAG) { + final String tag = parser.getName(); + if (TAG_MERGE.equals(tag)) { + if (row == null) { + parseKeyboardContent(parser, keys); + } else { + parseRowContent(parser, row, keys); + } + break; + } else { + throw new ParseException( + "Included keyboard layout must have <merge> root element", parser); + } + } + } + } + + private void parseSwitchKeyboardContent(XmlResourceParser parser, List<Key> keys) + throws XmlPullParserException, IOException { + parseSwitchInternal(parser, null, keys); + } + + private void parseSwitchRowContent(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + parseSwitchInternal(parser, row, keys); + } + + private void parseSwitchInternal(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + if (DEBUG) Log.d(TAG, String.format("<%s> %s", TAG_SWITCH, mKeyboard.mId)); + boolean selected = false; + int event; + while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (event == XmlPullParser.START_TAG) { + final String tag = parser.getName(); + if (TAG_CASE.equals(tag)) { + selected |= parseCase(parser, row, selected ? null : keys); + } else if (TAG_DEFAULT.equals(tag)) { + selected |= parseDefault(parser, row, selected ? null : keys); + } else { + throw new IllegalStartTag(parser, TAG_KEY); + } + } else if (event == XmlPullParser.END_TAG) { + final String tag = parser.getName(); + if (TAG_SWITCH.equals(tag)) { + if (DEBUG) Log.d(TAG, String.format("</%s>", TAG_SWITCH)); + break; + } else { + throw new IllegalEndTag(parser, TAG_KEY); + } + } + } + } + + private boolean parseCase(XmlResourceParser parser, Row row, List<Key> keys) + throws XmlPullParserException, IOException { + final boolean selected = parseCaseCondition(parser); + if (row == null) { + // Processing Rows. + parseKeyboardContent(parser, selected ? keys : null); + } else { + // Processing Keys. + parseRowContent(parser, row, selected ? keys : null); + } + return selected; + } + + private boolean parseCaseCondition(XmlResourceParser parser) { + final KeyboardId id = mKeyboard.mId; + if (id == null) + return true; + + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_Case); + final TypedArray viewAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.KeyboardView); + try { + final boolean modeMatched = matchTypedValue(a, + R.styleable.Keyboard_Case_mode, id.mMode, KeyboardId.modeName(id.mMode)); + final boolean navigateActionMatched = matchBoolean(a, + R.styleable.Keyboard_Case_navigateAction, id.mNavigateAction); + final boolean passwordInputMatched = matchBoolean(a, + R.styleable.Keyboard_Case_passwordInput, id.mPasswordInput); + final boolean hasSettingsKeyMatched = matchBoolean(a, + R.styleable.Keyboard_Case_hasSettingsKey, id.mHasSettingsKey); + final boolean f2KeyModeMatched = matchInteger(a, + R.styleable.Keyboard_Case_f2KeyMode, id.mF2KeyMode); + final boolean clobberSettingsKeyMatched = matchBoolean(a, + R.styleable.Keyboard_Case_clobberSettingsKey, id.mClobberSettingsKey); + final boolean voiceEnabledMatched = matchBoolean(a, + R.styleable.Keyboard_Case_voiceKeyEnabled, id.mVoiceKeyEnabled); + final boolean voiceKeyMatched = matchBoolean(a, + R.styleable.Keyboard_Case_hasVoiceKey, id.mHasVoiceKey); + // As noted at {@link KeyboardId} class, we are interested only in enum value masked by + // {@link android.view.inputmethod.EditorInfo#IME_MASK_ACTION} and + // {@link android.view.inputmethod.EditorInfo#IME_FLAG_NO_ENTER_ACTION}. So matching + // this attribute with id.mImeOptions as integer value is enough for our purpose. + final boolean imeActionMatched = matchInteger(a, + R.styleable.Keyboard_Case_imeAction, id.mImeAction); + final boolean localeCodeMatched = matchString(a, + R.styleable.Keyboard_Case_localeCode, id.mLocale.toString()); + final boolean languageCodeMatched = matchString(a, + R.styleable.Keyboard_Case_languageCode, id.mLocale.getLanguage()); + final boolean countryCodeMatched = matchString(a, + R.styleable.Keyboard_Case_countryCode, id.mLocale.getCountry()); + final boolean selected = modeMatched && navigateActionMatched && passwordInputMatched + && hasSettingsKeyMatched && f2KeyModeMatched && clobberSettingsKeyMatched + && voiceEnabledMatched && voiceKeyMatched && imeActionMatched && + localeCodeMatched && languageCodeMatched && countryCodeMatched; + + if (DEBUG) Log.d(TAG, String.format("<%s%s%s%s%s%s%s%s%s%s%s%s%s> %s", TAG_CASE, + textAttr(a.getString(R.styleable.Keyboard_Case_mode), "mode"), + booleanAttr(a, R.styleable.Keyboard_Case_navigateAction, "navigateAction"), + booleanAttr(a, R.styleable.Keyboard_Case_passwordInput, "passwordInput"), + booleanAttr(a, R.styleable.Keyboard_Case_hasSettingsKey, "hasSettingsKey"), + textAttr(KeyboardId.f2KeyModeName( + a.getInt(R.styleable.Keyboard_Case_f2KeyMode, -1)), "f2KeyMode"), + booleanAttr(a, R.styleable.Keyboard_Case_clobberSettingsKey, + "clobberSettingsKey"), + booleanAttr(a, R.styleable.Keyboard_Case_voiceKeyEnabled, "voiceKeyEnabled"), + booleanAttr(a, R.styleable.Keyboard_Case_hasVoiceKey, "hasVoiceKey"), + textAttr(EditorInfoCompatUtils.imeOptionsName( + a.getInt(R.styleable.Keyboard_Case_imeAction, -1)), "imeAction"), + textAttr(a.getString(R.styleable.Keyboard_Case_localeCode), "localeCode"), + textAttr(a.getString(R.styleable.Keyboard_Case_languageCode), "languageCode"), + textAttr(a.getString(R.styleable.Keyboard_Case_countryCode), "countryCode"), + Boolean.toString(selected))); + + return selected; + } finally { + a.recycle(); + viewAttr.recycle(); + } + } + + private static boolean matchInteger(TypedArray a, int index, int value) { + // If <case> does not have "index" attribute, that means this <case> is wild-card for the + // attribute. + return !a.hasValue(index) || a.getInt(index, 0) == value; + } + + private static boolean matchBoolean(TypedArray a, int index, boolean value) { + // If <case> does not have "index" attribute, that means this <case> is wild-card for the + // attribute. + return !a.hasValue(index) || a.getBoolean(index, false) == value; + } + + private static boolean matchString(TypedArray a, int index, String value) { + // If <case> does not have "index" attribute, that means this <case> is wild-card for the + // attribute. + return !a.hasValue(index) || stringArrayContains(a.getString(index).split("\\|"), value); + } + + private static boolean matchTypedValue(TypedArray a, int index, int intValue, String strValue) { + // If <case> does not have "index" attribute, that means this <case> is wild-card for the + // attribute. + final TypedValue v = a.peekValue(index); + if (v == null) + return true; + + if (isIntegerValue(v)) { + return intValue == a.getInt(index, 0); + } else if (isStringValue(v)) { + return stringArrayContains(a.getString(index).split("\\|"), strValue); + } + return false; + } + + private static boolean stringArrayContains(String[] array, String value) { + for (final String elem : array) { + if (elem.equals(value)) + return true; + } + return false; + } + + 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 startKeyboard() { + mCurrentY += mKeyboardTopPadding; + } + + private void startRow(Row row) { + mCurrentX = 0; + setSpacer(mCurrentX, mHorizontalEdgesPadding); + mCurrentRow = row; + } + + private void endRow() { + if (mCurrentRow == null) + throw new InflateException("orphant end row tag"); + setSpacer(mCurrentX, mHorizontalEdgesPadding); + if (mCurrentX > mMaxRowWidth) + mMaxRowWidth = mCurrentX; + mCurrentY += mCurrentRow.mDefaultHeight; + mCurrentRow = null; + } + + private void endKey(Key key) { + mCurrentX = key.mX - key.mGap / 2 + key.mWidth + key.mGap; + } + + private void endKeyboard(int defaultVerticalGap) { + mCurrentY += mKeyboardBottomPadding; + mTotalHeight = mCurrentY - defaultVerticalGap; + } + + private void setSpacer(int keyXPos, int width) { + mCurrentX = keyXPos + width; + } + + public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) { + final TypedValue value = a.peekValue(index); + if (value == null) + return defValue; + if (isFractionValue(value)) { + // Round it to avoid values like 47.9999 from getting truncated + return Math.round(a.getFraction(index, base, base, defValue)); + } else if (isDimensionValue(value)) { + return a.getDimensionPixelOffset(index, defValue); + } else if (isIntegerValue(value)) { + // For enum value. + return a.getInt(index, defValue); + } + return defValue; + } + + private static boolean isFractionValue(TypedValue v) { + return v.type == TypedValue.TYPE_FRACTION; + } + + private static boolean isDimensionValue(TypedValue v) { + return v.type == TypedValue.TYPE_DIMENSION; + } + + private static boolean isIntegerValue(TypedValue v) { + return v.type >= TypedValue.TYPE_FIRST_INT && v.type <= TypedValue.TYPE_LAST_INT; + } + + private static boolean isStringValue(TypedValue v) { + return v.type == TypedValue.TYPE_STRING; + } + + @SuppressWarnings("serial") + public static class ParseException extends InflateException { + public ParseException(String msg, XmlResourceParser parser) { + super(msg + " at line " + parser.getLineNumber()); + } + } + + @SuppressWarnings("serial") + private static class IllegalStartTag extends ParseException { + public IllegalStartTag(XmlResourceParser parser, String parent) { + super("Illegal start tag " + parser.getName() + " in " + parent, parser); + } + } + + @SuppressWarnings("serial") + private static class IllegalEndTag extends ParseException { + public IllegalEndTag(XmlResourceParser parser, String parent) { + super("Illegal end tag " + parser.getName() + " in " + parent, parser); + } + } + + @SuppressWarnings("serial") + private static class IllegalAttribute extends ParseException { + public IllegalAttribute(XmlResourceParser parser, String attribute) { + super("Tag " + parser.getName() + " has illegal attribute " + attribute, parser); + } + } + + @SuppressWarnings("serial") + private static class NonEmptyTag extends ParseException { + public NonEmptyTag(String tag, XmlResourceParser parser) { + super(tag + " must be empty tag", parser); + } + } + + private static String textAttr(String value, String name) { + return value != null ? String.format(" %s=%s", name, value) : ""; + } + + private static String booleanAttr(TypedArray a, int index, String name) { + return a.hasValue(index) ? String.format(" %s=%s", name, a.getBoolean(index, false)) : ""; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardShiftState.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardShiftState.java new file mode 100644 index 000000000..0cde4e5b5 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardShiftState.java @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.util.Log; + +import com.android.inputmethod.keyboard.KeyboardSwitcher; + +public class KeyboardShiftState { + private static final String TAG = "KeyboardShiftState"; + private static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE; + + private static final int NORMAL = 0; + private static final int MANUAL_SHIFTED = 1; + private static final int MANUAL_SHIFTED_FROM_AUTO = 2; + private static final int AUTO_SHIFTED = 3; + private static final int SHIFT_LOCKED = 4; + private static final int SHIFT_LOCK_SHIFTED = 5; + + private int mState = NORMAL; + + public boolean setShifted(boolean newShiftState) { + final int oldState = mState; + if (newShiftState) { + switch (oldState) { + case NORMAL: + mState = MANUAL_SHIFTED; + break; + case AUTO_SHIFTED: + mState = MANUAL_SHIFTED_FROM_AUTO; + break; + case SHIFT_LOCKED: + mState = SHIFT_LOCK_SHIFTED; + break; + } + } else { + switch (oldState) { + case MANUAL_SHIFTED: + case MANUAL_SHIFTED_FROM_AUTO: + case AUTO_SHIFTED: + mState = NORMAL; + break; + case SHIFT_LOCK_SHIFTED: + mState = SHIFT_LOCKED; + break; + } + } + if (DEBUG) + Log.d(TAG, "setShifted(" + newShiftState + "): " + toString(oldState) + " > " + this); + return mState != oldState; + } + + public void setShiftLocked(boolean newShiftLockState) { + final int oldState = mState; + if (newShiftLockState) { + switch (oldState) { + case NORMAL: + case MANUAL_SHIFTED: + case MANUAL_SHIFTED_FROM_AUTO: + case AUTO_SHIFTED: + mState = SHIFT_LOCKED; + break; + } + } else { + switch (oldState) { + case SHIFT_LOCKED: + case SHIFT_LOCK_SHIFTED: + mState = NORMAL; + break; + } + } + if (DEBUG) + Log.d(TAG, "setShiftLocked(" + newShiftLockState + "): " + toString(oldState) + + " > " + this); + } + + public void setAutomaticTemporaryUpperCase() { + final int oldState = mState; + mState = AUTO_SHIFTED; + if (DEBUG) + Log.d(TAG, "setAutomaticTemporaryUpperCase: " + toString(oldState) + " > " + this); + } + + public boolean isShiftedOrShiftLocked() { + return mState != NORMAL; + } + + public boolean isShiftLocked() { + return mState == SHIFT_LOCKED || mState == SHIFT_LOCK_SHIFTED; + } + + public boolean isAutomaticTemporaryUpperCase() { + return mState == AUTO_SHIFTED; + } + + public boolean isManualTemporaryUpperCase() { + return mState == MANUAL_SHIFTED || mState == MANUAL_SHIFTED_FROM_AUTO + || mState == SHIFT_LOCK_SHIFTED; + } + + public boolean isManualTemporaryUpperCaseFromAuto() { + return mState == MANUAL_SHIFTED_FROM_AUTO; + } + + @Override + public String toString() { + return toString(mState); + } + + private static String toString(int state) { + switch (state) { + case NORMAL: return "NORMAL"; + case MANUAL_SHIFTED: return "MANUAL_SHIFTED"; + case MANUAL_SHIFTED_FROM_AUTO: return "MANUAL_SHIFTED_FROM_AUTO"; + case AUTO_SHIFTED: return "AUTO_SHIFTED"; + case SHIFT_LOCKED: return "SHIFT_LOCKED"; + case SHIFT_LOCK_SHIFTED: return "SHIFT_LOCK_SHIFTED"; + default: return "UKNOWN"; + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java new file mode 100644 index 000000000..040c16ded --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java @@ -0,0 +1,250 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Paint; +import android.graphics.Rect; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardView; +import com.android.inputmethod.keyboard.MiniKeyboard; +import com.android.inputmethod.latin.R; + +import java.util.List; + +public class MiniKeyboardBuilder { + private final Resources mRes; + private final MiniKeyboard mKeyboard; + private final CharSequence[] mPopupCharacters; + private final MiniKeyboardLayoutParams mParams; + + /* package */ static class MiniKeyboardLayoutParams { + public final int mKeyWidth; + public final int mRowHeight; + /* package */ final int mTopRowAdjustment; + public final int mNumRows; + public final int mNumColumns; + public final int mLeftKeys; + public final int mRightKeys; // includes default key. + + /** + * The object holding mini keyboard layout parameters. + * + * @param numKeys number of keys in this mini keyboard. + * @param maxColumns number of maximum columns of this mini keyboard. + * @param keyWidth mini keyboard key width in pixel, including horizontal gap. + * @param rowHeight mini keyboard row height in pixel, including vertical gap. + * @param coordXInParent coordinate x of the popup key in parent keyboard. + * @param parentKeyboardWidth parent keyboard width in pixel. + */ + public MiniKeyboardLayoutParams(int numKeys, int maxColumns, int keyWidth, int rowHeight, + int coordXInParent, int parentKeyboardWidth) { + if (parentKeyboardWidth / keyWidth < maxColumns) + throw new IllegalArgumentException("Keyboard is too small to hold mini keyboard: " + + parentKeyboardWidth + " " + keyWidth + " " + maxColumns); + mKeyWidth = keyWidth; + mRowHeight = rowHeight; + + final int numRows = (numKeys + maxColumns - 1) / maxColumns; + mNumRows = numRows; + final int numColumns = getOptimizedColumns(numKeys, maxColumns); + mNumColumns = numColumns; + + final int numLeftKeys = (numColumns - 1) / 2; + final int numRightKeys = numColumns - numLeftKeys; // including default key. + final int maxLeftKeys = coordXInParent / keyWidth; + final int maxRightKeys = Math.max(1, (parentKeyboardWidth - coordXInParent) / keyWidth); + int leftKeys, rightKeys; + if (numLeftKeys > maxLeftKeys) { + leftKeys = maxLeftKeys; + rightKeys = numColumns - maxLeftKeys; + } else if (numRightKeys > maxRightKeys) { + leftKeys = numColumns - maxRightKeys; + rightKeys = maxRightKeys; + } else { + leftKeys = numLeftKeys; + rightKeys = numRightKeys; + } + // Shift right if the left edge of mini keyboard is on the edge of parent keyboard + // unless the parent key is on the left edge. + if (leftKeys * keyWidth >= coordXInParent && leftKeys > 0) { + leftKeys--; + rightKeys++; + } + // Shift left if the right edge of mini keyboard is on the edge of parent keyboard + // unless the parent key is on the right edge. + if (rightKeys * keyWidth + coordXInParent >= parentKeyboardWidth && rightKeys > 1) { + leftKeys++; + rightKeys--; + } + mLeftKeys = leftKeys; + mRightKeys = rightKeys; + + // Centering of the top row. + final boolean onEdge = (leftKeys == 0 || rightKeys == 1); + if (numRows < 2 || onEdge || getTopRowEmptySlots(numKeys, numColumns) % 2 == 0) { + mTopRowAdjustment = 0; + } else if (mLeftKeys < mRightKeys - 1) { + mTopRowAdjustment = 1; + } else { + mTopRowAdjustment = -1; + } + } + + // Return key position according to column count (0 is default). + /* package */ int getColumnPos(int n) { + final int col = n % mNumColumns; + if (col == 0) { + // default position. + return 0; + } + int pos = 0; + int right = 1; // include default position key. + int left = 0; + int i = 0; + while (true) { + // Assign right key if available. + if (right < mRightKeys) { + pos = right; + right++; + i++; + } + if (i >= col) + break; + // Assign left key if available. + if (left < mLeftKeys) { + left++; + pos = -left; + i++; + } + if (i >= col) + break; + } + return pos; + } + + private static int getTopRowEmptySlots(int numKeys, int numColumns) { + final int remainingKeys = numKeys % numColumns; + if (remainingKeys == 0) { + return 0; + } else { + return numColumns - remainingKeys; + } + } + + private int getOptimizedColumns(int numKeys, int maxColumns) { + int numColumns = Math.min(numKeys, maxColumns); + while (getTopRowEmptySlots(numKeys, numColumns) >= mNumRows) { + numColumns--; + } + return numColumns; + } + + public int getDefaultKeyCoordX() { + return mLeftKeys * mKeyWidth; + } + + public int getX(int n, int row) { + final int x = getColumnPos(n) * mKeyWidth + getDefaultKeyCoordX(); + if (isTopRow(row)) { + return x + mTopRowAdjustment * (mKeyWidth / 2); + } + return x; + } + + public int getY(int row) { + return (mNumRows - 1 - row) * mRowHeight; + } + + public int getRowFlags(int row) { + int rowFlags = 0; + if (row == 0) rowFlags |= Keyboard.EDGE_TOP; + if (isTopRow(row)) rowFlags |= Keyboard.EDGE_BOTTOM; + return rowFlags; + } + + private boolean isTopRow(int rowCount) { + return rowCount == mNumRows - 1; + } + } + + public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key parentKey, + Keyboard parentKeyboard) { + final Context context = view.getContext(); + mRes = context.getResources(); + final MiniKeyboard keyboard = new MiniKeyboard( + context, layoutTemplateResId, parentKeyboard); + mKeyboard = keyboard; + mPopupCharacters = parentKey.mPopupCharacters; + + final int keyWidth = getMaxKeyWidth(view, mPopupCharacters, keyboard.getKeyWidth()); + final MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams( + mPopupCharacters.length, parentKey.mMaxPopupColumn, + keyWidth, parentKeyboard.getRowHeight(), + parentKey.mX + (parentKey.mWidth + parentKey.mGap) / 2 - keyWidth / 2, + view.getMeasuredWidth()); + mParams = params; + + keyboard.setRowHeight(params.mRowHeight); + keyboard.setHeight(params.mNumRows * params.mRowHeight); + keyboard.setMinWidth(params.mNumColumns * params.mKeyWidth); + keyboard.setDefaultCoordX(params.getDefaultKeyCoordX() + params.mKeyWidth / 2); + } + + private static int getMaxKeyWidth(KeyboardView view, CharSequence[] popupCharacters, + int minKeyWidth) { + Paint paint = null; + Rect bounds = null; + int maxWidth = 0; + for (CharSequence popupSpec : popupCharacters) { + final CharSequence label = PopupCharactersParser.getLabel(popupSpec.toString()); + // If the label is single letter, minKeyWidth is enough to hold the label. + if (label != null && label.length() > 1) { + if (paint == null) { + paint = new Paint(); + paint.setAntiAlias(true); + } + final int labelSize = view.getLabelSizeAndSetPaint(label, 0, paint); + paint.setTextSize(labelSize); + if (bounds == null) bounds = new Rect(); + paint.getTextBounds(label.toString(), 0, label.length(), bounds); + if (maxWidth < bounds.width()) + maxWidth = bounds.width(); + } + } + final int horizontalPadding = (int)view.getContext().getResources().getDimension( + R.dimen.mini_keyboard_key_horizontal_padding); + return Math.max(minKeyWidth, maxWidth + horizontalPadding); + } + + public MiniKeyboard build() { + final MiniKeyboard keyboard = mKeyboard; + final List<Key> keys = keyboard.getKeys(); + final MiniKeyboardLayoutParams params = mParams; + for (int n = 0; n < mPopupCharacters.length; n++) { + final CharSequence label = mPopupCharacters[n]; + final int row = n / params.mNumColumns; + final Key key = new Key(mRes, keyboard, label, params.getX(n, row), params.getY(row), + params.mKeyWidth, params.mRowHeight, params.getRowFlags(row)); + keys.add(key); + } + return keyboard; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/ModifierKeyState.java b/java/src/com/android/inputmethod/keyboard/internal/ModifierKeyState.java new file mode 100644 index 000000000..dae73c4e4 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/ModifierKeyState.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.util.Log; + +import com.android.inputmethod.keyboard.KeyboardSwitcher; + +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/internal/PointerTrackerKeyState.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerKeyState.java new file mode 100644 index 000000000..ddadb1338 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerKeyState.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import com.android.inputmethod.keyboard.KeyDetector; +import com.android.inputmethod.keyboard.PointerTracker; + +/** + * This class keeps track of a key index and a position where {@link PointerTracker} is. + */ +public class PointerTrackerKeyState { + private final KeyDetector mKeyDetector; + + // The position and time at which first down event occurred. + private long mDownTime; + private long mUpTime; + + // The current key index where this pointer is. + private int mKeyIndex = KeyDetector.NOT_A_KEY; + // The position where mKeyIndex was recognized for the first time. + private int mKeyX; + private int mKeyY; + + // Last pointer position. + private int mLastX; + private int mLastY; + + public PointerTrackerKeyState(KeyDetector keyDetecor) { + mKeyDetector = keyDetecor; + } + + public int getKeyIndex() { + return mKeyIndex; + } + + public int getKeyX() { + return mKeyX; + } + + public int getKeyY() { + return mKeyY; + } + + public long getDownTime() { + return mDownTime; + } + + public long getUpTime() { + return mUpTime; + } + + public int getLastX() { + return mLastX; + } + + public int getLastY() { + return mLastY; + } + + public int onDownKey(int x, int y, long eventTime) { + mDownTime = eventTime; + return onMoveToNewKey(onMoveKeyInternal(x, y), x, y); + } + + private int onMoveKeyInternal(int x, int y) { + mLastX = x; + mLastY = y; + return mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); + } + + public int onMoveKey(int x, int y) { + return onMoveKeyInternal(x, y); + } + + public int onMoveToNewKey(int keyIndex, int x, int y) { + mKeyIndex = keyIndex; + mKeyX = x; + mKeyY = y; + return keyIndex; + } + + public int onUpKey(int x, int y, long eventTime) { + mUpTime = eventTime; + mKeyIndex = KeyDetector.NOT_A_KEY; + return onMoveKeyInternal(x, y); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java new file mode 100644 index 000000000..f87cd869e --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import com.android.inputmethod.keyboard.PointerTracker; + +import java.util.LinkedList; + +public class PointerTrackerQueue { + private LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>(); + + public void add(PointerTracker tracker) { + mQueue.add(tracker); + } + + public void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) { + if (mQueue.lastIndexOf(tracker) < 0) { + return; + } + final 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.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime, true); + queue.remove(oldestPos); + } + } + } + + public void releaseAllPointers(long eventTime) { + releaseAllPointersExcept(null, eventTime, true); + } + + public void releaseAllPointersExcept(PointerTracker tracker, long eventTime, + boolean updateReleasedKeyGraphics) { + for (PointerTracker t : mQueue) { + if (t == tracker) + continue; + t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime, updateReleasedKeyGraphics); + } + 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/internal/PopupCharactersParser.java b/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java new file mode 100644 index 000000000..8276f5d78 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.res.Resources; +import android.text.TextUtils; +import android.util.Log; + +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.latin.R; + +/** + * 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 (@icon/icon_number|@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. + * See {@link KeyboardIconsSet} about icon_number. + */ +public class PopupCharactersParser { + private static final String TAG = PopupCharactersParser.class.getSimpleName(); + + 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 + "icon/"; + 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 int getIconId(String popupSpec) { + if (hasIcon(popupSpec)) { + int end = popupSpec.indexOf(LABEL_END, PREFIX_ICON.length() + 1); + final String iconId = popupSpec.substring(PREFIX_ICON.length(), end); + try { + return Integer.valueOf(iconId); + } catch (NumberFormatException e) { + Log.w(TAG, "illegal icon id specified: " + iconId); + return KeyboardIconsSet.ICON_UNDEFINED; + } + } + return KeyboardIconsSet.ICON_UNDEFINED; + } + + 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/internal/Row.java b/java/src/com/android/inputmethod/keyboard/internal/Row.java new file mode 100644 index 000000000..06aadcc05 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/Row.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.util.Xml; + +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.latin.R; + +/** + * Container for keys in the keyboard. All keys in a row are at the same Y-coordinate. + * Some of the key size defaults can be overridden per row from what the {@link Keyboard} + * defines. + */ +public class Row { + /** Default width of a key in this row. */ + public final int mDefaultWidth; + /** Default height of a key in this row. */ + public final int mDefaultHeight; + /** Default horizontal gap between keys in this row. */ + public final int mDefaultHorizontalGap; + /** Vertical gap following this row. */ + public final int mVerticalGap; + /** + * Edge flags for this row of keys. Possible values that can be assigned are + * {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM} + */ + public final int mRowEdgeFlags; + + private final Keyboard mKeyboard; + + public Row(Resources res, Keyboard keyboard, XmlResourceParser parser) { + this.mKeyboard = keyboard; + final int keyboardWidth = keyboard.getDisplayWidth(); + final int keyboardHeight = keyboard.getKeyboardHeight(); + TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard); + mDefaultWidth = KeyboardParser.getDimensionOrFraction(a, + R.styleable.Keyboard_keyWidth, keyboardWidth, keyboard.getKeyWidth()); + mDefaultHeight = KeyboardParser.getDimensionOrFraction(a, + R.styleable.Keyboard_rowHeight, keyboardHeight, keyboard.getRowHeight()); + mDefaultHorizontalGap = KeyboardParser.getDimensionOrFraction(a, + R.styleable.Keyboard_horizontalGap, keyboardWidth, keyboard.getHorizontalGap()); + mVerticalGap = KeyboardParser.getDimensionOrFraction(a, + R.styleable.Keyboard_verticalGap, keyboardHeight, keyboard.getVerticalGap()); + a.recycle(); + a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.Keyboard_Row); + mRowEdgeFlags = a.getInt(R.styleable.Keyboard_Row_rowEdgeFlags, 0); + a.recycle(); + } + + public Keyboard getKeyboard() { + return mKeyboard; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/ShiftKeyState.java b/java/src/com/android/inputmethod/keyboard/internal/ShiftKeyState.java new file mode 100644 index 000000000..6617b917f --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/ShiftKeyState.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +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/internal/SlidingLocaleDrawable.java b/java/src/com/android/inputmethod/keyboard/internal/SlidingLocaleDrawable.java new file mode 100644 index 000000000..f8c81adfb --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/SlidingLocaleDrawable.java @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Paint.Align; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; +import android.text.TextPaint; +import android.view.ViewConfiguration; + +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.LatinKeyboard; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SubtypeSwitcher; + +/** + * 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 static final int SLIDE_SPEED_MULTIPLIER_RATIO = 150; + private final int mWidth; + private final int mHeight; + private final Drawable mBackground; + private final int mSpacebarTextColor; + 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) { + mBackground = background; + Keyboard.setDefaultBounds(background); + mWidth = width; + mHeight = height; + final TextPaint textPaint = new TextPaint(); + textPaint.setTextSize(LatinKeyboard.getTextSizeFromTheme( + context.getTheme(), android.R.style.TextAppearance_Medium, 18)); + textPaint.setColor(Color.TRANSPARENT); + textPaint.setTextAlign(Align.CENTER); + textPaint.setAntiAlias(true); + mTextPaint = textPaint; + mMiddleX = (background != null) ? (mWidth - mBackground.getIntrinsicWidth()) / 2 : 0; + + final TypedArray a = context.obtainStyledAttributes( + null, R.styleable.LatinKeyboard, R.attr.latinKeyboardStyle, R.style.LatinKeyboard); + mSpacebarTextColor = a.getColor(R.styleable.LatinKeyboard_spacebarTextColor, 0); + mLeftDrawable = a.getDrawable(R.styleable.LatinKeyboard_spacebarArrowPreviewLeftIcon); + mRightDrawable = a.getDrawable(R.styleable.LatinKeyboard_spacebarArrowPreviewRightIcon); + a.recycle(); + + mThreshold = ViewConfiguration.get(context).getScaledTouchSlop(); + } + + public void setDiff(int diff) { + if (diff == Integer.MAX_VALUE) { + mHitThreshold = false; + mCurrentLanguage = null; + return; + } + mDiff = Math.max(diff, diff * SLIDE_SPEED_MULTIPLIER_RATIO / 100); + 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(mSpacebarTextColor); + 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); + + if (lArrow != null && rArrow != null) { + 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/internal/SwipeTracker.java index 970e91965..8d192c2f0 100644 --- a/java/src/com/android/inputmethod/latin/SwipeTracker.java +++ b/java/src/com/android/inputmethod/keyboard/internal/SwipeTracker.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Google Inc. + * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,11 +14,11 @@ * the License. */ -package com.android.inputmethod.latin; +package com.android.inputmethod.keyboard.internal; 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/AssetFileAddress.java b/java/src/com/android/inputmethod/latin/AssetFileAddress.java new file mode 100644 index 000000000..074ecacc5 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/AssetFileAddress.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import java.io.File; + +/** + * Immutable class to hold the address of an asset. + * As opposed to a normal file, an asset is usually represented as a contiguous byte array in + * the package file. Open it correctly thus requires the name of the package it is in, but + * also the offset in the file and the length of this data. This class encapsulates these three. + */ +class AssetFileAddress { + public final String mFilename; + public final long mOffset; + public final long mLength; + + public AssetFileAddress(final String filename, final long offset, final long length) { + mFilename = filename; + mOffset = offset; + mLength = length; + } + + public static AssetFileAddress makeFromFileName(final String filename) { + if (null == filename) return null; + File f = new File(filename); + if (null == f || !f.isFile()) return null; + return new AssetFileAddress(filename, 0l, f.length()); + } + + public static AssetFileAddress makeFromFileNameAndOffset(final String filename, + final long offset, final long length) { + if (null == filename) return null; + File f = new File(filename); + if (null == f || !f.isFile()) return null; + return new AssetFileAddress(filename, offset, length); + } +} diff --git a/java/src/com/android/inputmethod/latin/AutoCorrection.java b/java/src/com/android/inputmethod/latin/AutoCorrection.java new file mode 100644 index 000000000..d3119792c --- /dev/null +++ b/java/src/com/android/inputmethod/latin/AutoCorrection.java @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.latin; + +import android.text.TextUtils; +import android.util.Log; + +import java.util.ArrayList; +import java.util.Map; + +public class AutoCorrection { + private static final boolean DBG = LatinImeLogger.sDBG; + private static final String TAG = AutoCorrection.class.getSimpleName(); + private boolean mHasAutoCorrection; + private CharSequence mAutoCorrectionWord; + private double mNormalizedScore; + + public void init() { + mHasAutoCorrection = false; + mAutoCorrectionWord = null; + mNormalizedScore = Integer.MIN_VALUE; + } + + public boolean hasAutoCorrection() { + return mHasAutoCorrection; + } + + public CharSequence getAutoCorrectionWord() { + return mAutoCorrectionWord; + } + + public double getNormalizedScore() { + return mNormalizedScore; + } + + public void updateAutoCorrectionStatus(Map<String, Dictionary> dictionaries, + WordComposer wordComposer, ArrayList<CharSequence> suggestions, int[] sortedScores, + CharSequence typedWord, double autoCorrectionThreshold, int correctionMode, + CharSequence quickFixedWord, CharSequence whitelistedWord) { + if (hasAutoCorrectionForWhitelistedWord(whitelistedWord)) { + mHasAutoCorrection = true; + mAutoCorrectionWord = whitelistedWord; + } else if (hasAutoCorrectionForTypedWord( + dictionaries, wordComposer, suggestions, typedWord, correctionMode)) { + mHasAutoCorrection = true; + mAutoCorrectionWord = typedWord; + } else if (hasAutoCorrectionForQuickFix(quickFixedWord)) { + mHasAutoCorrection = true; + mAutoCorrectionWord = quickFixedWord; + } else if (hasAutoCorrectionForBinaryDictionary(wordComposer, suggestions, correctionMode, + sortedScores, typedWord, autoCorrectionThreshold)) { + mHasAutoCorrection = true; + mAutoCorrectionWord = suggestions.get(0); + } + } + + public static boolean isValidWord( + Map<String, Dictionary> dictionaries, CharSequence word, boolean ignoreCase) { + if (TextUtils.isEmpty(word)) { + return false; + } + final CharSequence lowerCasedWord = word.toString().toLowerCase(); + for (final String key : dictionaries.keySet()) { + if (key.equals(Suggest.DICT_KEY_WHITELIST)) continue; + final Dictionary dictionary = dictionaries.get(key); + if (dictionary.isValidWord(word) + || (ignoreCase && dictionary.isValidWord(lowerCasedWord))) { + return true; + } + } + return false; + } + + public static boolean isValidWordForAutoCorrection( + Map<String, Dictionary> dictionaries, CharSequence word, boolean ignoreCase) { + final Dictionary whiteList = dictionaries.get(Suggest.DICT_KEY_WHITELIST); + // If "word" is in the whitelist dictionary, it should not be auto corrected. + if (whiteList != null && whiteList.isValidWord(word)) { + return false; + } + return isValidWord(dictionaries, word, ignoreCase); + } + + private static boolean hasAutoCorrectionForWhitelistedWord(CharSequence whiteListedWord) { + return whiteListedWord != null; + } + + private boolean hasAutoCorrectionForTypedWord(Map<String, Dictionary> dictionaries, + WordComposer wordComposer, ArrayList<CharSequence> suggestions, CharSequence typedWord, + int correctionMode) { + if (TextUtils.isEmpty(typedWord)) return false; + boolean isValidWord = isValidWordForAutoCorrection(dictionaries, typedWord, false); + return wordComposer.size() > 1 && suggestions.size() > 0 && isValidWord + && (correctionMode == Suggest.CORRECTION_FULL + || correctionMode == Suggest.CORRECTION_FULL_BIGRAM); + } + + private static boolean hasAutoCorrectionForQuickFix(CharSequence quickFixedWord) { + return quickFixedWord != null; + } + + private boolean hasAutoCorrectionForBinaryDictionary(WordComposer wordComposer, + ArrayList<CharSequence> suggestions, int correctionMode, int[] sortedScores, + CharSequence typedWord, double autoCorrectionThreshold) { + if (wordComposer.size() > 1 && (correctionMode == Suggest.CORRECTION_FULL + || correctionMode == Suggest.CORRECTION_FULL_BIGRAM) + && typedWord != null && suggestions.size() > 0 && sortedScores.length > 0) { + final CharSequence autoCorrectionCandidate = suggestions.get(0); + final int autoCorrectionCandidateScore = sortedScores[0]; + // TODO: when the normalized score of the first suggestion is nearly equals to + // the normalized score of the second suggestion, behave less aggressive. + mNormalizedScore = Utils.calcNormalizedScore( + typedWord,autoCorrectionCandidate, autoCorrectionCandidateScore); + if (DBG) { + Log.d(TAG, "Normalized " + typedWord + "," + autoCorrectionCandidate + "," + + autoCorrectionCandidateScore + ", " + mNormalizedScore + + "(" + autoCorrectionThreshold + ")"); + } + if (mNormalizedScore >= autoCorrectionThreshold) { + if (DBG) { + Log.d(TAG, "Auto corrected by S-threshold."); + } + return true; + } + } + return false; + } + +} diff --git a/java/src/com/android/inputmethod/latin/AutoDictionary.java b/java/src/com/android/inputmethod/latin/AutoDictionary.java index 4fbb5b012..460930f16 100644 --- a/java/src/com/android/inputmethod/latin/AutoDictionary.java +++ b/java/src/com/android/inputmethod/latin/AutoDictionary.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Google Inc. + * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -16,10 +16,6 @@ package com.android.inputmethod.latin; -import java.util.HashMap; -import java.util.Set; -import java.util.Map.Entry; - import android.content.ContentValues; import android.content.Context; import android.database.Cursor; @@ -30,6 +26,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 @@ -41,13 +41,8 @@ public class AutoDictionary extends ExpandableDictionary { static final int FREQUENCY_FOR_PICKED = 3; // Weight added to a user typing a new word that doesn't get corrected (or is reverted) static final int FREQUENCY_FOR_TYPED = 1; - // A word that is frequently typed and gets promoted to the user dictionary, uses this - // frequency. - static final int FREQUENCY_FOR_AUTO_ADD = 250; // If the user touches a typed word 2 times or more, it will become valid. private static final int VALIDITY_THRESHOLD = 2 * FREQUENCY_FOR_PICKED; - // If the user touches a typed word 4 times or more, it will be added to the user dict. - private static final int PROMOTION_THRESHOLD = 4 * FREQUENCY_FOR_PICKED; private LatinIME mIme; // Locale for which this auto dictionary is storing words @@ -98,7 +93,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 +133,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; @@ -150,11 +146,6 @@ public class AutoDictionary extends ExpandableDictionary { freq = freq < 0 ? addFrequency : freq + addFrequency; super.addWord(word, freq); - if (freq >= PROMOTION_THRESHOLD) { - mIme.promoteToUserDictionary(word, FREQUENCY_FOR_AUTO_ADD); - freq = 0; - } - synchronized (mPendingWritesLock) { // Write a null frequency if it is to be deleted from the db mPendingWrites.put(word, freq == 0 ? null : new Integer(freq)); @@ -224,7 +215,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..9748d6006 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -1,12 +1,12 @@ /* * Copyright (C) 2008 The Android Open Source Project - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -16,224 +16,193 @@ package com.android.inputmethod.latin; -import java.io.InputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.channels.Channels; -import java.util.Arrays; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.keyboard.ProximityInfo; import android.content.Context; -import android.util.Log; + +import java.util.Arrays; /** * Implements a static, compacted, binary dictionary of standard words. */ public class BinaryDictionary extends Dictionary { + public static final String DICTIONARY_PACK_AUTHORITY = + "com.android.inputmethod.latin.dictionarypack"; + /** - * There is difference between what java and native code can handle. + * There is a difference between what java and native code can handle. * This value should only be used in BinaryDictionary.java * It is necessary to keep it at this value because some languages e.g. German have * really long words. */ - protected static final int MAX_WORD_LENGTH = 48; + public static final int MAX_WORD_LENGTH = 48; + public static final int MAX_WORDS = 18; + @SuppressWarnings("unused") private static final String TAG = "BinaryDictionary"; - private static final int MAX_ALTERNATIVES = 16; - private static final int MAX_WORDS = 18; + private static final int MAX_PROXIMITY_CHARS_SIZE = ProximityInfo.MAX_PROXIMITY_CHARS_SIZE; private static final int MAX_BIGRAMS = 60; private static final int TYPED_LETTER_MULTIPLIER = 2; - private static final boolean ENABLE_MISSED_CHARACTERS = true; private int mDicTypeId; private int mNativeDict; - private int mDictLength; - private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES]; - private char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS]; - private char[] mOutputChars_bigrams = new char[MAX_WORD_LENGTH * MAX_BIGRAMS]; - private int[] mFrequencies = new int[MAX_WORDS]; - private int[] mFrequencies_bigrams = new int[MAX_BIGRAMS]; - // Keep a reference to the native dict direct buffer in Java to avoid - // unexpected deallocation of the direct buffer. - private ByteBuffer mNativeDictDirectBuffer; + private final int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_PROXIMITY_CHARS_SIZE]; + private final char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS]; + private final char[] mOutputChars_bigrams = new char[MAX_WORD_LENGTH * MAX_BIGRAMS]; + private final int[] mScores = new int[MAX_WORDS]; + private final int[] mBigramScores = new int[MAX_BIGRAMS]; - static { - try { - System.loadLibrary("jni_latinime"); - } catch (UnsatisfiedLinkError ule) { - Log.e("BinaryDictionary", "Could not load native library jni_latinime"); - } - } + private final KeyboardSwitcher mKeyboardSwitcher = KeyboardSwitcher.getInstance(); + + public static final Flag FLAG_REQUIRES_GERMAN_UMLAUT_PROCESSING = + new Flag(R.bool.config_require_umlaut_processing, 0x1); + + // Can create a new flag from extravalue : + // public static final Flag FLAG_MYFLAG = + // new Flag("my_flag", 0x02); + + private static final Flag[] ALL_FLAGS = { + // Here should reside all flags that trigger some special processing + // These *must* match the definition in UnigramDictionary enum in + // unigram_dictionary.h so please update both at the same time. + FLAG_REQUIRES_GERMAN_UMLAUT_PROCESSING, + }; + + private int mFlags = 0; /** - * Create a dictionary from a raw resource file - * @param context application context for reading resources - * @param resId the resource containing the raw binary dictionary + * Constructor for the binary dictionary. This is supposed to be called from the + * dictionary factory. + * All implementations should pass null into flagArray, except for testing purposes. + * @param context the context to access the environment from. + * @param filename the name of the file to read through native code. + * @param offset the offset of the dictionary data within the file. + * @param length the length of the binary data. + * @param flagArray the flags to limit the dictionary to, or null for default. */ - public BinaryDictionary(Context context, int[] resId, int dicTypeId) { - if (resId != null && resId.length > 0 && resId[0] != 0) { - loadDictionary(context, resId); - } - mDicTypeId = dicTypeId; + public BinaryDictionary(final Context context, + final String filename, final long offset, final long length, Flag[] flagArray) { + // Note: at the moment a binary dictionary is always of the "main" type. + // Initializing this here will help transitioning out of the scheme where + // the Suggest class knows everything about every single dictionary. + mDicTypeId = Suggest.DIC_MAIN; + // TODO: Stop relying on the state of SubtypeSwitcher, get it as a parameter + mFlags = Flag.initFlags(null == flagArray ? ALL_FLAGS : flagArray, context, + SubtypeSwitcher.getInstance()); + loadDictionary(filename, offset, length); } - /** - * Create a dictionary from a byte buffer. This is used for testing. - * @param context application context for reading resources - * @param byteBuffer a ByteBuffer containing the binary dictionary - */ - public BinaryDictionary(Context context, ByteBuffer byteBuffer, int dicTypeId) { - if (byteBuffer != null) { - if (byteBuffer.isDirect()) { - mNativeDictDirectBuffer = byteBuffer; - } else { - mNativeDictDirectBuffer = ByteBuffer.allocateDirect(byteBuffer.capacity()); - byteBuffer.rewind(); - mNativeDictDirectBuffer.put(byteBuffer); - } - mDictLength = byteBuffer.capacity(); - mNativeDict = openNative(mNativeDictDirectBuffer, - TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); - } - mDicTypeId = dicTypeId; + static { + Utils.loadNativeLibrary(); } - private native int openNative(ByteBuffer bb, int typedLetterMultiplier, - int fullWordMultiplier); + private native int openNative(String sourceDir, long dictOffset, long dictSize, + int typedLetterMultiplier, int fullWordMultiplier, int maxWordLength, + int maxWords, int maxAlternatives); private native void closeNative(int dict); private native boolean isValidWordNative(int nativeData, char[] word, int wordLength); - private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize, - char[] outputChars, int[] frequencies, int maxWordLength, int maxWords, - int maxAlternatives, int skipPos, int[] nextLettersFrequencies, int nextLettersSize); + private native int getSuggestionsNative(int dict, int proximityInfo, int[] xCoordinates, + int[] yCoordinates, int[] inputCodes, int codesSize, int flags, char[] outputChars, + int[] scores); private native int getBigramsNative(int dict, char[] prevWord, int prevWordLength, - int[] inputCodes, int inputCodesLength, char[] outputChars, int[] frequencies, + int[] inputCodes, int inputCodesLength, char[] outputChars, int[] scores, int maxWordLength, int maxBigrams, int maxAlternatives); - private final void loadDictionary(Context context, int[] resId) { - InputStream[] is = null; - try { - // merging separated dictionary into one if dictionary is separated - int total = 0; - is = new InputStream[resId.length]; - for (int i = 0; i < resId.length; i++) { - is[i] = context.getResources().openRawResource(resId[i]); - total += is[i].available(); - } - - mNativeDictDirectBuffer = - ByteBuffer.allocateDirect(total).order(ByteOrder.nativeOrder()); - int got = 0; - for (int i = 0; i < resId.length; i++) { - got += Channels.newChannel(is[i]).read(mNativeDictDirectBuffer); - } - if (got != total) { - Log.e(TAG, "Read " + got + " bytes, expected " + total); - } else { - mNativeDict = openNative(mNativeDictDirectBuffer, - TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); - mDictLength = total; - } - } catch (IOException e) { - Log.w(TAG, "No available memory for binary dictionary"); - } finally { - try { - if (is != null) { - for (int i = 0; i < is.length; i++) { - is[i].close(); - } - } - } catch (IOException e) { - Log.w(TAG, "Failed to close input stream"); - } - } + private final void loadDictionary(String path, long startOffset, long length) { + mNativeDict = openNative(path, startOffset, length, + TYPED_LETTER_MULTIPLIER, FULL_WORD_SCORE_MULTIPLIER, + MAX_WORD_LENGTH, MAX_WORDS, MAX_PROXIMITY_CHARS_SIZE); } - @Override public void getBigrams(final WordComposer codes, final CharSequence previousWord, - final WordCallback callback, int[] nextLettersFrequencies) { + final WordCallback callback) { + if (mNativeDict == 0) return; char[] chars = previousWord.toString().toCharArray(); Arrays.fill(mOutputChars_bigrams, (char) 0); - Arrays.fill(mFrequencies_bigrams, 0); + Arrays.fill(mBigramScores, 0); int codesSize = codes.size(); + if (codesSize <= 0) { + // Do not return bigrams from BinaryDictionary when nothing was typed. + // Only use user-history bigrams (or whatever other bigram dictionaries decide). + return; + } Arrays.fill(mInputCodes, -1); int[] alternatives = codes.getCodesAt(0); System.arraycopy(alternatives, 0, mInputCodes, 0, - Math.min(alternatives.length, MAX_ALTERNATIVES)); + Math.min(alternatives.length, MAX_PROXIMITY_CHARS_SIZE)); int count = getBigramsNative(mNativeDict, chars, chars.length, mInputCodes, codesSize, - mOutputChars_bigrams, mFrequencies_bigrams, MAX_WORD_LENGTH, MAX_BIGRAMS, - MAX_ALTERNATIVES); + mOutputChars_bigrams, mBigramScores, MAX_WORD_LENGTH, MAX_BIGRAMS, + MAX_PROXIMITY_CHARS_SIZE); - for (int j = 0; j < count; j++) { - if (mFrequencies_bigrams[j] < 1) break; - int start = j * MAX_WORD_LENGTH; + for (int j = 0; j < count; ++j) { + if (mBigramScores[j] < 1) break; + 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], + callback.addWord(mOutputChars_bigrams, start, len, mBigramScores[j], mDicTypeId, DataType.BIGRAM); } } } @Override - public void getWords(final WordComposer codes, final WordCallback callback, - int[] nextLettersFrequencies) { - final int codesSize = codes.size(); - // Won't deal with really long words. - if (codesSize > MAX_WORD_LENGTH - 1) return; - - Arrays.fill(mInputCodes, -1); - for (int i = 0; i < codesSize; i++) { - int[] alternatives = codes.getCodesAt(i); - System.arraycopy(alternatives, 0, mInputCodes, i * MAX_ALTERNATIVES, - Math.min(alternatives.length, MAX_ALTERNATIVES)); - } - Arrays.fill(mOutputChars, (char) 0); - Arrays.fill(mFrequencies, 0); - - int count = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, - mOutputChars, mFrequencies, - MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES, -1, - nextLettersFrequencies, - nextLettersFrequencies != null ? nextLettersFrequencies.length : 0); - - // If there aren't sufficient suggestions, search for words by allowing wild cards at - // the different character positions. This feature is not ready for prime-time as we need - // to figure out the best ranking for such words compared to proximity corrections and - // completions. - if (ENABLE_MISSED_CHARACTERS && count < 5) { - for (int skip = 0; skip < codesSize; skip++) { - int tempCount = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, - mOutputChars, mFrequencies, - MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES, skip, - null, 0); - count = Math.max(count, tempCount); - if (tempCount > 0) break; - } - } + public void getWords(final WordComposer codes, final WordCallback callback) { + final int count = getSuggestions(codes, mKeyboardSwitcher.getLatinKeyboard(), + mOutputChars, mScores); - for (int j = 0; j < count; j++) { - if (mFrequencies[j] < 1) break; - int start = j * MAX_WORD_LENGTH; + for (int j = 0; j < count; ++j) { + if (mScores[j] < 1) break; + 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, + callback.addWord(mOutputChars, start, len, mScores[j], mDicTypeId, DataType.UNIGRAM); } } } + /* package for test */ boolean isValidDictionary() { + return mNativeDict != 0; + } + + /* package for test */ int getSuggestions(final WordComposer codes, final Keyboard keyboard, + char[] outputChars, int[] scores) { + if (!isValidDictionary()) return -1; + + final int codesSize = codes.size(); + // Won't deal with really long words. + if (codesSize > MAX_WORD_LENGTH - 1) return -1; + + Arrays.fill(mInputCodes, WordComposer.NOT_A_CODE); + for (int i = 0; i < codesSize; i++) { + int[] alternatives = codes.getCodesAt(i); + System.arraycopy(alternatives, 0, mInputCodes, i * MAX_PROXIMITY_CHARS_SIZE, + Math.min(alternatives.length, MAX_PROXIMITY_CHARS_SIZE)); + } + Arrays.fill(outputChars, (char) 0); + Arrays.fill(scores, 0); + + final int proximityInfo = keyboard == null ? 0 : keyboard.getProximityInfo(); + return getSuggestionsNative( + mNativeDict, proximityInfo, + codes.getXCoordinates(), codes.getYCoordinates(), mInputCodes, codesSize, + mFlags, outputChars, scores); + } + @Override public boolean isValidWord(CharSequence word) { if (word == null) return false; @@ -241,12 +210,12 @@ public class BinaryDictionary extends Dictionary { return isValidWordNative(mNativeDict, chars, chars.length); } - public int getSize() { - return mDictLength; // This value is initialized on the call to openNative() - } - @Override public synchronized void close() { + closeInternal(); + } + + private void closeInternal() { if (mNativeDict != 0) { closeNative(mNativeDict); mNativeDict = 0; @@ -255,7 +224,10 @@ public class BinaryDictionary extends Dictionary { @Override protected void finalize() throws Throwable { - close(); - super.finalize(); + try { + closeInternal(); + } finally { + super.finalize(); + } } } diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java new file mode 100644 index 000000000..76a230f82 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.res.AssetFileDescriptor; +import android.net.Uri; +import android.text.TextUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +/** + * Group class for static methods to help with creation and getting of the binary dictionary + * file from the dictionary provider + */ +public class BinaryDictionaryFileDumper { + /** + * The size of the temporary buffer to copy files. + */ + static final int FILE_READ_BUFFER_SIZE = 1024; + + // Prevents this class to be accidentally instantiated. + private BinaryDictionaryFileDumper() { + } + + /** + * Generates a file name that matches the locale passed as an argument. + * The file name is basically the result of the .toString() method, except we replace + * any @File.separator with an underscore to avoid generating a file name that may not + * be created. + * @param locale the locale for which to get the file name + * @param context the context to use for getting the directory + * @return the name of the file to be created + */ + private static String getCacheFileNameForLocale(Locale locale, Context context) { + // The following assumes two things : + // 1. That File.separator is not the same character as "_" + // I don't think any android system will ever use "_" as a path separator + // 2. That no two locales differ by only a File.separator versus a "_" + // Since "_" can't be part of locale components this should be safe. + // Examples: + // en -> en + // en_US_POSIX -> en_US_POSIX + // en__foo/bar -> en__foo_bar + final String[] separator = { File.separator }; + final String[] empty = { "_" }; + final CharSequence basename = TextUtils.replace(locale.toString(), separator, empty); + return context.getFilesDir() + File.separator + basename; + } + + /** + * Return for a given locale the provider URI to query to get the dictionary. + */ + public static Uri getProviderUri(Locale locale) { + return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) + .authority(BinaryDictionary.DICTIONARY_PACK_AUTHORITY).appendPath( + locale.toString()).build(); + } + + /** + * Queries a content provider for dictionary data for some locale and returns the file addresses + * + * This will query a content provider for dictionary data for a given locale, and return + * the addresses of a file set the members of which are suitable to be mmap'ed. It will copy + * them to local storage if needed. + * It should also check the dictionary versions to avoid unnecessary copies but this is + * still in TODO state. + * This will make the data from the content provider the cached dictionary for this locale, + * overwriting any previous cached data. + * @returns the addresses of the files, or null if no data could be obtained. + * @throw FileNotFoundException if the provider returns non-existent data. + * @throw IOException if the provider-returned data could not be read. + */ + public static List<AssetFileAddress> getDictSetFromContentProvider(Locale locale, + Context context) throws FileNotFoundException, IOException { + // TODO: check whether the dictionary is the same or not and if it is, return the cached + // file. + // TODO: This should be able to read a number of files from the dictionary pack, copy + // them all and return them. + final ContentResolver resolver = context.getContentResolver(); + final Uri dictionaryPackUri = getProviderUri(locale); + final AssetFileDescriptor afd = resolver.openAssetFileDescriptor(dictionaryPackUri, "r"); + if (null == afd) return null; + final String fileName = + copyFileTo(afd.createInputStream(), getCacheFileNameForLocale(locale, context)); + return Arrays.asList(AssetFileAddress.makeFromFileName(fileName)); + } + + /** + * Accepts a file as dictionary data for some locale and returns the name of a file. + * + * This will make the data in the input file the cached dictionary for this locale, overwriting + * any previous cached data. + */ + public static String getDictionaryFileFromFile(String fileName, Locale locale, + Context context) throws FileNotFoundException, IOException { + return copyFileTo(new FileInputStream(fileName), getCacheFileNameForLocale(locale, + context)); + } + + /** + * Accepts a resource number as dictionary data for some locale and returns the name of a file. + * + * This will make the resource the cached dictionary for this locale, overwriting any previous + * cached data. + */ + public static String getDictionaryFileFromResource(int resource, Locale locale, + Context context) throws FileNotFoundException, IOException { + return copyFileTo(context.getResources().openRawResource(resource), + getCacheFileNameForLocale(locale, context)); + } + + /** + * Copies the data in an input stream to a target file, creating the file if necessary and + * overwriting it if it already exists. + * @param input the stream to be copied. + * @param outputFileName the name of a file to copy the data to. It is created if necessary. + */ + private static String copyFileTo(final InputStream input, final String outputFileName) + throws FileNotFoundException, IOException { + final byte[] buffer = new byte[FILE_READ_BUFFER_SIZE]; + final FileOutputStream output = new FileOutputStream(outputFileName); + for (int readBytes = input.read(buffer); readBytes >= 0; readBytes = input.read(buffer)) + output.write(buffer, 0, readBytes); + input.close(); + return outputFileName; + } +} diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java new file mode 100644 index 000000000..7ce92920d --- /dev/null +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import android.content.Context; +import android.content.res.AssetFileDescriptor; +import android.util.Log; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +/** + * Helper class to get the address of a mmap'able dictionary file. + */ +class BinaryDictionaryGetter { + + /** + * Used for Log actions from this class + */ + private static final String TAG = BinaryDictionaryGetter.class.getSimpleName(); + + // Prevents this from being instantiated + private BinaryDictionaryGetter() {} + + /** + * Returns a file address from a resource, or null if it cannot be opened. + */ + private static AssetFileAddress loadFallbackResource(Context context, int fallbackResId) { + final AssetFileDescriptor afd = context.getResources().openRawResourceFd(fallbackResId); + if (afd == null) { + Log.e(TAG, "Found the resource but cannot read it. Is it compressed? resId=" + + fallbackResId); + return null; + } + return AssetFileAddress.makeFromFileNameAndOffset( + context.getApplicationInfo().sourceDir, afd.getStartOffset(), afd.getLength()); + } + + /** + * Returns a list of file addresses for a given locale, trying relevant methods in order. + * + * Tries to get binary dictionaries from various sources, in order: + * - Uses a private method of getting a private dictionaries, as implemented by the + * PrivateBinaryDictionaryGetter class. + * If that fails: + * - Uses a content provider to get a public dictionary set, as per the protocol described + * in BinaryDictionaryFileDumper. + * If that fails: + * - Gets a file name from the fallback resource passed as an argument. + * If that fails: + * - Returns null. + * @return The address of a valid file, or null. + */ + public static List<AssetFileAddress> getDictionaryFiles(Locale locale, Context context, + int fallbackResId) { + // Try first to query a private package signed the same way for private files. + final List<AssetFileAddress> privateFiles = + PrivateBinaryDictionaryGetter.getDictionaryFiles(locale, context); + if (null != privateFiles) { + return privateFiles; + } else { + try { + // If that was no-go, try to find a publicly exported dictionary. + List<AssetFileAddress> listFromContentProvider = + BinaryDictionaryFileDumper.getDictSetFromContentProvider(locale, context); + if (null != listFromContentProvider) { + return listFromContentProvider; + } + // If the list is null, fall through and return the fallback + } catch (FileNotFoundException e) { + Log.e(TAG, "Unable to create dictionary file from provider for locale " + + locale.toString() + ": falling back to internal dictionary"); + } catch (IOException e) { + Log.e(TAG, "Unable to read source data for locale " + + locale.toString() + ": falling back to internal dictionary"); + } + return Arrays.asList(loadFallbackResource(context, fallbackResId)); + } + } +} diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index 68f288925..09fd3b473 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,128 @@ 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.content.res.TypedArray; +import android.graphics.Color; import android.graphics.Typeface; -import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Message; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.BackgroundColorSpan; +import android.text.style.CharacterStyle; +import android.text.style.ForegroundColorSpan; +import android.text.style.StyleSpan; +import android.text.style.UnderlineSpan; import android.util.AttributeSet; -import android.view.GestureDetector; import android.view.Gravity; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup.LayoutParams; +import android.view.View.OnClickListener; +import android.view.View.OnLongClickListener; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.TextView; +import com.android.inputmethod.compat.FrameLayoutCompatUtils; +import com.android.inputmethod.compat.LinearLayoutCompatUtils; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; + 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; + public interface Listener { + public boolean addWordToDictionary(String word); + public void pickSuggestionManually(int index, CharSequence word); + } - private final TextView mPreviewText; + private static final CharacterStyle BOLD_SPAN = new StyleSpan(Typeface.BOLD); + private static final CharacterStyle UNDERLINE_SPAN = new UnderlineSpan(); + // The maximum number of suggestions available. See {@link Suggest#mPrefMaxSuggestions}. + private static final int MAX_SUGGESTIONS = 18; + private static final int UNSPECIFIED_MEASURESPEC = MeasureSpec.makeMeasureSpec( + 0, MeasureSpec.UNSPECIFIED); + + private static final boolean DBG = LatinImeLogger.sDBG; + + private static final int NUM_CANDIDATES_IN_STRIP = 3; + private final ImageView mExpandCandidatesPane; + private final ImageView mCloseCandidatesPane; + private ViewGroup mCandidatesPane; + private ViewGroup mCandidatesPaneContainer; + private View mKeyboardView; + private final ArrayList<TextView> mWords = new ArrayList<TextView>(); + private final ArrayList<TextView> mInfos = new ArrayList<TextView>(); + private final ArrayList<View> mDividers = new ArrayList<View>(); + private final int mCandidatePadding; + private final int mCandidateStripHeight; + private final CharacterStyle mInvertedForegroundColorSpan; + private final CharacterStyle mInvertedBackgroundColorSpan; + private final int mAutoCorrectHighlight; + private static final int AUTO_CORRECT_BOLD = 0x01; + private static final int AUTO_CORRECT_UNDERLINE = 0x02; + private static final int AUTO_CORRECT_INVERT = 0x04; + private final int mColorTypedWord; + private final int mColorAutoCorrect; + private final int mColorSuggestedCandidate; private final PopupWindow mPreviewPopup; - private int mCurrentWordIndex; - private Drawable mDivider; - - private static final int MAX_SUGGESTIONS = 32; - private static final int SCROLL_PIXELS = 20; - - private final int[] mWordWidth = new int[MAX_SUGGESTIONS]; - private final int[] mWordX = new int[MAX_SUGGESTIONS]; - private int mPopupPreviewX; - private int mPopupPreviewY; - - private static final int X_GAP = 10; - - private final int mColorNormal; - private final int mColorRecommended; - private final int mColorOther; - private final Paint mPaint; - private final int mDescent; - private boolean mScrolled; + private final TextView mPreviewText; + + private Listener mListener; + 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(); + break; + } + } + + public void postHidePreview() { + cancelHidePreview(); + sendMessageDelayed(obtainMessage(MSG_HIDE_PREVIEW), DELAY_HIDE_PREVIEW); + } + + public void cancelHidePreview() { + removeMessages(MSG_HIDE_PREVIEW); + } + + public void postUpdateSuggestions() { + cancelUpdateSuggestions(); + sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTION), + DELAY_UPDATE_SUGGESTION); + } + + public void cancelUpdateSuggestions() { + removeMessages(MSG_UPDATE_SUGGESTION); + } + + public void cancelAllMessages() { + cancelHidePreview(); + cancelUpdateSuggestions(); + } + } /** * Construct a CandidateView for showing suggested words for completion. @@ -94,245 +147,298 @@ public class CandidateView extends View { * @param attrs */ public CandidateView(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.candidateViewStyle); + } + + public CandidateView(Context context, AttributeSet attrs, int defStyle) { + // Note: Up to version 10 (Gingerbread) of the API, LinearLayout doesn't have 3-argument + // constructor. + // TODO: Call 3-argument constructor, super(context, attrs, defStyle), when we abandon + // backward compatibility with the version 10 or earlier of the API. super(context, attrs); - mSelectionHighlight = context.getResources().getDrawable( - R.drawable.list_selector_background_pressed); + if (defStyle != R.attr.candidateViewStyle) { + throw new IllegalArgumentException( + "can't accept defStyle other than R.attr.candidayeViewStyle: defStyle=" + + defStyle); + } + setBackgroundDrawable(LinearLayoutCompatUtils.getBackgroundDrawable( + context, attrs, defStyle, R.style.CandidateViewStyle)); - LayoutInflater inflate = - (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); Resources res = context.getResources(); + LayoutInflater inflater = LayoutInflater.from(context); + inflater.inflate(R.layout.candidates_strip, this); + mPreviewPopup = new PopupWindow(context); - mPreviewText = (TextView) inflate.inflate(R.layout.candidate_preview, null); - mPreviewPopup.setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + 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); - 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(); - } + mCandidatePadding = res.getDimensionPixelOffset(R.dimen.candidate_padding); + mCandidateStripHeight = res.getDimensionPixelOffset(R.dimen.candidate_strip_height); + for (int i = 0; i < MAX_SUGGESTIONS; i++) { + final TextView word, info; + switch (i) { + case 0: + word = (TextView)findViewById(R.id.word_left); + word.setPadding(mCandidatePadding, 0, 0, 0); + info = (TextView)findViewById(R.id.info_left); + break; + case 1: + word = (TextView)findViewById(R.id.word_center); + info = (TextView)findViewById(R.id.info_center); + break; + case 2: + word = (TextView)findViewById(R.id.word_right); + info = (TextView)findViewById(R.id.info_right); + break; + default: + word = (TextView)inflater.inflate(R.layout.candidate_word, null); + info = (TextView)inflater.inflate(R.layout.candidate_info, null); + break; } - } - - @Override - public boolean onDown(MotionEvent e) { - mScrolled = false; - return false; - } - - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, - float distanceX, float distanceY) { - if (!mScrolled) { - // This is applied only when we recognize that scrolling is starting. - final int deltaX = (int) (e2.getX() - e1.getX()); - final int deltaY = (int) (e2.getY() - e1.getY()); - final int distance = (deltaX * deltaX) + (deltaY * deltaY); - if (distance < mTouchSlopSquare) { - return true; - } - mScrolled = true; + word.setTag(i); + word.setOnClickListener(this); + if (i == 0) + word.setOnLongClickListener(this); + mWords.add(word); + mInfos.add(info); + if (i > 0) { + final View divider = inflater.inflate(R.layout.candidate_divider, null); + divider.measure(UNSPECIFIED_MEASURESPEC, UNSPECIFIED_MEASURESPEC); + mDividers.add(divider); } + } - final int width = getWidth(); - mScrolled = true; - int scrollX = getScrollX(); - scrollX += (int) distanceX; - if (scrollX < 0) { - scrollX = 0; + final TypedArray a = context.obtainStyledAttributes( + attrs, R.styleable.CandidateView, defStyle, R.style.CandidateViewStyle); + mAutoCorrectHighlight = a.getInt(R.styleable.CandidateView_autoCorrectHighlight, 0); + mColorTypedWord = a.getColor(R.styleable.CandidateView_colorTypedWord, 0); + mColorAutoCorrect = a.getColor(R.styleable.CandidateView_colorAutoCorrect, 0); + mColorSuggestedCandidate = a.getColor(R.styleable.CandidateView_colorSuggested, 0); + mInvertedForegroundColorSpan = new ForegroundColorSpan(mColorTypedWord ^ 0x00ffffff); + mInvertedBackgroundColorSpan = new BackgroundColorSpan(mColorTypedWord); + + mExpandCandidatesPane = (ImageView)findViewById(R.id.expand_candidates_pane); + mExpandCandidatesPane.setImageDrawable( + a.getDrawable(R.styleable.CandidateView_iconExpandPane)); + mExpandCandidatesPane.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + expandCandidatesPane(); } - if (distanceX > 0 && scrollX + width > mTotalWidth) { - scrollX -= (int) distanceX; + }); + mCloseCandidatesPane = (ImageView)findViewById(R.id.close_candidates_pane); + mCloseCandidatesPane.setImageDrawable( + a.getDrawable(R.styleable.CandidateView_iconClosePane)); + mCloseCandidatesPane.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + closeCandidatesPane(); } - mTargetScrollX = scrollX; - scrollTo(scrollX, getScrollY()); - hidePreview(); - invalidate(); - return true; - } + }); + + a.recycle(); } /** - * A connection back to the service to communicate with the text field + * A connection back to the input method. * @param listener */ - public void setService(LatinIME listener) { - mService = listener; + public void setListener(Listener listener, View inputView) { + mListener = listener; + mKeyboardView = inputView.findViewById(R.id.keyboard_view); + mCandidatesPane = FrameLayoutCompatUtils.getPlacer( + (ViewGroup)inputView.findViewById(R.id.candidates_pane)); + mCandidatesPane.setOnClickListener(this); + mCandidatesPaneContainer = (ViewGroup)inputView.findViewById( + R.id.candidates_pane_container); } - - @Override - public int computeHorizontalScrollRange() { - return mTotalWidth; + + public void setSuggestions(SuggestedWords suggestions) { + if (suggestions == null) + return; + mSuggestions = suggestions; + if (mShowingAutoCorrectionInverted) { + mHandler.postUpdateSuggestions(); + } else { + updateSuggestions(); + } } - /** - * 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); + private CharSequence getStyledCandidateWord(CharSequence word, boolean isAutoCorrect) { + if (!isAutoCorrect) + return word; + final Spannable spannedWord = new SpannableString(word); + if ((mAutoCorrectHighlight & AUTO_CORRECT_BOLD) != 0) + spannedWord.setSpan(BOLD_SPAN, 0, word.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + if ((mAutoCorrectHighlight & AUTO_CORRECT_UNDERLINE) != 0) + spannedWord.setSpan(UNDERLINE_SPAN, 0, word.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + return spannedWord; + } + + private int getCandidateTextColor(boolean isAutoCorrect, boolean isSuggestedCandidate, + SuggestedWordInfo info) { + final int color; + if (isAutoCorrect) { + color = mColorAutoCorrect; + } else if (isSuggestedCandidate) { + color = mColorSuggestedCandidate; + } else { + color = mColorTypedWord; } - 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()); + if (info != null && info.isPreviousSuggestedWord()) { + final int newAlpha = (int)(Color.alpha(color) * 0.5f); + return Color.argb(newAlpha, Color.red(color), Color.green(color), Color.blue(color)); + } else { + return color; } + } - 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; + private void updateSuggestions() { + final SuggestedWords suggestions = mSuggestions; + final List<SuggestedWordInfo> suggestedWordInfoList = suggestions.mSuggestedWordInfoList; + clear(); + final int paneWidth = getWidth(); + final int dividerWidth = mDividers.get(0).getMeasuredWidth(); + final int dividerHeight = mDividers.get(0).getMeasuredHeight(); int x = 0; + int y = 0; + int fromIndex = NUM_CANDIDATES_IN_STRIP; + final int count = Math.min(mWords.size(), suggestions.size()); + closeCandidatesPane(); + mExpandCandidatesPane.setEnabled(count >= NUM_CANDIDATES_IN_STRIP); for (int i = 0; i < count; i++) { - CharSequence suggestion = mSuggestions.get(i); + final CharSequence suggestion = suggestions.getWord(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; + final SuggestedWordInfo suggestionInfo = (suggestedWordInfoList != null) + ? suggestedWordInfoList.get(i) : null; + final boolean isAutoCorrect = suggestions.mHasMinimalSuggestion + && ((i == 1 && !suggestions.mTypedWordValid) + || (i == 0 && suggestions.mTypedWordValid)); + // 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. + // TODO: Need to revisit this logic with bigram suggestions + final boolean isSuggestedCandidate = (i != 0); + final boolean isPunctuationSuggestions = (suggestion.length() == 1 && count > 1); + + final TextView word = mWords.get(i); + // TODO: Reorder candidates in strip as appropriate. The center candidate should hold + // the word when space is typed (valid typed word or auto corrected word). + word.setTextColor(getCandidateTextColor(isAutoCorrect, + isSuggestedCandidate || isPunctuationSuggestions, suggestionInfo)); + word.setText(getStyledCandidateWord(suggestion, isAutoCorrect)); + // TODO: call TextView.setTextScaleX() to fit the candidate in single line. + word.measure(UNSPECIFIED_MEASURESPEC, UNSPECIFIED_MEASURESPEC); + final int width = word.getMeasuredWidth(); + final int height = word.getMeasuredHeight(); + + final TextView info; + if (DBG && suggestionInfo != null + && !TextUtils.isEmpty(suggestionInfo.getDebugString())) { + info = mInfos.get(i); + info.setText(suggestionInfo.getDebugString()); + info.setVisibility(View.VISIBLE); + info.measure(UNSPECIFIED_MEASURESPEC, UNSPECIFIED_MEASURESPEC); + } else { + info = null; } - 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); + if (i < NUM_CANDIDATES_IN_STRIP) { + if (info != null) { + final int infoWidth = info.getMeasuredWidth(); + FrameLayoutCompatUtils.placeViewAt( + info, x + width - infoWidth, y, infoWidth, info.getMeasuredHeight()); } - canvas.translate(-x - wordWidth, 0); + } else { + // TODO: Handle overflow case. + if (dividerWidth + x + width >= paneWidth) { + centeringCandidates(fromIndex, i - 1, x, paneWidth); + x = 0; + y += mCandidateStripHeight; + fromIndex = i; + } + if (x != 0) { + final View divider = mDividers.get(i - NUM_CANDIDATES_IN_STRIP); + mCandidatesPane.addView(divider); + FrameLayoutCompatUtils.placeViewAt( + divider, x, y + (mCandidateStripHeight - dividerHeight) / 2, + dividerWidth, dividerHeight); + x += dividerWidth; + } + mCandidatesPane.addView(word); + FrameLayoutCompatUtils.placeViewAt( + word, x, y + (mCandidateStripHeight - height) / 2, width, height); + if (info != null) { + mCandidatesPane.addView(info); + final int infoWidth = info.getMeasuredWidth(); + FrameLayoutCompatUtils.placeViewAt( + info, x + width - infoWidth, y, infoWidth, info.getMeasuredHeight()); + } + x += width; } - paint.setTypeface(Typeface.DEFAULT); - x += wordWidth; } - mService.onAutoCompletionStateChanged(existsAutoCompletion); - mTotalWidth = x; - if (mTargetScrollX != scrollX) { - scrollToTarget(); + if (x != 0) { + // Centering last candidates row. + centeringCandidates(fromIndex, count - 1, x, paneWidth); } } - - 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()); - } + + private void centeringCandidates(int from, int to, int width, int paneWidth) { + final ViewGroup pane = mCandidatesPane; + final int fromIndex = pane.indexOfChild(mWords.get(from)); + final int toIndex; + if (mInfos.get(to).getParent() != null) { + toIndex = pane.indexOfChild(mInfos.get(to)); } else { - scrollX -= SCROLL_PIXELS; - if (scrollX <= mTargetScrollX) { - scrollX = mTargetScrollX; - scrollTo(scrollX, getScrollY()); - requestLayout(); - } else { - scrollTo(scrollX, getScrollY()); - } + toIndex = pane.indexOfChild(mWords.get(to)); + } + final int offset = (paneWidth - width) / 2; + for (int index = fromIndex; index <= toIndex; index++) { + offsetMargin(pane.getChildAt(index), offset, 0); } - 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; - } + + private static void offsetMargin(View v, int dx, int dy) { + if (v == null) + return; + final ViewGroup.LayoutParams lp = v.getLayoutParams(); + if (lp instanceof ViewGroup.MarginLayoutParams) { + final ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams)lp; + mlp.setMargins(mlp.leftMargin + dx, mlp.topMargin + dy, 0, 0); } - mShowingCompletions = completions; - mTypedWordValid = typedWordValid; - scrollTo(0, getScrollY()); - mTargetScrollX = 0; - mHaveMinimalSuggestion = haveMinimalSuggestion; - // Compute the total width - onDraw(null); - invalidate(); - requestLayout(); + } + + private void expandCandidatesPane() { + mExpandCandidatesPane.setVisibility(View.GONE); + mCloseCandidatesPane.setVisibility(View.VISIBLE); + mCandidatesPaneContainer.setMinimumHeight(mKeyboardView.getMeasuredHeight()); + mCandidatesPaneContainer.setVisibility(View.VISIBLE); + mKeyboardView.setVisibility(View.GONE); + } + + private void closeCandidatesPane() { + mExpandCandidatesPane.setVisibility(View.VISIBLE); + mCloseCandidatesPane.setVisibility(View.GONE); + mCandidatesPaneContainer.setVisibility(View.GONE); + mKeyboardView.setVisibility(View.VISIBLE); + } + + public void onAutoCorrectionInverted(CharSequence autoCorrectedWord) { + if ((mAutoCorrectHighlight & AUTO_CORRECT_INVERT) == 0) + return; + final TextView tv = mWords.get(1); + 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 isShowingAddToDictionaryHint() { @@ -340,11 +446,14 @@ public class CandidateView extends View { } 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 = mWords.get(1); + tv.setClickable(false); } public boolean dismissAddToDictionaryHint() { @@ -353,135 +462,94 @@ 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; + mShowingAutoCorrectionInverted = false; + for (int i = 0; i < NUM_CANDIDATES_IN_STRIP; i++) { + mWords.get(i).setText(null); + mInfos.get(i).setVisibility(View.GONE); } - return true; + mCandidatesPane.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(mColorTypedWord); + previewText.setText(word); + previewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + View v = mWords.get(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; - if (mService.addWordToDictionary(word.toString())) { - showPreview(0, getContext().getResources().getString(R.string.added_word, word)); + private void addToDictionary(CharSequence word) { + if (mListener.addWordToDictionary(word.toString())) { + showPreview(0, getContext().getString(R.string.added_word, word)); } } - + + @Override + public boolean onLongClick(View view) { + final Object tag = view.getTag(); + if (!(tag instanceof Integer)) + return true; + final int index = (Integer) tag; + if (index >= mSuggestions.size()) + return true; + + final CharSequence word = mSuggestions.getWord(index); + if (word.length() < 2) + return false; + addToDictionary(word); + return true; + } + + @Override + public void onClick(View view) { + final Object tag = view.getTag(); + if (!(tag instanceof Integer)) + return; + final int index = (Integer) tag; + if (index >= mSuggestions.size()) + return; + + final CharSequence word = mSuggestions.getWord(index); + if (mShowingAddToDictionary && index == 0) { + addToDictionary(word); + } else { + mListener.pickSuggestionManually(index, word); + } + // Because some punctuation letters are not treated as word separator depending on locale, + // {@link #setSuggestions} might not be called and candidates pane left opened. + closeCandidatesPane(); + } + @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..66a041508 100644 --- a/java/src/com/android/inputmethod/latin/ContactsDictionary.java +++ b/java/src/com/android/inputmethod/latin/ContactsDictionary.java @@ -21,14 +21,17 @@ 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; +import com.android.inputmethod.keyboard.Keyboard; + public class ContactsDictionary extends ExpandableDictionary { private static final String[] PROJECTION = { - Contacts._ID, + BaseColumns._ID, Contacts.DISPLAY_NAME, }; @@ -37,7 +40,7 @@ public class ContactsDictionary extends ExpandableDictionary { /** * Frequency for contacts information into the dictionary */ - private static final int FREQUENCY_FOR_CONTACTS = 128; + private static final int FREQUENCY_FOR_CONTACTS = 40; private static final int FREQUENCY_FOR_CONTACTS_BIGRAM = 90; private static final int INDEX_NAME = 1; @@ -94,6 +97,14 @@ public class ContactsDictionary extends ExpandableDictionary { mLastLoadedContacts = SystemClock.uptimeMillis(); } + @Override + public void getBigrams(final WordComposer codes, final CharSequence previousWord, + final WordCallback callback) { + // Do not return bigrams from Contacts when nothing was typed. + if (codes.size() <= 0) return; + super.getBigrams(codes, previousWord, callback); + } + private void addWords(Cursor cursor) { clearDictionary(); @@ -103,7 +114,7 @@ public class ContactsDictionary extends ExpandableDictionary { while (!cursor.isAfterLast()) { String name = cursor.getString(INDEX_NAME); - if (name != null) { + if (name != null && -1 == name.indexOf('@')) { int len = name.length(); String prevWord = null; @@ -114,8 +125,9 @@ public class ContactsDictionary extends ExpandableDictionary { for (j = i + 1; j < len; j++) { char c = name.charAt(j); - if (!(c == '-' || c == '\'' || - Character.isLetter(c))) { + if (!(c == Keyboard.CODE_DASH + || c == Keyboard.CODE_SINGLE_QUOTE + || Character.isLetter(c))) { break; } } @@ -131,8 +143,6 @@ public class ContactsDictionary extends ExpandableDictionary { if (wordLen < maxWordLength && wordLen > 1) { super.addWord(word, FREQUENCY_FOR_CONTACTS); if (!TextUtils.isEmpty(prevWord)) { - // TODO Do not add email address - // Not so critical super.setBigram(prevWord, word, FREQUENCY_FOR_CONTACTS_BIGRAM); } diff --git a/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java b/java/src/com/android/inputmethod/latin/DebugSettings.java index cba1a0af9..fd62d61c3 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMEDebugSettings.java +++ b/java/src/com/android/inputmethod/latin/DebugSettings.java @@ -20,17 +20,20 @@ import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; +import android.os.Process; import android.preference.CheckBoxPreference; import android.preference.PreferenceActivity; import android.util.Log; -public class LatinIMEDebugSettings extends PreferenceActivity +public class DebugSettings extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { - private static final String TAG = "LatinIMEDebugSettings"; + private static final String TAG = "DebugSettings"; private static final String DEBUG_MODE_KEY = "debug_mode"; + private boolean mServiceNeedsRestart = false; private CheckBoxPreference mDebugMode; + private CheckBoxPreference mUseSpacebarLanguageSwitch; @Override protected void onCreate(Bundle icicle) { @@ -39,15 +42,31 @@ public class LatinIMEDebugSettings extends PreferenceActivity SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); prefs.registerOnSharedPreferenceChangeListener(this); + mServiceNeedsRestart = false; mDebugMode = (CheckBoxPreference) findPreference(DEBUG_MODE_KEY); updateDebugMode(); } + @Override + protected void onStop() { + super.onStop(); + if (mServiceNeedsRestart) Process.killProcess(Process.myPid()); + } + + @Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { if (key.equals(DEBUG_MODE_KEY)) { if (mDebugMode != null) { mDebugMode.setChecked(prefs.getBoolean(DEBUG_MODE_KEY, false)); updateDebugMode(); + mServiceNeedsRestart = true; + } + } else if (key.equals(SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCH_KEY)) { + if (mUseSpacebarLanguageSwitch != null) { + mUseSpacebarLanguageSwitch.setChecked( + prefs.getBoolean(SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCH_KEY, + getResources().getBoolean( + R.bool.config_use_spacebar_language_switcher))); } } } diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java index d04bf57a7..c7737b9a2 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. */ @@ -29,7 +29,7 @@ abstract public class Dictionary { /** * The weight to give to a word if it's length is the same as the number of typed characters. */ - protected static final int FULL_WORD_FREQ_MULTIPLIER = 2; + protected static final int FULL_WORD_SCORE_MULTIPLIER = 2; public static enum DataType { UNIGRAM, BIGRAM @@ -42,17 +42,17 @@ 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 score. * @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 score the score 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 * @return true if the word was added, false if no more words are required */ - boolean addWord(char[] word, int wordOffset, int wordLength, int frequency, int dicTypeId, + boolean addWord(char[] word, int wordOffset, int wordLength, int score, int dicTypeId, DataType dataType); } @@ -61,27 +61,19 @@ abstract public class Dictionary { * words are added through the callback object. * @param composer the key sequence to match * @param callback the callback object to send matched words to as possible candidates - * @param nextLettersFrequencies array of frequencies of next letters that could follow the - * word so far. For instance, "bracke" can be followed by "t", so array['t'] will have - * a non-zero value on returning from this method. - * Pass in null if you don't want the dictionary to look up next letters. - * @see WordCallback#addWord(char[], int, int) + * @see WordCallback#addWord(char[], int, int, int, int, DataType) */ - abstract public void getWords(final WordComposer composer, final WordCallback callback, - int[] nextLettersFrequencies); + abstract public void getWords(final WordComposer composer, final WordCallback callback); /** * Searches for pairs in the bigram dictionary that matches the previous word and all the * possible words following are added through the callback object. * @param composer the key sequence to match + * @param previousWord the word before * @param callback the callback object to send possible word following previous word - * @param nextLettersFrequencies array of frequencies of next letters that could follow the - * word so far. For instance, "bracke" can be followed by "t", so array['t'] will have - * a non-zero value on returning from this method. - * Pass in null if you don't want the dictionary to look up next letters. */ public void getBigrams(final WordComposer composer, final CharSequence previousWord, - final WordCallback callback, int[] nextLettersFrequencies) { + final WordCallback callback) { // empty base implementation } @@ -116,5 +108,6 @@ abstract public class Dictionary { * Override to clean up any resources. */ public void close() { + // empty base implementation } } diff --git a/java/src/com/android/inputmethod/latin/DictionaryCollection.java b/java/src/com/android/inputmethod/latin/DictionaryCollection.java new file mode 100644 index 000000000..5e7de3e6b --- /dev/null +++ b/java/src/com/android/inputmethod/latin/DictionaryCollection.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Class for a collection of dictionaries that behave like one dictionary. + */ +public class DictionaryCollection extends Dictionary { + + protected final List<Dictionary> mDictionaries; + + public DictionaryCollection() { + mDictionaries = new CopyOnWriteArrayList<Dictionary>(); + } + + public DictionaryCollection(Dictionary... dictionaries) { + mDictionaries = new CopyOnWriteArrayList<Dictionary>(dictionaries); + } + + public DictionaryCollection(Collection<Dictionary> dictionaries) { + mDictionaries = new CopyOnWriteArrayList<Dictionary>(dictionaries); + } + + @Override + public void getWords(final WordComposer composer, final WordCallback callback) { + for (final Dictionary dict : mDictionaries) + dict.getWords(composer, callback); + } + + @Override + public void getBigrams(final WordComposer composer, final CharSequence previousWord, + final WordCallback callback) { + for (final Dictionary dict : mDictionaries) + dict.getBigrams(composer, previousWord, callback); + } + + @Override + public boolean isValidWord(CharSequence word) { + for (int i = mDictionaries.size() - 1; i >= 0; --i) + if (mDictionaries.get(i).isValidWord(word)) return true; + return false; + } + + @Override + public void close() { + for (final Dictionary dict : mDictionaries) + dict.close(); + } + + public void addDictionary(Dictionary newDict) { + mDictionaries.add(newDict); + } +} diff --git a/java/src/com/android/inputmethod/latin/DictionaryFactory.java b/java/src/com/android/inputmethod/latin/DictionaryFactory.java new file mode 100644 index 000000000..bba331868 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/DictionaryFactory.java @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import android.content.Context; +import android.content.res.AssetFileDescriptor; +import android.content.res.Resources; +import android.util.Log; + +import java.io.File; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; + +/** + * Factory for dictionary instances. + */ +public class DictionaryFactory { + + private static String TAG = DictionaryFactory.class.getSimpleName(); + + /** + * Initializes a dictionary from a dictionary pack. + * + * This searches for a content provider providing a dictionary pack for the specified + * locale. If none is found, it falls back to using the resource passed as fallBackResId + * as a dictionary. + * @param context application context for reading resources + * @param locale the locale for which to create the dictionary + * @param fallbackResId the id of the resource to use as a fallback if no pack is found + * @return an initialized instance of Dictionary + */ + public static Dictionary createDictionaryFromManager(Context context, Locale locale, + int fallbackResId) { + if (null == locale) { + Log.e(TAG, "No locale defined for dictionary"); + return new DictionaryCollection(createBinaryDictionary(context, fallbackResId)); + } + + final List<Dictionary> dictList = new LinkedList<Dictionary>(); + for (final AssetFileAddress f : BinaryDictionaryGetter.getDictionaryFiles(locale, + context, fallbackResId)) { + dictList.add(new BinaryDictionary(context, f.mFilename, f.mOffset, f.mLength, null)); + } + + if (null == dictList) return null; + return new DictionaryCollection(dictList); + } + + /** + * Initializes a dictionary from a raw resource file + * @param context application context for reading resources + * @param resId the resource containing the raw binary dictionary + * @return an initialized instance of BinaryDictionary + */ + protected static BinaryDictionary createBinaryDictionary(Context context, int resId) { + AssetFileDescriptor afd = null; + try { + afd = context.getResources().openRawResourceFd(resId); + if (afd == null) { + Log.e(TAG, "Found the resource but it is compressed. resId=" + resId); + return null; + } + if (!isFullDictionary(afd)) return null; + final String sourceDir = context.getApplicationInfo().sourceDir; + final File packagePath = new File(sourceDir); + // TODO: Come up with a way to handle a directory. + if (!packagePath.isFile()) { + Log.e(TAG, "sourceDir is not a file: " + sourceDir); + return null; + } + return new BinaryDictionary(context, + sourceDir, afd.getStartOffset(), afd.getLength(), null); + } catch (android.content.res.Resources.NotFoundException e) { + Log.e(TAG, "Could not find the resource. resId=" + resId); + return null; + } finally { + if (null != afd) { + try { + afd.close(); + } catch (java.io.IOException e) { + /* IOException on close ? What am I supposed to do ? */ + } + } + } + } + + /** + * Create a dictionary from passed data. This is intended for unit tests only. + * @param context the test context to create this data from. + * @param dictionary the file to read + * @param startOffset the offset in the file where the data starts + * @param length the length of the data + * @param flagArray the flags to use with this data for testing + * @return the created dictionary, or null. + */ + public static Dictionary createDictionaryForTest(Context context, File dictionary, + long startOffset, long length, Flag[] flagArray) { + if (dictionary.isFile()) { + return new BinaryDictionary(context, dictionary.getAbsolutePath(), startOffset, length, + flagArray); + } else { + Log.e(TAG, "Could not find the file. path=" + dictionary.getAbsolutePath()); + return null; + } + } + + /** + * Find out whether a dictionary is available for this locale. + * @param context the context on which to check resources. + * @param locale the locale to check for. + * @return whether a (non-placeholder) dictionary is available or not. + */ + public static boolean isDictionaryAvailable(Context context, Locale locale) { + final Resources res = context.getResources(); + final Locale saveLocale = Utils.setSystemLocale(res, locale); + + final int resourceId = Utils.getMainDictionaryResourceId(res); + final AssetFileDescriptor afd = res.openRawResourceFd(resourceId); + final boolean hasDictionary = isFullDictionary(afd); + try { + if (null != afd) afd.close(); + } catch (java.io.IOException e) { + /* Um, what can we do here exactly? */ + } + + Utils.setSystemLocale(res, saveLocale); + return hasDictionary; + } + + // TODO: Do not use the size of the dictionary as an unique dictionary ID. + public static Long getDictionaryId(Context context, Locale locale) { + final Resources res = context.getResources(); + final Locale saveLocale = Utils.setSystemLocale(res, locale); + + final int resourceId = Utils.getMainDictionaryResourceId(res); + final AssetFileDescriptor afd = res.openRawResourceFd(resourceId); + final Long size = (afd != null && afd.getLength() > PLACEHOLDER_LENGTH) + ? afd.getLength() + : null; + try { + if (null != afd) afd.close(); + } catch (java.io.IOException e) { + } + + Utils.setSystemLocale(res, saveLocale); + return size; + } + + // TODO: Find the Right Way to find out whether the resource is a placeholder or not. + // Suggestion : strip the locale, open the placeholder file and store its offset. + // Upon opening the file, if it's the same offset, then it's the placeholder. + private static final long PLACEHOLDER_LENGTH = 34; + /** + * Finds out whether the data pointed out by an AssetFileDescriptor is a full + * dictionary (as opposed to null, or to a place holder). + * @param afd the file descriptor to test, or null + * @return true if the dictionary is a real full dictionary, false if it's null or a placeholder + */ + protected static boolean isFullDictionary(final AssetFileDescriptor afd) { + return (afd != null && afd.getLength() > PLACEHOLDER_LENGTH); + } +} diff --git a/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java b/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java new file mode 100644 index 000000000..9d30af84b --- /dev/null +++ b/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ProviderInfo; +import android.net.Uri; + +/** + * Takes action to reload the necessary data when a dictionary pack was added/removed. + */ +public class DictionaryPackInstallBroadcastReceiver extends BroadcastReceiver { + + final LatinIME mService; + /** + * The action of the intent for publishing that new dictionary data is available. + */ + /* package */ static final String NEW_DICTIONARY_INTENT_ACTION = + "com.android.inputmethod.latin.dictionarypack.newdict"; + + public DictionaryPackInstallBroadcastReceiver(final LatinIME service) { + mService = service; + } + + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + final PackageManager manager = context.getPackageManager(); + + // We need to reread the dictionary if a new dictionary package is installed. + if (action.equals(Intent.ACTION_PACKAGE_ADDED)) { + final Uri packageUri = intent.getData(); + if (null == packageUri) return; // No package name : we can't do anything + final String packageName = packageUri.getSchemeSpecificPart(); + if (null == packageName) return; + final PackageInfo packageInfo; + try { + packageInfo = manager.getPackageInfo(packageName, PackageManager.GET_PROVIDERS); + } catch (android.content.pm.PackageManager.NameNotFoundException e) { + return; // No package info : we can't do anything + } + final ProviderInfo[] providers = packageInfo.providers; + if (null == providers) return; // No providers : it is not a dictionary. + + // Search for some dictionary pack in the just-installed package. If found, reread. + for (ProviderInfo info : providers) { + if (BinaryDictionary.DICTIONARY_PACK_AUTHORITY.equals(info.authority)) { + mService.resetSuggestMainDict(); + return; + } + } + // If we come here none of the authorities matched the one we searched for. + // We can exit safely. + return; + } else if (action.equals(Intent.ACTION_PACKAGE_REMOVED) + && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) { + // When the dictionary package is removed, we need to reread dictionary (to use the + // next-priority one, or stop using a dictionary at all if this was the only one, + // since this is the user request). + // If we are replacing the package, we will receive ADDED right away so no need to + // remove the dictionary at the moment, since we will do it when we receive the + // ADDED broadcast. + + // TODO: Only reload dictionary on REMOVED when the removed package is the one we + // read dictionary from? + mService.resetSuggestMainDict(); + } else if (action.equals(NEW_DICTIONARY_INTENT_ACTION)) { + mService.resetSuggestMainDict(); + } + } +} diff --git a/java/src/com/android/inputmethod/latin/EditingUtil.java b/java/src/com/android/inputmethod/latin/EditingUtils.java index 781d7fd4a..e56aa695d 100644 --- a/java/src/com/android/inputmethod/latin/EditingUtil.java +++ b/java/src/com/android/inputmethod/latin/EditingUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Google Inc. + * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -16,30 +16,27 @@ 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; /** * 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 */ private static final int LOOKBACK_CHARACTER_NUM = 15; - // Cache Method pointers - private static boolean sMethodsInitialized; - 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 +51,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) { @@ -75,34 +73,30 @@ 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 + * @param separators characters which may separate words * @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 +104,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 +141,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; @@ -173,29 +161,74 @@ public class EditingUtil { private static final Pattern spaceRegex = Pattern.compile("\\s+"); + public static CharSequence getPreviousWord(InputConnection connection, String sentenceSeperators) { //TODO: Should fix this. This could be slow! CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0); - if (prev == null) { - return null; - } + return getPreviousWord(prev, sentenceSeperators); + } + + // Get the word before the whitespace preceding the non-whitespace preceding the cursor. + // Also, it won't return words that end in a separator. + // Example : + // "abc def|" -> abc + // "abc def |" -> abc + // "abc def. |" -> abc + // "abc def . |" -> def + // "abc|" -> null + // "abc |" -> null + // "abc. def|" -> null + public static CharSequence getPreviousWord(CharSequence prev, String sentenceSeperators) { + if (prev == null) return null; String[] w = spaceRegex.split(prev); - if (w.length >= 2 && w[w.length-2].length() > 0) { - char lastChar = w[w.length-2].charAt(w[w.length-2].length() -1); - if (sentenceSeperators.contains(String.valueOf(lastChar))) { - return null; - } - return w[w.length-2]; - } else { - return null; - } + + // If we can't find two words, or we found an empty word, return null. + if (w.length < 2 || w[w.length - 2].length() <= 0) return null; + + // If ends in a separator, return null + char lastChar = w[w.length - 2].charAt(w[w.length - 2].length() - 1); + if (sentenceSeperators.contains(String.valueOf(lastChar))) return null; + + return w[w.length - 2]; + } + + public static CharSequence getThisWord(InputConnection connection, String sentenceSeperators) { + final CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0); + return getThisWord(prev, sentenceSeperators); + } + + // Get the word immediately before the cursor, even if there is whitespace between it and + // the cursor - but not if there is punctuation. + // Example : + // "abc def|" -> def + // "abc def |" -> def + // "abc def. |" -> null + // "abc def . |" -> null + public static CharSequence getThisWord(CharSequence prev, String sentenceSeperators) { + if (prev == null) return null; + String[] w = spaceRegex.split(prev); + + // No word : return null + if (w.length < 1 || w[w.length - 1].length() <= 0) return null; + + // If ends in a separator, return null + char lastChar = w[w.length - 1].charAt(w[w.length - 1].length() - 1); + if (sentenceSeperators.contains(String.valueOf(lastChar))) return null; + + return w[w.length - 1]; } 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 +256,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. @@ -246,7 +275,8 @@ public class EditingUtil { } // 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(); @@ -256,82 +286,8 @@ 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; } - - /** - * 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.start, word.end); - } catch (InvocationTargetException exc) { - // Ignore - } catch (IllegalArgumentException e) { - // Ignore - } catch (IllegalAccessException e) { - // Ignore - } - } - } } diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java index e954c0818..97a4a1816 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java @@ -16,11 +16,13 @@ package com.android.inputmethod.latin; -import java.util.LinkedList; - import android.content.Context; import android.os.AsyncTask; +import com.android.inputmethod.keyboard.Keyboard; + +import java.util.LinkedList; + /** * Base class for an in-memory dictionary that can grow dynamically and can * be searched for suggestions and valid words. @@ -32,15 +34,14 @@ public class ExpandableDictionary extends Dictionary { */ protected static final int MAX_WORD_LENGTH = 32; + // Bigram frequency is a fixed point number with 1 meaning 1.2 and 255 meaning 1.8. + protected static final int BIGRAM_MAX_FREQUENCY = 255; + private Context mContext; private char[] mWordBuilder = new char[MAX_WORD_LENGTH]; private int mDicTypeId; private int mMaxDepth; private int mInputLength; - private int[] mNextLettersFrequencies; - private StringBuilder sb = new StringBuilder(MAX_WORD_LENGTH); - - private static final char QUOTE = '\''; private boolean mRequiresReload; @@ -49,53 +50,66 @@ 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; + if (mFrequency > BIGRAM_MAX_FREQUENCY) mFrequency = BIGRAM_MAX_FREQUENCY; + 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 +142,14 @@ public class ExpandableDictionary extends Dictionary { /** Override to load your dictionary here, on a background thread. */ public void loadDictionaryAsync() { + // empty base implementation } - Context getContext() { + public Context getContext() { return mContext; } - - int getMaxWordLength() { + + public int getMaxWordLength() { return MAX_WORD_LENGTH; } @@ -145,40 +160,40 @@ public class ExpandableDictionary extends Dictionary { private void addWordRec(NodeArray children, final String word, final int depth, final int frequency, Node parentNode) { final int wordLength = word.length(); + if (wordLength <= depth) return; final char c = word.charAt(depth); // Does children have the current character? - final int childrenLength = children.length; + final int childrenLength = children.mLength; Node childNode = null; boolean found = false; for (int i = 0; i < childrenLength; i++) { - childNode = children.data[i]; - if (childNode.code == c) { + childNode = children.mData[i]; + if (childNode.mCode == c) { found = true; break; } } if (!found) { childNode = new Node(); - childNode.code = c; - childNode.parent = parentNode; + childNode.mCode = c; + childNode.mParent = parentNode; children.add(childNode); } if (wordLength == depth + 1) { // Terminate this word - childNode.terminal = true; - childNode.frequency = Math.max(frequency, childNode.frequency); - if (childNode.frequency > 255) childNode.frequency = 255; + childNode.mTerminal = true; + childNode.mFrequency = Math.max(frequency, childNode.mFrequency); + if (childNode.mFrequency > 255) childNode.mFrequency = 255; return; } - if (childNode.children == null) { - childNode.children = new NodeArray(); + if (childNode.mChildren == null) { + childNode.mChildren = new NodeArray(); } - addWordRec(childNode.children, word, depth + 1, frequency, childNode); + addWordRec(childNode.mChildren, word, depth + 1, frequency, childNode); } @Override - public void getWords(final WordComposer codes, final WordCallback callback, - int[] nextLettersFrequencies) { + public void getWords(final WordComposer codes, final WordCallback callback) { synchronized (mUpdatingLock) { // If we need to update, start off a background task if (mRequiresReload) startDictionaryLoadingTaskLocked(); @@ -187,7 +202,6 @@ public class ExpandableDictionary extends Dictionary { } mInputLength = codes.size(); - mNextLettersFrequencies = nextLettersFrequencies; if (mCodes.length < mInputLength) mCodes = new int[mInputLength][]; // Cache the codes so that we don't have to lookup an array list for (int i = 0; i < mInputLength; i++) { @@ -214,9 +228,20 @@ public class ExpandableDictionary extends Dictionary { /** * Returns the word's frequency or -1 if not found */ - public int getWordFrequency(CharSequence word) { + protected int getWordFrequency(CharSequence word) { + // Case-sensitive search Node node = searchNode(mRoots, word, 0, word.length()); - return (node == null) ? -1 : node.frequency; + return (node == null) ? -1 : node.mFrequency; + } + + private static int computeSkippedWordFinalFreq(int freq, int snr, int inputLength) { + // The computation itself makes sense for >= 2, but the == 2 case returns 0 + // anyway so we may as well test against 3 instead and return the constant + if (inputLength >= 3) { + return (freq * snr * (inputLength - 2)) / (inputLength - 1); + } else { + return 0; + } } /** @@ -232,16 +257,17 @@ public class ExpandableDictionary extends Dictionary { * @param completion whether the traversal is now in completion mode - meaning that we've * exhausted the input and we're looking for all possible suffixes. * @param snr current weight of the word being formed - * @param inputIndex position in the input characters. This can be off from the depth in + * @param inputIndex position in the input characters. This can be off from the depth in * case we skip over some punctuations such as apostrophe in the traversal. That is, if you type * "wouldve", it could be matching "would've", so the depth will be one more than the * inputIndex * @param callback the callback class for adding a word */ - protected void getWordsRec(NodeArray roots, final WordComposer codes, final char[] word, + // TODO: Share this routine with the native code for BinaryDictionary + protected void getWordsRec(NodeArray roots, final WordComposer codes, final char[] word, final int depth, boolean completion, int snr, int inputIndex, int skipPos, WordCallback callback) { - final int count = roots.length; + final int count = roots.mLength; final int codeSize = mInputLength; // Optimization: Prune out words that are too long compared to how much was typed. if (depth > mMaxDepth) { @@ -255,34 +281,36 @@ public class ExpandableDictionary extends Dictionary { } for (int i = 0; i < count; i++) { - final Node node = roots.data[i]; - final char c = node.code; + final Node node = roots.mData[i]; + final char c = node.mCode; final char lowerC = toLowerCase(c); - final boolean terminal = node.terminal; - final NodeArray children = node.children; - final int freq = node.frequency; + final boolean terminal = node.mTerminal; + final NodeArray children = node.mChildren; + final int freq = node.mFrequency; if (completion) { word[depth] = c; if (terminal) { - if (!callback.addWord(word, 0, depth + 1, freq * snr, mDicTypeId, - DataType.UNIGRAM)) { - return; + final int finalFreq; + if (skipPos < 0) { + finalFreq = freq * snr; + } else { + finalFreq = computeSkippedWordFinalFreq(freq, snr, mInputLength); } - // Add to frequency of next letters for predictive correction - if (mNextLettersFrequencies != null && depth >= inputIndex && skipPos < 0 - && mNextLettersFrequencies.length > word[inputIndex]) { - mNextLettersFrequencies[word[inputIndex]]++; + if (!callback.addWord(word, 0, depth + 1, finalFreq, mDicTypeId, + DataType.UNIGRAM)) { + return; } } if (children != null) { getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, skipPos, callback); } - } else if ((c == QUOTE && currentChars[0] != QUOTE) || depth == skipPos) { + } else if ((c == Keyboard.CODE_SINGLE_QUOTE + && currentChars[0] != Keyboard.CODE_SINGLE_QUOTE) || depth == skipPos) { // Skip the ' and continue deeper word[depth] = c; if (children != null) { - getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, + getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, skipPos, callback); } } else { @@ -299,10 +327,16 @@ public class ExpandableDictionary extends Dictionary { if (codeSize == inputIndex + 1) { if (terminal) { - if (INCLUDE_TYPED_WORD_IF_VALID + if (INCLUDE_TYPED_WORD_IF_VALID || !same(word, depth + 1, codes.getTypedWord())) { - int finalFreq = freq * snr * addedAttenuation; - if (skipPos < 0) finalFreq *= FULL_WORD_FREQ_MULTIPLIER; + final int finalFreq; + if (skipPos < 0) { + finalFreq = freq * snr * addedAttenuation + * FULL_WORD_SCORE_MULTIPLIER; + } else { + finalFreq = computeSkippedWordFinalFreq(freq, + snr * addedAttenuation, mInputLength); + } callback.addWord(word, 0, depth + 1, finalFreq, mDicTypeId, DataType.UNIGRAM); } @@ -313,7 +347,7 @@ public class ExpandableDictionary extends Dictionary { skipPos, callback); } } else if (children != null) { - getWordsRec(children, codes, word, depth + 1, + getWordsRec(children, codes, word, depth + 1, false, snr * addedAttenuation, inputIndex + 1, skipPos, callback); } @@ -333,31 +367,33 @@ public class ExpandableDictionary extends Dictionary { /** * Adds bigrams to the in-memory trie structure that is being used to retrieve any word - * @param frequency frequency for this bigrams - * @param addFrequency if true, it adds to current frequency + * @param frequency frequency for this bigram + * @param addFrequency if true, it adds to current frequency, else it overwrites the old value * @return returns the final frequency */ private int addOrSetBigram(String word1, String word2, int frequency, boolean addFrequency) { - Node firstWord = searchWord(mRoots, word1, 0, null); + // We don't want results to be different according to case of the looked up left hand side + // word. We do want however to return the correct case for the right hand side. + // So we want to squash the case of the left hand side, and preserve that of the right + // hand side word. + Node firstWord = searchWord(mRoots, word1.toLowerCase(), 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 +405,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 @@ -406,18 +442,22 @@ 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); + private void runBigramReverseLookUp(final CharSequence previousWord, + final WordCallback callback) { + // Search for the lowercase version of the word only, because that's where bigrams + // store their sons. + Node prevWord = searchNode(mRoots, previousWord.toString().toLowerCase(), 0, + previousWord.length()); + if (prevWord != null && prevWord.mNGrams != null) { + reverseLookUp(prevWord.mNGrams, callback); } } @Override public void getBigrams(final WordComposer codes, final CharSequence previousWord, - final WordCallback callback, int[] nextLettersFrequencies) { + final WordCallback callback) { if (!reloadDictionaryIfRequired()) { - runReverseLookUp(previousWord, callback); + runBigramReverseLookUp(previousWord, callback); } } @@ -430,10 +470,14 @@ public class ExpandableDictionary extends Dictionary { try { Thread.sleep(100); } catch (InterruptedException e) { + // } } } + // Local to reverseLookUp, but do not allocate each time. + private final char[] mLookedUpString = new char[MAX_WORD_LENGTH]; + /** * reverseLookUp retrieves the full word given a list of terminal nodes and adds those words * through callback. @@ -444,42 +488,45 @@ public class ExpandableDictionary extends Dictionary { Node node; int freq; for (NextWord nextWord : terminalNodes) { - node = nextWord.word; - freq = nextWord.frequency; - // 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; - } while(node != null); - - // TODO better way to feed char array? - callback.addWord(sb.toString().toCharArray(), 0, sb.length(), freq, mDicTypeId, - DataType.BIGRAM); - } + node = nextWord.mWord; + freq = nextWord.getFrequency(); + int index = MAX_WORD_LENGTH; + do { + --index; + mLookedUpString[index] = node.mCode; + node = node.mParent; + } while (node != null); + + callback.addWord(mLookedUpString, index, MAX_WORD_LENGTH - index, freq, mDicTypeId, + DataType.BIGRAM); } } /** - * Search for the terminal node of the word + * Recursively search for the terminal node of the word. + * + * One iteration takes the full word to search for and the current index of the recursion. + * + * @param children the node of the trie to search under. + * @param word the word to search for. Only read [offset..length] so there may be trailing chars + * @param offset the index in {@code word} this recursion should operate on. + * @param length the length of the input word. * @return Returns the terminal node of the word if the word exists */ 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; - char currentChar = word.charAt(offset); + final int count = children.mLength; + final char currentChar = word.charAt(offset); for (int j = 0; j < count; j++) { - final Node node = children.data[j]; - if (node.code == currentChar) { + final Node node = children.mData[j]; + if (node.mCode == currentChar) { if (offset == length - 1) { - if (node.terminal) { + if (node.mTerminal) { return node; } } else { - if (node.children != null) { - Node returnNode = searchNode(node.children, word, offset + 1, length); + if (node.mChildren != null) { + Node returnNode = searchNode(node.mChildren, word, offset + 1, length); if (returnNode != null) return returnNode; } } @@ -503,16 +550,17 @@ public class ExpandableDictionary extends Dictionary { } } - static char toLowerCase(char c) { + private static char toLowerCase(char c) { + char baseChar = c; if (c < BASE_CHARS.length) { - c = BASE_CHARS[c]; + baseChar = BASE_CHARS[c]; } - if (c >= 'A' && c <= 'Z') { - c = (char) (c | 32); - } else if (c > 127) { - c = Character.toLowerCase(c); + if (baseChar >= 'A' && baseChar <= 'Z') { + return (char)(baseChar | 32); + } else if (baseChar > 127) { + return Character.toLowerCase(baseChar); } - return c; + return baseChar; } /** @@ -521,7 +569,7 @@ public class ExpandableDictionary extends Dictionary { * if c is not a combined character, or the base character if it * is combined. */ - static final char BASE_CHARS[] = { + private static final char BASE_CHARS[] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, diff --git a/java/src/com/android/inputmethod/latin/Flag.java b/java/src/com/android/inputmethod/latin/Flag.java new file mode 100644 index 000000000..3cb8f7e17 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/Flag.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import android.content.Context; +import android.content.res.Resources; + +public class Flag { + public final String mName; + public final int mResource; + public final int mMask; + public final int mSource; + + static private final int SOURCE_CONFIG = 1; + static private final int SOURCE_EXTRAVALUE = 2; + + public Flag(int resourceId, int mask) { + mName = null; + mResource = resourceId; + mSource = SOURCE_CONFIG; + mMask = mask; + } + + public Flag(String name, int mask) { + mName = name; + mResource = 0; + mSource = SOURCE_EXTRAVALUE; + mMask = mask; + } + + // If context/switcher are null, set all related flags in flagArray to on. + public static int initFlags(Flag[] flagArray, Context context, SubtypeSwitcher switcher) { + int flags = 0; + final Resources res = null == context ? null : context.getResources(); + for (Flag entry : flagArray) { + switch (entry.mSource) { + case Flag.SOURCE_CONFIG: + if (res == null || res.getBoolean(entry.mResource)) + flags |= entry.mMask; + break; + case Flag.SOURCE_EXTRAVALUE: + if (switcher == null || + switcher.currentSubtypeContainsExtraValueKey(entry.mName)) + flags |= entry.mMask; + break; + } + } + return flags; + } +} diff --git a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java deleted file mode 100644 index 26854399b..000000000 --- a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (C) 2008-2009 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.content.SharedPreferences; -import android.content.SharedPreferences.Editor; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.PreferenceActivity; -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 String mSelectedLanguages; - private ArrayList<Loc> mAvailableLanguages = new ArrayList<Loc>(); - - private static final String[] WHITELIST_LANGUAGES = { - "cs", "da", "de", "en_GB", "en_US", "es", "es_US", "fr", "it", "nb", "nl", "pl", "pt", - "ru", "tr", - }; - - private static boolean isWhitelisted(String lang) { - for (String s : WHITELIST_LANGUAGES) { - if (s.equalsIgnoreCase(lang)) { - return true; - } - } - return false; - } - - private static class Loc implements Comparable<Object> { - static Collator sCollator = Collator.getInstance(); - - String label; - Locale locale; - - public Loc(String label, Locale locale) { - this.label = label; - this.locale = locale; - } - - @Override - public String toString() { - return this.label; - } - - public int compareTo(Object o) { - return sCollator.compare(this.label, ((Loc) o).label); - } - } - - @Override - protected void onCreate(Bundle icicle) { - super.onCreate(icicle); - addPreferencesFromResource(R.xml.language_prefs); - // Get the settings preferences - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - mSelectedLanguages = sp.getString(LatinIME.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)); - boolean checked = isLocaleIn(locale, languageList); - pref.setChecked(checked); - if (hasDictionary(locale)) { - pref.setSummary(R.string.has_dictionary); - } - parent.addPreference(pref); - } - } - - private boolean isLocaleIn(Locale locale, String[] list) { - String lang = get5Code(locale); - for (int i = 0; i < list.length; i++) { - if (lang.equalsIgnoreCase(list[i])) return true; - } - return false; - } - - private boolean hasDictionary(Locale locale) { - Resources res = getResources(); - Configuration conf = res.getConfiguration(); - Locale saveLocale = conf.locale; - boolean haveDictionary = false; - conf.locale = locale; - res.updateConfiguration(conf, res.getDisplayMetrics()); - - int[] dictionaries = LatinIME.getDictionary(res); - BinaryDictionary bd = new BinaryDictionary(this, dictionaries, Suggest.DIC_MAIN); - - // Is the dictionary larger than a placeholder? Arbitrarily chose a lower limit of - // 4000-5000 words, whereas the LARGE_DICTIONARY is about 20000+ words. - if (bd.getSize() > Suggest.LARGE_DICTIONARY_THRESHOLD / 4) { - haveDictionary = true; - } - bd.close(); - conf.locale = saveLocale; - res.updateConfiguration(conf, res.getDisplayMetrics()); - return haveDictionary; - } - - private String get5Code(Locale locale) { - String country = locale.getCountry(); - return locale.getLanguage() - + (TextUtils.isEmpty(country) ? "" : "_" + country); - } - - @Override - protected void onResume() { - super.onResume(); - } - - @Override - protected void onPause() { - super.onPause(); - // Save the selected languages - String checkedLanguages = ""; - PreferenceGroup parent = getPreferenceScreen(); - int count = parent.getPreferenceCount(); - for (int i = 0; i < count; i++) { - CheckBoxPreference pref = (CheckBoxPreference) parent.getPreference(i); - if (pref.isChecked()) { - Locale locale = mAvailableLanguages.get(i).locale; - 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); - SharedPreferencesCompat.apply(editor); - } - - ArrayList<Loc> getUniqueLocales() { - String[] locales = getAssets().getLocales(); - Arrays.sort(locales); - ArrayList<Loc> uniqueLocales = new ArrayList<Loc>(); - - final int origSize = locales.length; - Loc[] preprocess = new Loc[origSize]; - int finalSize = 0; - for (int i = 0 ; i < origSize; i++ ) { - String s = locales[i]; - int len = s.length(); - final Locale l; - final String language; - if (len == 5) { - language = s.substring(0, 2); - String country = s.substring(3, 5); - l = new Locale(language, country); - } else if (len == 2) { - language = s; - l = new Locale(language); - } else { - continue; - } - // Exclude languages that are not relevant to LatinIME - if (!isWhitelisted(s)) continue; - - if (finalSize == 0) { - preprocess[finalSize++] = - new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(l), l), l); - } else { - // check previous entry: - // same lang and a country -> upgrade to full name and - // insert ours with full name - // diff lang -> insert ours with lang-only name - if (preprocess[finalSize-1].locale.getLanguage().equals( - language)) { - preprocess[finalSize-1].label = LanguageSwitcher.toTitleCase( - preprocess[finalSize-1].locale.getDisplayName(), - preprocess[finalSize-1].locale); - preprocess[finalSize++] = - new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(), l), l); - } else { - String displayName; - if (s.equals("zz_ZZ")) { - } else { - displayName = LanguageSwitcher.toTitleCase(l.getDisplayName(l), l); - preprocess[finalSize++] = new Loc(displayName, l); - } - } - } - } - for (int i = 0; i < finalSize ; i++) { - uniqueLocales.add(preprocess[i]); - } - return uniqueLocales; - } -} diff --git a/java/src/com/android/inputmethod/latin/KeyDetector.java b/java/src/com/android/inputmethod/latin/KeyDetector.java deleted file mode 100644 index 76fe1200e..000000000 --- a/java/src/com/android/inputmethod/latin/KeyDetector.java +++ /dev/null @@ -1,113 +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; -import android.inputmethodservice.Keyboard.Key; - -import java.util.Arrays; -import java.util.List; - -abstract class KeyDetector { - protected Keyboard mKeyboard; - - private Key[] mKeys; - - protected int mCorrectionX; - - protected int mCorrectionY; - - protected boolean mProximityCorrectOn; - - protected int mProximityThresholdSquare; - - public Key[] setKeyboard(Keyboard keyboard, float correctionX, float correctionY) { - if (keyboard == null) - throw new NullPointerException(); - mCorrectionX = (int)correctionX; - mCorrectionY = (int)correctionY; - mKeyboard = keyboard; - List<Key> keys = mKeyboard.getKeys(); - Key[] array = keys.toArray(new Key[keys.size()]); - mKeys = array; - return array; - } - - protected int getTouchX(int x) { - return x + mCorrectionX; - } - - protected int getTouchY(int y) { - return y + mCorrectionY; - } - - protected Key[] getKeys() { - if (mKeys == null) - throw new IllegalStateException("keyboard isn't set"); - // mKeyboard is guaranteed not to be null at setKeybaord() method if mKeys is not null - return mKeys; - } - - public void setProximityCorrectionEnabled(boolean enabled) { - mProximityCorrectOn = enabled; - } - - public boolean isProximityCorrectionEnabled() { - return mProximityCorrectOn; - } - - public void setProximityThreshold(int threshold) { - mProximityThresholdSquare = threshold * threshold; - } - - /** - * Allocates array that can hold all key indices returned by {@link #getKeyIndexAndNearbyCodes} - * method. The maximum size of the array should be computed by {@link #getMaxNearbyKeys}. - * - * @return Allocates and returns an array that can hold all key indices returned by - * {@link #getKeyIndexAndNearbyCodes} method. All elements in the returned array are - * initialized by {@link com.android.inputmethod.latin.LatinKeyboardView.NOT_A_KEY} - * value. - */ - public int[] newCodeArray() { - int[] codes = new int[getMaxNearbyKeys()]; - Arrays.fill(codes, LatinKeyboardBaseView.NOT_A_KEY); - return codes; - } - - /** - * Computes maximum size of the array that can contain all nearby key indices returned by - * {@link #getKeyIndexAndNearbyCodes}. - * - * @return Returns maximum size of the array that can contain all nearby key indices returned - * by {@link #getKeyIndexAndNearbyCodes}. - */ - abstract protected int getMaxNearbyKeys(); - - /** - * Finds all possible nearby key indices around a touch event point and returns the nearest key - * index. The algorithm to determine the nearby keys depends on the threshold set by - * {@link #setProximityThreshold(int)} and the mode set by - * {@link #setProximityCorrectionEnabled(boolean)}. - * - * @param x The x-coordinate of a touch point - * @param y The y-coordinate of a touch point - * @param allKeys All nearby key indices are returned in this array - * @return The nearest key index - */ - abstract public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys); -} diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java deleted file mode 100644 index 0db204ed8..000000000 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ /dev/null @@ -1,606 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import android.content.SharedPreferences; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.preference.PreferenceManager; -import android.view.InflateException; - -import java.lang.ref.SoftReference; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Locale; - -public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener { - - public static final int MODE_NONE = 0; - public static final int MODE_TEXT = 1; - public static final int MODE_SYMBOLS = 2; - public static final int MODE_PHONE = 3; - public static final int MODE_URL = 4; - public static final int MODE_EMAIL = 5; - public static final int MODE_IM = 6; - public static final int MODE_WEB = 7; - - // Main keyboard layouts without the settings key - public static final int KEYBOARDMODE_NORMAL = R.id.mode_normal; - public static final int KEYBOARDMODE_URL = R.id.mode_url; - public static final int KEYBOARDMODE_EMAIL = R.id.mode_email; - public static final int KEYBOARDMODE_IM = R.id.mode_im; - public static final int KEYBOARDMODE_WEB = R.id.mode_webentry; - // Main keyboard layouts with the settings key - public static final int KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY = - R.id.mode_normal_with_settings_key; - public static final int KEYBOARDMODE_URL_WITH_SETTINGS_KEY = - R.id.mode_url_with_settings_key; - public static final int KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY = - R.id.mode_email_with_settings_key; - public static final int KEYBOARDMODE_IM_WITH_SETTINGS_KEY = - R.id.mode_im_with_settings_key; - public static final int KEYBOARDMODE_WEB_WITH_SETTINGS_KEY = - R.id.mode_webentry_with_settings_key; - - // Symbols keyboard layout without the settings key - public static final int KEYBOARDMODE_SYMBOLS = R.id.mode_symbols; - // Symbols keyboard layout with the settings key - public static final int KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY = - R.id.mode_symbols_with_settings_key; - - public static final String DEFAULT_LAYOUT_ID = "4"; - public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20100902"; - private static final int[] THEMES = new int [] { - R.layout.input_basic, R.layout.input_basic_highcontrast, R.layout.input_stone_normal, - R.layout.input_stone_bold, R.layout.input_gingerbread}; - - // Ids for each characters' color in the keyboard - private static final int CHAR_THEME_COLOR_WHITE = 0; - private static final int CHAR_THEME_COLOR_BLACK = 1; - - // Tables which contains resource ids for each character theme color - private static final int[] KBD_PHONE = new int[] {R.xml.kbd_phone, R.xml.kbd_phone_black}; - private static final int[] KBD_PHONE_SYMBOLS = new int[] { - R.xml.kbd_phone_symbols, R.xml.kbd_phone_symbols_black}; - private static final int[] KBD_SYMBOLS = new int[] { - R.xml.kbd_symbols, R.xml.kbd_symbols_black}; - private static final int[] KBD_SYMBOLS_SHIFT = new int[] { - R.xml.kbd_symbols_shift, R.xml.kbd_symbols_shift_black}; - private static final int[] KBD_QWERTY = new int[] {R.xml.kbd_qwerty, R.xml.kbd_qwerty_black}; - - private LatinKeyboardView mInputView; - private static final int[] ALPHABET_MODES = { - KEYBOARDMODE_NORMAL, - KEYBOARDMODE_URL, - KEYBOARDMODE_EMAIL, - KEYBOARDMODE_IM, - KEYBOARDMODE_WEB, - KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY, - KEYBOARDMODE_URL_WITH_SETTINGS_KEY, - KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY, - KEYBOARDMODE_IM_WITH_SETTINGS_KEY, - KEYBOARDMODE_WEB_WITH_SETTINGS_KEY }; - - private LatinIME mInputMethodService; - - private KeyboardId mSymbolsId; - private KeyboardId mSymbolsShiftedId; - - private KeyboardId mCurrentId; - private final HashMap<KeyboardId, SoftReference<LatinKeyboard>> mKeyboards = - new HashMap<KeyboardId, SoftReference<LatinKeyboard>>(); - - private int mMode = MODE_NONE; /** One of the MODE_XXX values */ - private int mImeOptions; - private boolean mIsSymbols; - /** mIsAutoCompletionActive indicates that auto completed word will be input instead of - * what user actually typed. */ - private boolean mIsAutoCompletionActive; - private boolean mHasVoice; - private boolean mVoiceOnPrimary; - private boolean mPreferSymbols; - - private static final int AUTO_MODE_SWITCH_STATE_ALPHA = 0; - private static final int AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN = 1; - private static final int AUTO_MODE_SWITCH_STATE_SYMBOL = 2; - // The following states are used only on the distinct multi-touch panel devices. - private static final int AUTO_MODE_SWITCH_STATE_MOMENTARY = 3; - private static final int AUTO_MODE_SWITCH_STATE_CHORDING = 4; - private int mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; - - // Indicates whether or not we have the settings key - private boolean mHasSettingsKey; - private static final int SETTINGS_KEY_MODE_AUTO = R.string.settings_key_mode_auto; - private static final int SETTINGS_KEY_MODE_ALWAYS_SHOW = R.string.settings_key_mode_always_show; - // NOTE: No need to have SETTINGS_KEY_MODE_ALWAYS_HIDE here because it's not being referred to - // in the source code now. - // Default is SETTINGS_KEY_MODE_AUTO. - private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO; - - private int mLastDisplayWidth; - private LanguageSwitcher mLanguageSwitcher; - private Locale mInputLocale; - - private int mLayoutId; - - private static final KeyboardSwitcher sInstance = new KeyboardSwitcher(); - - public static KeyboardSwitcher getInstance() { - return sInstance; - } - - private KeyboardSwitcher() { - // Intentional empty constructor for singleton. - } - - public static void init(LatinIME ims) { - sInstance.mInputMethodService = ims; - - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ims); - sInstance.mLayoutId = Integer.valueOf( - prefs.getString(PREF_KEYBOARD_LAYOUT, DEFAULT_LAYOUT_ID)); - sInstance.updateSettingsKeyState(prefs); - prefs.registerOnSharedPreferenceChangeListener(sInstance); - - sInstance.mSymbolsId = sInstance.makeSymbolsId(false); - sInstance.mSymbolsShiftedId = sInstance.makeSymbolsShiftedId(false); - } - - /** - * Sets the input locale, when there are multiple locales for input. - * If no locale switching is required, then the locale should be set to null. - * @param locale the current input locale, or null for default locale with no locale - * button. - */ - public void setLanguageSwitcher(LanguageSwitcher languageSwitcher) { - mLanguageSwitcher = languageSwitcher; - mInputLocale = mLanguageSwitcher.getInputLocale(); - } - - private KeyboardId makeSymbolsId(boolean hasVoice) { - return new KeyboardId(KBD_SYMBOLS[getCharColorId()], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - } - - private KeyboardId makeSymbolsShiftedId(boolean hasVoice) { - return new KeyboardId(KBD_SYMBOLS_SHIFT[getCharColorId()], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - } - - public void makeKeyboards(boolean forceCreate) { - mSymbolsId = makeSymbolsId(mHasVoice && !mVoiceOnPrimary); - mSymbolsShiftedId = makeSymbolsShiftedId(mHasVoice && !mVoiceOnPrimary); - - if (forceCreate) mKeyboards.clear(); - // Configuration change is coming after the keyboard gets recreated. So don't rely on that. - // If keyboards have already been made, check if we have a screen width change and - // create the keyboard layouts again at the correct orientation - int displayWidth = mInputMethodService.getMaxWidth(); - if (displayWidth == mLastDisplayWidth) return; - mLastDisplayWidth = displayWidth; - if (!forceCreate) mKeyboards.clear(); - } - - /** - * Represents the parameters necessary to construct a new LatinKeyboard, - * which also serve as a unique identifier for each keyboard type. - */ - private static class KeyboardId { - // TODO: should have locale and portrait/landscape orientation? - public final int mXml; - public final int mKeyboardMode; /** A KEYBOARDMODE_XXX value */ - public final boolean mEnableShiftLock; - public final boolean mHasVoice; - - private final int mHashCode; - - public KeyboardId(int xml, int mode, boolean enableShiftLock, boolean hasVoice) { - this.mXml = xml; - this.mKeyboardMode = mode; - this.mEnableShiftLock = enableShiftLock; - this.mHasVoice = hasVoice; - - this.mHashCode = Arrays.hashCode(new Object[] { - xml, mode, enableShiftLock, hasVoice - }); - } - - public KeyboardId(int xml, boolean hasVoice) { - this(xml, 0, false, hasVoice); - } - - @Override - public boolean equals(Object other) { - return other instanceof KeyboardId && equals((KeyboardId) other); - } - - private boolean equals(KeyboardId other) { - return other.mXml == this.mXml - && other.mKeyboardMode == this.mKeyboardMode - && other.mEnableShiftLock == this.mEnableShiftLock - && other.mHasVoice == this.mHasVoice; - } - - @Override - public int hashCode() { - return mHashCode; - } - } - - public void setVoiceMode(boolean enableVoice, boolean voiceOnPrimary) { - if (enableVoice != mHasVoice || voiceOnPrimary != mVoiceOnPrimary) { - mKeyboards.clear(); - } - mHasVoice = enableVoice; - mVoiceOnPrimary = voiceOnPrimary; - setKeyboardMode(mMode, mImeOptions, mHasVoice, mIsSymbols); - } - - private boolean hasVoiceButton(boolean isSymbols) { - return mHasVoice && (isSymbols != mVoiceOnPrimary); - } - - public void setKeyboardMode(int mode, int imeOptions, boolean enableVoice) { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; - mPreferSymbols = mode == MODE_SYMBOLS; - if (mode == MODE_SYMBOLS) { - mode = MODE_TEXT; - } - try { - setKeyboardMode(mode, imeOptions, enableVoice, mPreferSymbols); - } catch (RuntimeException e) { - LatinImeLogger.logOnException(mode + "," + imeOptions + "," + mPreferSymbols, e); - } - } - - private void setKeyboardMode(int mode, int imeOptions, boolean enableVoice, boolean isSymbols) { - if (mInputView == null) return; - mMode = mode; - mImeOptions = imeOptions; - if (enableVoice != mHasVoice) { - // TODO clean up this unnecessary recursive call. - setVoiceMode(enableVoice, mVoiceOnPrimary); - } - mIsSymbols = isSymbols; - - mInputView.setPreviewEnabled(mInputMethodService.getPopupOn()); - KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols); - LatinKeyboard keyboard = null; - keyboard = getKeyboard(id); - - if (mode == MODE_PHONE) { - mInputView.setPhoneKeyboard(keyboard); - } - - mCurrentId = id; - mInputView.setKeyboard(keyboard); - keyboard.setShifted(false); - keyboard.setShiftLocked(keyboard.isShiftLocked()); - keyboard.setImeOptions(mInputMethodService.getResources(), mMode, imeOptions); - keyboard.setColorOfSymbolIcons(mIsAutoCompletionActive, isBlackSym()); - // Update the settings key state because number of enabled IMEs could have been changed - updateSettingsKeyState(PreferenceManager.getDefaultSharedPreferences(mInputMethodService)); - } - - private LatinKeyboard getKeyboard(KeyboardId id) { - SoftReference<LatinKeyboard> ref = mKeyboards.get(id); - LatinKeyboard keyboard = (ref == null) ? null : ref.get(); - if (keyboard == null) { - Resources orig = mInputMethodService.getResources(); - Configuration conf = orig.getConfiguration(); - Locale saveLocale = conf.locale; - conf.locale = mInputLocale; - orig.updateConfiguration(conf, null); - keyboard = new LatinKeyboard(mInputMethodService, id.mXml, id.mKeyboardMode); - keyboard.setVoiceMode(hasVoiceButton(id.mXml == R.xml.kbd_symbols - || id.mXml == R.xml.kbd_symbols_black), mHasVoice); - keyboard.setLanguageSwitcher(mLanguageSwitcher, mIsAutoCompletionActive, isBlackSym()); - - if (id.mEnableShiftLock) { - keyboard.enableShiftLock(); - } - mKeyboards.put(id, new SoftReference<LatinKeyboard>(keyboard)); - - conf.locale = saveLocale; - orig.updateConfiguration(conf, null); - } - return keyboard; - } - - private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) { - boolean hasVoice = hasVoiceButton(isSymbols); - int charColorId = getCharColorId(); - // TODO: generalize for any KeyboardId - int keyboardRowsResId = KBD_QWERTY[charColorId]; - if (isSymbols) { - if (mode == MODE_PHONE) { - return new KeyboardId(KBD_PHONE_SYMBOLS[charColorId], hasVoice); - } else { - return new KeyboardId(KBD_SYMBOLS[charColorId], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - } - } - switch (mode) { - case MODE_NONE: - LatinImeLogger.logOnWarning( - "getKeyboardId:" + mode + "," + imeOptions + "," + isSymbols); - /* fall through */ - case MODE_TEXT: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY : KEYBOARDMODE_NORMAL, - true, hasVoice); - case MODE_SYMBOLS: - return new KeyboardId(KBD_SYMBOLS[charColorId], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - case MODE_PHONE: - return new KeyboardId(KBD_PHONE[charColorId], hasVoice); - case MODE_URL: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_URL_WITH_SETTINGS_KEY : KEYBOARDMODE_URL, true, hasVoice); - case MODE_EMAIL: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY : KEYBOARDMODE_EMAIL, true, hasVoice); - case MODE_IM: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_IM_WITH_SETTINGS_KEY : KEYBOARDMODE_IM, true, hasVoice); - case MODE_WEB: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_WEB_WITH_SETTINGS_KEY : KEYBOARDMODE_WEB, true, hasVoice); - } - return null; - } - - public int getKeyboardMode() { - return mMode; - } - - public boolean isAlphabetMode() { - if (mCurrentId == null) { - return false; - } - int currentMode = mCurrentId.mKeyboardMode; - for (Integer mode : ALPHABET_MODES) { - if (currentMode == mode) { - return true; - } - } - return false; - } - - public void setShifted(boolean shifted) { - if (mInputView != null) { - mInputView.setShifted(shifted); - } - } - - public void setShiftLocked(boolean shiftLocked) { - if (mInputView != null) { - mInputView.setShiftLocked(shiftLocked); - } - } - - public void toggleShift() { - if (isAlphabetMode()) - return; - if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) { - LatinKeyboard symbolsShiftedKeyboard = getKeyboard(mSymbolsShiftedId); - mCurrentId = mSymbolsShiftedId; - mInputView.setKeyboard(symbolsShiftedKeyboard); - // Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To - // enable the indicator, we need to call enableShiftLock() and setShiftLocked(true). - // Thus we can keep the ALT key's Key.on value true while LatinKey.onRelease() is - // called. - symbolsShiftedKeyboard.enableShiftLock(); - symbolsShiftedKeyboard.setShiftLocked(true); - symbolsShiftedKeyboard.setImeOptions(mInputMethodService.getResources(), - mMode, mImeOptions); - } else { - LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId); - mCurrentId = mSymbolsId; - mInputView.setKeyboard(symbolsKeyboard); - // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the - // indicator, we need to call enableShiftLock() and setShiftLocked(false). - symbolsKeyboard.enableShiftLock(); - symbolsKeyboard.setShifted(false); - symbolsKeyboard.setImeOptions(mInputMethodService.getResources(), mMode, mImeOptions); - } - } - - public void onCancelInput() { - // Snap back to the previous keyboard mode if the user cancels sliding input. - if (mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY && getPointerCount() == 1) - mInputMethodService.changeKeyboardMode(); - } - - public void toggleSymbols() { - setKeyboardMode(mMode, mImeOptions, mHasVoice, !mIsSymbols); - if (mIsSymbols && !mPreferSymbols) { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN; - } else { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; - } - } - - public boolean hasDistinctMultitouch() { - return mInputView != null && mInputView.hasDistinctMultitouch(); - } - - public void setAutoModeSwitchStateMomentary() { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_MOMENTARY; - } - - public boolean isInMomentaryAutoModeSwitchState() { - return mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_MOMENTARY; - } - - public boolean isInChordingAutoModeSwitchState() { - return mAutoModeSwitchState == AUTO_MODE_SWITCH_STATE_CHORDING; - } - - public boolean isVibrateAndSoundFeedbackRequired() { - return mInputView != null && !mInputView.isInSlidingKeyInput(); - } - - private int getPointerCount() { - return mInputView == null ? 0 : mInputView.getPointerCount(); - } - - /** - * Updates state machine to figure out when to automatically snap back to the previous mode. - */ - public void onKey(int key) { - // Switch back to alpha mode if user types one or more non-space/enter characters - // followed by a space/enter - switch (mAutoModeSwitchState) { - case AUTO_MODE_SWITCH_STATE_MOMENTARY: - // Only distinct multi touch devices can be in this state. - // On non-distinct multi touch devices, mode change key is handled by {@link onKey}, - // not by {@link onPress} and {@link onRelease}. So, on such devices, - // {@link mAutoModeSwitchState} starts from {@link AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN}, - // or {@link AUTO_MODE_SWITCH_STATE_ALPHA}, not from - // {@link AUTO_MODE_SWITCH_STATE_MOMENTARY}. - if (key == LatinKeyboard.KEYCODE_MODE_CHANGE) { - // Detected only the mode change key has been pressed, and then released. - if (mIsSymbols) { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN; - } else { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; - } - } else if (getPointerCount() == 1) { - // Snap back to the previous keyboard mode if the user pressed the mode change key - // and slid to other key, then released the finger. - // If the user cancels the sliding input, snapping back to the previous keyboard - // mode is handled by {@link #onCancelInput}. - mInputMethodService.changeKeyboardMode(); - } else { - // Chording input is being started. The keyboard mode will be snapped back to the - // previous mode in {@link onReleaseSymbol} when the mode change key is released. - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_CHORDING; - } - break; - case AUTO_MODE_SWITCH_STATE_SYMBOL_BEGIN: - if (key != LatinIME.KEYCODE_SPACE && key != LatinIME.KEYCODE_ENTER && key >= 0) { - mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_SYMBOL; - } - break; - case AUTO_MODE_SWITCH_STATE_SYMBOL: - // Snap back to alpha keyboard mode if user types one or more non-space/enter - // characters followed by a space/enter. - if (key == LatinIME.KEYCODE_ENTER || key == LatinIME.KEYCODE_SPACE) { - mInputMethodService.changeKeyboardMode(); - } - break; - } - } - - public LatinKeyboardView getInputView() { - return mInputView; - } - - public void recreateInputView() { - changeLatinKeyboardView(mLayoutId, true); - } - - private void changeLatinKeyboardView(int newLayout, boolean forceReset) { - if (mLayoutId != newLayout || mInputView == null || forceReset) { - if (mInputView != null) { - mInputView.closing(); - } - if (THEMES.length <= newLayout) { - newLayout = Integer.valueOf(DEFAULT_LAYOUT_ID); - } - - LatinIMEUtil.GCUtils.getInstance().reset(); - boolean tryGC = true; - for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { - try { - mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater( - ).inflate(THEMES[newLayout], null); - tryGC = false; - } catch (OutOfMemoryError e) { - tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait( - mLayoutId + "," + newLayout, e); - } catch (InflateException e) { - tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait( - mLayoutId + "," + newLayout, e); - } - } - mInputView.setOnKeyboardActionListener(mInputMethodService); - mLayoutId = newLayout; - } - mInputMethodService.mHandler.post(new Runnable() { - public void run() { - if (mInputView != null) { - mInputMethodService.setInputView(mInputView); - } - mInputMethodService.updateInputViewShown(); - }}); - } - - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (PREF_KEYBOARD_LAYOUT.equals(key)) { - changeLatinKeyboardView( - Integer.valueOf(sharedPreferences.getString(key, DEFAULT_LAYOUT_ID)), false); - } else if (LatinIMESettings.PREF_SETTINGS_KEY.equals(key)) { - updateSettingsKeyState(sharedPreferences); - recreateInputView(); - } - } - - public boolean isBlackSym () { - if (mInputView != null && mInputView.getSymbolColorScheme() == 1) { - return true; - } - return false; - } - - private int getCharColorId () { - if (isBlackSym()) { - return CHAR_THEME_COLOR_BLACK; - } else { - return CHAR_THEME_COLOR_WHITE; - } - } - - public void onAutoCompletionStateChanged(boolean isAutoCompletion) { - if (isAutoCompletion != mIsAutoCompletionActive) { - LatinKeyboardView keyboardView = getInputView(); - mIsAutoCompletionActive = isAutoCompletion; - keyboardView.invalidateKey(((LatinKeyboard) keyboardView.getKeyboard()) - .onAutoCompletionStateChanged(isAutoCompletion)); - } - } - - private void updateSettingsKeyState(SharedPreferences prefs) { - Resources resources = mInputMethodService.getResources(); - final String settingsKeyMode = prefs.getString(LatinIMESettings.PREF_SETTINGS_KEY, - resources.getString(DEFAULT_SETTINGS_KEY_MODE)); - // We show the settings key when 1) SETTINGS_KEY_MODE_ALWAYS_SHOW or - // 2) SETTINGS_KEY_MODE_AUTO and there are two or more enabled IMEs on the system - if (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_ALWAYS_SHOW)) - || (settingsKeyMode.equals(resources.getString(SETTINGS_KEY_MODE_AUTO)) - && LatinIMEUtil.hasMultipleEnabledIMEs(mInputMethodService))) { - mHasSettingsKey = true; - } else { - mHasSettingsKey = false; - } - } -} diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 4f3d3ba9f..9c6465dd2 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -25,18 +25,17 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; -import android.content.res.XmlResourceParser; import android.inputmethodservice.InputMethodService; -import android.inputmethodservice.Keyboard; import android.media.AudioManager; +import android.net.ConnectivityManager; import android.os.Debug; import android.os.Handler; +import android.os.IBinder; import android.os.Message; import android.os.SystemClock; import android.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; @@ -44,7 +43,6 @@ import android.util.PrintWriterPrinter; import android.util.Printer; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; @@ -53,441 +51,422 @@ import android.view.WindowManager; import android.view.inputmethod.CompletionInfo; 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.widget.LinearLayout; -import com.android.inputmethod.latin.LatinIMEUtil.RingCharBuffer; -import com.android.inputmethod.voice.FieldContext; -import com.android.inputmethod.voice.SettingsUtil; -import com.android.inputmethod.voice.VoiceInput; - -import org.xmlpull.v1.XmlPullParserException; +import com.android.inputmethod.accessibility.AccessibilityUtils; +import com.android.inputmethod.compat.CompatUtils; +import com.android.inputmethod.compat.EditorInfoCompatUtils; +import com.android.inputmethod.compat.InputConnectionCompatUtils; +import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; +import com.android.inputmethod.compat.InputMethodServiceCompatWrapper; +import com.android.inputmethod.compat.InputTypeCompatUtils; +import com.android.inputmethod.compat.SuggestionSpanUtils; +import com.android.inputmethod.deprecated.LanguageSwitcherProxy; +import com.android.inputmethod.deprecated.VoiceProxy; +import com.android.inputmethod.deprecated.recorrection.Recorrection; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardActionListener; +import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.keyboard.KeyboardView; +import com.android.inputmethod.keyboard.LatinKeyboard; +import com.android.inputmethod.keyboard.LatinKeyboardView; import 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.Locale; -import java.util.Map; /** * Input method implementation for Qwerty'ish keyboard. */ -public class LatinIME extends InputMethodService - implements LatinKeyboardBaseView.OnKeyboardActionListener, - VoiceInput.UiListener, - SharedPreferences.OnSharedPreferenceChangeListener { - private static final String TAG = "LatinIME"; +public class LatinIME extends InputMethodServiceCompatWrapper implements KeyboardActionListener, + CandidateView.Listener { + private static final String TAG = LatinIME.class.getSimpleName(); private static final boolean PERF_DEBUG = false; - static final boolean DEBUG = false; - static final boolean TRACE = false; - static final boolean VOICE_INSTALLED = true; - static final boolean ENABLE_VOICE_BUTTON = true; - - private static final String PREF_VIBRATE_ON = "vibrate_on"; - private static final String PREF_SOUND_ON = "sound_on"; - private static final String PREF_POPUP_ON = "popup_on"; - private static final String PREF_AUTO_CAP = "auto_cap"; - private static final String PREF_QUICK_FIXES = "quick_fixes"; - private static final String PREF_SHOW_SUGGESTIONS = "show_suggestions"; - private static final String PREF_AUTO_COMPLETE = "auto_complete"; - //private static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion"; - private static final String PREF_VOICE_MODE = "voice_mode"; - - // Whether or not the user has used voice input before (and thus, whether to show the - // first-run warning dialog or not). - private static final String PREF_HAS_USED_VOICE_INPUT = "has_used_voice_input"; - - // Whether or not the user has used voice input from an unsupported locale UI before. - // For example, the user has a Chinese UI but activates voice input. - private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE = - "has_used_voice_input_unsupported_locale"; - - // A list of locales which are supported by default for voice input, unless we get a - // different list from Gservices. - public static final String DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES = - "en " + - "en_US " + - "en_GB " + - "en_AU " + - "en_CA " + - "en_IE " + - "en_IN " + - "en_NZ " + - "en_SG " + - "en_ZA "; - - // The private IME option used to indicate that no microphone should be shown for a - // given text field. For instance this is specified by the search dialog when the - // dialog is already showing a voice search button. - private static final String IME_OPTION_NO_MICROPHONE = "nm"; - - public static final String PREF_SELECTED_LANGUAGES = "selected_languages"; - public static final String PREF_INPUT_LANGUAGE = "input_language"; - private static final String PREF_RECORRECTION_ENABLED = "recorrection_enabled"; - - private static final int MSG_UPDATE_SUGGESTIONS = 0; - private static final int MSG_START_TUTORIAL = 1; - private static final int MSG_UPDATE_SHIFT_STATE = 2; - private static final int MSG_VOICE_RESULTS = 3; - private static final int MSG_UPDATE_OLD_SUGGESTIONS = 4; + private static final boolean TRACE = false; + private static boolean DEBUG; + + /** + * The private IME option used to indicate that no microphone should be + * shown for a given text field. For instance, this is specified by the + * search dialog when the dialog is already showing a voice search button. + * + * @deprecated Use {@link LatinIME#IME_OPTION_NO_MICROPHONE} with package name prefixed. + */ + @SuppressWarnings("dep-ann") + public static final String IME_OPTION_NO_MICROPHONE_COMPAT = "nm"; + + /** + * The private IME option used to indicate that no microphone should be + * shown for a given text field. For instance, this is specified by the + * search dialog when the dialog is already showing a voice search button. + */ + public static final String IME_OPTION_NO_MICROPHONE = "noMicrophoneKey"; + + /** + * The private IME option used to indicate that no settings key should be + * shown for a given text field. + */ + public static final String IME_OPTION_NO_SETTINGS_KEY = "noSettingsKey"; + + private static final int EXTENDED_TOUCHABLE_REGION_HEIGHT = 100; // How many continuous deletes at which to start deleting at a higher speed. private static final int DELETE_ACCELERATE_AT = 20; // Key events coming any faster than this are long-presses. private static final int QUICK_PRESS = 200; - static final int KEYCODE_ENTER = '\n'; - static final int KEYCODE_SPACE = ' '; - static final int KEYCODE_PERIOD = '.'; + /** + * The name of the scheme used by the Package Manager to warn of a new package installation, + * replacement or removal. + */ + private static final String SCHEME_PACKAGE = "package"; + + 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 + }; - // Contextual menu positions - private static final int POS_METHOD = 0; - private static final int POS_SETTINGS = 1; + private Settings.Values mSettingsValues; - //private LatinKeyboardView mInputView; - private LinearLayout mCandidateViewContainer; + private View mCandidateViewContainer; + private int mCandidateStripHeight; private CandidateView mCandidateView; private Suggest mSuggest; - private CompletionInfo[] mCompletions; + private CompletionInfo[] mApplicationSpecifiedCompletions; private AlertDialog mOptionsDialog; - private AlertDialog mVoiceWarningDialog; - /* package */ KeyboardSwitcher mKeyboardSwitcher; + private InputMethodManagerCompatWrapper mImm; + private Resources mResources; + private SharedPreferences mPrefs; + private String mInputMethodId; + private KeyboardSwitcher mKeyboardSwitcher; + private SubtypeSwitcher mSubtypeSwitcher; + private VoiceProxy mVoiceProxy; + private Recorrection mRecorrection; private UserDictionary mUserDictionary; private UserBigramDictionary mUserBigramDictionary; - private ContactsDictionary mContactsDictionary; private AutoDictionary mAutoDictionary; - private Hints mHints; - - private Resources mResources; - - private String mInputLocale; - private String mSystemLocale; - private LanguageSwitcher mLanguageSwitcher; + // TODO: Create an inner class to group options and pseudo-options to improve readability. + // These variables are initialized according to the {@link EditorInfo#inputType}. + private boolean mShouldInsertMagicSpace; + private boolean mInputTypeNoAutoCorrect; + private boolean mIsSettingsSuggestionStripOn; + private boolean mApplicationSpecifiedCompletionOn; - private StringBuilder mComposing = new StringBuilder(); + private final StringBuilder mComposing = new StringBuilder(); private WordComposer mWord = new WordComposer(); - private int mCommittedLength; - private boolean mPredicting; - private boolean mRecognizing; - private boolean mAfterVoiceInput; - private boolean mImmediatelyAfterVoiceInput; - private boolean mShowingVoiceSuggestions; - private boolean mVoiceInputHighlighted; - private boolean mEnableVoiceButton; private CharSequence mBestWord; - private boolean mPredictionOn; - private boolean mCompletionOn; + private boolean mHasUncommittedTypedChars; 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 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; + // Magic space: a space that should disappear on space/apostrophe insertion, move after the + // punctuation on punctuation insertion, and become a real space on alpha char insertion. + private boolean mJustAddedMagicSpace; // This indicates whether the last char is a magic space. + // This indicates whether the last keypress resulted in processing of double space replacement + // with period-space. + private boolean mJustReplacedDoubleSpace; + + private int mCorrectionMode; + private int mCommittedLength; + private int mOrientation; // Keep track of the last selection range to decide if we need to show word alternatives - private int mLastSelectionStart; - private int mLastSelectionEnd; - - // Input type is such that we should not auto-correct - private boolean mInputTypeNoAutoCorrect; + private int mLastSelectionStart; + private int mLastSelectionEnd; - // Indicates whether the suggestion strip is to be on in landscape - private boolean mJustAccepted; - private CharSequence mJustRevertedSeparator; + // Whether we are expecting an onUpdateSelection event to fire. If it does when we don't + // "expect" it, it means the user actually moved the cursor. + private boolean mExpectingUpdateSelection; 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 boolean mSilentMode; - - /* package */ String mWordSeparators; - private String mSentenceSeparators; - private String mSuggestPuncs; - private VoiceInput mVoiceInput; - private VoiceResults mVoiceResults = new VoiceResults(); + private static final float FX_VOLUME = -1.0f; + private boolean mSilentModeOn; // System-wide current configuration + + // TODO: Move this flag to VoiceProxy private boolean mConfigurationChanging; + // Object for reacting to adding/removing a dictionary pack. + private BroadcastReceiver mDictionaryPackInstallReceiver = + new DictionaryPackInstallBroadcastReceiver(this); + // 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>(); + public final UIHandler mHandler = new UIHandler(); - private class VoiceResults { - List<String> candidates; - Map<String, List<CharSequence>> alternatives; - } - - public abstract static class WordAlternatives { - protected CharSequence mChosenWord; + public class UIHandler extends Handler { + private static final int MSG_UPDATE_SUGGESTIONS = 0; + private static final int MSG_UPDATE_OLD_SUGGESTIONS = 1; + private static final int MSG_UPDATE_SHIFT_STATE = 2; + private static final int MSG_VOICE_RESULTS = 3; + private static final int MSG_FADEOUT_LANGUAGE_ON_SPACEBAR = 4; + private static final int MSG_DISMISS_LANGUAGE_ON_SPACEBAR = 5; + private static final int MSG_SPACE_TYPED = 6; + private static final int MSG_SET_BIGRAM_PREDICTIONS = 7; - public WordAlternatives() { - // Nothing + @Override + public void handleMessage(Message msg) { + final KeyboardSwitcher switcher = mKeyboardSwitcher; + final LatinKeyboardView inputView = switcher.getKeyboardView(); + switch (msg.what) { + case MSG_UPDATE_SUGGESTIONS: + updateSuggestions(); + break; + case MSG_UPDATE_OLD_SUGGESTIONS: + mRecorrection.fetchAndDisplayRecorrectionSuggestions(mVoiceProxy, mCandidateView, + mSuggest, mKeyboardSwitcher, mWord, mHasUncommittedTypedChars, + mLastSelectionStart, mLastSelectionEnd, mSettingsValues.mWordSeparators); + break; + case MSG_UPDATE_SHIFT_STATE: + switcher.updateShiftState(); + break; + case MSG_SET_BIGRAM_PREDICTIONS: + updateBigramPredictions(); + break; + case MSG_VOICE_RESULTS: + mVoiceProxy.handleVoiceResults(preferCapitalization() + || (switcher.isAlphabetMode() && switcher.isShiftedOrShiftLocked())); + break; + case MSG_FADEOUT_LANGUAGE_ON_SPACEBAR: + if (inputView != null) { + inputView.setSpacebarTextFadeFactor( + (1.0f + mSettingsValues.mFinalFadeoutFactorOfLanguageOnSpacebar) / 2, + (LatinKeyboard)msg.obj); + } + sendMessageDelayed(obtainMessage(MSG_DISMISS_LANGUAGE_ON_SPACEBAR, msg.obj), + mSettingsValues.mDurationOfFadeoutLanguageOnSpacebar); + break; + case MSG_DISMISS_LANGUAGE_ON_SPACEBAR: + if (inputView != null) { + inputView.setSpacebarTextFadeFactor( + mSettingsValues.mFinalFadeoutFactorOfLanguageOnSpacebar, + (LatinKeyboard)msg.obj); + } + break; + } } - public WordAlternatives(CharSequence chosenWord) { - mChosenWord = chosenWord; + public void postUpdateSuggestions() { + removeMessages(MSG_UPDATE_SUGGESTIONS); + sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTIONS), + mSettingsValues.mDelayUpdateSuggestions); } - @Override - public int hashCode() { - return mChosenWord.hashCode(); + public void cancelUpdateSuggestions() { + removeMessages(MSG_UPDATE_SUGGESTIONS); } - public abstract CharSequence getOriginalWord(); + public boolean hasPendingUpdateSuggestions() { + return hasMessages(MSG_UPDATE_SUGGESTIONS); + } - public CharSequence getChosenWord() { - return mChosenWord; + public void postUpdateOldSuggestions() { + removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); + sendMessageDelayed(obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS), + mSettingsValues.mDelayUpdateOldSuggestions); } - public abstract List<CharSequence> getAlternatives(); - } + public void cancelUpdateOldSuggestions() { + removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); + } - public class TypedWordAlternatives extends WordAlternatives { - private WordComposer word; + public void postUpdateShiftKeyState() { + removeMessages(MSG_UPDATE_SHIFT_STATE); + sendMessageDelayed(obtainMessage(MSG_UPDATE_SHIFT_STATE), + mSettingsValues.mDelayUpdateShiftState); + } - public TypedWordAlternatives() { - // Nothing + public void cancelUpdateShiftState() { + removeMessages(MSG_UPDATE_SHIFT_STATE); } - public TypedWordAlternatives(CharSequence chosenWord, WordComposer wordComposer) { - super(chosenWord); - word = wordComposer; + public void postUpdateBigramPredictions() { + removeMessages(MSG_SET_BIGRAM_PREDICTIONS); + sendMessageDelayed(obtainMessage(MSG_SET_BIGRAM_PREDICTIONS), + mSettingsValues.mDelayUpdateSuggestions); } - @Override - public CharSequence getOriginalWord() { - return word.getTypedWord(); + public void cancelUpdateBigramPredictions() { + removeMessages(MSG_SET_BIGRAM_PREDICTIONS); } - @Override - public List<CharSequence> getAlternatives() { - return getTypedSuggestions(word); + public void updateVoiceResults() { + sendMessage(obtainMessage(MSG_VOICE_RESULTS)); } - } - /* package */ Handler mHandler = new Handler() { - @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; + public void startDisplayLanguageOnSpacebar(boolean localeChanged) { + removeMessages(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR); + removeMessages(MSG_DISMISS_LANGUAGE_ON_SPACEBAR); + final LatinKeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); + if (inputView != null) { + final LatinKeyboard keyboard = mKeyboardSwitcher.getLatinKeyboard(); + // The language is always displayed when the delay is negative. + final boolean needsToDisplayLanguage = localeChanged + || mSettingsValues.mDelayBeforeFadeoutLanguageOnSpacebar < 0; + // The language is never displayed when the delay is zero. + if (mSettingsValues.mDelayBeforeFadeoutLanguageOnSpacebar != 0) { + inputView.setSpacebarTextFadeFactor(needsToDisplayLanguage ? 1.0f + : mSettingsValues.mFinalFadeoutFactorOfLanguageOnSpacebar, keyboard); + } + // The fadeout animation will start when the delay is positive. + if (localeChanged && mSettingsValues.mDelayBeforeFadeoutLanguageOnSpacebar > 0) { + sendMessageDelayed(obtainMessage(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR, keyboard), + mSettingsValues.mDelayBeforeFadeoutLanguageOnSpacebar); + } } } - }; + + public void startDoubleSpacesTimer() { + removeMessages(MSG_SPACE_TYPED); + sendMessageDelayed(obtainMessage(MSG_SPACE_TYPED), + mSettingsValues.mDoubleSpacesTurnIntoPeriodTimeout); + } + + public void cancelDoubleSpacesTimer() { + removeMessages(MSG_SPACE_TYPED); + } + + public boolean isAcceptingDoubleSpaces() { + return hasMessages(MSG_SPACE_TYPED); + } + } @Override public void onCreate() { - LatinImeLogger.init(this); - KeyboardSwitcher.init(this); - super.onCreate(); - //setStatusIcon(R.drawable.ime_qwerty); - mResources = getResources(); - final Configuration conf = mResources.getConfiguration(); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - mLanguageSwitcher = new LanguageSwitcher(this); - mLanguageSwitcher.loadLocales(prefs); + mPrefs = prefs; + LatinImeLogger.init(this, prefs); + LanguageSwitcherProxy.init(this, prefs); + SubtypeSwitcher.init(this, prefs); + KeyboardSwitcher.init(this, prefs); + Recorrection.init(this, prefs); + AccessibilityUtils.init(this, prefs); + + super.onCreate(); + + mImm = InputMethodManagerCompatWrapper.getInstance(this); + mInputMethodId = Utils.getInputMethodId(mImm, getPackageName()); + mSubtypeSwitcher = SubtypeSwitcher.getInstance(); mKeyboardSwitcher = KeyboardSwitcher.getInstance(); - mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher); - mSystemLocale = conf.locale.toString(); - mLanguageSwitcher.setSystemLocale(conf.locale); - String inputLanguage = mLanguageSwitcher.getInputLanguage(); - if (inputLanguage == null) { - inputLanguage = conf.locale.toString(); - } - mReCorrectionEnabled = prefs.getBoolean(PREF_RECORRECTION_ENABLED, - getResources().getBoolean(R.bool.default_recorrection_enabled)); + mRecorrection = Recorrection.getInstance(); + DEBUG = LatinImeLogger.sDBG; - LatinIMEUtil.GCUtils.getInstance().reset(); + loadSettings(); + + final Resources res = getResources(); + mResources = res; + + Utils.GCUtils.getInstance().reset(); boolean tryGC = true; - for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { + for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { try { - initSuggest(inputLanguage); + initSuggest(); tryGC = false; } catch (OutOfMemoryError e) { - tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait(inputLanguage, e); + tryGC = Utils.GCUtils.getInstance().tryGCOrWait("InitSuggest", e); } } - mOrientation = conf.orientation; - initSuggestPuncList(); + mOrientation = res.getConfiguration().orientation; - // register to receive ringer mode changes for silent mode - IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); + // Register to receive ringer mode change and network state change. + // Also receive installation and removal of a dictionary pack. + final IntentFilter filter = new IntentFilter(); + filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(mReceiver, filter); - if (VOICE_INSTALLED) { - mVoiceInput = new VoiceInput(this, this); - mHints = new Hints(this, new Hints.Display() { - public void showHint(int viewResource) { - LayoutInflater inflater = (LayoutInflater) getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - View view = inflater.inflate(viewResource, null); - setCandidatesView(view); - setCandidatesViewShown(true); - mIsShowingHint = true; - } - }); - } - prefs.registerOnSharedPreferenceChangeListener(this); - } + mVoiceProxy = VoiceProxy.init(this, prefs, mHandler); - /** - * Loads a dictionary or multiple separated dictionary - * @return returns array of dictionary resource ids - */ - /* package */ static int[] getDictionary(Resources res) { - String packageName = LatinIME.class.getPackage().getName(); - XmlResourceParser xrp = res.getXml(R.xml.dictionary); - ArrayList<Integer> dictionaries = new ArrayList<Integer>(); - - try { - int current = xrp.getEventType(); - while (current != XmlResourceParser.END_DOCUMENT) { - if (current == XmlResourceParser.START_TAG) { - String tag = xrp.getName(); - if (tag != null) { - if (tag.equals("part")) { - String dictFileName = xrp.getAttributeValue(null, "name"); - dictionaries.add(res.getIdentifier(dictFileName, "raw", packageName)); - } - } - } - xrp.next(); - current = xrp.getEventType(); - } - } catch (XmlPullParserException e) { - Log.e(TAG, "Dictionary XML parsing failure"); - } catch (IOException e) { - Log.e(TAG, "Dictionary XML IOException"); - } + final IntentFilter packageFilter = new IntentFilter(); + packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); + packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); + packageFilter.addDataScheme(SCHEME_PACKAGE); + registerReceiver(mDictionaryPackInstallReceiver, packageFilter); - int count = dictionaries.size(); - int[] dict = new int[count]; - for (int i = 0; i < count; i++) { - dict[i] = dictionaries.get(i); - } + final IntentFilter newDictFilter = new IntentFilter(); + newDictFilter.addAction( + DictionaryPackInstallBroadcastReceiver.NEW_DICTIONARY_INTENT_ACTION); + registerReceiver(mDictionaryPackInstallReceiver, newDictFilter); + } - return dict; + // Has to be package-visible for unit tests + /* package */ void loadSettings() { + if (null == mPrefs) mPrefs = PreferenceManager.getDefaultSharedPreferences(this); + if (null == mSubtypeSwitcher) mSubtypeSwitcher = SubtypeSwitcher.getInstance(); + mSettingsValues = new Settings.Values(mPrefs, this, mSubtypeSwitcher.getInputLocaleStr()); + resetContactsDictionary(); } - private void initSuggest(String locale) { - mInputLocale = locale; + private void initSuggest() { + final String localeStr = mSubtypeSwitcher.getInputLocaleStr(); + final Locale keyboardLocale = Utils.constructLocaleFromString(localeStr); - Resources orig = getResources(); - Configuration conf = orig.getConfiguration(); - Locale saveLocale = conf.locale; - conf.locale = new Locale(locale); - orig.updateConfiguration(conf, orig.getDisplayMetrics()); + final Resources res = mResources; + final Locale savedLocale = Utils.setSystemLocale(res, keyboardLocale); if (mSuggest != null) { mSuggest.close(); } - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true); - int[] dictionaries = getDictionary(orig); - mSuggest = new Suggest(this, dictionaries); - updateAutoTextEnabled(saveLocale); - if (mUserDictionary != null) mUserDictionary.close(); - mUserDictionary = new UserDictionary(this, mInputLocale); - if (mContactsDictionary == null) { - mContactsDictionary = new ContactsDictionary(this, Suggest.DIC_CONTACTS); - } - if (mAutoDictionary != null) { - mAutoDictionary.close(); + int mainDicResId = Utils.getMainDictionaryResourceId(res); + mSuggest = new Suggest(this, mainDicResId, keyboardLocale); + if (mSettingsValues.mAutoCorrectEnabled) { + mSuggest.setAutoCorrectionThreshold(mSettingsValues.mAutoCorrectionThreshold); } - mAutoDictionary = new AutoDictionary(this, this, mInputLocale, Suggest.DIC_AUTO); - if (mUserBigramDictionary != null) { - mUserBigramDictionary.close(); - } - mUserBigramDictionary = new UserBigramDictionary(this, this, mInputLocale, - Suggest.DIC_USER); - mSuggest.setUserBigramDictionary(mUserBigramDictionary); + updateAutoTextEnabled(); + + mUserDictionary = new UserDictionary(this, localeStr); mSuggest.setUserDictionary(mUserDictionary); - mSuggest.setContactsDictionary(mContactsDictionary); + + resetContactsDictionary(); + + mAutoDictionary = new AutoDictionary(this, this, localeStr, Suggest.DIC_AUTO); mSuggest.setAutoDictionary(mAutoDictionary); + + mUserBigramDictionary = new UserBigramDictionary(this, this, localeStr, Suggest.DIC_USER); + mSuggest.setUserBigramDictionary(mUserBigramDictionary); + updateCorrectionMode(); - mWordSeparators = mResources.getString(R.string.word_separators); - mSentenceSeparators = mResources.getString(R.string.sentence_separators); - conf.locale = saveLocale; - orig.updateConfiguration(conf, orig.getDisplayMetrics()); + Utils.setSystemLocale(res, savedLocale); + } + + private void resetContactsDictionary() { + if (null == mSuggest) return; + ContactsDictionary contactsDictionary = mSettingsValues.mUseContactsDict + ? new ContactsDictionary(this, Suggest.DIC_CONTACTS) : null; + mSuggest.setContactsDictionary(contactsDictionary); + } + + /* package private */ void resetSuggestMainDict() { + final String localeStr = mSubtypeSwitcher.getInputLocaleStr(); + final Locale keyboardLocale = Utils.constructLocaleFromString(localeStr); + int mainDicResId = Utils.getMainDictionaryResourceId(mResources); + mSuggest.resetMainDict(this, mainDicResId, keyboardLocale); } @Override public void onDestroy() { - if (mUserDictionary != null) { - mUserDictionary.close(); - } - if (mContactsDictionary != null) { - mContactsDictionary.close(); + if (mSuggest != null) { + mSuggest.close(); + mSuggest = null; } unregisterReceiver(mReceiver); - if (VOICE_INSTALLED && mVoiceInput != null) { - mVoiceInput.destroy(); - } + unregisterReceiver(mDictionaryPackInstallReceiver); + mVoiceProxy.destroy(); LatinImeLogger.commit(); LatinImeLogger.onDestroy(); super.onDestroy(); @@ -495,236 +474,192 @@ public class LatinIME extends InputMethodService @Override public void onConfigurationChanged(Configuration conf) { - // If the system locale changes and is different from the saved - // locale (mSystemLocale), then reload the input locale list from the - // latin ime settings (shared prefs) and reset the input locale - // to the first one. - final String systemLocale = conf.locale.toString(); - if (!TextUtils.equals(systemLocale, mSystemLocale)) { - mSystemLocale = systemLocale; - if (mLanguageSwitcher != null) { - mLanguageSwitcher.loadLocales( - PreferenceManager.getDefaultSharedPreferences(this)); - mLanguageSwitcher.setSystemLocale(conf.locale); - toggleLanguage(true, true); - } else { - reloadKeyboards(); - } - } + mSubtypeSwitcher.onConfigurationChanged(conf); // If orientation changed while predicting, commit the change if (conf.orientation != mOrientation) { InputConnection ic = getCurrentInputConnection(); commitTyped(ic); if (ic != null) ic.finishComposingText(); // For voice input mOrientation = conf.orientation; - reloadKeyboards(); + if (isShowingOptionDialog()) + mOptionsDialog.dismiss(); } + mConfigurationChanging = true; super.onConfigurationChanged(conf); - if (mRecognizing) { - switchToRecognitionStatusView(); - } + mVoiceProxy.onConfigurationChanged(conf); mConfigurationChanging = false; + + // This will work only when the subtype is not supported. + LanguageSwitcherProxy.onConfigurationChanged(conf); } @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); - mCandidateView.setService(this); - setCandidatesViewShown(true); - return mCandidateViewContainer; + public void setInputView(View view) { + super.setInputView(view); + mCandidateViewContainer = view.findViewById(R.id.candidates_container); + mCandidateView = (CandidateView) view.findViewById(R.id.candidates); + mCandidateView.setListener(this, view); + mCandidateStripHeight = (int)mResources.getDimension(R.dimen.candidate_strip_height); + } + + @Override + public void setCandidatesView(View view) { + // To ensure that CandidatesView will never be set. + return; } @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { - LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + final KeyboardSwitcher switcher = mKeyboardSwitcher; + LatinKeyboardView inputView = switcher.getKeyboardView(); + + if (DEBUG) { + Log.d(TAG, "onStartInputView: attribute:" + ((attribute == null) ? "none" + : String.format("inputType=0x%08x imeOptions=0x%08x", + attribute.inputType, attribute.imeOptions))); + } // In landscape mode, this method gets called without the input view being created. if (inputView == null) { return; } - if (mRefreshKeyboardRequired) { - mRefreshKeyboardRequired = false; - toggleLanguage(true, true); - } - - mKeyboardSwitcher.makeKeyboards(false); - - TextEntryState.newSession(this); + mSubtypeSwitcher.updateParametersOnStartInputView(); - // Most such things we decide below in the switch statement, but we need to know - // now whether this is a password text field, because we need to know now (before - // the switch statement) whether we want to enable the voice button. - mPasswordText = false; - int variation = attribute.inputType & EditorInfo.TYPE_MASK_VARIATION; - if (variation == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD || - variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) { - mPasswordText = true; - } + TextEntryState.reset(); - mEnableVoiceButton = shouldShowVoiceButton(makeFieldContext(), attribute); - final boolean enableVoiceButton = mEnableVoiceButton && mEnableVoice; + // Most such things we decide below in initializeInputAttributesAndGetMode, but we need to + // know now whether this is a password text field, because we need to know now whether we + // want to enable the voice button. + final VoiceProxy voiceIme = mVoiceProxy; + voiceIme.resetVoiceStates(InputTypeCompatUtils.isPasswordInputType(attribute.inputType) + || InputTypeCompatUtils.isVisiblePasswordInputType(attribute.inputType)); - mAfterVoiceInput = false; - mImmediatelyAfterVoiceInput = false; - mShowingVoiceSuggestions = false; - mVoiceInputHighlighted = false; - mInputTypeNoAutoCorrect = false; - mPredictionOn = false; - mCompletionOn = false; - mCompletions = null; - mCapsLock = false; - 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); - break; - case EditorInfo.TYPE_CLASS_TEXT: - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, - attribute.imeOptions, enableVoiceButton); - //startPrediction(); - mPredictionOn = true; - // Make sure that passwords are not displayed in candidate view - if (variation == EditorInfo.TYPE_TEXT_VARIATION_PASSWORD || - variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ) { - mPredictionOn = false; - } - if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS - || variation == EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME) { - mAutoSpace = false; - } else { - mAutoSpace = true; - } - if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS) { - mPredictionOn = false; - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_EMAIL, - attribute.imeOptions, enableVoiceButton); - } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_URI) { - mPredictionOn = false; - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_URL, - attribute.imeOptions, enableVoiceButton); - } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_SHORT_MESSAGE) { - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_IM, - attribute.imeOptions, enableVoiceButton); - } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_FILTER) { - mPredictionOn = false; - } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) { - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_WEB, - attribute.imeOptions, enableVoiceButton); - // If it's a browser edit field and auto correct is not ON explicitly, then - // disable auto correction, but keep suggestions on. - if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) { - mInputTypeNoAutoCorrect = true; - } - } + initializeInputAttributes(attribute); - // If NO_SUGGESTIONS is set, don't do prediction. - if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0) { - mPredictionOn = false; - mInputTypeNoAutoCorrect = true; - } - // If it's not multiline and the autoCorrect flag is not set, then don't correct - if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0 && - (attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) == 0) { - mInputTypeNoAutoCorrect = true; - } - if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) { - mPredictionOn = false; - mCompletionOn = isFullscreenMode(); - } - break; - default: - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, - attribute.imeOptions, enableVoiceButton); - } inputView.closing(); + mEnteredText = null; mComposing.setLength(0); - mPredicting = false; + mHasUncommittedTypedChars = false; mDeleteCount = 0; - mJustAddedAutoSpace = false; + mJustAddedMagicSpace = false; + mJustReplacedDoubleSpace = false; + loadSettings(); - updateShiftKeyState(attribute); + updateCorrectionMode(); + updateAutoTextEnabled(); + updateSuggestionVisibility(mPrefs, mResources); - setCandidatesViewShownInternal(isCandidateStripVisible() || mCompletionOn, - false /* needsInputViewShown */ ); - updateSuggestions(); + if (mSuggest != null && mSettingsValues.mAutoCorrectEnabled) { + mSuggest.setAutoCorrectionThreshold(mSettingsValues.mAutoCorrectionThreshold); + } + mVoiceProxy.loadSettings(attribute, mPrefs); + // This will work only when the subtype is not supported. + LanguageSwitcherProxy.loadSettings(); - // If the dictionary is not big enough, don't auto correct - mHasDictionary = mSuggest.hasMainDictionary(); + if (mSubtypeSwitcher.isKeyboardMode()) { + switcher.loadKeyboard(attribute, + mSubtypeSwitcher.isShortcutImeEnabled() && voiceIme.isVoiceButtonEnabled(), + voiceIme.isVoiceButtonOnPrimary()); + switcher.updateShiftState(); + } + + setSuggestionStripShownInternal(isCandidateStripVisible(), /* needsInputViewShown */ false); + // Delay updating suggestions because keyboard input view may not be shown at this point. + mHandler.postUpdateSuggestions(); updateCorrectionMode(); - inputView.setPreviewEnabled(mPopupOn); + inputView.setKeyPreviewPopupEnabled(mSettingsValues.mKeyPreviewPopupOn, + mSettingsValues.mKeyPreviewPopupDismissDelay); inputView.setProximityCorrectionEnabled(true); - mPredictionOn = mPredictionOn && (mCorrectionMode > 0 || mShowSuggestions); // If we just entered a text field, maybe it has some old text that requires correction - checkReCorrectionOnStart(); - checkTutorial(attribute.privateImeOptions); + mRecorrection.checkRecorrectionOnStart(); + inputView.setForeground(true); + + voiceIme.onStartInputView(inputView.getWindowToken()); + if (TRACE) Debug.startMethodTracing("/data/trace/latinime"); } - private void checkReCorrectionOnStart() { - if (mReCorrectionEnabled && 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 - // 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); - if (et == null) return; - - mLastSelectionStart = et.startOffset + et.selectionStart; - mLastSelectionEnd = et.startOffset + et.selectionEnd; - - // Then look for possible corrections in a delayed fashion - if (!TextUtils.isEmpty(et.text) && isCursorTouchingWord()) { - postUpdateOldSuggestions(); + private void initializeInputAttributes(EditorInfo attribute) { + if (attribute == null) + return; + final int inputType = attribute.inputType; + final int variation = inputType & InputType.TYPE_MASK_VARIATION; + mShouldInsertMagicSpace = false; + mInputTypeNoAutoCorrect = false; + mIsSettingsSuggestionStripOn = false; + mApplicationSpecifiedCompletionOn = false; + mApplicationSpecifiedCompletions = null; + + if ((inputType & InputType.TYPE_MASK_CLASS) == InputType.TYPE_CLASS_TEXT) { + mIsSettingsSuggestionStripOn = true; + // Make sure that passwords are not displayed in candidate view + if (InputTypeCompatUtils.isPasswordInputType(inputType) + || InputTypeCompatUtils.isVisiblePasswordInputType(inputType)) { + mIsSettingsSuggestionStripOn = false; + } + if (InputTypeCompatUtils.isEmailVariation(variation) + || variation == InputType.TYPE_TEXT_VARIATION_PERSON_NAME) { + mShouldInsertMagicSpace = false; + } else { + mShouldInsertMagicSpace = true; + } + if (InputTypeCompatUtils.isEmailVariation(variation)) { + mIsSettingsSuggestionStripOn = false; + } else if (variation == InputType.TYPE_TEXT_VARIATION_URI) { + mIsSettingsSuggestionStripOn = false; + } else if (variation == InputType.TYPE_TEXT_VARIATION_FILTER) { + mIsSettingsSuggestionStripOn = false; + } else if (variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) { + // If it's a browser edit field and auto correct is not ON explicitly, then + // disable auto correction, but keep suggestions on. + if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) { + mInputTypeNoAutoCorrect = true; + } + } + + // If NO_SUGGESTIONS is set, don't do prediction. + if ((inputType & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0) { + mIsSettingsSuggestionStripOn = false; + mInputTypeNoAutoCorrect = true; + } + // If it's not multiline and the autoCorrect flag is not set, then don't correct + if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0 + && (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE) == 0) { + mInputTypeNoAutoCorrect = true; + } + if ((inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) { + mIsSettingsSuggestionStripOn = false; + mApplicationSpecifiedCompletionOn = isFullscreenMode(); } } } @Override + public void onWindowHidden() { + super.onWindowHidden(); + KeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); + if (inputView != null) inputView.closing(); + } + + @Override public void onFinishInput() { 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(); - } + mVoiceProxy.flushVoiceInputLogs(mConfigurationChanging); + + KeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); + if (inputView != null) inputView.closing(); if (mAutoDictionary != null) mAutoDictionary.flushPendingWrites(); if (mUserBigramDictionary != null) mUserBigramDictionary.flushPendingWrites(); } @@ -732,21 +667,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.getKeyboardView(); + 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; + mVoiceProxy.showPunctuationHintIfNecessary(); } @Override @@ -759,75 +690,70 @@ public class LatinIME extends InputMethodService if (DEBUG) { Log.i(TAG, "onUpdateSelection: oss=" + oldSelStart + ", ose=" + oldSelEnd + + ", lss=" + mLastSelectionStart + + ", lse=" + mLastSelectionEnd + ", nss=" + newSelStart + ", nse=" + newSelEnd + ", cs=" + candidatesStart + ", ce=" + candidatesEnd); } - if (mAfterVoiceInput) { - mVoiceInput.setCursorPos(newSelEnd); - mVoiceInput.setSelectionSpan(newSelEnd - newSelStart); - } + mVoiceProxy.setCursorAndSelection(newSelEnd, newSelStart); // If the current selection in the text view changes, we should // clear whatever candidate text we have. - if ((((mComposing.length() > 0 && mPredicting) || mVoiceInputHighlighted) - && (newSelStart != candidatesEnd - || newSelEnd != candidatesEnd) - && mLastSelectionStart != newSelStart)) { + final boolean selectionChanged = (newSelStart != candidatesEnd + || newSelEnd != candidatesEnd) && mLastSelectionStart != newSelStart; + final boolean candidatesCleared = candidatesStart == -1 && candidatesEnd == -1; + if (((mComposing.length() > 0 && mHasUncommittedTypedChars) + || mVoiceProxy.isVoiceInputHighlighted()) + && (selectionChanged || candidatesCleared)) { + if (candidatesCleared) { + // If the composing span has been cleared, save the typed word in the history for + // recorrection before we reset the candidate strip. Then, we'll be able to show + // suggestions for recorrection right away. + mRecorrection.saveRecorrectionSuggestion(mWord, mComposing); + } mComposing.setLength(0); - mPredicting = false; - postUpdateSuggestions(); + mHasUncommittedTypedChars = false; + if (isCursorTouchingWord()) { + mHandler.cancelUpdateBigramPredictions(); + mHandler.postUpdateSuggestions(); + } else { + setPunctuationSuggestions(); + } TextEntryState.reset(); InputConnection ic = getCurrentInputConnection(); if (ic != null) { ic.finishComposingText(); } - mVoiceInputHighlighted = false; - } else if (!mPredicting && !mJustAccepted) { - switch (TextEntryState.getState()) { - case ACCEPTED_DEFAULT: + mVoiceProxy.setVoiceInputHighlighted(false); + } else if (!mHasUncommittedTypedChars && !mExpectingUpdateSelection) { + if (TextEntryState.isAcceptedDefault() || TextEntryState.isSpaceAfterPicked()) { + if (TextEntryState.isAcceptedDefault()) TextEntryState.reset(); - // fall through - case SPACE_AFTER_PICKED: - mJustAddedAutoSpace = false; // The user moved the cursor. - break; } } - mJustAccepted = false; - postUpdateShiftKeyState(); + if (!mExpectingUpdateSelection) { + mJustAddedMagicSpace = false; // The user moved the cursor. + mJustReplacedDoubleSpace = false; + } + mExpectingUpdateSelection = false; + mHandler.postUpdateShiftKeyState(); // Make a note of the cursor position mLastSelectionStart = newSelStart; mLastSelectionEnd = newSelEnd; - if (mReCorrectionEnabled) { - // Don't look for corrections if the keyboard is not visible - if (mKeyboardSwitcher != null && mKeyboardSwitcher.getInputView() != null - && mKeyboardSwitcher.getInputView().isShown()) { - // Check if we should go in or out of correction mode. - if (isPredictionOn() - && mJustRevertedSeparator == null - && (candidatesStart == candidatesEnd || newSelStart != oldSelStart - || TextEntryState.isCorrecting()) - && (newSelStart < newSelEnd - 1 || (!mPredicting)) - && !mVoiceInputHighlighted) { - if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) { - 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(); - } - } - } - } - } + mRecorrection.updateRecorrectionSelection(mKeyboardSwitcher, + mCandidateView, candidatesStart, candidatesEnd, newSelStart, + newSelEnd, oldSelStart, mLastSelectionStart, + mLastSelectionEnd, mHasUncommittedTypedChars); + } + + public void setLastSelection(int start, int end) { + mLastSelectionStart = start; + mLastSelectionEnd = end; } /** @@ -840,7 +766,7 @@ public class LatinIME extends InputMethodService */ @Override public void onExtractedTextClicked() { - if (mReCorrectionEnabled && isPredictionOn()) return; + if (mRecorrection.isRecorrectionEnabled() && isSuggestionsRequested()) return; super.onExtractedTextClicked(); } @@ -856,7 +782,7 @@ public class LatinIME extends InputMethodService */ @Override public void onExtractedCursorMovement(int dx, int dy) { - if (mReCorrectionEnabled && isPredictionOn()) return; + if (mRecorrection.isRecorrectionEnabled() && isSuggestionsRequested()) return; super.onExtractedCursorMovement(dx, dy); } @@ -864,84 +790,103 @@ 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(); - mWordHistory.clear(); + mVoiceProxy.hideVoiceWindow(mConfigurationChanging); + mRecorrection.clearWordsInHistory(); super.hideWindow(); - TextEntryState.endSession(); } @Override - public void onDisplayCompletions(CompletionInfo[] completions) { + public void onDisplayCompletions(CompletionInfo[] applicationSpecifiedCompletions) { if (DEBUG) { - Log.i("foo", "Received completions:"); - for (int i=0; i<(completions != null ? completions.length : 0); i++) { - Log.i("foo", " #" + i + ": " + completions[i]); + Log.i(TAG, "Received completions:"); + if (applicationSpecifiedCompletions != null) { + for (int i = 0; i < applicationSpecifiedCompletions.length; i++) { + Log.i(TAG, " #" + i + ": " + applicationSpecifiedCompletions[i]); + } } } - if (mCompletionOn) { - mCompletions = completions; - if (completions == null) { + if (mApplicationSpecifiedCompletionOn) { + mApplicationSpecifiedCompletions = applicationSpecifiedCompletions; + if (applicationSpecifiedCompletions == null) { clearSuggestions(); return; } - List<CharSequence> stringList = new ArrayList<CharSequence>(); - for (int i=0; i<(completions != null ? completions.length : 0); i++) { - CompletionInfo ci = completions[i]; - if (ci != null) stringList.add(ci.getText()); - } + SuggestedWords.Builder builder = new SuggestedWords.Builder() + .setApplicationSpecifiedCompletions(applicationSpecifiedCompletions) + .setTypedWordValid(true) + .setHasMinimalSuggestion(true); // When in fullscreen mode, show completions generated by the application - setSuggestions(stringList, true, true, true); + setSuggestions(builder.build()); mBestWord = null; - setCandidatesViewShown(true); + setSuggestionStripShown(true); } } - private void setCandidatesViewShownInternal(boolean shown, boolean needsInputViewShown) { - // TODO: Remove this if we support candidates with hard keyboard + private void setSuggestionStripShownInternal(boolean shown, boolean needsInputViewShown) { + // TODO: Modify this if we support candidates with hard keyboard if (onEvaluateInputViewShown()) { - super.setCandidatesViewShown(shown && mKeyboardSwitcher.getInputView() != null - && (needsInputViewShown ? mKeyboardSwitcher.getInputView().isShown() : true)); + final boolean shouldShowCandidates = shown + && (needsInputViewShown ? mKeyboardSwitcher.isInputViewShown() : true); + if (isExtractViewShown()) { + // No need to have extra space to show the key preview. + mCandidateViewContainer.setMinimumHeight(0); + mCandidateViewContainer.setVisibility( + shouldShowCandidates ? View.VISIBLE : View.GONE); + } else { + // We must control the visibility of the suggestion strip in order to avoid clipped + // key previews, even when we don't show the suggestion strip. + mCandidateViewContainer.setVisibility( + shouldShowCandidates ? View.VISIBLE : View.INVISIBLE); + } } } - @Override - public void setCandidatesViewShown(boolean shown) { - setCandidatesViewShownInternal(shown, true /* needsInputViewShown */ ); + private void setSuggestionStripShown(boolean shown) { + setSuggestionStripShownInternal(shown, /* needsInputViewShown */true); } @Override public void onComputeInsets(InputMethodService.Insets outInsets) { super.onComputeInsets(outInsets); - if (!isFullscreenMode()) { - outInsets.contentTopInsets = outInsets.visibleTopInsets; + final KeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); + if (inputView == null || mCandidateViewContainer == null) + return; + final int containerHeight = mCandidateViewContainer.getHeight(); + int touchY = containerHeight; + // Need to set touchable region only if input view is being shown + if (mKeyboardSwitcher.isInputViewShown()) { + if (mCandidateViewContainer.getVisibility() == View.VISIBLE) { + touchY -= mCandidateStripHeight; + } + final int touchWidth = inputView.getWidth(); + final int touchHeight = inputView.getHeight() + containerHeight + // Extend touchable region below the keyboard. + + EXTENDED_TOUCHABLE_REGION_HEIGHT; + if (DEBUG) { + Log.d(TAG, "Touchable region: y=" + touchY + " width=" + touchWidth + + " height=" + touchHeight); + } + setTouchableRegionCompat(outInsets, 0, touchY, touchWidth, touchHeight); } + outInsets.contentTopInsets = touchY; + outInsets.visibleTopInsets = touchY; } @Override public boolean onEvaluateFullscreenMode() { - DisplayMetrics dm = getResources().getDisplayMetrics(); + final Resources res = mResources; + DisplayMetrics dm = res.getDisplayMetrics(); float displayHeight = dm.heightPixels; // If the display is more than X inches high, don't go to fullscreen mode - float dimen = getResources().getDimension(R.dimen.max_height_for_fullscreen); + float dimen = res.getDimension(R.dimen.max_height_for_fullscreen); if (displayHeight > dimen) { return false; } else { @@ -952,25 +897,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.getKeyboardView() != null) { + if (mKeyboardSwitcher.getKeyboardView().handleBack()) { return true; } - break; + } + break; } return super.onKeyDown(keyCode, event); } @@ -978,138 +911,86 @@ public class LatinIME extends InputMethodService @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { - case KeyEvent.KEYCODE_DPAD_DOWN: - case KeyEvent.KEYCODE_DPAD_UP: - case KeyEvent.KEYCODE_DPAD_LEFT: - case KeyEvent.KEYCODE_DPAD_RIGHT: - // If tutorial is visible, don't allow dpad to work - if (mTutorial != null) { - return true; - } - LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); - // Enable shift key and DPAD to do selections - if (inputView != null && inputView.isShown() - && inputView.isShifted()) { - event = new KeyEvent(event.getDownTime(), event.getEventTime(), - event.getAction(), event.getKeyCode(), event.getRepeatCount(), - event.getDeviceId(), event.getScanCode(), - KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON); - InputConnection ic = getCurrentInputConnection(); - if (ic != null) ic.sendKeyEvent(event); - return true; - } - break; + case KeyEvent.KEYCODE_DPAD_DOWN: + case KeyEvent.KEYCODE_DPAD_UP: + case KeyEvent.KEYCODE_DPAD_LEFT: + case KeyEvent.KEYCODE_DPAD_RIGHT: + // Enable shift key and DPAD to do selections + if (mKeyboardSwitcher.isInputViewShown() + && mKeyboardSwitcher.isShiftedOrShiftLocked()) { + KeyEvent newEvent = new KeyEvent(event.getDownTime(), event.getEventTime(), + event.getAction(), event.getKeyCode(), event.getRepeatCount(), + event.getDeviceId(), event.getScanCode(), + KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON); + InputConnection ic = getCurrentInputConnection(); + if (ic != null) + ic.sendKeyEvent(newEvent); + return true; + } + break; } return super.onKeyUp(keyCode, event); } - private void revertVoiceInput() { - InputConnection ic = getCurrentInputConnection(); - if (ic != null) ic.commitText("", 1); - updateSuggestions(); - mVoiceInputHighlighted = false; - } - - private void commitVoiceInput() { - InputConnection ic = getCurrentInputConnection(); - if (ic != null) ic.finishComposingText(); - updateSuggestions(); - mVoiceInputHighlighted = false; - } - - private void reloadKeyboards() { - mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher); - if (mKeyboardSwitcher.getInputView() != null - && mKeyboardSwitcher.getKeyboardMode() != KeyboardSwitcher.MODE_NONE) { - mKeyboardSwitcher.setVoiceMode(mEnableVoice && mEnableVoiceButton, mVoiceOnPrimary); - } - mKeyboardSwitcher.makeKeyboards(true); - } - - private void commitTyped(InputConnection inputConnection) { - if (mPredicting) { - mPredicting = false; + public void commitTyped(InputConnection inputConnection) { + if (mHasUncommittedTypedChars) { + mHasUncommittedTypedChars = false; if (mComposing.length() > 0) { if (inputConnection != null) { inputConnection.commitText(mComposing, 1); } mCommittedLength = mComposing.length(); TextEntryState.acceptedTyped(mComposing); - addToDictionaries(mComposing, AutoDictionary.FREQUENCY_FOR_TYPED); + addToAutoAndUserBigramDictionaries(mComposing, AutoDictionary.FREQUENCY_FOR_TYPED); } updateSuggestions(); } } - private void postUpdateShiftKeyState() { - mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE); - // TODO: Should remove this 300ms delay? - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SHIFT_STATE), 300); - } - - public void updateShiftKeyState(EditorInfo attr) { + public boolean getCurrentAutoCapsState() { InputConnection ic = getCurrentInputConnection(); - if (ic != null && attr != null && mKeyboardSwitcher.isAlphabetMode()) { - mKeyboardSwitcher.setShifted(mShiftKeyState.isMomentary() || mCapsLock - || getCursorCapsMode(ic, attr) != 0); - } - } - - private int getCursorCapsMode(InputConnection ic, EditorInfo attr) { - int caps = 0; EditorInfo ei = getCurrentInputEditorInfo(); - if (mAutoCap && ei != null && ei.inputType != EditorInfo.TYPE_NULL) { - caps = ic.getCursorCapsMode(attr.inputType); + if (mSettingsValues.mAutoCap && ic != null && ei != null + && ei.inputType != InputType.TYPE_NULL) { + return ic.getCursorCapsMode(ei.inputType) != 0; } - return caps; + return false; } - private void swapPunctuationAndSpace() { + private void swapSwapperAndSpace() { final InputConnection ic = getCurrentInputConnection(); if (ic == null) return; CharSequence lastTwo = ic.getTextBeforeCursor(2, 0); + // It is guaranteed lastTwo.charAt(1) is a swapper - else this method is not called. if (lastTwo != null && lastTwo.length() == 2 - && lastTwo.charAt(0) == KEYCODE_SPACE && isSentenceSeparator(lastTwo.charAt(1))) { + && lastTwo.charAt(0) == Keyboard.CODE_SPACE) { ic.beginBatchEdit(); ic.deleteSurroundingText(2, 0); ic.commitText(lastTwo.charAt(1) + " ", 1); ic.endBatchEdit(); - updateShiftKeyState(getCurrentInputEditorInfo()); - mJustAddedAutoSpace = true; + mKeyboardSwitcher.updateShiftState(); } } - private void reswapPeriodAndSpace() { - final InputConnection ic = getCurrentInputConnection(); - 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) { - ic.beginBatchEdit(); - ic.deleteSurroundingText(3, 0); - ic.commitText(" ..", 1); - ic.endBatchEdit(); - updateShiftKeyState(getCurrentInputEditorInfo()); - } - } - - private void doubleSpace() { - //if (!mAutoPunctuate) return; + private void maybeDoubleSpace() { if (mCorrectionMode == Suggest.CORRECTION_NONE) return; final InputConnection ic = getCurrentInputConnection(); if (ic == null) return; CharSequence lastThree = ic.getTextBeforeCursor(3, 0); if (lastThree != null && lastThree.length() == 3 && Character.isLetterOrDigit(lastThree.charAt(0)) - && lastThree.charAt(1) == KEYCODE_SPACE && lastThree.charAt(2) == KEYCODE_SPACE) { + && lastThree.charAt(1) == Keyboard.CODE_SPACE + && lastThree.charAt(2) == Keyboard.CODE_SPACE + && mHandler.isAcceptingDoubleSpaces()) { + mHandler.cancelDoubleSpacesTimer(); ic.beginBatchEdit(); ic.deleteSurroundingText(2, 0); ic.commitText(". ", 1); ic.endBatchEdit(); - updateShiftKeyState(getCurrentInputEditorInfo()); - mJustAddedAutoSpace = true; + mKeyboardSwitcher.updateShiftState(); + mJustReplacedDoubleSpace = true; + } else { + mHandler.startDoubleSpacesTimer(); } } @@ -1121,8 +1002,8 @@ public class LatinIME extends InputMethodService // if there is one. CharSequence lastOne = ic.getTextBeforeCursor(1, 0); if (lastOne != null && lastOne.length() == 1 - && lastOne.charAt(0) == KEYCODE_PERIOD - && text.charAt(0) == KEYCODE_PERIOD) { + && lastOne.charAt(0) == Keyboard.CODE_PERIOD + && text.charAt(0) == Keyboard.CODE_PERIOD) { ic.deleteSurroundingText(1, 0); } } @@ -1133,16 +1014,17 @@ 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); } } + @Override public boolean addWordToDictionary(String word) { mUserDictionary.addWord(word, 128); // Suggestion strip should be updated after the operation of adding word to the // user dictionary - postUpdateSuggestions(); + mHandler.postUpdateSuggestions(); return true; } @@ -1154,25 +1036,22 @@ public class LatinIME extends InputMethodService } } - private void showInputMethodPicker() { - ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) - .showInputMethodPicker(); - } - - private void onOptionKeyPressed() { - if (!isShowingOptionDialog()) { - if (LatinIMEUtil.hasMultipleEnabledIMEs(this)) { - showOptionsMenu(); - } else { - launchSettings(); - } + private void onSettingsKeyPressed() { + if (isShowingOptionDialog()) + return; + if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) { + showSubtypeSelectorAndSettings(); + } else if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) { + showOptionsMenu(); + } else { + launchSettings(); } } - private void onOptionKeyLongPressed() { + private void onSettingsKeyLongPressed() { if (!isShowingOptionDialog()) { - if (LatinIMEUtil.hasMultipleEnabledIMEs(this)) { - showInputMethodPicker(); + if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) { + mImm.showInputMethodPicker(); } else { launchSettings(); } @@ -1183,150 +1062,155 @@ public class LatinIME extends InputMethodService return mOptionsDialog != null && mOptionsDialog.isShowing(); } - // Implementation of KeyboardViewListener - - public void onKey(int primaryCode, int[] keyCodes, int x, int y) { + // Implementation of {@link KeyboardActionListener}. + @Override + public void onCodeInput(int primaryCode, int[] keyCodes, int x, int y) { long when = SystemClock.uptimeMillis(); - if (primaryCode != Keyboard.KEYCODE_DELETE || - when > mLastKeyTime + QUICK_PRESS) { + if (primaryCode != Keyboard.CODE_DELETE || when > mLastKeyTime + QUICK_PRESS) { mDeleteCount = 0; } mLastKeyTime = when; - final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); + KeyboardSwitcher switcher = mKeyboardSwitcher; + final boolean distinctMultiTouch = switcher.hasDistinctMultitouch(); + final boolean lastStateOfJustReplacedDoubleSpace = mJustReplacedDoubleSpace; + mJustReplacedDoubleSpace = false; switch (primaryCode) { - case Keyboard.KEYCODE_DELETE: - handleBackspace(); - mDeleteCount++; - LatinImeLogger.logOnDelete(); - break; - case Keyboard.KEYCODE_SHIFT: - // Shift key is handled in onPress() when device has distinct multi-touch panel. - if (!distinctMultiTouch) - handleShift(); - break; - case Keyboard.KEYCODE_MODE_CHANGE: - // Symbol key is handled in onPress() when device has distinct multi-touch panel. - if (!distinctMultiTouch) - changeKeyboardMode(); - break; - case Keyboard.KEYCODE_CANCEL: - if (!isShowingOptionDialog()) { - handleClose(); - } - break; - case LatinKeyboardView.KEYCODE_OPTIONS: - onOptionKeyPressed(); - break; - case LatinKeyboardView.KEYCODE_OPTIONS_LONGPRESS: - onOptionKeyLongPressed(); - break; - case LatinKeyboardView.KEYCODE_NEXT_LANGUAGE: - toggleLanguage(false, true); - break; - case LatinKeyboardView.KEYCODE_PREV_LANGUAGE: - toggleLanguage(false, false); - break; - case LatinKeyboardView.KEYCODE_VOICE: - if (VOICE_INSTALLED) { - startListening(false /* was a button press, was not a swipe */); - } - break; - case 9 /*Tab*/: - sendDownUpKeyEvents(KeyEvent.KEYCODE_TAB); - break; - default: - if (primaryCode != KEYCODE_ENTER) { - mJustAddedAutoSpace = false; - } - RingCharBuffer.getInstance().push((char)primaryCode, x, y); - LatinImeLogger.logOnInputChar(); - if (isWordSeparator(primaryCode)) { - handleSeparator(primaryCode); - } else { - handleCharacter(primaryCode, keyCodes); - } - // Cancel the just reverted state - mJustRevertedSeparator = null; + case Keyboard.CODE_DELETE: + handleBackspace(lastStateOfJustReplacedDoubleSpace); + mDeleteCount++; + mExpectingUpdateSelection = true; + 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 LatinKeyboard.CODE_NEXT_LANGUAGE: + toggleLanguage(true); + break; + case LatinKeyboard.CODE_PREV_LANGUAGE: + toggleLanguage(false); + break; + case Keyboard.CODE_CAPSLOCK: + switcher.toggleCapsLock(); + break; + case Keyboard.CODE_SHORTCUT: + mSubtypeSwitcher.switchToShortcutIME(); + break; + case Keyboard.CODE_TAB: + handleTab(); + // There are two cases for tab. Either we send a "next" event, that may change the + // focus but will never move the cursor. Or, we send a real tab keycode, which some + // applications may accept or ignore, and we don't know whether this will move the + // cursor or not. So actually, we don't really know. + // So to go with the safer option, we'd rather behave as if the user moved the + // cursor when they didn't than the opposite. We also expect that most applications + // will actually use tab only for focus movement. + // To sum it up: do not update mExpectingUpdateSelection here. + break; + default: + if (mSettingsValues.isWordSeparator(primaryCode)) { + handleSeparator(primaryCode, x, y); + } else { + handleCharacter(primaryCode, keyCodes, x, y); + } + mExpectingUpdateSelection = true; + break; } - mKeyboardSwitcher.onKey(primaryCode); + switcher.onKey(primaryCode); // Reset after any single keystroke mEnteredText = null; } - public void onText(CharSequence text) { - if (VOICE_INSTALLED && mVoiceInputHighlighted) { - commitVoiceInput(); - } + @Override + public void onTextInput(CharSequence text) { + mVoiceProxy.commitVoiceInput(); InputConnection ic = getCurrentInputConnection(); if (ic == null) return; - abortCorrection(false); + mRecorrection.abortRecorrection(false); ic.beginBatchEdit(); - if (mPredicting) { - commitTyped(ic); - } + commitTyped(ic); maybeRemovePreviousPeriod(text); ic.commitText(text, 1); ic.endBatchEdit(); - updateShiftKeyState(getCurrentInputEditorInfo()); - mKeyboardSwitcher.onKey(0); // dummy key code. - mJustRevertedSeparator = null; - mJustAddedAutoSpace = false; + mKeyboardSwitcher.updateShiftState(); + mKeyboardSwitcher.onKey(Keyboard.CODE_DUMMY); + mJustAddedMagicSpace = false; mEnteredText = text; } - public void onCancel() { + @Override + public void onCancelInput() { // User released a finger outside any key mKeyboardSwitcher.onCancelInput(); } - private void handleBackspace() { - if (VOICE_INSTALLED && mVoiceInputHighlighted) { - mVoiceInput.incrementTextModificationDeleteCount( - mVoiceResults.candidates.get(0).toString().length()); - revertVoiceInput(); - return; - } - boolean deleteChar = false; - InputConnection ic = getCurrentInputConnection(); - if (ic == null) return; + private void handleBackspace(boolean justReplacedDoubleSpace) { + if (mVoiceProxy.logAndRevertVoiceInput()) return; + final InputConnection ic = getCurrentInputConnection(); + if (ic == null) return; ic.beginBatchEdit(); - if (mAfterVoiceInput) { - // Don't log delete if the user is pressing delete at - // the beginning of the text box (hence not deleting anything) - if (mVoiceInput.getCursorPos() > 0) { - // If anything was selected before the delete was pressed, increment the - // delete count by the length of the selection - int deleteLen = mVoiceInput.getSelectionSpan() > 0 ? - mVoiceInput.getSelectionSpan() : 1; - mVoiceInput.incrementTextModificationDeleteCount(deleteLen); - } - } + mVoiceProxy.handleBackspace(); - if (mPredicting) { + boolean deleteChar = false; + if (mHasUncommittedTypedChars) { final int length = mComposing.length(); if (length > 0) { mComposing.delete(length - 1, length); mWord.deleteLast(); ic.setComposingText(mComposing, 1); if (mComposing.length() == 0) { - mPredicting = false; + mHasUncommittedTypedChars = false; + } + if (1 == length) { + // 1 == length means we are about to erase the last character of the word, + // so we can show bigrams. + mHandler.postUpdateBigramPredictions(); + } else { + // length > 1, so we still have letters to deduce a suggestion from. + mHandler.postUpdateSuggestions(); } - postUpdateSuggestions(); } else { ic.deleteSurroundingText(1, 0); } } else { deleteChar = true; } - postUpdateShiftKeyState(); + mHandler.postUpdateShiftKeyState(); + TextEntryState.backspace(); - if (TextEntryState.getState() == TextEntryState.State.UNDO_COMMIT) { + if (TextEntryState.isUndoCommit()) { revertLastWord(deleteChar); ic.endBatchEdit(); return; - } else if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) { + } + if (justReplacedDoubleSpace) { + if (revertDoubleSpace()) { + ic.endBatchEdit(); + return; + } + } + + if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) { ic.deleteSurroundingText(mEnteredText.length(), 0); } else if (deleteChar) { if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) { @@ -1345,178 +1229,176 @@ public class LatinIME extends InputMethodService } } } - mJustRevertedSeparator = null; ic.endBatchEdit(); } - private void resetShift() { - handleShiftInternal(true); - } + private void handleTab() { + final int imeOptions = getCurrentInputEditorInfo().imeOptions; + if (!EditorInfoCompatUtils.hasFlagNavigateNext(imeOptions) + && !EditorInfoCompatUtils.hasFlagNavigatePrevious(imeOptions)) { + 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 (EditorInfoCompatUtils.hasFlagNavigateNext(imeOptions) + && !isManualTemporaryUpperCase) { + EditorInfoCompatUtils.performEditorActionNext(ic); + } else if (EditorInfoCompatUtils.hasFlagNavigatePrevious(imeOptions) + && isManualTemporaryUpperCase) { + EditorInfoCompatUtils.performEditorActionPrevious(ic); } } - private void abortCorrection(boolean force) { - if (force || TextEntryState.isCorrecting()) { - getCurrentInputConnection().finishComposingText(); - clearSuggestions(); - } - } + private void handleCharacter(int primaryCode, int[] keyCodes, int x, int y) { + mVoiceProxy.handleCharacter(); - private void handleCharacter(int primaryCode, int[] keyCodes) { - if (VOICE_INSTALLED && mVoiceInputHighlighted) { - commitVoiceInput(); + if (mJustAddedMagicSpace && mSettingsValues.isMagicSpaceStripper(primaryCode)) { + removeTrailingSpace(); } - if (mAfterVoiceInput) { - // Assume input length is 1. This assumption fails for smiley face insertions. - mVoiceInput.incrementTextModificationInsertCount(1); - } - if (mLastSelectionStart == mLastSelectionEnd && TextEntryState.isCorrecting()) { - abortCorrection(false); + if (mLastSelectionStart == mLastSelectionEnd) { + mRecorrection.abortRecorrection(false); } - if (isAlphabet(primaryCode) && isPredictionOn() && !isCursorTouchingWord()) { - if (!mPredicting) { - mPredicting = true; + int code = primaryCode; + if (isAlphabet(code) && isSuggestionsRequested() && !isCursorTouchingWord()) { + if (!mHasUncommittedTypedChars) { + mHasUncommittedTypedChars = true; mComposing.setLength(0); - saveWordInHistory(mBestWord); + mRecorrection.saveRecorrectionSuggestion(mWord, mBestWord); mWord.reset(); + clearSuggestions(); } } - if (mKeyboardSwitcher.getInputView().isShifted()) { + final 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)) { + code = keyCodes[0]; + if (switcher.isAlphabetMode() && Character.isLowerCase(code)) { // In some locales, such as Turkish, Character.toUpperCase() may return a wrong // character because it doesn't take care of locale. - final String upperCaseString = new String(new int[] {primaryCode}, 0, 1) - .toUpperCase(mLanguageSwitcher.getInputLocale()); + final String upperCaseString = new String(new int[] {code}, 0, 1) + .toUpperCase(mSubtypeSwitcher.getInputLocale()); if (upperCaseString.codePointCount(0, upperCaseString.length()) == 1) { - primaryCode = upperCaseString.codePointAt(0); + code = upperCaseString.codePointAt(0); } else { // Some keys, such as [eszett], have upper case as multi-characters. - onText(upperCaseString); + onTextInput(upperCaseString); return; } } } - if (mPredicting) { - if (mKeyboardSwitcher.getInputView().isShifted() - && mKeyboardSwitcher.isAlphabetMode() - && mComposing.length() == 0) { + if (mHasUncommittedTypedChars) { + if (mComposing.length() == 0 && switcher.isAlphabetMode() + && switcher.isShiftedOrShiftLocked()) { mWord.setFirstCharCapitalized(true); } - mComposing.append((char) primaryCode); - mWord.add(primaryCode, keyCodes); + mComposing.append((char) code); + mWord.add(code, keyCodes, x, y); InputConnection ic = getCurrentInputConnection(); if (ic != null) { // If it's the first letter, make note of auto-caps state if (mWord.size() == 1) { - mWord.setAutoCapitalized( - getCursorCapsMode(ic, getCurrentInputEditorInfo()) != 0); + mWord.setAutoCapitalized(getCurrentAutoCapsState()); } ic.setComposingText(mComposing, 1); } - postUpdateSuggestions(); + mHandler.postUpdateSuggestions(); } else { - sendKeyChar((char)primaryCode); + sendKeyChar((char)code); + } + if (mJustAddedMagicSpace && mSettingsValues.isMagicSpaceSwapper(primaryCode)) { + swapSwapperAndSpace(); + } else { + mJustAddedMagicSpace = false; } - updateShiftKeyState(getCurrentInputEditorInfo()); + + switcher.updateShiftState(); if (LatinIME.PERF_DEBUG) measureCps(); - TextEntryState.typedCharacter((char) primaryCode, isWordSeparator(primaryCode)); + TextEntryState.typedCharacter((char) code, mSettingsValues.isWordSeparator(code), x, y); } - 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); - } + private void handleSeparator(int primaryCode, int x, int y) { + mVoiceProxy.handleSeparator(); // Should dismiss the "Touch again to save" message when handling separator if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) { - postUpdateSuggestions(); + mHandler.cancelUpdateBigramPredictions(); + mHandler.postUpdateSuggestions(); } boolean pickedDefault = false; // Handle separator - InputConnection ic = getCurrentInputConnection(); + final InputConnection ic = getCurrentInputConnection(); if (ic != null) { ic.beginBatchEdit(); - abortCorrection(false); + mRecorrection.abortRecorrection(false); } - if (mPredicting) { + if (mHasUncommittedTypedChars) { // In certain languages where single quote is a separator, it's better // not to auto correct, but accept the typed word. For instance, // in Italian dov' should not be expanded to dove' because the elision // requires the last vowel to be removed. - if (mAutoCorrectOn && primaryCode != '\'' && - (mJustRevertedSeparator == null - || mJustRevertedSeparator.length() == 0 - || mJustRevertedSeparator.charAt(0) != primaryCode)) { - pickedDefault = pickDefaultSuggestion(); - // Picked the suggestion by the space key. We consider this - // as "added an auto space". - if (primaryCode == KEYCODE_SPACE) { - mJustAddedAutoSpace = true; - } + final boolean shouldAutoCorrect = + (mSettingsValues.mAutoCorrectEnabled || mSettingsValues.mQuickFixes) + && !mInputTypeNoAutoCorrect && mHasDictionary; + if (shouldAutoCorrect && primaryCode != Keyboard.CODE_SINGLE_QUOTE) { + pickedDefault = pickDefaultSuggestion(primaryCode); } else { commitTyped(ic); } } - if (mJustAddedAutoSpace && primaryCode == KEYCODE_ENTER) { - removeTrailingSpace(); - mJustAddedAutoSpace = false; - } - sendKeyChar((char)primaryCode); - // Handle the case of ". ." -> " .." with auto-space if necessary - // before changing the TextEntryState. - if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED - && primaryCode == KEYCODE_PERIOD) { - reswapPeriodAndSpace(); + if (mJustAddedMagicSpace) { + if (mSettingsValues.isMagicSpaceSwapper(primaryCode)) { + sendKeyChar((char)primaryCode); + swapSwapperAndSpace(); + } else { + if (mSettingsValues.isMagicSpaceStripper(primaryCode)) removeTrailingSpace(); + sendKeyChar((char)primaryCode); + mJustAddedMagicSpace = false; + } + } else { + sendKeyChar((char)primaryCode); } - TextEntryState.typedCharacter((char) primaryCode, true); - if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED - && primaryCode != KEYCODE_ENTER) { - swapPunctuationAndSpace(); - } else if (isPredictionOn() && primaryCode == KEYCODE_SPACE) { - doubleSpace(); + if (isSuggestionsRequested() && primaryCode == Keyboard.CODE_SPACE) { + maybeDoubleSpace(); } + + TextEntryState.typedCharacter((char) primaryCode, true, x, y); + if (pickedDefault) { - TextEntryState.backToAcceptedDefault(mWord.getTypedWord()); + CharSequence typedWord = mWord.getTypedWord(); + TextEntryState.backToAcceptedDefault(typedWord); + if (!TextUtils.isEmpty(typedWord) && !typedWord.equals(mBestWord)) { + InputConnectionCompatUtils.commitCorrection( + ic, mLastSelectionEnd - typedWord.length(), typedWord, mBestWord); + if (mCandidateView != null) + mCandidateView.onAutoCorrectionInverted(mBestWord); + } + } + if (Keyboard.CODE_SPACE == primaryCode) { + if (!isCursorTouchingWord()) { + mHandler.cancelUpdateSuggestions(); + mHandler.cancelUpdateOldSuggestions(); + mHandler.postUpdateBigramPredictions(); + } + } else { + // Set punctuation right away. onUpdateSelection will fire but tests whether it is + // already displayed or not, so it's okay. + setPunctuationSuggestions(); } - updateShiftKeyState(getCurrentInputEditorInfo()); + mKeyboardSwitcher.updateShiftState(); if (ic != null) { ic.endBatchEdit(); } @@ -1524,367 +1406,172 @@ public class LatinIME extends InputMethodService private void handleClose() { commitTyped(getCurrentInputConnection()); - if (VOICE_INSTALLED & mRecognizing) { - mVoiceInput.cancel(); - } + mVoiceProxy.handleClose(); requestHideSelf(0); - if (mKeyboardSwitcher != null) { - LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); - if (inputView != null) { - inputView.closing(); - } - } - TextEntryState.endSession(); - } - - private void saveWordInHistory(CharSequence result) { - if (mWord.size() <= 1) { - mWord.reset(); - return; - } - // Skip if result is null. It happens in some edge case. - if (TextUtils.isEmpty(result)) { - return; - } - - // Make a copy of the CharSequence, since it is/could be a mutable CharSequence - final String resultCopy = result.toString(); - TypedWordAlternatives entry = new TypedWordAlternatives(resultCopy, - new WordComposer(mWord)); - mWordHistory.add(entry); + LatinKeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); + if (inputView != null) + inputView.closing(); } - private void postUpdateSuggestions() { - mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS); - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SUGGESTIONS), 100); + public boolean isSuggestionsRequested() { + return mIsSettingsSuggestionStripOn + && (mCorrectionMode > 0 || isShowingSuggestionsStrip()); } - private void postUpdateOldSuggestions() { - mHandler.removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS), 300); + public boolean isShowingPunctuationList() { + return mSettingsValues.mSuggestPuncList == mCandidateView.getSuggestions(); } - private boolean isPredictionOn() { - return mPredictionOn; + public boolean isShowingSuggestionsStrip() { + return (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_VALUE) + || (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE + && mOrientation == Configuration.ORIENTATION_PORTRAIT); } - private boolean isCandidateStripVisible() { - return isPredictionOn() && mShowSuggestions; - } - - public void onCancelVoice() { - if (mRecognizing) { - switchToKeyboardView(); - } - } - - private void switchToKeyboardView() { - mHandler.post(new Runnable() { - public void run() { - mRecognizing = false; - if (mKeyboardSwitcher.getInputView() != null) { - setInputView(mKeyboardSwitcher.getInputView()); - } - setCandidatesViewShown(true); - updateInputViewShown(); - postUpdateSuggestions(); - }}); - } - - private void switchToRecognitionStatusView() { - final boolean configChanged = mConfigurationChanging; - mHandler.post(new Runnable() { - public void run() { - setCandidatesViewShown(false); - mRecognizing = true; - View v = mVoiceInput.getView(); - ViewParent p = v.getParent(); - if (p != null && p instanceof ViewGroup) { - ((ViewGroup)v.getParent()).removeView(v); - } - setInputView(v); - updateInputViewShown(); - if (configChanged) { - mVoiceInput.onConfigurationChanged(); - } - }}); - } - - private void startListening(boolean swipe) { - if (!mHasUsedVoiceInput || - (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale)) { - // Calls reallyStartListening if user clicks OK, does nothing if user clicks Cancel. - showVoiceWarningDialog(swipe); - } else { - reallyStartListening(swipe); - } - } - - private void reallyStartListening(boolean swipe) { - if (!mHasUsedVoiceInput) { - // The user has started a voice input, so remember that in the - // future (so we don't show the warning dialog after the first run). - SharedPreferences.Editor editor = - PreferenceManager.getDefaultSharedPreferences(this).edit(); - editor.putBoolean(PREF_HAS_USED_VOICE_INPUT, true); - SharedPreferencesCompat.apply(editor); - mHasUsedVoiceInput = true; - } - - if (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale) { - // The user has started a voice input from an unsupported locale, so remember that - // in the future (so we don't show the warning dialog the next time they do this). - SharedPreferences.Editor editor = - PreferenceManager.getDefaultSharedPreferences(this).edit(); - editor.putBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, true); - SharedPreferencesCompat.apply(editor); - mHasUsedVoiceInputUnsupportedLocale = true; - } - - // Clear N-best suggestions - clearSuggestions(); - - FieldContext context = new FieldContext( - getCurrentInputConnection(), - getCurrentInputEditorInfo(), - mLanguageSwitcher.getInputLanguage(), - mLanguageSwitcher.getEnabledLanguages()); - mVoiceInput.startListening(context, swipe); - switchToRecognitionStatusView(); - } - - private void showVoiceWarningDialog(final boolean swipe) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setCancelable(true); - builder.setIcon(R.drawable.ic_mic_dialog); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - mVoiceInput.logKeyboardWarningDialogOk(); - reallyStartListening(swipe); - } - }); - builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - mVoiceInput.logKeyboardWarningDialogCancel(); - } - }); - - if (mLocaleSupportedForVoiceInput) { - String message = getString(R.string.voice_warning_may_not_understand) + "\n\n" + - getString(R.string.voice_warning_how_to_turn_off); - builder.setMessage(message); - } else { - String message = getString(R.string.voice_warning_locale_not_supported) + "\n\n" + - getString(R.string.voice_warning_may_not_understand) + "\n\n" + - getString(R.string.voice_warning_how_to_turn_off); - builder.setMessage(message); - } - - builder.setTitle(R.string.voice_warning_title); - mVoiceWarningDialog = builder.create(); - - Window window = mVoiceWarningDialog.getWindow(); - WindowManager.LayoutParams lp = window.getAttributes(); - lp.token = mKeyboardSwitcher.getInputView().getWindowToken(); - lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; - window.setAttributes(lp); - window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); - mVoiceInput.logKeyboardWarningDialogShown(); - mVoiceWarningDialog.show(); - } - - public void onVoiceResults(List<String> candidates, - Map<String, List<CharSequence>> alternatives) { - if (!mRecognizing) { - return; - } - mVoiceResults.candidates = candidates; - mVoiceResults.alternatives = alternatives; - mHandler.sendMessage(mHandler.obtainMessage(MSG_VOICE_RESULTS)); + public boolean isCandidateStripVisible() { + if (mCandidateView == null) + return false; + if (mCandidateView.isShowingAddToDictionaryHint() || TextEntryState.isRecorrecting()) + return true; + if (!isShowingSuggestionsStrip()) + return false; + if (mApplicationSpecifiedCompletionOn) + return true; + return isSuggestionsRequested(); } - private void handleVoiceResults() { - mAfterVoiceInput = true; - mImmediatelyAfterVoiceInput = true; - - InputConnection ic = getCurrentInputConnection(); - if (!isFullscreenMode()) { - // Start listening for updates to the text from typing, etc. - if (ic != null) { - ExtractedTextRequest req = new ExtractedTextRequest(); - ic.getExtractedText(req, InputConnection.GET_EXTRACTED_TEXT_MONITOR); - } - } - - vibrate(); - switchToKeyboardView(); - - final List<CharSequence> nBest = new ArrayList<CharSequence>(); - boolean capitalizeFirstWord = preferCapitalization() - || (mKeyboardSwitcher.isAlphabetMode() - && mKeyboardSwitcher.getInputView().isShifted()); - for (String c : mVoiceResults.candidates) { - if (capitalizeFirstWord) { - c = Character.toUpperCase(c.charAt(0)) + c.substring(1, c.length()); + public void switchToKeyboardView() { + if (DEBUG) { + Log.d(TAG, "Switch to keyboard view."); + } + View v = mKeyboardSwitcher.getKeyboardView(); + if (v != null) { + // Confirms that the keyboard view doesn't have parent view. + ViewParent p = v.getParent(); + if (p != null && p instanceof ViewGroup) { + ((ViewGroup) p).removeView(v); } - nBest.add(c); + setInputView(v); } - - 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); + setSuggestionStripShown(isCandidateStripVisible()); + updateInputViewShown(); + mHandler.postUpdateSuggestions(); } - private void clearSuggestions() { - setSuggestions(null, false, false, false); + public void clearSuggestions() { + setSuggestions(SuggestedWords.EMPTY); } - private void setSuggestions( - List<CharSequence> suggestions, - boolean completions, - boolean typedWordValid, - boolean haveMinimalSuggestion) { - - if (mIsShowingHint) { - setCandidatesView(mCandidateViewContainer); - mIsShowingHint = false; - } - + public void setSuggestions(SuggestedWords words) { if (mCandidateView != null) { - mCandidateView.setSuggestions( - suggestions, completions, typedWordValid, haveMinimalSuggestion); + mCandidateView.setSuggestions(words); + mKeyboardSwitcher.onAutoCorrectionStateChanged( + words.hasWordAboveAutoCorrectionScoreThreshold()); } } - private void updateSuggestions() { - LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); - ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null); - + public void updateSuggestions() { // Check if we have a suggestion engine attached. - if ((mSuggest == null || !isPredictionOn()) && !mVoiceInputHighlighted) { + if ((mSuggest == null || !isSuggestionsRequested()) + && !mVoiceProxy.isVoiceInputHighlighted()) { return; } - if (!mPredicting) { - setNextSuggestions(); + if (!mHasUncommittedTypedChars) { + setPunctuationSuggestions(); return; } showSuggestions(mWord); } - private List<CharSequence> getTypedSuggestions(WordComposer word) { - List<CharSequence> stringList = mSuggest.getSuggestions( - mKeyboardSwitcher.getInputView(), word, false, null); - return stringList; - } - - private void showCorrections(WordAlternatives alternatives) { - List<CharSequence> stringList = alternatives.getAlternatives(); - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters(null); - showSuggestions(stringList, alternatives.getOriginalWord(), false, false); - } - 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(), - mWordSeparators); - List<CharSequence> stringList = mSuggest.getSuggestions( - mKeyboardSwitcher.getInputView(), word, false, prevWord); - // long stopTime = System.currentTimeMillis(); // TIME MEASUREMENT! - // Log.d("LatinIME","Suggest Total Time - " + (stopTime - startTime)); - - int[] nextLettersFrequencies = mSuggest.getNextLettersFrequencies(); - - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setPreferredLetters( - nextLettersFrequencies); - - boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasMinimalCorrection(); - //|| mCorrectionMode == mSuggest.CORRECTION_FULL; - CharSequence typedWord = word.getTypedWord(); - // If we're in basic correct - boolean typedWordValid = mSuggest.isValidWord(typedWord) || - (preferCapitalization() - && mSuggest.isValidWord(typedWord.toString().toLowerCase())); + // TODO: May need a better way of retrieving previous word + CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(), + mSettingsValues.mWordSeparators); + SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder( + mKeyboardSwitcher.getKeyboardView(), word, prevWord); + + boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasAutoCorrection(); + final CharSequence typedWord = word.getTypedWord(); + // Here, we want to promote a whitelisted word if exists. + final boolean typedWordValid = AutoCorrection.isValidWordForAutoCorrection( + mSuggest.getUnigramDictionaries(), typedWord, preferCapitalization()); if (mCorrectionMode == Suggest.CORRECTION_FULL || mCorrectionMode == Suggest.CORRECTION_FULL_BIGRAM) { correctionAvailable |= typedWordValid; } // Don't auto-correct words with multiple capital letter correctionAvailable &= !word.isMostlyCaps(); - correctionAvailable &= !TextEntryState.isCorrecting(); - - showSuggestions(stringList, typedWord, typedWordValid, correctionAvailable); + correctionAvailable &= !TextEntryState.isRecorrecting(); + + // Basically, we update the suggestion strip only when suggestion count > 1. However, + // there is an exception: We update the suggestion strip whenever typed word's length + // is 1 or typed word is found in dictionary, regardless of suggestion count. Actually, + // in most cases, suggestion count is 1 when typed word's length is 1, but we do always + // need to clear the previous state when the user starts typing a word (i.e. typed word's + // length == 1). + if (typedWord != null) { + if (builder.size() > 1 || typedWord.length() == 1 || typedWordValid + || mCandidateView.isShowingAddToDictionaryHint()) { + builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion( + correctionAvailable); + } else { + final SuggestedWords previousSuggestions = mCandidateView.getSuggestions(); + if (previousSuggestions == mSettingsValues.mSuggestPuncList) + return; + builder.addTypedWordAndPreviousSuggestions(typedWord, previousSuggestions); + } + } + showSuggestions(builder.build(), typedWord); } - private void showSuggestions(List<CharSequence> stringList, CharSequence typedWord, - boolean typedWordValid, boolean correctionAvailable) { - setSuggestions(stringList, false, typedWordValid, correctionAvailable); - if (stringList.size() > 0) { - if (correctionAvailable && !typedWordValid && stringList.size() > 1) { - mBestWord = stringList.get(1); + public void showSuggestions(SuggestedWords suggestedWords, CharSequence typedWord) { + setSuggestions(suggestedWords); + if (suggestedWords.size() > 0) { + if (Utils.shouldBlockedBySafetyNetForAutoCorrection(suggestedWords, mSuggest)) { + mBestWord = typedWord; + } else if (suggestedWords.hasAutoCorrectionWord()) { + mBestWord = suggestedWords.getWord(1); } else { mBestWord = typedWord; } } else { mBestWord = null; } - setCandidatesViewShown(isCandidateStripVisible() || mCompletionOn); + setSuggestionStripShown(isCandidateStripVisible()); } - private boolean pickDefaultSuggestion() { + private boolean pickDefaultSuggestion(int separatorCode) { // 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); + TextEntryState.acceptedDefault(mWord.getTypedWord(), mBestWord, separatorCode); + mExpectingUpdateSelection = true; + commitBestWord(mBestWord); // Add the word to the auto dictionary if it's not a known word - addToDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED); + addToAutoAndUserBigramDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED); return true; - } return false; } + @Override 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(); + mVoiceProxy.flushAndLogAllTextModificationCounters(index, suggestion, + mSettingsValues.mWordSeparators); - final boolean correcting = TextEntryState.isCorrecting(); + final boolean recorrecting = TextEntryState.isRecorrecting(); InputConnection ic = getCurrentInputConnection(); if (ic != null) { ic.beginBatchEdit(); } - if (mCompletionOn && mCompletions != null && index >= 0 - && index < mCompletions.length) { - CompletionInfo ci = mCompletions[index]; + if (mApplicationSpecifiedCompletionOn && mApplicationSpecifiedCompletions != null + && index >= 0 && index < mApplicationSpecifiedCompletions.length) { + CompletionInfo ci = mApplicationSpecifiedCompletions[index]; if (ic != null) { ic.commitCompletion(ci); } @@ -1892,7 +1579,7 @@ public class LatinIME extends InputMethodService if (mCandidateView != null) { mCandidateView.clear(); } - updateShiftKeyState(getCurrentInputEditorInfo()); + mKeyboardSwitcher.updateShiftState(); if (ic != null) { ic.endBatchEdit(); } @@ -1900,52 +1587,81 @@ public class LatinIME extends InputMethodService } // If this is a punctuation, apply it through the normal key press - if (suggestion.length() == 1 && (isWordSeparator(suggestion.charAt(0)) - || isSuggestedPunctuation(suggestion.charAt(0)))) { + if (suggestion.length() == 1 && (mSettingsValues.isWordSeparator(suggestion.charAt(0)) + || mSettingsValues.isSuggestedPunctuation(suggestion.charAt(0)))) { // 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); + // Find out whether the previous character is a space. If it is, as a special case + // for punctuation entered through the suggestion strip, it should be considered + // a magic space even if it was a normal space. This is meant to help in case the user + // pressed space on purpose of displaying the suggestion strip punctuation. final char primaryCode = suggestion.charAt(0); - onKey(primaryCode, new int[]{primaryCode}, LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE, - LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE); + final CharSequence beforeText = ic != null ? ic.getTextBeforeCursor(1, 0) : ""; + final int toLeft = (ic == null || TextUtils.isEmpty(beforeText)) + ? 0 : beforeText.charAt(0); + final boolean oldMagicSpace = mJustAddedMagicSpace; + if (Keyboard.CODE_SPACE == toLeft) mJustAddedMagicSpace = true; + onCodeInput(primaryCode, new int[] { primaryCode }, + KeyboardActionListener.NOT_A_TOUCH_COORDINATE, + KeyboardActionListener.NOT_A_TOUCH_COORDINATE); + mJustAddedMagicSpace = oldMagicSpace; if (ic != null) { ic.endBatchEdit(); } return; } - mJustAccepted = true; - pickSuggestion(suggestion, correcting); + if (!mHasUncommittedTypedChars) { + // If we are not composing a word, then it was a suggestion inferred from + // context - no user input. We should reset the word composer. + mWord.reset(); + } + mExpectingUpdateSelection = true; + commitBestWord(suggestion); // Add the word to the auto dictionary if it's not a known word if (index == 0) { - addToDictionaries(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED); + addToAutoAndUserBigramDictionaries(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED); } else { - addToBigramDictionary(suggestion, 1); + addToOnlyBigramDictionary(suggestion, 1); } LatinImeLogger.logOnManualSuggestion(mComposing.toString(), suggestion.toString(), - index, suggestions); + index, suggestions.mWords); TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion); // Follow it with a space - if (mAutoSpace && !correcting) { - sendSpace(); - mJustAddedAutoSpace = true; - } - - final boolean showingAddToDictionaryHint = index == 0 && mCorrectionMode > 0 - && !mSuggest.isValidWord(suggestion) - && !mSuggest.isValidWord(suggestion.toString().toLowerCase()); - - if (!correcting) { + if (mShouldInsertMagicSpace && !recorrecting) { + sendMagicSpace(); + } + + // We should show the hint if the user pressed the first entry AND either: + // - There is no dictionary (we know that because we tried to load it => null != mSuggest + // AND mHasDictionary is false) + // - There is a dictionary and the word is not in it + // Please note that if mSuggest is null, it means that everything is off: suggestion + // and correction, so we shouldn't try to show the hint + // We used to look at mCorrectionMode here, but showing the hint should have nothing + // to do with the autocorrection setting. + final boolean showingAddToDictionaryHint = index == 0 && mSuggest != null + // If there is no dictionary the hint should be shown. + && (!mHasDictionary + // If "suggestion" is not in the dictionary, the hint should be shown. + || !AutoCorrection.isValidWord( + mSuggest.getUnigramDictionaries(), suggestion, true)); + + if (!recorrecting) { // Fool the state watcher so that a subsequent backspace will not do a revert, unless // we just did a correction, in which case we need to stay in // TextEntryState.State.PICKED_SUGGESTION state. - TextEntryState.typedCharacter((char) KEYCODE_SPACE, true); - setNextSuggestions(); - } else if (!showingAddToDictionaryHint) { + TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true, + WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE); + } + 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(); + updateBigramPredictions(); + // Updating the predictions right away may be slow and feel unresponsive on slower + // terminals. On the other hand if we just postUpdateBigramPredictions() it will + // take a noticeable delay to update them which may feel uneasy. } if (showingAddToDictionaryHint) { mCandidateView.showAddToDictionaryHint(suggestion); @@ -1955,193 +1671,71 @@ public class LatinIME extends InputMethodService } } - private void rememberReplacedWord(CharSequence suggestion) { - if (mShowingVoiceSuggestions) { - // Retain the replaced word in the alternatives array. - EditingUtil.Range range = new EditingUtil.Range(); - String wordToBeReplaced = EditingUtil.getWordAtCursor(getCurrentInputConnection(), - mWordSeparators, range); - if (!mWordToSuggestions.containsKey(wordToBeReplaced)) { - wordToBeReplaced = wordToBeReplaced.toLowerCase(); - } - if (mWordToSuggestions.containsKey(wordToBeReplaced)) { - List<CharSequence> suggestions = mWordToSuggestions.get(wordToBeReplaced); - if (suggestions.contains(suggestion)) { - suggestions.remove(suggestion); - } - suggestions.add(wordToBeReplaced); - mWordToSuggestions.remove(wordToBeReplaced); - mWordToSuggestions.put(suggestion.toString(), suggestions); - } - } - } - /** * Commits the chosen word to the text field and saves it for later * retrieval. - * @param suggestion the suggestion picked by the user to be committed to - * the text field - * @param correcting whether this is due to a correction of an existing - * word. */ - private void pickSuggestion(CharSequence suggestion, boolean correcting) { - final LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); - final Locale inputLocale = mLanguageSwitcher.getInputLocale(); - if (mCapsLock) { - suggestion = suggestion.toString().toUpperCase(inputLocale); - } else if (preferCapitalization() - || (mKeyboardSwitcher.isAlphabetMode() - && inputView.isShifted())) { - suggestion = suggestion.toString().toUpperCase(inputLocale).charAt(0) - + suggestion.subSequence(1, suggestion.length()).toString(); - } + private void commitBestWord(CharSequence bestWord) { + KeyboardSwitcher switcher = mKeyboardSwitcher; + if (!switcher.isKeyboardAvailable()) + return; InputConnection ic = getCurrentInputConnection(); if (ic != null) { - rememberReplacedWord(suggestion); - 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))) { - final Locale inputLocale = mLanguageSwitcher.getInputLocale(); - for (int i = 0; i < suggestions.size(); i++) { - String origSugg = (String) suggestions.get(i); - String capsSugg = origSugg.toUpperCase(inputLocale).charAt(0) - + origSugg.subSequence(1, origSugg.length()).toString(); - suggestions.set(i, capsSugg); - } - } - setSuggestions(suggestions, false, true, true); - setCandidatesViewShown(true); - return true; + mVoiceProxy.rememberReplacedWord(bestWord, mSettingsValues.mWordSeparators); + SuggestedWords suggestedWords = mCandidateView.getSuggestions(); + ic.commitText(SuggestionSpanUtils.getTextWithSuggestionSpan( + this, bestWord, suggestedWords), 1); } - return false; + mRecorrection.saveRecorrectionSuggestion(mWord, bestWord); + mHasUncommittedTypedChars = false; + mCommittedLength = bestWord.length(); } - /** - * Tries to apply any typed alternatives for the word if we have any cached alternatives, - * otherwise tries to find new corrections and completions for the word. - * @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) { - // 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 (entry instanceof TypedWordAlternatives) { - foundWord = ((TypedWordAlternatives) entry).word; - } - alternatives = entry; - break; - } - } - // If we didn't find a match, at least suggest completions - if (foundWord == null - && (mSuggest.isValidWord(touching.word) - || mSuggest.isValidWord(touching.word.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) - }); - } - foundWord.setFirstCharCapitalized(Character.isUpperCase(touching.word.charAt(0))); - } - // Found a match, show suggestions - if (foundWord != null || alternatives != null) { - if (alternatives == null) { - alternatives = new TypedWordAlternatives(touching.word, foundWord); - } - showCorrections(alternatives); - if (foundWord != null) { - mWord = new WordComposer(foundWord); - } else { - mWord.reset(); - } - return true; - } - return false; - } + private static final WordComposer sEmptyWordComposer = new WordComposer(); + public void updateBigramPredictions() { + if (mSuggest == null || !isSuggestionsRequested()) + return; - private void setOldSuggestions() { - mShowingVoiceSuggestions = false; - if (mCandidateView != null && mCandidateView.isShowingAddToDictionaryHint()) { + if (!mSettingsValues.mBigramPredictionEnabled) { + setPunctuationSuggestions(); return; } - InputConnection ic = getCurrentInputConnection(); - if (ic == null) return; - if (!mPredicting) { - // Extract the selected or touching text - EditingUtil.SelectedWord touching = EditingUtil.getWordAtCursorOrSelection(ic, - mLastSelectionStart, mLastSelectionEnd, mWordSeparators); - if (touching != null && touching.word.length() > 1) { - ic.beginBatchEdit(); + final CharSequence prevWord = EditingUtils.getThisWord(getCurrentInputConnection(), + mSettingsValues.mWordSeparators); + SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder( + mKeyboardSwitcher.getKeyboardView(), sEmptyWordComposer, prevWord); - if (!applyVoiceAlternatives(touching) && !applyTypedAlternatives(touching)) { - abortCorrection(true); - } else { - TextEntryState.selectedForCorrection(); - EditingUtil.underlineWord(ic, touching); - } - - ic.endBatchEdit(); - } else { - abortCorrection(true); - setNextSuggestions(); // Show the punctuation suggestions list - } + if (builder.size() > 0) { + // Explicitly supply an empty typed word (the no-second-arg version of + // showSuggestions will retrieve the word near the cursor, we don't want that here) + showSuggestions(builder.build(), ""); } else { - abortCorrection(true); + if (!isShowingPunctuationList()) setPunctuationSuggestions(); } } - private void setNextSuggestions() { - setSuggestions(mSuggestPuncList, false, false, false); + public void setPunctuationSuggestions() { + setSuggestions(mSettingsValues.mSuggestPuncList); + setSuggestionStripShown(isCandidateStripVisible()); } - private void addToDictionaries(CharSequence suggestion, int frequencyDelta) { + private void addToAutoAndUserBigramDictionaries(CharSequence suggestion, int frequencyDelta) { checkAddToDictionary(suggestion, frequencyDelta, false); } - private void addToBigramDictionary(CharSequence suggestion, int frequencyDelta) { + private void addToOnlyBigramDictionary(CharSequence suggestion, int frequencyDelta) { checkAddToDictionary(suggestion, frequencyDelta, true); } /** * Adds to the UserBigramDictionary and/or AutoDictionary - * @param addToBigramDictionary true if it should be added to bigram dictionary if possible + * @param selectedANotTypedWord true if it should be added to bigram dictionary if possible */ private void checkAddToDictionary(CharSequence suggestion, int frequencyDelta, - boolean addToBigramDictionary) { + boolean selectedANotTypedWord) { if (suggestion == null || suggestion.length() < 1) return; + // Only auto-add to dictionary if auto-correct is ON. Otherwise we'll be // adding words in situations where the user or application really didn't // want corrections enabled or learned. @@ -2149,36 +1743,42 @@ public class LatinIME extends InputMethodService || mCorrectionMode == Suggest.CORRECTION_FULL_BIGRAM)) { return; } - if (suggestion != null) { - if (!addToBigramDictionary && mAutoDictionary.isValidWord(suggestion) - || (!mSuggest.isValidWord(suggestion.toString()) - && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) { - mAutoDictionary.addWord(suggestion.toString(), frequencyDelta); - } - if (mUserBigramDictionary != null) { - CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection(), - mSentenceSeparators); - if (!TextUtils.isEmpty(prevWord)) { - mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString()); - } + final boolean selectedATypedWordAndItsInAutoDic = + !selectedANotTypedWord && mAutoDictionary.isValidWord(suggestion); + final boolean isValidWord = AutoCorrection.isValidWord( + mSuggest.getUnigramDictionaries(), suggestion, true); + final boolean needsToAddToAutoDictionary = selectedATypedWordAndItsInAutoDic + || !isValidWord; + if (needsToAddToAutoDictionary) { + mAutoDictionary.addWord(suggestion.toString(), frequencyDelta); + } + + if (mUserBigramDictionary != null) { + // We don't want to register as bigrams words separated by a separator. + // For example "I will, and you too" : we don't want the pair ("will" "and") to be + // a bigram. + CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(), + mSettingsValues.mWordSeparators); + if (!TextUtils.isEmpty(prevWord)) { + mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString()); } } } - private boolean isCursorTouchingWord() { + public boolean isCursorTouchingWord() { InputConnection ic = getCurrentInputConnection(); if (ic == null) return false; CharSequence toLeft = ic.getTextBeforeCursor(1, 0); CharSequence toRight = ic.getTextAfterCursor(1, 0); if (!TextUtils.isEmpty(toLeft) - && !isWordSeparator(toLeft.charAt(0)) - && !isSuggestedPunctuation(toLeft.charAt(0))) { + && !mSettingsValues.isWordSeparator(toLeft.charAt(0)) + && !mSettingsValues.isSuggestedPunctuation(toLeft.charAt(0))) { return true; } if (!TextUtils.isEmpty(toRight) - && !isWordSeparator(toRight.charAt(0)) - && !isSuggestedPunctuation(toRight.charAt(0))) { + && !mSettingsValues.isWordSeparator(toRight.charAt(0)) + && !mSettingsValues.isSuggestedPunctuation(toRight.charAt(0))) { return true; } return false; @@ -2191,165 +1791,140 @@ public class LatinIME extends InputMethodService public void revertLastWord(boolean deleteChar) { final int length = mComposing.length(); - if (!mPredicting && length > 0) { + if (!mHasUncommittedTypedChars && length > 0) { final InputConnection ic = getCurrentInputConnection(); - mPredicting = true; - mJustRevertedSeparator = ic.getTextBeforeCursor(1, 0); + final CharSequence punctuation = ic.getTextBeforeCursor(1, 0); if (deleteChar) ic.deleteSurroundingText(1, 0); int toDelete = mCommittedLength; - CharSequence toTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0); - if (toTheLeft != null && toTheLeft.length() > 0 - && isWordSeparator(toTheLeft.charAt(0))) { + final CharSequence toTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0); + if (!TextUtils.isEmpty(toTheLeft) + && mSettingsValues.isWordSeparator(toTheLeft.charAt(0))) { toDelete--; } ic.deleteSurroundingText(toDelete, 0); - ic.setComposingText(mComposing, 1); - TextEntryState.backspace(); - postUpdateSuggestions(); + // Re-insert punctuation only when the deleted character was word separator and the + // composing text wasn't equal to the auto-corrected text. + if (deleteChar + && !TextUtils.isEmpty(punctuation) + && mSettingsValues.isWordSeparator(punctuation.charAt(0)) + && !TextUtils.equals(mComposing, toTheLeft)) { + ic.commitText(mComposing, 1); + TextEntryState.acceptedTyped(mComposing); + ic.commitText(punctuation, 1); + TextEntryState.typedCharacter(punctuation.charAt(0), true, + WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE); + // Clear composing text + mComposing.setLength(0); + } else { + mHasUncommittedTypedChars = true; + ic.setComposingText(mComposing, 1); + TextEntryState.backspace(); + } + mHandler.cancelUpdateBigramPredictions(); + mHandler.postUpdateSuggestions(); } else { sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL); - mJustRevertedSeparator = null; } } - protected String getWordSeparators() { - return mWordSeparators; + public boolean revertDoubleSpace() { + mHandler.cancelDoubleSpacesTimer(); + final InputConnection ic = getCurrentInputConnection(); + // Here we test whether we indeed have a period and a space before us. This should not + // be needed, but it's there just in case something went wrong. + final CharSequence textBeforeCursor = ic.getTextBeforeCursor(2, 0); + if (!". ".equals(textBeforeCursor)) + return false; + ic.beginBatchEdit(); + ic.deleteSurroundingText(2, 0); + ic.commitText(" ", 1); + ic.endBatchEdit(); + return true; } public boolean isWordSeparator(int code) { - String separators = getWordSeparators(); - return separators.contains(String.valueOf((char)code)); - } - - private boolean isSentenceSeparator(int code) { - return mSentenceSeparators.contains(String.valueOf((char)code)); + return mSettingsValues.isWordSeparator(code); } - private void sendSpace() { - sendKeyChar((char)KEYCODE_SPACE); - updateShiftKeyState(getCurrentInputEditorInfo()); - //onKey(KEY_SPACE[0], KEY_SPACE); + private void sendMagicSpace() { + sendKeyChar((char)Keyboard.CODE_SPACE); + mJustAddedMagicSpace = true; + mKeyboardSwitcher.updateShiftState(); } public boolean preferCapitalization() { return mWord.isFirstCharCapitalized(); } - private void toggleLanguage(boolean reset, boolean next) { - if (reset) { - mLanguageSwitcher.reset(); - } else { - if (next) { - mLanguageSwitcher.next(); - } else { - mLanguageSwitcher.prev(); - } - } - int currentKeyboardMode = mKeyboardSwitcher.getKeyboardMode(); - reloadKeyboards(); - mKeyboardSwitcher.makeKeyboards(true); - mKeyboardSwitcher.setKeyboardMode(currentKeyboardMode, 0, - mEnableVoiceButton && mEnableVoice); - initSuggest(mLanguageSwitcher.getInputLanguage()); - mLanguageSwitcher.persist(); - updateShiftKeyState(getCurrentInputEditorInfo()); - } - - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, - String key) { - if (PREF_SELECTED_LANGUAGES.equals(key)) { - mLanguageSwitcher.loadLocales(sharedPreferences); - mRefreshKeyboardRequired = true; - } else if (PREF_RECORRECTION_ENABLED.equals(key)) { - mReCorrectionEnabled = sharedPreferences.getBoolean(PREF_RECORRECTION_ENABLED, - getResources().getBoolean(R.bool.default_recorrection_enabled)); - } - } - - public void swipeRight() { - if (LatinKeyboardView.DEBUG_AUTO_PLAY) { - ClipboardManager cm = ((ClipboardManager)getSystemService(CLIPBOARD_SERVICE)); - CharSequence text = cm.getText(); - if (!TextUtils.isEmpty(text)) { - mKeyboardSwitcher.getInputView().startPlaying(text.toString()); - } - } - } - - public void swipeLeft() { + // Notify that language or mode have been changed and toggleLanguage will update KeyboardID + // according to new language or mode. + public void onRefreshKeyboard() { + // Reload keyboard because the current language has been changed. + mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(), + mSubtypeSwitcher.isShortcutImeEnabled() && mVoiceProxy.isVoiceButtonEnabled(), + mVoiceProxy.isVoiceButtonOnPrimary()); + initSuggest(); + loadSettings(); + mKeyboardSwitcher.updateShiftState(); } - public void swipeDown() { - handleClose(); - } + // "reset" and "next" are used only for USE_SPACEBAR_LANGUAGE_SWITCHER. + private void toggleLanguage(boolean next) { + if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()) { + mSubtypeSwitcher.toggleLanguage(next); + } + // The following is necessary because on API levels < 10, we don't get notified when + // subtype changes. + if (!CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) + onRefreshKeyboard(); + } - public void swipeUp() { - //launchSettings(); + @Override + public void onSwipeDown() { + if (mSettingsValues.mSwipeDownDismissKeyboardEnabled) + handleClose(); } - public void onPress(int primaryCode) { + @Override + public void onPress(int primaryCode, boolean withSliding) { if (mKeyboardSwitcher.isVibrateAndSoundFeedbackRequired()) { vibrate(); playKeyClick(primaryCode); } - final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); - if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_SHIFT) { - mShiftKeyState.onPress(); - handleShift(); - } else if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_MODE_CHANGE) { - changeKeyboardMode(); - mSymbolKeyState.onPress(); - mKeyboardSwitcher.setAutoModeSwitchStateMomentary(); + KeyboardSwitcher switcher = mKeyboardSwitcher; + final boolean distinctMultiTouch = switcher.hasDistinctMultitouch(); + if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) { + switcher.onPressShift(withSliding); + } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { + switcher.onPressSymbol(); } else { - mShiftKeyState.onOtherKeyPressed(); - mSymbolKeyState.onOtherKeyPressed(); + switcher.onOtherKeyPressed(); } } - public void onRelease(int primaryCode) { + @Override + public void onRelease(int primaryCode, boolean withSliding) { + KeyboardSwitcher switcher = mKeyboardSwitcher; // Reset any drag flags in the keyboard - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).keyReleased(); - //vibrate(); - final boolean distinctMultiTouch = mKeyboardSwitcher.hasDistinctMultitouch(); - if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_SHIFT) { - if (mShiftKeyState.isMomentary()) - resetShift(); - mShiftKeyState.onRelease(); - } else if (distinctMultiTouch && primaryCode == Keyboard.KEYCODE_MODE_CHANGE) { - // Snap back to the previous keyboard mode if the user chords the mode change key and - // other key, then released the mode change key. - if (mKeyboardSwitcher.isInChordingAutoModeSwitchState()) - changeKeyboardMode(); - mSymbolKeyState.onRelease(); + final boolean distinctMultiTouch = switcher.hasDistinctMultitouch(); + if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) { + switcher.onReleaseShift(withSliding); + } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { + switcher.onReleaseSymbol(); } } - private FieldContext makeFieldContext() { - return new FieldContext( - getCurrentInputConnection(), - getCurrentInputEditorInfo(), - mLanguageSwitcher.getInputLanguage(), - mLanguageSwitcher.getEnabledLanguages()); - } - - private boolean fieldCanDoVoice(FieldContext fieldContext) { - return !mPasswordText - && mVoiceInput != null - && !mVoiceInput.isBlacklistedField(fieldContext); - } - - private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) { - return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext) - && !(attribute != null - && IME_OPTION_NO_MICROPHONE.equals(attribute.privateImeOptions)) - && SpeechRecognizer.isRecognitionAvailable(this); - } - // receive ringer mode changes to detect silent mode + // receive ringer mode change and network state change. private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - updateRingerMode(); + final String action = intent.getAction(); + if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) { + updateRingerMode(); + } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { + mSubtypeSwitcher.onNetworkStateChanged(intent); + } } }; @@ -2359,7 +1934,7 @@ public class LatinIME extends InputMethodService mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); } if (mAudioManager != null) { - mSilentMode = (mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL); + mSilentModeOn = (mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL); } } @@ -2367,22 +1942,22 @@ public class LatinIME extends InputMethodService // if mAudioManager is null, we don't have the ringer state yet // mAudioManager will be set by updateRingerMode if (mAudioManager == null) { - if (mKeyboardSwitcher.getInputView() != null) { + if (mKeyboardSwitcher.getKeyboardView() != null) { updateRingerMode(); } } - if (mSoundOn && !mSilentMode) { + if (isSoundOn()) { // FIXME: Volume and enable should come from UI settings // FIXME: These should be triggered after auto-repeat logic int sound = AudioManager.FX_KEYPRESS_STANDARD; switch (primaryCode) { - case Keyboard.KEYCODE_DELETE: + case Keyboard.CODE_DELETE: sound = AudioManager.FX_KEYPRESS_DELETE; break; - case KEYCODE_ENTER: + case Keyboard.CODE_ENTER: sound = AudioManager.FX_KEYPRESS_RETURN; break; - case KEYCODE_SPACE: + case Keyboard.CODE_SPACE: sound = AudioManager.FX_KEYPRESS_SPACEBAR; break; } @@ -2390,81 +1965,69 @@ public class LatinIME extends InputMethodService } } - private void vibrate() { - if (!mVibrateOn) { + public void vibrate() { + if (!mSettingsValues.mVibrateOn) { return; } - if (mKeyboardSwitcher.getInputView() != null) { - mKeyboardSwitcher.getInputView().performHapticFeedback( + LatinKeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); + 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) { - if (mUserDictionary.isValidWord(word)) return; - mUserDictionary.addWord(word, frequency); - } - - /* package */ WordComposer getCurrentWord() { + public WordComposer getCurrentWord() { return mWord; } - /* package */ boolean getPopupOn() { - return mPopupOn; + boolean isSoundOn() { + return mSettingsValues.mSoundOn && !mSilentModeOn; } private void updateCorrectionMode() { + // TODO: cleanup messy flags mHasDictionary = mSuggest != null ? mSuggest.hasMainDictionary() : false; - mAutoCorrectOn = (mAutoCorrectEnabled || mQuickFixes) - && !mInputTypeNoAutoCorrect && mHasDictionary; - mCorrectionMode = (mAutoCorrectOn && mAutoCorrectEnabled) + final boolean shouldAutoCorrect = (mSettingsValues.mAutoCorrectEnabled + || mSettingsValues.mQuickFixes) && !mInputTypeNoAutoCorrect && mHasDictionary; + mCorrectionMode = (shouldAutoCorrect && mSettingsValues.mAutoCorrectEnabled) ? Suggest.CORRECTION_FULL - : (mAutoCorrectOn ? Suggest.CORRECTION_BASIC : Suggest.CORRECTION_NONE); - mCorrectionMode = (mBigramSuggestionEnabled && mAutoCorrectOn && mAutoCorrectEnabled) + : (shouldAutoCorrect ? Suggest.CORRECTION_BASIC : Suggest.CORRECTION_NONE); + mCorrectionMode = (mSettingsValues.mBigramSuggestionEnabled && shouldAutoCorrect + && mSettingsValues.mAutoCorrectEnabled) ? Suggest.CORRECTION_FULL_BIGRAM : mCorrectionMode; if (mSuggest != null) { mSuggest.setCorrectionMode(mCorrectionMode); } } - private void updateAutoTextEnabled(Locale systemLocale) { + private void updateAutoTextEnabled() { if (mSuggest == null) return; - boolean different = - !systemLocale.getLanguage().equalsIgnoreCase(mInputLocale.substring(0, 2)); - mSuggest.setAutoTextEnabled(!different && mQuickFixes); + mSuggest.setQuickFixesEnabled(mSettingsValues.mQuickFixes + && SubtypeSwitcher.getInstance().isSystemLanguageSameAsInputLanguage()); + } + + private void updateSuggestionVisibility(final SharedPreferences prefs, final Resources res) { + final String suggestionVisiblityStr = prefs.getString( + Settings.PREF_SHOW_SUGGESTIONS_SETTING, + res.getString(R.string.prefs_suggestion_visibility_default_value)); + for (int visibility : SUGGESTION_VISIBILITY_VALUE_ARRAY) { + if (suggestionVisiblityStr.equals(res.getString(visibility))) { + mSuggestionVisibility = visibility; + break; + } + } } protected void launchSettings() { - launchSettings(LatinIMESettings.class); + launchSettings(Settings.class); } public void launchDebugSettings() { - launchSettings(LatinIMEDebugSettings.class); + launchSettings(DebugSettings.class); } - protected void launchSettings (Class<? extends PreferenceActivity> settingsClass) { + protected void launchSettings(Class<? extends PreferenceActivity> settingsClass) { handleClose(); Intent intent = new Intent(); intent.setClass(LatinIME.this, settingsClass); @@ -2472,122 +2035,78 @@ public class LatinIME extends InputMethodService startActivity(intent); } - private void loadSettings() { - // 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); + private void showSubtypeSelectorAndSettings() { + final CharSequence title = getString(R.string.english_ime_input_options); + final CharSequence[] items = new CharSequence[] { + // TODO: Should use new string "Select active input modes". + getString(R.string.language_selection_title), + getString(R.string.english_ime_settings), + }; + final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface di, int position) { + di.dismiss(); + switch (position) { + case 0: + Intent intent = CompatUtils.getInputLanguageSelectionIntent( + mInputMethodId, Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED + | Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + break; + case 1: + launchSettings(); + break; + } } - mEnableVoice = enableVoice; - mVoiceOnPrimary = voiceOnPrimary; - } - 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); + }; + showOptionsMenuInternal(title, items, listener); } - 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)); + private void showOptionsMenu() { + final CharSequence title = getString(R.string.english_ime_input_options); + final CharSequence[] items = new CharSequence[] { + getString(R.string.selectInputMethod), + getString(R.string.english_ime_settings), + }; + final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface di, int position) { + di.dismiss(); + switch (position) { + case 0: + mImm.showInputMethodPicker(); + break; + case 1: + launchSettings(); + break; + } } - } + }; + showOptionsMenuInternal(title, items, listener); } - private boolean isSuggestedPunctuation(int code) { - return mSuggestPuncs.contains(String.valueOf((char)code)); - } - - private void showOptionsMenu() { + private void showOptionsMenuInternal(CharSequence title, CharSequence[] items, + DialogInterface.OnClickListener listener) { + final IBinder windowToken = mKeyboardSwitcher.getKeyboardView().getWindowToken(); + if (windowToken == null) return; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setCancelable(true); builder.setIcon(R.drawable.ic_dialog_keyboard); builder.setNegativeButton(android.R.string.cancel, null); - CharSequence itemSettings = getString(R.string.english_ime_settings); - CharSequence itemInputMethod = getString(R.string.selectInputMethod); - builder.setItems(new CharSequence[] { - itemInputMethod, itemSettings}, - new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface di, int position) { - di.dismiss(); - switch (position) { - case POS_SETTINGS: - launchSettings(); - break; - case POS_METHOD: - ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) - .showInputMethodPicker(); - break; - } - } - }); - builder.setTitle(mResources.getString(R.string.english_ime_input_options)); + builder.setItems(items, listener); + builder.setTitle(title); mOptionsDialog = builder.create(); + mOptionsDialog.setCanceledOnTouchOutside(true); Window window = mOptionsDialog.getWindow(); WindowManager.LayoutParams lp = window.getAttributes(); - lp.token = mKeyboardSwitcher.getInputView().getWindowToken(); + lp.token = windowToken; lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; window.setAttributes(lp); window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); mOptionsDialog.show(); } - public void changeKeyboardMode() { - mKeyboardSwitcher.toggleSymbols(); - if (mCapsLock && mKeyboardSwitcher.isAlphabetMode()) { - mKeyboardSwitcher.setShiftLocked(mCapsLock); - } - - updateShiftKeyState(getCurrentInputEditorInfo()); - } - - public static <E> ArrayList<E> newArrayList(E... elements) { - int capacity = (elements.length * 110) / 100 + 5; - ArrayList<E> list = new ArrayList<E>(capacity); - Collections.addAll(list, elements); - return list; - } - @Override protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { super.dump(fd, fout, args); @@ -2595,18 +2114,17 @@ public class LatinIME extends InputMethodService final Printer p = new PrintWriterPrinter(fout); p.println("LatinIME state :"); p.println(" Keyboard mode = " + mKeyboardSwitcher.getKeyboardMode()); - p.println(" mCapsLock=" + mCapsLock); p.println(" mComposing=" + mComposing.toString()); - p.println(" mPredictionOn=" + mPredictionOn); + p.println(" mIsSuggestionsRequested=" + mIsSettingsSuggestionStripOn); p.println(" mCorrectionMode=" + mCorrectionMode); - p.println(" mPredicting=" + mPredicting); - p.println(" mAutoCorrectOn=" + mAutoCorrectOn); - p.println(" mAutoSpace=" + mAutoSpace); - p.println(" mCompletionOn=" + mCompletionOn); + p.println(" mHasUncommittedTypedChars=" + mHasUncommittedTypedChars); + p.println(" mAutoCorrectEnabled=" + mSettingsValues.mAutoCorrectEnabled); + p.println(" mShouldInsertMagicSpace=" + mShouldInsertMagicSpace); + p.println(" mApplicationSpecifiedCompletionOn=" + mApplicationSpecifiedCompletionOn); p.println(" TextEntryState.state=" + TextEntryState.getState()); - p.println(" mSoundOn=" + mSoundOn); - p.println(" mVibrateOn=" + mVibrateOn); - p.println(" mPopupOn=" + mPopupOn); + p.println(" mSoundOn=" + mSettingsValues.mSoundOn); + p.println(" mVibrateOn=" + mSettingsValues.mVibrateOn); + p.println(" mKeyPreviewPopupOn=" + mSettingsValues.mKeyPreviewPopupOn); } // Characters per second measurement @@ -2626,8 +2144,4 @@ public class LatinIME extends InputMethodService for (int i = 0; i < CPS_BUFFER_SIZE; i++) total += mCpsIntervals[i]; System.out.println("CPS = " + ((CPS_BUFFER_SIZE * 1000f) / total)); } - - public void onAutoCompletionStateChanged(boolean isAutoCompletion) { - mKeyboardSwitcher.onAutoCompletionStateChanged(isAutoCompletion); - } } diff --git a/java/src/com/android/inputmethod/latin/LatinIMESettings.java b/java/src/com/android/inputmethod/latin/LatinIMESettings.java deleted file mode 100644 index ffff33da2..000000000 --- a/java/src/com/android/inputmethod/latin/LatinIMESettings.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import java.util.ArrayList; -import java.util.Locale; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.backup.BackupManager; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.ListPreference; -import android.preference.PreferenceActivity; -import android.preference.PreferenceGroup; -import android.speech.SpeechRecognizer; -import android.text.AutoText; -import android.util.Log; - -import com.android.inputmethod.voice.SettingsUtil; -import com.android.inputmethod.voice.VoiceInputLogger; - -public class LatinIMESettings extends PreferenceActivity - implements SharedPreferences.OnSharedPreferenceChangeListener, - DialogInterface.OnDismissListener { - - private static final String QUICK_FIXES_KEY = "quick_fixes"; - private static final String PREDICTION_SETTINGS_KEY = "prediction_settings"; - private static final String VOICE_SETTINGS_KEY = "voice_mode"; - /* package */ static final String PREF_SETTINGS_KEY = "settings_key"; - - private static final String TAG = "LatinIMESettings"; - - // Dialog ids - private static final int VOICE_INPUT_CONFIRM_DIALOG = 0; - - private CheckBoxPreference mQuickFixes; - private ListPreference mVoicePreference; - private ListPreference mSettingsKeyPreference; - private boolean mVoiceOn; - - private VoiceInputLogger mLogger; - - private boolean mOkClicked = false; - private String mVoiceModeOff; - - @Override - protected void onCreate(Bundle icicle) { - super.onCreate(icicle); - addPreferencesFromResource(R.xml.prefs); - mQuickFixes = (CheckBoxPreference) findPreference(QUICK_FIXES_KEY); - mVoicePreference = (ListPreference) findPreference(VOICE_SETTINGS_KEY); - mSettingsKeyPreference = (ListPreference) findPreference(PREF_SETTINGS_KEY); - SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); - prefs.registerOnSharedPreferenceChangeListener(this); - - mVoiceModeOff = getString(R.string.voice_mode_off); - mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); - mLogger = VoiceInputLogger.getLogger(this); - } - - @Override - protected void onResume() { - super.onResume(); - int autoTextSize = AutoText.getSize(getListView()); - if (autoTextSize < 1) { - ((PreferenceGroup) findPreference(PREDICTION_SETTINGS_KEY)) - .removePreference(mQuickFixes); - } - if (!LatinIME.VOICE_INSTALLED - || !SpeechRecognizer.isRecognitionAvailable(this)) { - getPreferenceScreen().removePreference(mVoicePreference); - } else { - updateVoiceModeSummary(); - } - updateSettingsKeySummary(); - } - - @Override - protected void onDestroy() { - getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( - this); - super.onDestroy(); - } - - public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { - (new BackupManager(this)).dataChanged(); - // If turning on voice input, show dialog - if (key.equals(VOICE_SETTINGS_KEY) && !mVoiceOn) { - if (!prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff) - .equals(mVoiceModeOff)) { - showVoiceConfirmation(); - } - } - mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); - updateVoiceModeSummary(); - updateSettingsKeySummary(); - } - - private void updateSettingsKeySummary() { - mSettingsKeyPreference.setSummary( - getResources().getStringArray(R.array.settings_key_modes) - [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]); - } - - private void showVoiceConfirmation() { - mOkClicked = false; - showDialog(VOICE_INPUT_CONFIRM_DIALOG); - } - - private void updateVoiceModeSummary() { - mVoicePreference.setSummary( - getResources().getStringArray(R.array.voice_input_modes_summary) - [mVoicePreference.findIndexOfValue(mVoicePreference.getValue())]); - } - - @Override - protected Dialog onCreateDialog(int id) { - switch (id) { - case VOICE_INPUT_CONFIRM_DIALOG: - DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - if (whichButton == DialogInterface.BUTTON_NEGATIVE) { - mVoicePreference.setValue(mVoiceModeOff); - mLogger.settingsWarningDialogCancel(); - } else if (whichButton == DialogInterface.BUTTON_POSITIVE) { - mOkClicked = true; - mLogger.settingsWarningDialogOk(); - } - updateVoicePreference(); - } - }; - AlertDialog.Builder builder = new AlertDialog.Builder(this) - .setTitle(R.string.voice_warning_title) - .setPositiveButton(android.R.string.ok, listener) - .setNegativeButton(android.R.string.cancel, listener); - - // Get the current list of supported locales and check the current locale against - // that list, to decide whether to put a warning that voice input will not work in - // the current language as part of the pop-up confirmation dialog. - String supportedLocalesString = SettingsUtil.getSettingsString( - getContentResolver(), - SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES, - LatinIME.DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES); - ArrayList<String> voiceInputSupportedLocales = - LatinIME.newArrayList(supportedLocalesString.split("\\s+")); - boolean localeSupported = voiceInputSupportedLocales.contains( - Locale.getDefault().toString()); - - if (localeSupported) { - String message = getString(R.string.voice_warning_may_not_understand) + "\n\n" + - getString(R.string.voice_hint_dialog_message); - builder.setMessage(message); - } else { - String message = getString(R.string.voice_warning_locale_not_supported) + - "\n\n" + getString(R.string.voice_warning_may_not_understand) + "\n\n" + - getString(R.string.voice_hint_dialog_message); - builder.setMessage(message); - } - - AlertDialog dialog = builder.create(); - dialog.setOnDismissListener(this); - mLogger.settingsWarningDialogShown(); - return dialog; - default: - Log.e(TAG, "unknown dialog " + id); - return null; - } - } - - public void onDismiss(DialogInterface dialog) { - mLogger.settingsWarningDialogDismissed(); - if (!mOkClicked) { - // This assumes that onPreferenceClick gets called first, and this if the user - // agreed after the warning, we set the mOkClicked value to true. - mVoicePreference.setValue(mVoiceModeOff); - } - } - - private void updateVoicePreference() { - boolean isChecked = !mVoicePreference.getValue().equals(mVoiceModeOff); - if (isChecked) { - mLogger.voiceInputSettingEnabled(); - } else { - mLogger.voiceInputSettingDisabled(); - } - } -} diff --git a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java deleted file mode 100644 index 85ecaee50..000000000 --- a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin; - -import android.view.inputmethod.InputMethodManager; - -import android.content.Context; -import android.os.AsyncTask; -import android.text.format.DateUtils; -import android.util.Log; - -public class LatinIMEUtil { - - /** - * Cancel an {@link AsyncTask}. - * - * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this - * task should be interrupted; otherwise, in-progress tasks are allowed - * to complete. - */ - public static void cancelTask(AsyncTask<?, ?, ?> task, boolean mayInterruptIfRunning) { - if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) { - task.cancel(mayInterruptIfRunning); - } - } - - public static class GCUtils { - private static final String TAG = "GCUtils"; - public static final int GC_TRY_COUNT = 2; - // GC_TRY_LOOP_MAX is used for the hard limit of GC wait, - // GC_TRY_LOOP_MAX should be greater than GC_TRY_COUNT. - public static final int GC_TRY_LOOP_MAX = 5; - private static final long GC_INTERVAL = DateUtils.SECOND_IN_MILLIS; - private static GCUtils sInstance = new GCUtils(); - private int mGCTryCount = 0; - - public static GCUtils getInstance() { - return sInstance; - } - - public void reset() { - mGCTryCount = 0; - } - - public boolean tryGCOrWait(String metaData, Throwable t) { - if (mGCTryCount == 0) { - System.gc(); - } - if (++mGCTryCount > GC_TRY_COUNT) { - LatinImeLogger.logOnException(metaData, t); - return false; - } else { - try { - Thread.sleep(GC_INTERVAL); - return true; - } catch (InterruptedException e) { - Log.e(TAG, "Sleep was interrupted."); - LatinImeLogger.logOnException(metaData, t); - return false; - } - } - } - } - - public static boolean hasMultipleEnabledIMEs(Context context) { - return ((InputMethodManager) context.getSystemService( - Context.INPUT_METHOD_SERVICE)).getEnabledInputMethodList().size() > 1; - } - - /* package */ static class RingCharBuffer { - private static RingCharBuffer sRingCharBuffer = new RingCharBuffer(); - private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC'; - private static final int INVALID_COORDINATE = -2; - /* package */ static final int BUFSIZE = 20; - private Context mContext; - private boolean mEnabled = false; - private int mEnd = 0; - /* package */ int mLength = 0; - private char[] mCharBuf = new char[BUFSIZE]; - private int[] mXBuf = new int[BUFSIZE]; - private int[] mYBuf = new int[BUFSIZE]; - - private RingCharBuffer() { - } - public static RingCharBuffer getInstance() { - return sRingCharBuffer; - } - public static RingCharBuffer init(Context context, boolean enabled) { - sRingCharBuffer.mContext = context; - sRingCharBuffer.mEnabled = enabled; - return sRingCharBuffer; - } - private int normalize(int in) { - int ret = in % BUFSIZE; - return ret < 0 ? ret + BUFSIZE : ret; - } - public void push(char c, int x, int y) { - if (!mEnabled) return; - mCharBuf[mEnd] = c; - mXBuf[mEnd] = x; - mYBuf[mEnd] = y; - mEnd = normalize(mEnd + 1); - if (mLength < BUFSIZE) { - ++mLength; - } - } - public char pop() { - if (mLength < 1) { - return PLACEHOLDER_DELIMITER_CHAR; - } else { - mEnd = normalize(mEnd - 1); - --mLength; - return mCharBuf[mEnd]; - } - } - public char getLastChar() { - if (mLength < 1) { - return PLACEHOLDER_DELIMITER_CHAR; - } else { - return mCharBuf[normalize(mEnd - 1)]; - } - } - public int getPreviousX(char c, int back) { - int index = normalize(mEnd - 2 - back); - if (mLength <= back - || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) { - return INVALID_COORDINATE; - } else { - return mXBuf[index]; - } - } - public int getPreviousY(char c, int back) { - int index = normalize(mEnd - 2 - back); - if (mLength <= back - || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) { - return INVALID_COORDINATE; - } else { - return mYBuf[index]; - } - } - public String getLastString() { - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < mLength; ++i) { - char c = mCharBuf[normalize(mEnd - 1 - i)]; - if (!((LatinIME)mContext).isWordSeparator(c)) { - sb.append(c); - } else { - break; - } - } - return sb.reverse().toString(); - } - public void reset() { - mLength = 0; - } - } -} diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index a8ab9cc98..e460471a5 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() { @@ -41,10 +45,10 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang String before, String after, int position, List<CharSequence> suggestions) { } - public static void logOnAutoSuggestion(String before, String after) { + public static void logOnAutoCorrection(String before, String after, int separatorCode) { } - public static void logOnAutoSuggestionCanceled() { + public static void logOnAutoCorrectionCancelled() { } public static void logOnDelete() { @@ -53,6 +57,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void logOnInputChar() { } + public static void logOnInputSeparator() { + } + public static void logOnException(String metaData, Throwable e) { } @@ -68,4 +75,6 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void onSetKeyboard(Keyboard kb) { } + public static void onPrintAllUsabilityStudyLogs() { + } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java deleted file mode 100644 index 1438d7da1..000000000 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ /dev/null @@ -1,1027 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.content.res.XmlResourceParser; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.ColorFilter; -import android.graphics.Paint; -import android.graphics.Paint.Align; -import android.graphics.PixelFormat; -import android.graphics.PorterDuff; -import android.graphics.Rect; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.inputmethodservice.Keyboard; -import android.text.TextPaint; -import android.util.Log; -import android.view.ViewConfiguration; -import android.view.inputmethod.EditorInfo; - -import java.util.List; -import java.util.Locale; - -public class LatinKeyboard extends Keyboard { - - private static final boolean DEBUG_PREFERRED_LETTER = false; - private static final String TAG = "LatinKeyboard"; - private static final int OPACITY_FULLY_OPAQUE = 255; - private static final int SPACE_LED_LENGTH_PERCENT = 80; - - private Drawable mShiftLockIcon; - private Drawable mShiftLockPreviewIcon; - private Drawable mOldShiftIcon; - private Drawable mSpaceIcon; - private Drawable mSpaceAutoCompletionIndicator; - private Drawable mSpacePreviewIcon; - private Drawable mMicIcon; - private Drawable mMicPreviewIcon; - private Drawable m123MicIcon; - private Drawable m123MicPreviewIcon; - private final Drawable mButtonArrowLeftIcon; - private final Drawable mButtonArrowRightIcon; - private Key mShiftKey; - private Key mEnterKey; - private Key mF1Key; - private final Drawable mHintIcon; - private Key mSpaceKey; - private Key m123Key; - private final int NUMBER_HINT_COUNT = 10; - private Key[] mNumberHintKeys; - private Drawable[] mNumberHintIcons = new Drawable[NUMBER_HINT_COUNT]; - private final int[] mSpaceKeyIndexArray; - private int mSpaceDragStartX; - private int mSpaceDragLastDiff; - private Locale mLocale; - private LanguageSwitcher mLanguageSwitcher; - private final Resources mRes; - private final Context mContext; - private int mMode; - // Whether this keyboard has voice icon on it - private boolean mHasVoiceButton; - // Whether voice icon is enabled at all - private boolean mVoiceEnabled; - private final boolean mIsAlphaKeyboard; - private CharSequence m123Label; - private boolean mCurrentlyInSpace; - private SlidingLocaleDrawable mSlidingLocaleIcon; - private int[] mPrefLetterFrequencies; - private int mPrefLetter; - private int mPrefLetterX; - private int mPrefLetterY; - private int mPrefDistance; - - // TODO: generalize for any keyboardId - private boolean mIsBlackSym; - - // TODO: remove this attribute when either Keyboard.mDefaultVerticalGap or Key.parent becomes - // non-private. - private final int mVerticalGap; - - private static final int SHIFT_OFF = 0; - private static final int SHIFT_ON = 1; - private static final int SHIFT_LOCKED = 2; - - private int mShiftState = SHIFT_OFF; - - private static final float SPACEBAR_DRAG_THRESHOLD = 0.8f; - private static final float OVERLAP_PERCENTAGE_LOW_PROB = 0.70f; - private static final float OVERLAP_PERCENTAGE_HIGH_PROB = 0.85f; - // Minimum width of space key preview (proportional to keyboard width) - private static final float SPACEBAR_POPUP_MIN_RATIO = 0.4f; - // Height in space key the language name will be drawn. (proportional to space key height) - private static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f; - // If the full language name needs to be smaller than this value to be drawn on space key, - // its short language name will be used instead. - private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f; - - private static int sSpacebarVerticalCorrection; - - public LatinKeyboard(Context context, int xmlLayoutResId) { - this(context, xmlLayoutResId, 0); - } - - public LatinKeyboard(Context context, int xmlLayoutResId, int mode) { - super(context, xmlLayoutResId, mode); - final Resources res = context.getResources(); - mContext = context; - mMode = mode; - mRes = res; - mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); - mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); - setDefaultBounds(mShiftLockPreviewIcon); - mSpaceIcon = res.getDrawable(R.drawable.sym_keyboard_space); - mSpaceAutoCompletionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led); - mSpacePreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_space); - mMicIcon = res.getDrawable(R.drawable.sym_keyboard_mic); - mMicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_mic); - setDefaultBounds(mMicPreviewIcon); - mButtonArrowLeftIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_left); - mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right); - m123MicIcon = res.getDrawable(R.drawable.sym_keyboard_123_mic); - m123MicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_123_mic); - mHintIcon = res.getDrawable(R.drawable.hint_popup); - setDefaultBounds(m123MicPreviewIcon); - sSpacebarVerticalCorrection = res.getDimensionPixelOffset( - R.dimen.spacebar_vertical_correction); - mIsAlphaKeyboard = xmlLayoutResId == R.xml.kbd_qwerty - || xmlLayoutResId == R.xml.kbd_qwerty_black; - // The index of space key is available only after Keyboard constructor has finished. - mSpaceKeyIndexArray = new int[] { indexOf(LatinIME.KEYCODE_SPACE) }; - initializeNumberHintResources(context); - // TODO remove this initialization after cleanup - mVerticalGap = super.getVerticalGap(); - } - - private void initializeNumberHintResources(Context context) { - final Resources res = context.getResources(); - mNumberHintIcons[0] = res.getDrawable(R.drawable.keyboard_hint_0); - mNumberHintIcons[1] = res.getDrawable(R.drawable.keyboard_hint_1); - mNumberHintIcons[2] = res.getDrawable(R.drawable.keyboard_hint_2); - mNumberHintIcons[3] = res.getDrawable(R.drawable.keyboard_hint_3); - mNumberHintIcons[4] = res.getDrawable(R.drawable.keyboard_hint_4); - mNumberHintIcons[5] = res.getDrawable(R.drawable.keyboard_hint_5); - mNumberHintIcons[6] = res.getDrawable(R.drawable.keyboard_hint_6); - mNumberHintIcons[7] = res.getDrawable(R.drawable.keyboard_hint_7); - mNumberHintIcons[8] = res.getDrawable(R.drawable.keyboard_hint_8); - mNumberHintIcons[9] = res.getDrawable(R.drawable.keyboard_hint_9); - } - - @Override - protected Key createKeyFromXml(Resources res, Row parent, int x, int y, - XmlResourceParser parser) { - Key key = new LatinKey(res, parent, x, y, parser); - switch (key.codes[0]) { - case LatinIME.KEYCODE_ENTER: - mEnterKey = key; - break; - case LatinKeyboardView.KEYCODE_F1: - mF1Key = key; - break; - case LatinIME.KEYCODE_SPACE: - mSpaceKey = key; - break; - case KEYCODE_MODE_CHANGE: - m123Key = key; - m123Label = key.label; - break; - } - - // For number hints on the upper-right corner of key - if (mNumberHintKeys == null) { - // NOTE: This protected method is being called from the base class constructor before - // mNumberHintKeys gets initialized. - mNumberHintKeys = new Key[NUMBER_HINT_COUNT]; - } - int hintNumber = -1; - if (LatinKeyboardBaseView.isNumberAtLeftmostPopupChar(key)) { - hintNumber = key.popupCharacters.charAt(0) - '0'; - } else if (LatinKeyboardBaseView.isNumberAtRightmostPopupChar(key)) { - hintNumber = key.popupCharacters.charAt(key.popupCharacters.length() - 1) - '0'; - } - if (hintNumber >= 0 && hintNumber <= 9) { - mNumberHintKeys[hintNumber] = key; - } - - return key; - } - - void setImeOptions(Resources res, int mode, int options) { - mMode = mode; - // TODO should clean up this method - if (mEnterKey != null) { - // Reset some of the rarely used attributes. - mEnterKey.popupCharacters = null; - mEnterKey.popupResId = 0; - mEnterKey.text = null; - switch (options&(EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) { - case EditorInfo.IME_ACTION_GO: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_go_key); - break; - case EditorInfo.IME_ACTION_NEXT: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_next_key); - break; - case EditorInfo.IME_ACTION_DONE: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_done_key); - break; - case EditorInfo.IME_ACTION_SEARCH: - mEnterKey.iconPreview = res.getDrawable( - R.drawable.sym_keyboard_feedback_search); - mEnterKey.icon = res.getDrawable(mIsBlackSym ? - R.drawable.sym_bkeyboard_search : R.drawable.sym_keyboard_search); - mEnterKey.label = null; - break; - case EditorInfo.IME_ACTION_SEND: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_send_key); - break; - default: - if (mode == KeyboardSwitcher.MODE_IM) { - mEnterKey.icon = mHintIcon; - mEnterKey.iconPreview = null; - mEnterKey.label = ":-)"; - mEnterKey.text = ":-) "; - mEnterKey.popupResId = R.xml.popup_smileys; - } else { - mEnterKey.iconPreview = res.getDrawable( - R.drawable.sym_keyboard_feedback_return); - mEnterKey.icon = res.getDrawable(mIsBlackSym ? - R.drawable.sym_bkeyboard_return : R.drawable.sym_keyboard_return); - mEnterKey.label = null; - } - break; - } - // Set the initial size of the preview icon - if (mEnterKey.iconPreview != null) { - setDefaultBounds(mEnterKey.iconPreview); - } - } - } - - void enableShiftLock() { - int index = getShiftKeyIndex(); - if (index >= 0) { - mShiftKey = getKeys().get(index); - if (mShiftKey instanceof LatinKey) { - ((LatinKey)mShiftKey).enableShiftLock(); - } - mOldShiftIcon = mShiftKey.icon; - } - } - - void setShiftLocked(boolean shiftLocked) { - if (mShiftKey != null) { - if (shiftLocked) { - mShiftKey.on = true; - mShiftKey.icon = mShiftLockIcon; - mShiftState = SHIFT_LOCKED; - } else { - mShiftKey.on = false; - mShiftKey.icon = mShiftLockIcon; - mShiftState = SHIFT_ON; - } - } - } - - boolean isShiftLocked() { - return mShiftState == SHIFT_LOCKED; - } - - @Override - public boolean setShifted(boolean shiftState) { - boolean shiftChanged = false; - if (mShiftKey != null) { - if (shiftState == false) { - shiftChanged = mShiftState != SHIFT_OFF; - mShiftState = SHIFT_OFF; - mShiftKey.on = false; - mShiftKey.icon = mOldShiftIcon; - } else { - if (mShiftState == SHIFT_OFF) { - shiftChanged = mShiftState == SHIFT_OFF; - mShiftState = SHIFT_ON; - mShiftKey.icon = mShiftLockIcon; - } - } - } else { - return super.setShifted(shiftState); - } - return shiftChanged; - } - - @Override - public boolean isShifted() { - if (mShiftKey != null) { - return mShiftState != SHIFT_OFF; - } else { - return super.isShifted(); - } - } - - /* package */ boolean isAlphaKeyboard() { - return mIsAlphaKeyboard; - } - - public void setColorOfSymbolIcons(boolean isAutoCompletion, boolean isBlack) { - mIsBlackSym = isBlack; - if (isBlack) { - mShiftLockIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_shift_locked); - mSpaceIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_space); - mMicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic); - m123MicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_123_mic); - } else { - mShiftLockIcon = mRes.getDrawable(R.drawable.sym_keyboard_shift_locked); - mSpaceIcon = mRes.getDrawable(R.drawable.sym_keyboard_space); - mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic); - m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic); - } - updateDynamicKeys(); - if (mSpaceKey != null) { - updateSpaceBarForLocale(isAutoCompletion, isBlack); - } - updateNumberHintKeys(); - } - - private void setDefaultBounds(Drawable drawable) { - drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); - } - - public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) { - mHasVoiceButton = hasVoiceButton; - mVoiceEnabled = hasVoice; - updateDynamicKeys(); - } - - private void updateDynamicKeys() { - update123Key(); - updateF1Key(); - } - - private void update123Key() { - // Update KEYCODE_MODE_CHANGE key only on alphabet mode, not on symbol mode. - if (m123Key != null && mIsAlphaKeyboard) { - if (mVoiceEnabled && !mHasVoiceButton) { - m123Key.icon = m123MicIcon; - m123Key.iconPreview = m123MicPreviewIcon; - m123Key.label = null; - } else { - m123Key.icon = null; - m123Key.iconPreview = null; - m123Key.label = m123Label; - } - } - } - - private void updateF1Key() { - // Update KEYCODE_F1 key. Please note that some keyboard layouts have no F1 key. - if (mF1Key == null) - return; - - if (mIsAlphaKeyboard) { - if (mMode == KeyboardSwitcher.MODE_URL) { - setNonMicF1Key(mF1Key, "/", R.xml.popup_slash); - } else if (mMode == KeyboardSwitcher.MODE_EMAIL) { - setNonMicF1Key(mF1Key, "@", R.xml.popup_at); - } else { - if (mVoiceEnabled && mHasVoiceButton) { - setMicF1Key(mF1Key); - } else { - setNonMicF1Key(mF1Key, ",", R.xml.popup_comma); - } - } - } else { // Symbols keyboard - if (mVoiceEnabled && mHasVoiceButton) { - setMicF1Key(mF1Key); - } else { - setNonMicF1Key(mF1Key, ",", R.xml.popup_comma); - } - } - } - - private void setMicF1Key(Key key) { - // HACK: draw mMicIcon and mHintIcon at the same time - final Drawable micWithSettingsHintDrawable = new BitmapDrawable(mRes, - drawSynthesizedSettingsHintImage(key.width, key.height, mMicIcon, mHintIcon)); - - key.label = null; - key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; - key.popupResId = R.xml.popup_mic; - key.icon = micWithSettingsHintDrawable; - key.iconPreview = mMicPreviewIcon; - } - - private void setNonMicF1Key(Key key, String label, int popupResId) { - key.label = label; - key.codes = new int[] { label.charAt(0) }; - key.popupResId = popupResId; - key.icon = mHintIcon; - key.iconPreview = null; - } - - public boolean isF1Key(Key key) { - return key == mF1Key; - } - - public static boolean hasPuncOrSmileysPopup(Key key) { - return key.popupResId == R.xml.popup_punctuation || key.popupResId == R.xml.popup_smileys; - } - - /** - * @return a key which should be invalidated. - */ - public Key onAutoCompletionStateChanged(boolean isAutoCompletion) { - updateSpaceBarForLocale(isAutoCompletion, mIsBlackSym); - return mSpaceKey; - } - - private void updateNumberHintKeys() { - for (int i = 0; i < mNumberHintKeys.length; ++i) { - if (mNumberHintKeys[i] != null) { - mNumberHintKeys[i].icon = mNumberHintIcons[i]; - } - } - } - - public boolean isLanguageSwitchEnabled() { - return mLocale != null; - } - - private void updateSpaceBarForLocale(boolean isAutoCompletion, boolean isBlack) { - // If application locales are explicitly selected. - if (mLocale != null) { - mSpaceKey.icon = new BitmapDrawable(mRes, - drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack)); - } else { - // sym_keyboard_space_led can be shared with Black and White symbol themes. - if (isAutoCompletion) { - mSpaceKey.icon = new BitmapDrawable(mRes, - drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack)); - } else { - mSpaceKey.icon = isBlack ? mRes.getDrawable(R.drawable.sym_bkeyboard_space) - : mRes.getDrawable(R.drawable.sym_keyboard_space); - } - } - } - - // Compute width of text with specified text size using paint. - private static int getTextWidth(Paint paint, String text, float textSize, Rect bounds) { - paint.setTextSize(textSize); - paint.getTextBounds(text, 0, text.length(), bounds); - return bounds.width(); - } - - // Overlay two images: mainIcon and hintIcon. - private Bitmap drawSynthesizedSettingsHintImage( - int width, int height, Drawable mainIcon, Drawable hintIcon) { - if (mainIcon == null || hintIcon == null) - return null; - Rect hintIconPadding = new Rect(0, 0, 0, 0); - hintIcon.getPadding(hintIconPadding); - final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - final Canvas canvas = new Canvas(buffer); - canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); - - // Draw main icon at the center of the key visual - // Assuming the hintIcon shares the same padding with the key's background drawable - final int drawableX = (width + hintIconPadding.left - hintIconPadding.right - - mainIcon.getIntrinsicWidth()) / 2; - final int drawableY = (height + hintIconPadding.top - hintIconPadding.bottom - - mainIcon.getIntrinsicHeight()) / 2; - setDefaultBounds(mainIcon); - canvas.translate(drawableX, drawableY); - mainIcon.draw(canvas); - canvas.translate(-drawableX, -drawableY); - - // Draw hint icon fully in the key - hintIcon.setBounds(0, 0, width, height); - hintIcon.draw(canvas); - return buffer; - } - - // Layout local language name and left and right arrow on space bar. - private static String layoutSpaceBar(Paint paint, Locale locale, Drawable lArrow, - Drawable rArrow, int width, int height, float origTextSize, - boolean allowVariableTextSize) { - final float arrowWidth = lArrow.getIntrinsicWidth(); - final float arrowHeight = lArrow.getIntrinsicHeight(); - final float maxTextWidth = width - (arrowWidth + arrowWidth); - final Rect bounds = new Rect(); - - // Estimate appropriate language name text size to fit in maxTextWidth. - String language = LanguageSwitcher.toTitleCase(locale.getDisplayLanguage(locale), locale); - int textWidth = getTextWidth(paint, language, origTextSize, bounds); - // Assuming text width and text size are proportional to each other. - float textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f); - - final boolean useShortName; - if (allowVariableTextSize) { - textWidth = getTextWidth(paint, language, textSize, bounds); - // If text size goes too small or text does not fit, use short name - useShortName = textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME - || textWidth > maxTextWidth; - } else { - useShortName = textWidth > maxTextWidth; - textSize = origTextSize; - } - if (useShortName) { - language = LanguageSwitcher.toTitleCase(locale.getLanguage(), locale); - textWidth = getTextWidth(paint, language, origTextSize, bounds); - textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f); - } - paint.setTextSize(textSize); - - // Place left and right arrow just before and after language text. - final float baseline = height * SPACEBAR_LANGUAGE_BASELINE; - final int top = (int)(baseline - arrowHeight); - final float remains = (width - textWidth) / 2; - lArrow.setBounds((int)(remains - arrowWidth), top, (int)remains, (int)baseline); - rArrow.setBounds((int)(remains + textWidth), top, (int)(remains + textWidth + arrowWidth), - (int)baseline); - - return language; - } - - private Bitmap drawSpaceBar(int opacity, boolean isAutoCompletion, boolean isBlack) { - final int width = mSpaceKey.width; - final int height = mSpaceIcon.getIntrinsicHeight(); - final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - final Canvas canvas = new Canvas(buffer); - canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); - - // If application locales are explicitly selected. - if (mLocale != null) { - final Paint paint = new Paint(); - paint.setAlpha(opacity); - paint.setAntiAlias(true); - paint.setTextAlign(Align.CENTER); - - final boolean allowVariableTextSize = true; - final String language = layoutSpaceBar(paint, mLanguageSwitcher.getInputLocale(), - mButtonArrowLeftIcon, mButtonArrowRightIcon, width, height, - getTextSizeFromTheme(android.R.style.TextAppearance_Small, 14), - allowVariableTextSize); - - // Draw language text with shadow - final int shadowColor = mRes.getColor(isBlack - ? R.color.latinkeyboard_bar_language_shadow_black - : R.color.latinkeyboard_bar_language_shadow_white); - final float baseline = height * SPACEBAR_LANGUAGE_BASELINE; - final float descent = paint.descent(); - paint.setColor(shadowColor); - canvas.drawText(language, width / 2, baseline - descent - 1, paint); - paint.setColor(mRes.getColor(R.color.latinkeyboard_bar_language_text)); - canvas.drawText(language, width / 2, baseline - descent, paint); - - // Put arrows that are already layed out on either side of the text - if (mLanguageSwitcher.getLocaleCount() > 1) { - mButtonArrowLeftIcon.draw(canvas); - mButtonArrowRightIcon.draw(canvas); - } - } - - // Draw the spacebar icon at the bottom - if (isAutoCompletion) { - final int iconWidth = width * SPACE_LED_LENGTH_PERCENT / 100; - final int iconHeight = mSpaceAutoCompletionIndicator.getIntrinsicHeight(); - int x = (width - iconWidth) / 2; - int y = height - iconHeight; - mSpaceAutoCompletionIndicator.setBounds(x, y, x + iconWidth, y + iconHeight); - mSpaceAutoCompletionIndicator.draw(canvas); - } else { - final int iconWidth = mSpaceIcon.getIntrinsicWidth(); - final int iconHeight = mSpaceIcon.getIntrinsicHeight(); - int x = (width - iconWidth) / 2; - int y = height - iconHeight; - mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight); - mSpaceIcon.draw(canvas); - } - return buffer; - } - - private void updateLocaleDrag(int diff) { - if (mSlidingLocaleIcon == null) { - final int width = Math.max(mSpaceKey.width, - (int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO)); - final int height = mSpacePreviewIcon.getIntrinsicHeight(); - mSlidingLocaleIcon = new SlidingLocaleDrawable(mSpacePreviewIcon, width, height); - mSlidingLocaleIcon.setBounds(0, 0, width, height); - mSpaceKey.iconPreview = mSlidingLocaleIcon; - } - mSlidingLocaleIcon.setDiff(diff); - if (Math.abs(diff) == Integer.MAX_VALUE) { - mSpaceKey.iconPreview = mSpacePreviewIcon; - } else { - mSpaceKey.iconPreview = mSlidingLocaleIcon; - } - mSpaceKey.iconPreview.invalidateSelf(); - } - - public int getLanguageChangeDirection() { - if (mSpaceKey == null || mLanguageSwitcher.getLocaleCount() < 2 - || Math.abs(mSpaceDragLastDiff) < mSpaceKey.width * SPACEBAR_DRAG_THRESHOLD ) { - return 0; // No change - } - return mSpaceDragLastDiff > 0 ? 1 : -1; - } - - public void setLanguageSwitcher(LanguageSwitcher switcher, boolean isAutoCompletion, - boolean isBlackSym) { - mLanguageSwitcher = switcher; - Locale locale = mLanguageSwitcher.getLocaleCount() > 0 - ? mLanguageSwitcher.getInputLocale() - : null; - // If the language count is 1 and is the same as the system language, don't show it. - if (locale != null - && mLanguageSwitcher.getLocaleCount() == 1 - && mLanguageSwitcher.getSystemLocale().getLanguage() - .equalsIgnoreCase(locale.getLanguage())) { - locale = null; - } - mLocale = locale; - setColorOfSymbolIcons(isAutoCompletion, isBlackSym); - } - - public Locale getInputLocale() { - return (mLocale != null) ? mLocale : mLanguageSwitcher.getSystemLocale(); - } - - boolean isCurrentlyInSpace() { - return mCurrentlyInSpace; - } - - void setPreferredLetters(int[] frequencies) { - mPrefLetterFrequencies = frequencies; - mPrefLetter = 0; - } - - void keyReleased() { - mCurrentlyInSpace = false; - mSpaceDragLastDiff = 0; - mPrefLetter = 0; - mPrefLetterX = 0; - mPrefLetterY = 0; - mPrefDistance = Integer.MAX_VALUE; - if (mSpaceKey != null) { - updateLocaleDrag(Integer.MAX_VALUE); - } - } - - /** - * Does the magic of locking the touch gesture into the spacebar when - * switching input languages. - */ - boolean isInside(LatinKey key, int x, int y) { - final int code = key.codes[0]; - if (code == KEYCODE_SHIFT || - code == KEYCODE_DELETE) { - y -= key.height / 10; - if (code == KEYCODE_SHIFT) x += key.width / 6; - if (code == KEYCODE_DELETE) x -= key.width / 6; - } else if (code == LatinIME.KEYCODE_SPACE) { - y += LatinKeyboard.sSpacebarVerticalCorrection; - if (mLanguageSwitcher.getLocaleCount() > 1) { - if (mCurrentlyInSpace) { - int diff = x - mSpaceDragStartX; - if (Math.abs(diff - mSpaceDragLastDiff) > 0) { - updateLocaleDrag(diff); - } - mSpaceDragLastDiff = diff; - return true; - } else { - boolean insideSpace = key.isInsideSuper(x, y); - if (insideSpace) { - mCurrentlyInSpace = true; - mSpaceDragStartX = x; - updateLocaleDrag(0); - } - return insideSpace; - } - } - } else if (mPrefLetterFrequencies != null) { - // New coordinate? Reset - if (mPrefLetterX != x || mPrefLetterY != y) { - mPrefLetter = 0; - mPrefDistance = Integer.MAX_VALUE; - } - // Handle preferred next letter - final int[] pref = mPrefLetterFrequencies; - if (mPrefLetter > 0) { - if (DEBUG_PREFERRED_LETTER) { - if (mPrefLetter == code && !key.isInsideSuper(x, y)) { - Log.d(TAG, "CORRECTED !!!!!!"); - } - } - return mPrefLetter == code; - } else { - final boolean inside = key.isInsideSuper(x, y); - int[] nearby = getNearestKeys(x, y); - List<Key> nearbyKeys = getKeys(); - if (inside) { - // If it's a preferred letter - if (inPrefList(code, pref)) { - // Check if its frequency is much lower than a nearby key - mPrefLetter = code; - mPrefLetterX = x; - mPrefLetterY = y; - for (int i = 0; i < nearby.length; i++) { - Key k = nearbyKeys.get(nearby[i]); - if (k != key && inPrefList(k.codes[0], pref)) { - final int dist = distanceFrom(k, x, y); - if (dist < (int) (k.width * OVERLAP_PERCENTAGE_LOW_PROB) && - (pref[k.codes[0]] > pref[mPrefLetter] * 3)) { - mPrefLetter = k.codes[0]; - mPrefDistance = dist; - if (DEBUG_PREFERRED_LETTER) { - Log.d(TAG, "CORRECTED ALTHOUGH PREFERRED !!!!!!"); - } - break; - } - } - } - - return mPrefLetter == code; - } - } - - // Get the surrounding keys and intersect with the preferred list - // For all in the intersection - // if distance from touch point is within a reasonable distance - // make this the pref letter - // If no pref letter - // return inside; - // else return thiskey == prefletter; - - for (int i = 0; i < nearby.length; i++) { - Key k = nearbyKeys.get(nearby[i]); - if (inPrefList(k.codes[0], pref)) { - final int dist = distanceFrom(k, x, y); - if (dist < (int) (k.width * OVERLAP_PERCENTAGE_HIGH_PROB) - && dist < mPrefDistance) { - mPrefLetter = k.codes[0]; - mPrefLetterX = x; - mPrefLetterY = y; - mPrefDistance = dist; - } - } - } - // Didn't find any - if (mPrefLetter == 0) { - return inside; - } else { - return mPrefLetter == code; - } - } - } - - // Lock into the spacebar - if (mCurrentlyInSpace) return false; - - return key.isInsideSuper(x, y); - } - - private boolean inPrefList(int code, int[] pref) { - if (code < pref.length && code >= 0) return pref[code] > 0; - return false; - } - - private int distanceFrom(Key k, int x, int y) { - if (y > k.y && y < k.y + k.height) { - return Math.abs(k.x + k.width / 2 - x); - } else { - return Integer.MAX_VALUE; - } - } - - @Override - public int[] getNearestKeys(int x, int y) { - if (mCurrentlyInSpace) { - return mSpaceKeyIndexArray; - } else { - // Avoid dead pixels at edges of the keyboard - return super.getNearestKeys(Math.max(0, Math.min(x, getMinWidth() - 1)), - Math.max(0, Math.min(y, getHeight() - 1))); - } - } - - private int indexOf(int code) { - List<Key> keys = getKeys(); - int count = keys.size(); - for (int i = 0; i < count; i++) { - if (keys.get(i).codes[0] == code) return i; - } - return -1; - } - - private int getTextSizeFromTheme(int style, int defValue) { - TypedArray array = mContext.getTheme().obtainStyledAttributes( - style, new int[] { android.R.attr.textSize }); - int textSize = array.getDimensionPixelSize(array.getResourceId(0, 0), defValue); - return textSize; - } - - // TODO LatinKey could be static class - class LatinKey extends Keyboard.Key { - - // functional normal state (with properties) - private final int[] KEY_STATE_FUNCTIONAL_NORMAL = { - android.R.attr.state_single - }; - - // functional pressed state (with properties) - private final int[] KEY_STATE_FUNCTIONAL_PRESSED = { - android.R.attr.state_single, - android.R.attr.state_pressed - }; - - private boolean mShiftLockEnabled; - - public LatinKey(Resources res, Keyboard.Row parent, int x, int y, - XmlResourceParser parser) { - super(res, parent, x, y, parser); - if (popupCharacters != null && popupCharacters.length() == 0) { - // If there is a keyboard with no keys specified in popupCharacters - popupResId = 0; - } - } - - private void enableShiftLock() { - mShiftLockEnabled = true; - } - - // sticky is used for shift key. If a key is not sticky and is modifier, - // the key will be treated as functional. - private boolean isFunctionalKey() { - return !sticky && modifier; - } - - @Override - public void onReleased(boolean inside) { - if (!mShiftLockEnabled) { - super.onReleased(inside); - } else { - pressed = !pressed; - } - } - - /** - * Overriding this method so that we can reduce the target area for certain keys. - */ - @Override - public boolean isInside(int x, int y) { - // TODO This should be done by parent.isInside(this, x, y) - // if Key.parent were protected. - boolean result = LatinKeyboard.this.isInside(this, x, y); - return result; - } - - boolean isInsideSuper(int x, int y) { - return super.isInside(x, y); - } - - @Override - public int[] getCurrentDrawableState() { - if (isFunctionalKey()) { - if (pressed) { - return KEY_STATE_FUNCTIONAL_PRESSED; - } else { - return KEY_STATE_FUNCTIONAL_NORMAL; - } - } - return super.getCurrentDrawableState(); - } - - @Override - public int squaredDistanceFrom(int x, int y) { - // We should count vertical gap between rows to calculate the center of this Key. - final int verticalGap = LatinKeyboard.this.mVerticalGap; - final int xDist = this.x + width / 2 - x; - final int yDist = this.y + (height + verticalGap) / 2 - y; - return xDist * xDist + yDist * yDist; - } - } - - /** - * Animation to be displayed on the spacebar preview popup when switching - * languages by swiping the spacebar. It draws the current, previous and - * next languages and moves them by the delta of touch movement on the spacebar. - */ - class SlidingLocaleDrawable extends Drawable { - - private final int mWidth; - private final int mHeight; - private final Drawable mBackground; - private final TextPaint mTextPaint; - private final int mMiddleX; - private final Drawable mLeftDrawable; - private final Drawable mRightDrawable; - private final int mThreshold; - private int mDiff; - private boolean mHitThreshold; - private String mCurrentLanguage; - private String mNextLanguage; - private String mPrevLanguage; - - public SlidingLocaleDrawable(Drawable background, int width, int height) { - mBackground = background; - setDefaultBounds(mBackground); - mWidth = width; - mHeight = height; - mTextPaint = new TextPaint(); - mTextPaint.setTextSize(getTextSizeFromTheme(android.R.style.TextAppearance_Medium, 18)); - mTextPaint.setColor(R.color.latinkeyboard_transparent); - mTextPaint.setTextAlign(Align.CENTER); - mTextPaint.setAlpha(OPACITY_FULLY_OPAQUE); - mTextPaint.setAntiAlias(true); - mMiddleX = (mWidth - mBackground.getIntrinsicWidth()) / 2; - mLeftDrawable = - mRes.getDrawable(R.drawable.sym_keyboard_feedback_language_arrows_left); - mRightDrawable = - mRes.getDrawable(R.drawable.sym_keyboard_feedback_language_arrows_right); - mThreshold = ViewConfiguration.get(mContext).getScaledTouchSlop(); - } - - private void setDiff(int diff) { - if (diff == Integer.MAX_VALUE) { - mHitThreshold = false; - mCurrentLanguage = null; - return; - } - mDiff = diff; - if (mDiff > mWidth) mDiff = mWidth; - if (mDiff < -mWidth) mDiff = -mWidth; - if (Math.abs(mDiff) > mThreshold) mHitThreshold = true; - invalidateSelf(); - } - - private String getLanguageName(Locale locale) { - return LanguageSwitcher.toTitleCase(locale.getDisplayLanguage(locale), locale); - } - - @Override - public void draw(Canvas canvas) { - canvas.save(); - if (mHitThreshold) { - Paint paint = mTextPaint; - final int width = mWidth; - final int height = mHeight; - final int diff = mDiff; - final Drawable lArrow = mLeftDrawable; - final Drawable rArrow = mRightDrawable; - canvas.clipRect(0, 0, width, height); - if (mCurrentLanguage == null) { - final LanguageSwitcher languageSwitcher = mLanguageSwitcher; - mCurrentLanguage = getLanguageName(languageSwitcher.getInputLocale()); - mNextLanguage = getLanguageName(languageSwitcher.getNextInputLocale()); - mPrevLanguage = getLanguageName(languageSwitcher.getPrevInputLocale()); - } - // Draw language text with shadow - final float baseline = mHeight * SPACEBAR_LANGUAGE_BASELINE - paint.descent(); - paint.setColor(mRes.getColor(R.color.latinkeyboard_feedback_language_text)); - canvas.drawText(mCurrentLanguage, width / 2 + diff, baseline, paint); - canvas.drawText(mNextLanguage, diff - width / 2, baseline, paint); - canvas.drawText(mPrevLanguage, diff + width + width / 2, baseline, paint); - - setDefaultBounds(lArrow); - rArrow.setBounds(width - rArrow.getIntrinsicWidth(), 0, width, - rArrow.getIntrinsicHeight()); - lArrow.draw(canvas); - rArrow.draw(canvas); - } - if (mBackground != null) { - canvas.translate(mMiddleX, 0); - mBackground.draw(canvas); - } - canvas.restore(); - } - - @Override - public int getOpacity() { - return PixelFormat.TRANSLUCENT; - } - - @Override - public void setAlpha(int alpha) { - // Ignore - } - - @Override - public void setColorFilter(ColorFilter cf) { - // Ignore - } - - @Override - public int getIntrinsicWidth() { - return mWidth; - } - - @Override - public int getIntrinsicHeight() { - return mHeight; - } - } -} diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java deleted file mode 100644 index fece78689..000000000 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ /dev/null @@ -1,1517 +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.content.Context; -import android.content.pm.PackageManager; -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.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; -import android.util.AttributeSet; -import android.util.Log; -import android.util.TypedValue; -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.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.Locale; -import java.util.WeakHashMap; - -/** - * A view that renders a virtual {@link LatinKeyboard}. It handles rendering of keys and - * detecting key presses and touch movements. - * - * TODO: References to LatinKeyboard in this class should be replaced with ones to its base class. - * - * @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 - */ -public class LatinKeyboardBaseView extends View implements PointerTracker.UIProxy { - private static final String TAG = "LatinKeyboardBaseView"; - private static final boolean DEBUG = false; - - public static final int NOT_A_TOUCH_COORDINATE = -1; - - public interface OnKeyboardActionListener { - - /** - * Called when the user presses a key. This is sent before the - * {@link #onKey} is called. For keys that repeat, this is only - * called once. - * - * @param primaryCode - * the unicode of the key being pressed. If the touch is - * not on a valid key, the value will be zero. - */ - void onPress(int primaryCode); - - /** - * Called when the user releases a key. This is sent after the - * {@link #onKey} is called. For keys that repeat, this is only - * called once. - * - * @param primaryCode - * the code of the key that was released - */ - void onRelease(int primaryCode); - - /** - * Send a key press to the listener. - * - * @param primaryCode - * this is the key that was pressed - * @param keyCodes - * the codes for all the possible alternative keys with - * the primary code being the first. If the primary key - * code is a single character such as an alphabet or - * number or symbol, the alternatives will include other - * characters that may be on the same key or adjacent - * keys. These codes are useful to correct for - * accidental presses of a key adjacent to the intended - * key. - * @param x - * x-coordinate pixel of touched event. If onKey is not called by onTouchEvent, - * the value should be NOT_A_TOUCH_COORDINATE. - * @param y - * y-coordinate pixel of touched event. If onKey is not called by onTouchEvent, - * the value should be NOT_A_TOUCH_COORDINATE. - */ - void onKey(int primaryCode, int[] keyCodes, int x, int y); - - /** - * Sends a sequence of characters to the listener. - * - * @param text - * the sequence of characters to be displayed. - */ - void onText(CharSequence text); - - /** - * Called when user released a finger outside any key. - */ - void onCancel(); - - /** - * Called when the user quickly moves the finger from right to - * left. - */ - void swipeLeft(); - - /** - * Called when the user quickly moves the finger from left to - * right. - */ - void swipeRight(); - - /** - * Called when the user quickly moves the finger from up to down. - */ - void swipeDown(); - - /** - * Called when the user quickly moves the finger from down to up. - */ - void swipeUp(); - } - - // 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; - - // XML attribute - private int mKeyTextSize; - private int mKeyTextColor; - private Typeface mKeyTextStyle = Typeface.DEFAULT; - private int mLabelTextSize; - private int mSymbolColorScheme = 0; - private int mShadowColor; - private float mShadowRadius; - private Drawable mKeyBackground; - private float mBackgroundDimAmount; - private float mKeyHysteresisDistance; - private float mVerticalCorrection; - private int mPreviewOffset; - private int mPreviewHeight; - private int mPopupLayout; - - // Main keyboard - private Keyboard mKeyboard; - private Key[] mKeys; - // TODO this attribute should be gotten from Keyboard. - private int mKeyboardVerticalGap; - - // Key preview popup - private TextView mPreviewText; - private PopupWindow mPreviewPopup; - private int mPreviewTextSizeLarge; - private int[] mOffsetInWindow; - private int mOldPreviewKeyIndex = NOT_A_KEY; - private boolean mShowPreview = true; - private boolean mShowTouchPoints = true; - private int mPopupPreviewOffsetX; - private int mPopupPreviewOffsetY; - private int mWindowY; - private int mPopupPreviewDisplayedY; - private final int mDelayBeforePreview; - private final int mDelayAfterPreview; - - // Popup mini keyboard - private PopupWindow mMiniKeyboardPopup; - private LatinKeyboardBaseView mMiniKeyboard; - private View mMiniKeyboardParent; - private final WeakHashMap<Key, View> mMiniKeyboardCache = new WeakHashMap<Key, View>(); - private int mMiniKeyboardOriginX; - private int mMiniKeyboardOriginY; - private long mMiniKeyboardPopupTime; - private int[] mWindowOffset; - private final float mMiniKeyboardSlideAllowance; - private int mMiniKeyboardTrackerId; - - /** Listener for {@link OnKeyboardActionListener}. */ - private OnKeyboardActionListener 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 boolean mHasDistinctMultitouch; - private int mOldPointerCount = 1; - - protected KeyDetector mKeyDetector = new ProximityKeyDetector(); - - // Swipe gesture detector - private GestureDetector mGestureDetector; - private final SwipeTracker mSwipeTracker = new SwipeTracker(); - private final int mSwipeThreshold; - private final boolean mDisambiguateSwipe; - - // Drawing - /** Whether the keyboard bitmap needs to be redrawn before it's blitted. **/ - private boolean mDrawPending; - /** The dirty region in the keyboard bitmap */ - private final Rect mDirtyRect = new Rect(); - /** The keyboard bitmap for faster updates */ - private Bitmap mBuffer; - /** Notes if the keyboard just changed, so that we could possibly reallocate the mBuffer. */ - private boolean mKeyboardChanged; - private Key mInvalidatedKey; - /** The canvas for the above mutable keyboard bitmap */ - private Canvas mCanvas; - private final Paint mPaint; - private final Rect mPadding; - private final Rect mClipRegion = new Rect(0, 0, 0, 0); - // This map caches key label text height in pixel as value and key label text size as map key. - private final HashMap<Integer, Integer> mTextHeightCache = new HashMap<Integer, Integer>(); - // Distance from horizontal center of the key, proportional to key label text height. - private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR = 0.55f; - private final String KEY_LABEL_HEIGHT_REFERENCE_CHAR = "H"; - - private final UIHandler mHandler = new UIHandler(); - - class UIHandler extends Handler { - private static final int MSG_POPUP_PREVIEW = 1; - 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 boolean mInKeyRepeat; - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_POPUP_PREVIEW: - showKey(msg.arg1, (PointerTracker)msg.obj); - break; - case MSG_DISMISS_PREVIEW: - mPreviewPopup.dismiss(); - break; - case MSG_REPEAT_KEY: { - final PointerTracker tracker = (PointerTracker)msg.obj; - tracker.repeatKey(msg.arg1); - startKeyRepeatTimer(mKeyRepeatInterval, msg.arg1, tracker); - break; - } - case MSG_LONGPRESS_KEY: { - final PointerTracker tracker = (PointerTracker)msg.obj; - openPopupIfRequired(msg.arg1, tracker); - break; - } - } - } - - public void popupPreview(long delay, int keyIndex, PointerTracker tracker) { - removeMessages(MSG_POPUP_PREVIEW); - if (mPreviewPopup.isShowing() && mPreviewText.getVisibility() == VISIBLE) { - // Show right away, if it's already visible and finger is moving around - showKey(keyIndex, tracker); - } else { - sendMessageDelayed(obtainMessage(MSG_POPUP_PREVIEW, keyIndex, 0, tracker), - delay); - } - } - - public void cancelPopupPreview() { - removeMessages(MSG_POPUP_PREVIEW); - } - - public void dismissPreview(long delay) { - if (mPreviewPopup.isShowing()) { - sendMessageDelayed(obtainMessage(MSG_DISMISS_PREVIEW), delay); - } - } - - public void cancelDismissPreview() { - removeMessages(MSG_DISMISS_PREVIEW); - } - - public void startKeyRepeatTimer(long delay, int keyIndex, PointerTracker tracker) { - mInKeyRepeat = true; - sendMessageDelayed(obtainMessage(MSG_REPEAT_KEY, keyIndex, 0, tracker), delay); - } - - public void cancelKeyRepeatTimer() { - mInKeyRepeat = false; - removeMessages(MSG_REPEAT_KEY); - } - - public boolean isInKeyRepeat() { - return mInKeyRepeat; - } - - public void startLongPressTimer(long delay, int keyIndex, PointerTracker tracker) { - removeMessages(MSG_LONGPRESS_KEY); - sendMessageDelayed(obtainMessage(MSG_LONGPRESS_KEY, keyIndex, 0, tracker), delay); - } - - public void cancelLongPressTimer() { - removeMessages(MSG_LONGPRESS_KEY); - } - - public void cancelKeyTimers() { - cancelKeyRepeatTimer(); - cancelLongPressTimer(); - } - - public void cancelAllMessages() { - cancelKeyTimers(); - cancelPopupPreview(); - cancelDismissPreview(); - } - } - - static class PointerQueue { - private LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>(); - - public void add(PointerTracker tracker) { - mQueue.add(tracker); - } - - public int lastIndexOf(PointerTracker tracker) { - LinkedList<PointerTracker> queue = mQueue; - for (int index = queue.size() - 1; index >= 0; index--) { - PointerTracker t = queue.get(index); - if (t == tracker) - return index; - } - return -1; - } - - public void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) { - LinkedList<PointerTracker> queue = mQueue; - int oldestPos = 0; - for (PointerTracker t = queue.get(oldestPos); t != tracker; t = queue.get(oldestPos)) { - if (t.isModifier()) { - oldestPos++; - } else { - t.onUpEvent(t.getLastX(), t.getLastY(), eventTime); - t.setAlreadyProcessed(); - queue.remove(oldestPos); - } - } - } - - public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) { - for (PointerTracker t : mQueue) { - if (t == tracker) - continue; - t.onUpEvent(t.getLastX(), t.getLastY(), eventTime); - t.setAlreadyProcessed(); - } - mQueue.clear(); - if (tracker != null) - mQueue.add(tracker); - } - - public void remove(PointerTracker tracker) { - mQueue.remove(tracker); - } - - public boolean isInSlidingKeyInput() { - for (final PointerTracker tracker : mQueue) { - if (tracker.isInSlidingKeyInput()) - return true; - } - return false; - } - } - - public LatinKeyboardBaseView(Context context, AttributeSet attrs) { - this(context, attrs, R.attr.keyboardViewStyle); - } - - public LatinKeyboardBaseView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - TypedArray a = context.obtainStyledAttributes( - attrs, R.styleable.LatinKeyboardBaseView, defStyle, R.style.LatinKeyboardBaseView); - LayoutInflater inflate = - (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - int previewLayout = 0; - int keyTextSize = 0; - - int n = a.getIndexCount(); - - for (int i = 0; i < n; i++) { - int attr = a.getIndex(i); - - switch (attr) { - case R.styleable.LatinKeyboardBaseView_keyBackground: - mKeyBackground = a.getDrawable(attr); - break; - case R.styleable.LatinKeyboardBaseView_keyHysteresisDistance: - mKeyHysteresisDistance = a.getDimensionPixelOffset(attr, 0); - break; - case R.styleable.LatinKeyboardBaseView_verticalCorrection: - mVerticalCorrection = a.getDimensionPixelOffset(attr, 0); - break; - case R.styleable.LatinKeyboardBaseView_keyPreviewLayout: - previewLayout = a.getResourceId(attr, 0); - break; - case R.styleable.LatinKeyboardBaseView_keyPreviewOffset: - mPreviewOffset = a.getDimensionPixelOffset(attr, 0); - break; - case R.styleable.LatinKeyboardBaseView_keyPreviewHeight: - mPreviewHeight = a.getDimensionPixelSize(attr, 80); - break; - case R.styleable.LatinKeyboardBaseView_keyTextSize: - mKeyTextSize = a.getDimensionPixelSize(attr, 18); - break; - case R.styleable.LatinKeyboardBaseView_keyTextColor: - mKeyTextColor = a.getColor(attr, 0xFF000000); - break; - case R.styleable.LatinKeyboardBaseView_labelTextSize: - mLabelTextSize = a.getDimensionPixelSize(attr, 14); - break; - case R.styleable.LatinKeyboardBaseView_popupLayout: - mPopupLayout = a.getResourceId(attr, 0); - break; - case R.styleable.LatinKeyboardBaseView_shadowColor: - mShadowColor = a.getColor(attr, 0); - break; - case R.styleable.LatinKeyboardBaseView_shadowRadius: - mShadowRadius = a.getFloat(attr, 0f); - break; - // TODO: Use Theme (android.R.styleable.Theme_backgroundDimAmount) - case R.styleable.LatinKeyboardBaseView_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; - } - break; - case R.styleable.LatinKeyboardBaseView_symbolColorScheme: - mSymbolColorScheme = a.getInt(attr, 0); - break; - } - } - - final Resources res = getResources(); - - mPreviewPopup = new PopupWindow(context); - if (previewLayout != 0) { - mPreviewText = (TextView) inflate.inflate(previewLayout, null); - mPreviewTextSizeLarge = (int) res.getDimension(R.dimen.key_preview_text_size_large); - mPreviewPopup.setContentView(mPreviewText); - mPreviewPopup.setBackgroundDrawable(null); - } else { - mShowPreview = false; - } - mPreviewPopup.setTouchable(false); - mPreviewPopup.setAnimationStyle(R.style.KeyPreviewAnimation); - mDelayBeforePreview = res.getInteger(R.integer.config_delay_before_preview); - mDelayAfterPreview = res.getInteger(R.integer.config_delay_after_preview); - - mMiniKeyboardParent = this; - mMiniKeyboardPopup = new PopupWindow(context); - mMiniKeyboardPopup.setBackgroundDrawable(null); - mMiniKeyboardPopup.setAnimationStyle(R.style.MiniKeyboardAnimation); - - mPaint = new Paint(); - mPaint.setAntiAlias(true); - mPaint.setTextSize(keyTextSize); - mPaint.setTextAlign(Align.CENTER); - mPaint.setAlpha(255); - - mPadding = new Rect(0, 0, 0, 0); - mKeyBackground.getPadding(mPadding); - - mSwipeThreshold = (int) (500 * res.getDisplayMetrics().density); - // TODO: Refer frameworks/base/core/res/res/values/config.xml - mDisambiguateSwipe = res.getBoolean(R.bool.config_swipeDisambiguation); - mMiniKeyboardSlideAllowance = res.getDimension(R.dimen.mini_keyboard_slide_allowance); - - GestureDetector.SimpleOnGestureListener listener = - new GestureDetector.SimpleOnGestureListener() { - @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(); - return true; - } - } else if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) { - if (mDisambiguateSwipe && endingVelocityY >= velocityY / 4) { - swipeDown(); - return true; - } - } - return false; - } - }; - - final boolean ignoreMultitouch = true; - mGestureDetector = new GestureDetector(getContext(), listener, null, ignoreMultitouch); - mGestureDetector.setIsLongpressEnabled(false); - - mHasDistinctMultitouch = context.getPackageManager() - .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT); - mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); - } - - public void setOnKeyboardActionListener(OnKeyboardActionListener listener) { - mKeyboardActionListener = listener; - for (PointerTracker tracker : mPointerTrackers) { - tracker.setOnKeyboardActionListener(listener); - } - } - - /** - * Returns the {@link OnKeyboardActionListener} object. - * @return the listener attached to this keyboard - */ - protected OnKeyboardActionListener getOnKeyboardActionListener() { - return mKeyboardActionListener; - } - - /** - * Attaches a keyboard to this view. The keyboard can be switched at any time and the - * view will re-layout itself to accommodate the keyboard. - * @see Keyboard - * @see #getKeyboard() - * @param keyboard the keyboard to display in this view - */ - public void setKeyboard(Keyboard keyboard) { - if (mKeyboard != null) { - dismissKeyPreview(); - } - // Remove any pending messages, except dismissing preview - mHandler.cancelKeyTimers(); - mHandler.cancelPopupPreview(); - mKeyboard = keyboard; - 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); - } - requestLayout(); - // Hint to reallocate the buffer if the size changed - mKeyboardChanged = true; - invalidateAllKeys(); - computeProximityThreshold(keyboard); - mMiniKeyboardCache.clear(); - } - - /** - * Returns the current keyboard being displayed by this view. - * @return the currently attached keyboard - * @see #setKeyboard(Keyboard) - */ - public Keyboard getKeyboard() { - return mKeyboard; - } - - /** - * Return whether the device has distinct multi-touch panel. - * @return true if the device has distinct multi-touch panel. - */ - 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 - * @see #isPreviewEnabled() - */ - public void setPreviewEnabled(boolean previewEnabled) { - mShowPreview = previewEnabled; - } - - /** - * Returns the enabled state of the key feedback popup. - * @return whether or not the key feedback popup is enabled - * @see #setPreviewEnabled(boolean) - */ - public boolean isPreviewEnabled() { - return mShowPreview; - } - - public int getSymbolColorScheme() { - return mSymbolColorScheme; - } - - public void setPopupParent(View v) { - mMiniKeyboardParent = v; - } - - public void setPopupOffset(int x, int y) { - mPopupPreviewOffsetX = x; - mPopupPreviewOffsetY = y; - mPreviewPopup.dismiss(); - } - - /** - * When enabled, calls to {@link OnKeyboardActionListener#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 - */ - public void setProximityCorrectionEnabled(boolean enabled) { - mKeyDetector.setProximityCorrectionEnabled(enabled); - } - - /** - * Returns true if proximity correction is enabled. - */ - public boolean isProximityCorrectionEnabled() { - return mKeyDetector.isProximityCorrectionEnabled(); - } - - protected Locale getKeyboardLocale() { - if (mKeyboard instanceof LatinKeyboard) { - return ((LatinKeyboard)mKeyboard).getInputLocale(); - } else { - return getContext().getResources().getConfiguration().locale; - } - } - - protected CharSequence adjustCase(CharSequence label) { - if (mKeyboard.isShifted() && label != null && label.length() < 3 - && Character.isLowerCase(label.charAt(0))) { - return label.toString().toUpperCase(getKeyboardLocale()); - } - return label; - } - - @Override - public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // Round up a little - if (mKeyboard == null) { - setMeasuredDimension( - getPaddingLeft() + getPaddingRight(), getPaddingTop() + getPaddingBottom()); - } else { - int width = mKeyboard.getMinWidth() + getPaddingLeft() + getPaddingRight(); - if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) { - width = MeasureSpec.getSize(widthMeasureSpec); - } - setMeasuredDimension( - width, mKeyboard.getHeight() + getPaddingTop() + getPaddingBottom()); - } - } - - /** - * Compute the average distance between adjacent keys (horizontally and vertically) - * and square it to get the proximity threshold. We use a square here and in computing - * the touch distance from a key's center to avoid taking a square root. - * @param keyboard - */ - private void computeProximityThreshold(Keyboard keyboard) { - if (keyboard == null) return; - final Key[] keys = mKeys; - if (keys == null) return; - int length = keys.length; - int dimensionSum = 0; - for (int i = 0; i < length; i++) { - Key key = keys[i]; - dimensionSum += Math.min(key.width, key.height + mKeyboardVerticalGap) + key.gap; - } - if (dimensionSum < 0 || length == 0) return; - mKeyDetector.setProximityThreshold((int) (dimensionSum * 1.4f / length)); - } - - @Override - public void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - // Release the buffer, if any and it will be reallocated on the next draw - mBuffer = null; - } - - @Override - public void onDraw(Canvas canvas) { - super.onDraw(canvas); - if (mDrawPending || mBuffer == null || mKeyboardChanged) { - onBufferDraw(); - } - canvas.drawBitmap(mBuffer, 0, 0, null); - } - - private void onBufferDraw() { - if (mBuffer == null || mKeyboardChanged) { - if (mBuffer == null || mKeyboardChanged && - (mBuffer.getWidth() != getWidth() || mBuffer.getHeight() != getHeight())) { - // Make sure our bitmap is at least 1x1 - final int width = Math.max(1, getWidth()); - final int height = Math.max(1, getHeight()); - mBuffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - mCanvas = new Canvas(mBuffer); - } - invalidateAllKeys(); - mKeyboardChanged = false; - } - final Canvas canvas = mCanvas; - canvas.clipRect(mDirtyRect, Op.REPLACE); - - if (mKeyboard == null) return; - - final Paint paint = mPaint; - final Drawable keyBackground = mKeyBackground; - final Rect clipRegion = mClipRegion; - final Rect padding = mPadding; - final int kbdPaddingLeft = getPaddingLeft(); - final int kbdPaddingTop = getPaddingTop(); - final Key[] keys = mKeys; - final Key invalidKey = mInvalidatedKey; - - paint.setColor(mKeyTextColor); - boolean drawSingleKey = false; - if (invalidKey != null && canvas.getClipBounds(clipRegion)) { - // TODO we should use Rect.inset and Rect.contains here. - // Is clipRegion completely contained within the invalidated key? - if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left && - invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top && - invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right && - invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) { - drawSingleKey = true; - } - } - canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR); - final int keyCount = keys.length; - for (int i = 0; i < keyCount; i++) { - final Key key = keys[i]; - if (drawSingleKey && invalidKey != key) { - continue; - } - int[] drawableState = key.getCurrentDrawableState(); - keyBackground.setState(drawableState); - - // Switch the character to uppercase if shift is pressed - String label = key.label == null? null : adjustCase(key.label).toString(); - - final Rect bounds = keyBackground.getBounds(); - if (key.width != bounds.right || key.height != bounds.bottom) { - keyBackground.setBounds(0, 0, key.width, key.height); - } - canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop); - keyBackground.draw(canvas); - - boolean shouldDrawIcon = true; - 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); - } else { - labelSize = mKeyTextSize; - paint.setTypeface(mKeyTextStyle); - } - paint.setTextSize(labelSize); - - Integer labelHeightValue = mTextHeightCache.get(labelSize); - final int labelHeight; - if (labelHeightValue != null) { - labelHeight = labelHeightValue; - } else { - Rect textBounds = new Rect(); - paint.getTextBounds(KEY_LABEL_HEIGHT_REFERENCE_CHAR, 0, 1, textBounds); - labelHeight = textBounds.height(); - mTextHeightCache.put(labelSize, labelHeight); - } - - // Draw a drop shadow for the text - paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor); - final int centerX = (key.width + padding.left - padding.right) / 2; - final int centerY = (key.height + padding.top - padding.bottom) / 2; - final float baseline = centerY - + labelHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR; - canvas.drawText(label, centerX, baseline, paint); - // 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; - 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; - } - canvas.translate(drawableX, drawableY); - key.icon.setBounds(0, 0, drawableWidth, drawableHeight); - key.icon.draw(canvas); - canvas.translate(-drawableX, -drawableY); - } - canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop); - } - mInvalidatedKey = null; - // Overlay a dark rectangle to dim the keyboard - if (mMiniKeyboard != null) { - paint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24); - canvas.drawRect(0, 0, getWidth(), getHeight(), paint); - } - - if (DEBUG) { - if (mShowTouchPoints) { - for (PointerTracker tracker : mPointerTrackers) { - int startX = tracker.getStartX(); - int startY = tracker.getStartY(); - int lastX = tracker.getLastX(); - int lastY = tracker.getLastY(); - paint.setAlpha(128); - paint.setColor(0xFFFF0000); - canvas.drawCircle(startX, startY, 3, paint); - canvas.drawLine(startX, startY, lastX, lastY, paint); - paint.setColor(0xFF0000FF); - canvas.drawCircle(lastX, lastY, 3, paint); - paint.setColor(0xFF00FF00); - canvas.drawCircle((startX + lastX) / 2, (startY + lastY) / 2, 2, paint); - } - } - } - - mDrawPending = false; - mDirtyRect.setEmpty(); - } - - // TODO: clean up this method. - private void dismissKeyPreview() { - for (PointerTracker tracker : mPointerTrackers) - tracker.updateKey(NOT_A_KEY); - showPreview(NOT_A_KEY, null); - } - - public void showPreview(int keyIndex, PointerTracker tracker) { - int oldKeyIndex = mOldPreviewKeyIndex; - mOldPreviewKeyIndex = keyIndex; - final boolean isLanguageSwitchEnabled = (mKeyboard instanceof LatinKeyboard) - && ((LatinKeyboard)mKeyboard).isLanguageSwitchEnabled(); - // We should re-draw popup preview when 1) we need to hide the preview, 2) we will show - // the space key preview and 3) pointer moves off the space key to other letter key, we - // should hide the preview of the previous key. - final boolean hidePreviewOrShowSpaceKeyPreview = (tracker == null) - || tracker.isSpaceKey(keyIndex) || tracker.isSpaceKey(oldKeyIndex); - // 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) { - mHandler.cancelPopupPreview(); - mHandler.dismissPreview(mDelayAfterPreview); - } else if (tracker != null) { - mHandler.popupPreview(mDelayBeforePreview, keyIndex, tracker); - } - } - } - - private void showKey(final int keyIndex, PointerTracker tracker) { - Key key = tracker.getKey(keyIndex); - if (key == null) - 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 { - 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); - mPreviewText.setTypeface(Typeface.DEFAULT_BOLD); - } else { - mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge); - mPreviewText.setTypeface(mKeyTextStyle); - } - } - mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); - int popupWidth = Math.max(mPreviewText.getMeasuredWidth(), key.width - + mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight()); - final int popupHeight = mPreviewHeight; - LayoutParams lp = mPreviewText.getLayoutParams(); - if (lp != null) { - lp.width = popupWidth; - lp.height = popupHeight; - } - - int popupPreviewX = key.x - (popupWidth - key.width) / 2; - int popupPreviewY = key.y - popupHeight + mPreviewOffset; - - mHandler.cancelDismissPreview(); - if (mOffsetInWindow == null) { - mOffsetInWindow = new int[2]; - getLocationInWindow(mOffsetInWindow); - mOffsetInWindow[0] += mPopupPreviewOffsetX; // Offset may be zero - mOffsetInWindow[1] += mPopupPreviewOffsetY; // Offset may be zero - int[] windowLocation = new int[2]; - getLocationOnScreen(windowLocation); - mWindowY = windowLocation[1]; - } - // Set the preview background state - mPreviewText.getBackground().setState( - key.popupResId != 0 ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET); - popupPreviewX += mOffsetInWindow[0]; - popupPreviewY += mOffsetInWindow[1]; - - // If the popup cannot be shown above the key, put it on the side - 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); - } else { - popupPreviewX -= (int) (key.width * 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); - } - // Record popup preview position to display mini-keyboard later at the same positon - mPopupPreviewDisplayedY = popupPreviewY; - mPreviewText.setVisibility(VISIBLE); - } - - /** - * Requests a redraw of the entire keyboard. Calling {@link #invalidate} is not sufficient - * because the keyboard renders the keys to an off-screen buffer and an invalidate() only - * draws the cached buffer. - * @see #invalidateKey(Key) - */ - public void invalidateAllKeys() { - mDirtyRect.union(0, 0, getWidth(), getHeight()); - mDrawPending = true; - invalidate(); - } - - /** - * Invalidates a key so that it will be redrawn on the next repaint. Use this method if only - * one key is changing it's content. Any changes that affect the position or size of the key - * may not be honored. - * @param key key in the attached {@link Keyboard}. - * @see #invalidateAllKeys - */ - 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()); - onBufferDraw(); - invalidate(key.x + getPaddingLeft(), key.y + getPaddingTop(), - key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop()); - } - - private boolean openPopupIfRequired(int keyIndex, PointerTracker tracker) { - // Check if we have a popup layout specified first. - if (mPopupLayout == 0) { - return false; - } - - Key popupKey = tracker.getKey(keyIndex); - if (popupKey == null) - return false; - boolean result = onLongPress(popupKey); - if (result) { - dismissKeyPreview(); - mMiniKeyboardTrackerId = tracker.mPointerId; - // Mark this tracker "already processed" and remove it from the pointer queue - tracker.setAlreadyProcessed(); - mPointerQueue.remove(tracker); - } - return result; - } - - private View inflateMiniKeyboardContainer(Key popupKey) { - int popupKeyboardId = popupKey.popupResId; - 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); - dismissPopupKeyboard(); - } - - public void onText(CharSequence text) { - mKeyboardActionListener.onText(text); - dismissPopupKeyboard(); - } - - public void onCancel() { - mKeyboardActionListener.onCancel(); - dismissPopupKeyboard(); - } - - public void swipeLeft() { - } - public void swipeRight() { - } - public void swipeUp() { - } - public void swipeDown() { - } - public void onPress(int primaryCode) { - mKeyboardActionListener.onPress(primaryCode); - } - public void onRelease(int primaryCode) { - mKeyboardActionListener.onRelease(primaryCode); - } - }); - // Override default ProximityKeyDetector. - miniKeyboard.mKeyDetector = new MiniKeyboardKeyDetector(mMiniKeyboardSlideAllowance); - // 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); - } - miniKeyboard.setKeyboard(keyboard); - miniKeyboard.setPopupParent(this); - - container.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), - MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); - - return container; - } - - private static boolean isOneRowKeys(List<Key> keys) { - if (keys.size() == 0) return false; - final int edgeFlags = keys.get(0).edgeFlags; - // HACK: The first key of mini keyboard which was inflated from xml and has multiple rows, - // does not have both top and bottom edge flags on at the same time. On the other hand, - // the first key of mini keyboard that was created with popupCharacters must have both top - // and bottom edge flags on. - // When you want to use one row mini-keyboard from xml file, make sure that the row has - // both top and bottom edge flags set. - return (edgeFlags & Keyboard.EDGE_TOP) != 0 && (edgeFlags & Keyboard.EDGE_BOTTOM) != 0; - } - - /** - * Called when a key is long pressed. By default this will open any popup keyboard associated - * with this key through the attributes popupLayout and popupCharacters. - * @param popupKey the key that was long pressed - * @return true if the long press is handled, false otherwise. Subclasses should call the - * method on the base class if the subclass doesn't wish to handle the call. - */ - protected boolean onLongPress(Key popupKey) { - // TODO if popupKey.popupCharacters has only one letter, send it as key without opening - // mini keyboard. - - if (popupKey.popupResId == 0) - return false; - - View container = mMiniKeyboardCache.get(popupKey); - if (container == null) { - container = inflateMiniKeyboardContainer(popupKey); - mMiniKeyboardCache.put(popupKey, container); - } - mMiniKeyboard = (LatinKeyboardBaseView)container.findViewById(R.id.LatinKeyboardBaseView); - if (mWindowOffset == null) { - mWindowOffset = new int[2]; - getLocationInWindow(mWindowOffset); - } - - // Get width of a key in the mini popup keyboard = "miniKeyWidth". - // On the other hand, "popupKey.width" is width of the pressed key on the main keyboard. - // We adjust the position of mini popup keyboard with the edge key in it: - // a) When we have the leftmost key in popup keyboard directly above the pressed key - // Right edges of both keys should be aligned for consistent default selection - // b) When we have the rightmost key in popup keyboard directly above the pressed key - // Left edges of both keys should be aligned for consistent default selection - final List<Key> miniKeys = mMiniKeyboard.getKeyboard().getKeys(); - final int miniKeyWidth = miniKeys.size() > 0 ? miniKeys.get(0).width : 0; - - // HACK: Have the leftmost number in the popup characters right above the key - boolean isNumberAtLeftmost = - hasMultiplePopupChars(popupKey) && isNumberAtLeftmostPopupChar(popupKey); - int popupX = popupKey.x + mWindowOffset[0]; - popupX += getPaddingLeft(); - if (isNumberAtLeftmost) { - popupX += popupKey.width - miniKeyWidth; // adjustment for a) described above - popupX -= container.getPaddingLeft(); - } else { - popupX += miniKeyWidth; // adjustment for b) described above - popupX -= container.getMeasuredWidth(); - popupX += container.getPaddingRight(); - } - int popupY = popupKey.y + mWindowOffset[1]; - popupY += getPaddingTop(); - popupY -= container.getMeasuredHeight(); - popupY += container.getPaddingBottom(); - final int x = popupX; - final int y = mShowPreview && isOneRowKeys(miniKeys) ? mPopupPreviewDisplayedY : popupY; - - int adjustedX = x; - if (x < 0) { - adjustedX = 0; - } else if (x > (getMeasuredWidth() - container.getMeasuredWidth())) { - adjustedX = getMeasuredWidth() - container.getMeasuredWidth(); - } - mMiniKeyboardOriginX = adjustedX + container.getPaddingLeft() - mWindowOffset[0]; - mMiniKeyboardOriginY = y + container.getPaddingTop() - mWindowOffset[1]; - mMiniKeyboard.setPopupOffset(adjustedX, y); - mMiniKeyboard.setShifted(isShifted()); - // Mini keyboard needs no pop-up key preview displayed. - mMiniKeyboard.setPreviewEnabled(false); - mMiniKeyboardPopup.setContentView(container); - mMiniKeyboardPopup.setWidth(container.getMeasuredWidth()); - mMiniKeyboardPopup.setHeight(container.getMeasuredHeight()); - mMiniKeyboardPopup.showAtLocation(this, Gravity.NO_GRAVITY, x, y); - - // Inject down event on the key to mini keyboard. - long eventTime = SystemClock.uptimeMillis(); - mMiniKeyboardPopupTime = eventTime; - MotionEvent downEvent = generateMiniKeyboardMotionEvent(MotionEvent.ACTION_DOWN, popupKey.x - + popupKey.width / 2, popupKey.y + popupKey.height / 2, eventTime); - mMiniKeyboard.onTouchEvent(downEvent); - downEvent.recycle(); - - invalidateAllKeys(); - return true; - } - - private static boolean hasMultiplePopupChars(Key key) { - if (key.popupCharacters != null && key.popupCharacters.length() > 1) { - return true; - } - return false; - } - - private boolean shouldDrawIconFully(Key key) { - return isNumberAtEdgeOfPopupChars(key) || isLatinF1Key(key) - || LatinKeyboard.hasPuncOrSmileysPopup(key); - } - - private boolean shouldDrawLabelAndIcon(Key key) { - return isNumberAtEdgeOfPopupChars(key) || isNonMicLatinF1Key(key) - || LatinKeyboard.hasPuncOrSmileysPopup(key); - } - - private boolean isLatinF1Key(Key key) { - return (mKeyboard instanceof LatinKeyboard) && ((LatinKeyboard)mKeyboard).isF1Key(key); - } - - private boolean isNonMicLatinF1Key(Key key) { - return isLatinF1Key(key) && key.label != null; - } - - private static boolean isNumberAtEdgeOfPopupChars(Key key) { - return isNumberAtLeftmostPopupChar(key) || isNumberAtRightmostPopupChar(key); - } - - /* package */ static boolean isNumberAtLeftmostPopupChar(Key key) { - if (key.popupCharacters != null && key.popupCharacters.length() > 0 - && isAsciiDigit(key.popupCharacters.charAt(0))) { - return true; - } - return false; - } - - /* package */ static boolean isNumberAtRightmostPopupChar(Key key) { - if (key.popupCharacters != null && key.popupCharacters.length() > 0 - && isAsciiDigit(key.popupCharacters.charAt(key.popupCharacters.length() - 1))) { - return true; - } - return false; - } - - private static boolean isAsciiDigit(char c) { - return (c < 0x80) && Character.isDigit(c); - } - - private MotionEvent generateMiniKeyboardMotionEvent(int action, int x, int y, long eventTime) { - return MotionEvent.obtain(mMiniKeyboardPopupTime, eventTime, action, - x - mMiniKeyboardOriginX, y - mMiniKeyboardOriginY, 0); - } - - private PointerTracker getPointerTracker(final int id) { - final ArrayList<PointerTracker> pointers = mPointerTrackers; - final Key[] keys = mKeys; - final OnKeyboardActionListener 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); - if (listener != null) - tracker.setOnKeyboardActionListener(listener); - pointers.add(tracker); - } - - 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 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 && oldPointerCount > 1) { - return true; - } - - // Track the last few movements to look for spurious swipes. - mSwipeTracker.addMovement(me); - - // Gesture detector must be enabled only when mini-keyboard is not on the screen. - if (mMiniKeyboard == null - && mGestureDetector != null && mGestureDetector.onTouchEvent(me)) { - dismissKeyPreview(); - mHandler.cancelKeyTimers(); - return true; - } - - final long eventTime = me.getEventTime(); - final int index = me.getActionIndex(); - final int id = me.getPointerId(index); - final int x = (int)me.getX(index); - final int y = (int)me.getY(index); - - // Needs to be called after the gesture detector gets a turn, as it may have - // displayed the mini keyboard - if (mMiniKeyboard != null) { - final int miniKeyboardPointerIndex = me.findPointerIndex(mMiniKeyboardTrackerId); - if (miniKeyboardPointerIndex >= 0 && miniKeyboardPointerIndex < pointerCount) { - final int miniKeyboardX = (int)me.getX(miniKeyboardPointerIndex); - final int miniKeyboardY = (int)me.getY(miniKeyboardPointerIndex); - MotionEvent translated = generateMiniKeyboardMotionEvent(action, - miniKeyboardX, miniKeyboardY, eventTime); - mMiniKeyboard.onTouchEvent(translated); - translated.recycle(); - } - return true; - } - - if (mHandler.isInKeyRepeat()) { - // It will keep being in the key repeating mode while the key is being pressed. - if (action == MotionEvent.ACTION_MOVE) { - return true; - } - final PointerTracker tracker = getPointerTracker(id); - // Key repeating timer will be canceled if 2 or more keys are in action, and current - // event (UP or DOWN) is non-modifier key. - if (pointerCount > 1 && !tracker.isModifier()) { - mHandler.cancelKeyRepeatTimer(); - } - // Up event will pass through. - } - - // TODO: cleanup this code into a multi-touch to single-touch event converter class? - // Translate mutli-touch event to single-touch events on the device that has no distinct - // multi-touch panel. - if (!mHasDistinctMultitouch) { - // Use only main (id=0) pointer tracker. - PointerTracker tracker = getPointerTracker(0); - if (pointerCount == 1 && oldPointerCount == 2) { - // Multi-touch to single touch transition. - // Send a down event for the latest pointer. - tracker.onDownEvent(x, y, eventTime); - } else if (pointerCount == 2 && oldPointerCount == 1) { - // Single-touch to multi-touch transition. - // Send an up event for the last pointer. - tracker.onUpEvent(tracker.getLastX(), tracker.getLastY(), eventTime); - } else if (pointerCount == 1 && oldPointerCount == 1) { - tracker.onTouchEvent(action, x, y, eventTime); - } else { - Log.w(TAG, "Unknown touch panel behavior: pointer count is " + pointerCount - + " (old " + oldPointerCount + ")"); - } - return true; - } - - if (action == MotionEvent.ACTION_MOVE) { - for (int i = 0; i < pointerCount; i++) { - PointerTracker tracker = getPointerTracker(me.getPointerId(i)); - tracker.onMoveEvent((int)me.getX(i), (int)me.getY(i), eventTime); - } - } else { - PointerTracker tracker = getPointerTracker(id); - switch (action) { - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_POINTER_DOWN: - onDownEvent(tracker, x, y, eventTime); - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_POINTER_UP: - onUpEvent(tracker, x, y, eventTime); - break; - case MotionEvent.ACTION_CANCEL: - onCancelEvent(tracker, x, y, eventTime); - break; - } - } - - return true; - } - - private void onDownEvent(PointerTracker tracker, int x, int y, long eventTime) { - if (tracker.isOnModifierKey(x, y)) { - // Before processing a down event of modifier key, all pointers already being tracked - // should be released. - mPointerQueue.releaseAllPointersExcept(null, eventTime); - } - tracker.onDownEvent(x, y, eventTime); - mPointerQueue.add(tracker); - } - - private void onUpEvent(PointerTracker tracker, int x, int y, long eventTime) { - if (tracker.isModifier()) { - // Before processing an up event of modifier key, all pointers already being tracked - // should be released. - mPointerQueue.releaseAllPointersExcept(tracker, eventTime); - } else { - int index = mPointerQueue.lastIndexOf(tracker); - if (index >= 0) { - mPointerQueue.releaseAllPointersOlderThan(tracker, eventTime); - } else { - Log.w(TAG, "onUpEvent: corresponding down event not found for pointer " - + tracker.mPointerId); - } - } - tracker.onUpEvent(x, y, eventTime); - mPointerQueue.remove(tracker); - } - - private void onCancelEvent(PointerTracker tracker, int x, int y, long eventTime) { - tracker.onCancelEvent(x, y, eventTime); - mPointerQueue.remove(tracker); - } - - protected void swipeRight() { - mKeyboardActionListener.swipeRight(); - } - - protected void swipeLeft() { - mKeyboardActionListener.swipeLeft(); - } - - protected void swipeUp() { - mKeyboardActionListener.swipeUp(); - } - - protected void swipeDown() { - mKeyboardActionListener.swipeDown(); - } - - public void closing() { - mPreviewPopup.dismiss(); - mHandler.cancelAllMessages(); - - dismissPopupKeyboard(); - mBuffer = null; - mCanvas = null; - mMiniKeyboardCache.clear(); - } - - @Override - public void onDetachedFromWindow() { - super.onDetachedFromWindow(); - closing(); - } - - private void dismissPopupKeyboard() { - if (mMiniKeyboardPopup.isShowing()) { - mMiniKeyboardPopup.dismiss(); - mMiniKeyboard = null; - mMiniKeyboardOriginX = 0; - mMiniKeyboardOriginY = 0; - invalidateAllKeys(); - } - } - - public boolean handleBack() { - if (mMiniKeyboardPopup.isShowing()) { - dismissPopupKeyboard(); - return true; - } - return false; - } -} diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java deleted file mode 100644 index efe03a51f..000000000 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; -import android.os.Handler; -import android.os.Message; -import android.os.SystemClock; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.MotionEvent; - -import java.util.List; - -public class LatinKeyboardView extends LatinKeyboardBaseView { - - static final int KEYCODE_OPTIONS = -100; - static final int KEYCODE_OPTIONS_LONGPRESS = -101; - static final int KEYCODE_VOICE = -102; - static final int KEYCODE_F1 = -103; - static final int KEYCODE_NEXT_LANGUAGE = -104; - static final int KEYCODE_PREV_LANGUAGE = -105; - - private Keyboard mPhoneKeyboard; - - /** Whether we've started dropping move events because we found a big jump */ - private boolean mDroppingEvents; - /** - * Whether multi-touch disambiguation needs to be disabled if a real multi-touch event has - * occured - */ - private boolean mDisableDisambiguation; - /** The distance threshold at which we start treating the touch session as a multi-touch */ - private int mJumpThresholdSquare = Integer.MAX_VALUE; - /** The y coordinate of the last row */ - private int mLastRowY; - - public LatinKeyboardView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - public void setPhoneKeyboard(Keyboard phoneKeyboard) { - mPhoneKeyboard = phoneKeyboard; - } - - @Override - public void setPreviewEnabled(boolean previewEnabled) { - if (getKeyboard() == mPhoneKeyboard) { - // Phone keyboard never shows popup preview (except language switch). - super.setPreviewEnabled(false); - } else { - super.setPreviewEnabled(previewEnabled); - } - } - - @Override - public void setKeyboard(Keyboard newKeyboard) { - final Keyboard oldKeyboard = getKeyboard(); - if (oldKeyboard instanceof LatinKeyboard) { - // Reset old keyboard state before switching to new keyboard. - ((LatinKeyboard)oldKeyboard).keyReleased(); - } - super.setKeyboard(newKeyboard); - // One-seventh of the keyboard width seems like a reasonable threshold - mJumpThresholdSquare = newKeyboard.getMinWidth() / 7; - mJumpThresholdSquare *= mJumpThresholdSquare; - // Assuming there are 4 rows, this is the coordinate of the last row - mLastRowY = (newKeyboard.getHeight() * 3) / 4; - setKeyboardLocal(newKeyboard); - } - - @Override - protected boolean onLongPress(Key key) { - int primaryCode = key.codes[0]; - if (primaryCode == KEYCODE_OPTIONS) { - return invokeOnKey(KEYCODE_OPTIONS_LONGPRESS); - } else if (primaryCode == '0' && getKeyboard() == mPhoneKeyboard) { - // Long pressing on 0 in phone number keypad gives you a '+'. - return invokeOnKey('+'); - } else { - return super.onLongPress(key); - } - } - - private boolean invokeOnKey(int primaryCode) { - getOnKeyboardActionListener().onKey(primaryCode, null, - LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE, - LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE); - return true; - } - - @Override - protected CharSequence adjustCase(CharSequence label) { - Keyboard keyboard = getKeyboard(); - if (keyboard.isShifted() - && keyboard instanceof LatinKeyboard - && ((LatinKeyboard) keyboard).isAlphaKeyboard() - && !TextUtils.isEmpty(label) && label.length() < 3 - && Character.isLowerCase(label.charAt(0))) { - return label.toString().toUpperCase(getKeyboardLocale()); - } - return label; - } - - public boolean setShiftLocked(boolean shiftLocked) { - Keyboard keyboard = getKeyboard(); - if (keyboard instanceof LatinKeyboard) { - ((LatinKeyboard)keyboard).setShiftLocked(shiftLocked); - invalidateAllKeys(); - return true; - } - return false; - } - - /** - * This function checks to see if we need to handle any sudden jumps in the pointer location - * that could be due to a multi-touch being treated as a move by the firmware or hardware. - * Once a sudden jump is detected, all subsequent move events are discarded - * until an UP is received.<P> - * When a sudden jump is detected, an UP event is simulated at the last position and when - * the sudden moves subside, a DOWN event is simulated for the second key. - * @param me the motion event - * @return true if the event was consumed, so that it doesn't continue to be handled by - * KeyboardView. - */ - private boolean handleSuddenJump(MotionEvent me) { - final int action = me.getAction(); - final int x = (int) me.getX(); - final int y = (int) me.getY(); - boolean result = false; - - // Real multi-touch event? Stop looking for sudden jumps - if (me.getPointerCount() > 1) { - mDisableDisambiguation = true; - } - if (mDisableDisambiguation) { - // If UP, reset the multi-touch flag - if (action == MotionEvent.ACTION_UP) mDisableDisambiguation = false; - return false; - } - - switch (action) { - case MotionEvent.ACTION_DOWN: - // Reset the "session" - mDroppingEvents = false; - mDisableDisambiguation = false; - break; - case MotionEvent.ACTION_MOVE: - // Is this a big jump? - final int distanceSquare = (mLastX - x) * (mLastX - x) + (mLastY - y) * (mLastY - y); - // Check the distance and also if the move is not entirely within the bottom row - // If it's only in the bottom row, it might be an intentional slide gesture - // for language switching - if (distanceSquare > mJumpThresholdSquare - && (mLastY < mLastRowY || y < mLastRowY)) { - // If we're not yet dropping events, start dropping and send an UP event - if (!mDroppingEvents) { - mDroppingEvents = true; - // Send an up event - MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(), - MotionEvent.ACTION_UP, - mLastX, mLastY, me.getMetaState()); - super.onTouchEvent(translated); - translated.recycle(); - } - result = true; - } else if (mDroppingEvents) { - // If moves are small and we're already dropping events, continue dropping - result = true; - } - break; - case MotionEvent.ACTION_UP: - if (mDroppingEvents) { - // Send a down event first, as we dropped a bunch of sudden jumps and assume that - // the user is releasing the touch on the second key. - MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(), - MotionEvent.ACTION_DOWN, - x, y, me.getMetaState()); - super.onTouchEvent(translated); - translated.recycle(); - mDroppingEvents = false; - // Let the up event get processed as well, result = false - } - break; - } - // Track the previous coordinate - mLastX = x; - mLastY = y; - return result; - } - - @Override - public boolean onTouchEvent(MotionEvent me) { - LatinKeyboard keyboard = (LatinKeyboard) getKeyboard(); - if (DEBUG_LINE) { - mLastX = (int) me.getX(); - mLastY = (int) me.getY(); - invalidate(); - } - - // If there was a sudden jump, return without processing the actual motion event. - if (handleSuddenJump(me)) - return true; - - // Reset any bounding box controls in the keyboard - if (me.getAction() == MotionEvent.ACTION_DOWN) { - keyboard.keyReleased(); - } - - if (me.getAction() == MotionEvent.ACTION_UP) { - int languageDirection = keyboard.getLanguageChangeDirection(); - if (languageDirection != 0) { - getOnKeyboardActionListener().onKey( - languageDirection == 1 ? KEYCODE_NEXT_LANGUAGE : KEYCODE_PREV_LANGUAGE, - null, mLastX, mLastY); - me.setAction(MotionEvent.ACTION_CANCEL); - keyboard.keyReleased(); - return super.onTouchEvent(me); - } - } - - return super.onTouchEvent(me); - } - - /**************************** INSTRUMENTATION *******************************/ - - static final boolean DEBUG_AUTO_PLAY = false; - static final boolean DEBUG_LINE = false; - private static final int MSG_TOUCH_DOWN = 1; - private static final int MSG_TOUCH_UP = 2; - - Handler mHandler2; - - private String mStringToPlay; - private int mStringIndex; - private boolean mDownDelivered; - private Key[] mAsciiKeys = new Key[256]; - private boolean mPlaying; - private int mLastX; - private int mLastY; - private Paint mPaint; - - private void setKeyboardLocal(Keyboard k) { - if (DEBUG_AUTO_PLAY) { - findKeys(); - if (mHandler2 == null) { - mHandler2 = new Handler() { - @Override - public void handleMessage(Message msg) { - removeMessages(MSG_TOUCH_DOWN); - removeMessages(MSG_TOUCH_UP); - if (mPlaying == false) return; - - switch (msg.what) { - case MSG_TOUCH_DOWN: - if (mStringIndex >= mStringToPlay.length()) { - mPlaying = false; - return; - } - char c = mStringToPlay.charAt(mStringIndex); - while (c > 255 || mAsciiKeys[c] == null) { - mStringIndex++; - if (mStringIndex >= mStringToPlay.length()) { - mPlaying = false; - return; - } - c = mStringToPlay.charAt(mStringIndex); - } - int x = mAsciiKeys[c].x + 10; - int y = mAsciiKeys[c].y + 26; - MotionEvent me = MotionEvent.obtain(SystemClock.uptimeMillis(), - SystemClock.uptimeMillis(), - MotionEvent.ACTION_DOWN, x, y, 0); - LatinKeyboardView.this.dispatchTouchEvent(me); - me.recycle(); - sendEmptyMessageDelayed(MSG_TOUCH_UP, 500); // Deliver up in 500ms if nothing else - // happens - mDownDelivered = true; - break; - case MSG_TOUCH_UP: - char cUp = mStringToPlay.charAt(mStringIndex); - int x2 = mAsciiKeys[cUp].x + 10; - int y2 = mAsciiKeys[cUp].y + 26; - mStringIndex++; - - MotionEvent me2 = MotionEvent.obtain(SystemClock.uptimeMillis(), - SystemClock.uptimeMillis(), - MotionEvent.ACTION_UP, x2, y2, 0); - LatinKeyboardView.this.dispatchTouchEvent(me2); - me2.recycle(); - sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 500); // Deliver up in 500ms if nothing else - // happens - mDownDelivered = false; - break; - } - } - }; - - } - } - } - - private void findKeys() { - List<Key> keys = getKeyboard().getKeys(); - // Get the keys on this keyboard - for (int i = 0; i < keys.size(); i++) { - int code = keys.get(i).codes[0]; - if (code >= 0 && code <= 255) { - mAsciiKeys[code] = keys.get(i); - } - } - } - - public void startPlaying(String s) { - if (DEBUG_AUTO_PLAY) { - if (s == null) return; - mStringToPlay = s.toLowerCase(); - mPlaying = true; - mDownDelivered = false; - mStringIndex = 0; - mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 10); - } - } - - @Override - public void draw(Canvas c) { - LatinIMEUtil.GCUtils.getInstance().reset(); - boolean tryGC = true; - for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { - try { - super.draw(c); - tryGC = false; - } catch (OutOfMemoryError e) { - tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait("LatinKeyboardView", e); - } - } - if (DEBUG_AUTO_PLAY) { - if (mPlaying) { - mHandler2.removeMessages(MSG_TOUCH_DOWN); - mHandler2.removeMessages(MSG_TOUCH_UP); - if (mDownDelivered) { - mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_UP, 20); - } else { - mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 20); - } - } - } - if (DEBUG_LINE) { - if (mPaint == null) { - mPaint = new Paint(); - mPaint.setColor(0x80FFFFFF); - mPaint.setAntiAlias(false); - } - c.drawLine(mLastX, 0, mLastX, getHeight(), mPaint); - c.drawLine(0, mLastY, getWidth(), mLastY, mPaint); - } - } -} diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java deleted file mode 100644 index b23b4d7b8..000000000 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import com.android.inputmethod.latin.LatinKeyboardBaseView.OnKeyboardActionListener; -import com.android.inputmethod.latin.LatinKeyboardBaseView.UIHandler; - -import android.content.res.Resources; -import android.inputmethodservice.Keyboard; -import android.inputmethodservice.Keyboard.Key; -import android.util.Log; -import android.view.MotionEvent; - -public class PointerTracker { - private static final String TAG = "PointerTracker"; - private static final boolean DEBUG = false; - private static final boolean DEBUG_MOVE = false; - - public interface UIProxy { - public void invalidateKey(Key key); - public void showPreview(int keyIndex, PointerTracker tracker); - public boolean hasDistinctMultitouch(); - } - - public final int mPointerId; - - // Timing constants - private final int mDelayBeforeKeyRepeatStart; - private final int mLongPressKeyTimeout; - private final int mMultiTapKeyTimeout; - - // Miscellaneous constants - private static final int NOT_A_KEY = LatinKeyboardBaseView.NOT_A_KEY; - private static final int[] KEY_DELETE = { Keyboard.KEYCODE_DELETE }; - - private final UIProxy mProxy; - private final UIHandler mHandler; - private final KeyDetector mKeyDetector; - private OnKeyboardActionListener mListener; - private final KeyboardSwitcher mKeyboardSwitcher; - private final boolean mHasDistinctMultitouch; - - private Key[] mKeys; - private int mKeyHysteresisDistanceSquared = -1; - - private final KeyState mKeyState; - - // true if keyboard layout has been changed. - private boolean mKeyboardLayoutHasBeenChanged; - - // true if event is already translated to a key action (long press or mini-keyboard) - private boolean mKeyAlreadyProcessed; - - // true if this pointer is repeatable key - private boolean mIsRepeatableKey; - - // true if this pointer is in sliding key input - private boolean mIsInSlidingKeyInput; - - // For multi-tap - private int mLastSentIndex; - private int mTapCount; - private long mLastTapTime; - private boolean mInMultiTap; - private final StringBuilder mPreviewLabel = new StringBuilder(1); - - // pressed key - private int mPreviousKey = NOT_A_KEY; - - // This class keeps track of a key index and a position where this pointer is. - private static class KeyState { - private final KeyDetector mKeyDetector; - - // The position and time at which first down event occurred. - private int mStartX; - private int mStartY; - private long mDownTime; - - // The current key index where this pointer is. - private int mKeyIndex = NOT_A_KEY; - // The position where mKeyIndex was recognized for the first time. - private int mKeyX; - private int mKeyY; - - // Last pointer position. - private int mLastX; - private int mLastY; - - public KeyState(KeyDetector keyDetecor) { - mKeyDetector = keyDetecor; - } - - public int getKeyIndex() { - return mKeyIndex; - } - - public int getKeyX() { - return mKeyX; - } - - public int getKeyY() { - return mKeyY; - } - - public int getStartX() { - return mStartX; - } - - public int getStartY() { - return mStartY; - } - - public long getDownTime() { - return mDownTime; - } - - public int getLastX() { - return mLastX; - } - - public int getLastY() { - return mLastY; - } - - public int onDownKey(int x, int y, long eventTime) { - mStartX = x; - mStartY = y; - mDownTime = eventTime; - - return onMoveToNewKey(onMoveKeyInternal(x, y), x, y); - } - - private int onMoveKeyInternal(int x, int y) { - mLastX = x; - mLastY = y; - return mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); - } - - public int onMoveKey(int x, int y) { - return onMoveKeyInternal(x, y); - } - - public int onMoveToNewKey(int keyIndex, int x, int y) { - mKeyIndex = keyIndex; - mKeyX = x; - mKeyY = y; - return keyIndex; - } - - public int onUpKey(int x, int y) { - return onMoveKeyInternal(x, y); - } - } - - public PointerTracker(int id, UIHandler handler, KeyDetector keyDetector, UIProxy proxy, - Resources res) { - if (proxy == null || handler == null || keyDetector == null) - throw new NullPointerException(); - mPointerId = id; - mProxy = proxy; - mHandler = handler; - mKeyDetector = keyDetector; - mKeyboardSwitcher = KeyboardSwitcher.getInstance(); - mKeyState = new KeyState(keyDetector); - mHasDistinctMultitouch = proxy.hasDistinctMultitouch(); - mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start); - mLongPressKeyTimeout = res.getInteger(R.integer.config_long_press_key_timeout); - mMultiTapKeyTimeout = res.getInteger(R.integer.config_multi_tap_key_timeout); - resetMultiTap(); - } - - public void setOnKeyboardActionListener(OnKeyboardActionListener listener) { - mListener = listener; - } - - public void setKeyboard(Key[] keys, float keyHysteresisDistance) { - if (keys == null || keyHysteresisDistance < 0) - throw new IllegalArgumentException(); - mKeys = keys; - mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance); - // Mark that keyboard layout has been changed. - mKeyboardLayoutHasBeenChanged = true; - } - - public boolean isInSlidingKeyInput() { - return mIsInSlidingKeyInput; - } - - private boolean isValidKeyIndex(int keyIndex) { - return keyIndex >= 0 && keyIndex < mKeys.length; - } - - public Key getKey(int keyIndex) { - return isValidKeyIndex(keyIndex) ? mKeys[keyIndex] : null; - } - - private boolean isModifierInternal(int keyIndex) { - Key key = getKey(keyIndex); - if (key == null) - return false; - int primaryCode = key.codes[0]; - return primaryCode == Keyboard.KEYCODE_SHIFT - || primaryCode == Keyboard.KEYCODE_MODE_CHANGE; - } - - public boolean isModifier() { - return isModifierInternal(mKeyState.getKeyIndex()); - } - - public boolean isOnModifierKey(int x, int y) { - return isModifierInternal(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null)); - } - - public boolean isSpaceKey(int keyIndex) { - Key key = getKey(keyIndex); - return key != null && key.codes[0] == LatinIME.KEYCODE_SPACE; - } - - public void updateKey(int keyIndex) { - if (mKeyAlreadyProcessed) - return; - int oldKeyIndex = mPreviousKey; - mPreviousKey = keyIndex; - if (keyIndex != oldKeyIndex) { - if (isValidKeyIndex(oldKeyIndex)) { - // if new key index is not a key, old key was just released inside of the key. - final boolean inside = (keyIndex == NOT_A_KEY); - mKeys[oldKeyIndex].onReleased(inside); - mProxy.invalidateKey(mKeys[oldKeyIndex]); - } - if (isValidKeyIndex(keyIndex)) { - mKeys[keyIndex].onPressed(); - mProxy.invalidateKey(mKeys[keyIndex]); - } - } - } - - public void setAlreadyProcessed() { - mKeyAlreadyProcessed = true; - } - - public void onTouchEvent(int action, int x, int y, long eventTime) { - switch (action) { - case MotionEvent.ACTION_MOVE: - onMoveEvent(x, y, eventTime); - break; - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_POINTER_DOWN: - onDownEvent(x, y, eventTime); - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_POINTER_UP: - onUpEvent(x, y, eventTime); - break; - case MotionEvent.ACTION_CANCEL: - onCancelEvent(x, y, eventTime); - break; - } - } - - public void onDownEvent(int x, int y, long eventTime) { - if (DEBUG) - debugLog("onDownEvent:", x, y); - int keyIndex = mKeyState.onDownKey(x, y, eventTime); - mKeyboardLayoutHasBeenChanged = false; - mKeyAlreadyProcessed = false; - mIsRepeatableKey = false; - mIsInSlidingKeyInput = false; - checkMultiTap(eventTime, keyIndex); - if (mListener != null) { - if (isValidKeyIndex(keyIndex)) { - mListener.onPress(mKeys[keyIndex].codes[0]); - // This onPress call may have changed keyboard layout. Those cases are detected at - // {@link #setKeyboard}. In those cases, we should update keyIndex according to the - // new keyboard layout. - if (mKeyboardLayoutHasBeenChanged) { - mKeyboardLayoutHasBeenChanged = false; - keyIndex = mKeyState.onDownKey(x, y, eventTime); - } - } - } - if (isValidKeyIndex(keyIndex)) { - if (mKeys[keyIndex].repeatable) { - repeatKey(keyIndex); - mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this); - mIsRepeatableKey = true; - } - startLongPressTimer(keyIndex); - } - showKeyPreviewAndUpdateKey(keyIndex); - } - - public void onMoveEvent(int x, int y, long eventTime) { - if (DEBUG_MOVE) - debugLog("onMoveEvent:", x, y); - if (mKeyAlreadyProcessed) - return; - final KeyState keyState = mKeyState; - int keyIndex = keyState.onMoveKey(x, y); - final Key oldKey = getKey(keyState.getKeyIndex()); - if (isValidKeyIndex(keyIndex)) { - if (oldKey == null) { - // The pointer has been slid in to the new key, but the finger was not on any keys. - // In this case, we must call onPress() to notify that the new key is being pressed. - if (mListener != null) { - mListener.onPress(getKey(keyIndex).codes[0]); - // This onPress call may have changed keyboard layout. Those cases are detected - // at {@link #setKeyboard}. In those cases, we should update keyIndex according - // to the new keyboard layout. - if (mKeyboardLayoutHasBeenChanged) { - mKeyboardLayoutHasBeenChanged = false; - keyIndex = keyState.onMoveKey(x, y); - } - } - keyState.onMoveToNewKey(keyIndex, x, y); - startLongPressTimer(keyIndex); - } else if (!isMinorMoveBounce(x, y, keyIndex)) { - // The pointer has been slid in to the new key from the previous key, we must call - // onRelease() first to notify that the previous key has been released, then call - // onPress() to notify that the new key is being pressed. - mIsInSlidingKeyInput = true; - if (mListener != null) - mListener.onRelease(oldKey.codes[0]); - resetMultiTap(); - if (mListener != null) { - mListener.onPress(getKey(keyIndex).codes[0]); - // This onPress call may have changed keyboard layout. Those cases are detected - // at {@link #setKeyboard}. In those cases, we should update keyIndex according - // to the new keyboard layout. - if (mKeyboardLayoutHasBeenChanged) { - mKeyboardLayoutHasBeenChanged = false; - keyIndex = keyState.onMoveKey(x, y); - } - } - keyState.onMoveToNewKey(keyIndex, x, y); - startLongPressTimer(keyIndex); - } - } else { - if (oldKey != null && !isMinorMoveBounce(x, y, keyIndex)) { - // The pointer has been slid out from the previous key, we must call onRelease() to - // notify that the previous key has been released. - mIsInSlidingKeyInput = true; - if (mListener != null) - mListener.onRelease(oldKey.codes[0]); - resetMultiTap(); - keyState.onMoveToNewKey(keyIndex, x ,y); - mHandler.cancelLongPressTimer(); - } - } - showKeyPreviewAndUpdateKey(keyState.getKeyIndex()); - } - - public void onUpEvent(int x, int y, long eventTime) { - if (DEBUG) - debugLog("onUpEvent :", x, y); - mHandler.cancelKeyTimers(); - mHandler.cancelPopupPreview(); - showKeyPreviewAndUpdateKey(NOT_A_KEY); - mIsInSlidingKeyInput = false; - if (mKeyAlreadyProcessed) - return; - int keyIndex = mKeyState.onUpKey(x, y); - if (isMinorMoveBounce(x, y, keyIndex)) { - // Use previous fixed key index and coordinates. - keyIndex = mKeyState.getKeyIndex(); - x = mKeyState.getKeyX(); - y = mKeyState.getKeyY(); - } - if (!mIsRepeatableKey) { - detectAndSendKey(keyIndex, x, y, eventTime); - } - - if (isValidKeyIndex(keyIndex)) - mProxy.invalidateKey(mKeys[keyIndex]); - } - - public void onCancelEvent(int x, int y, long eventTime) { - if (DEBUG) - debugLog("onCancelEvt:", x, y); - mHandler.cancelKeyTimers(); - mHandler.cancelPopupPreview(); - showKeyPreviewAndUpdateKey(NOT_A_KEY); - mIsInSlidingKeyInput = false; - int keyIndex = mKeyState.getKeyIndex(); - if (isValidKeyIndex(keyIndex)) - mProxy.invalidateKey(mKeys[keyIndex]); - } - - public void repeatKey(int keyIndex) { - Key key = getKey(keyIndex); - if (key != null) { - // While key is repeating, because there is no need to handle multi-tap key, we can - // pass -1 as eventTime argument. - detectAndSendKey(keyIndex, key.x, key.y, -1); - } - } - - public int getLastX() { - return mKeyState.getLastX(); - } - - public int getLastY() { - return mKeyState.getLastY(); - } - - public long getDownTime() { - return mKeyState.getDownTime(); - } - - // These package scope methods are only for debugging purpose. - /* package */ int getStartX() { - return mKeyState.getStartX(); - } - - /* package */ int getStartY() { - return mKeyState.getStartY(); - } - - private boolean isMinorMoveBounce(int x, int y, int newKey) { - if (mKeys == null || mKeyHysteresisDistanceSquared < 0) - throw new IllegalStateException("keyboard and/or hysteresis not set"); - int curKey = mKeyState.getKeyIndex(); - if (newKey == curKey) { - return true; - } else if (isValidKeyIndex(curKey)) { - return getSquareDistanceToKeyEdge(x, y, mKeys[curKey]) < mKeyHysteresisDistanceSquared; - } else { - return false; - } - } - - private static int getSquareDistanceToKeyEdge(int x, int y, Key key) { - final int left = key.x; - final int right = key.x + key.width; - final int top = key.y; - final int bottom = key.y + key.height; - final int edgeX = x < left ? left : (x > right ? right : x); - final int edgeY = y < top ? top : (y > bottom ? bottom : y); - final int dx = x - edgeX; - final int dy = y - edgeY; - return dx * dx + dy * dy; - } - - private void showKeyPreviewAndUpdateKey(int keyIndex) { - updateKey(keyIndex); - // The modifier key, such as shift key, should not be shown as preview when multi-touch is - // supported. On the other hand, if multi-touch is not supported, the modifier key should - // be shown as preview. - if (mHasDistinctMultitouch && isModifier()) { - mProxy.showPreview(NOT_A_KEY, this); - } else { - mProxy.showPreview(keyIndex, this); - } - } - - private void startLongPressTimer(int keyIndex) { - if (mKeyboardSwitcher.isInMomentaryAutoModeSwitchState()) { - // We use longer timeout for sliding finger input started from the symbols mode key. - mHandler.startLongPressTimer(mLongPressKeyTimeout * 3, keyIndex, this); - } else { - mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this); - } - } - - private void detectAndSendKey(int index, int x, int y, long eventTime) { - final OnKeyboardActionListener listener = mListener; - final Key key = getKey(index); - - if (key == null) { - if (listener != null) - listener.onCancel(); - } else { - if (key.text != null) { - if (listener != null) { - listener.onText(key.text); - listener.onRelease(0); // dummy key code - } - } else { - int code = key.codes[0]; - int[] codes = mKeyDetector.newCodeArray(); - mKeyDetector.getKeyIndexAndNearbyCodes(x, y, codes); - // Multi-tap - if (mInMultiTap) { - if (mTapCount != -1) { - mListener.onKey(Keyboard.KEYCODE_DELETE, KEY_DELETE, x, y); - } else { - mTapCount = 0; - } - code = key.codes[mTapCount]; - } - /* - * Swap the first and second values in the codes array if the primary code is not - * the first value but the second value in the array. This happens when key - * debouncing is in effect. - */ - if (codes.length >= 2 && codes[0] != code && codes[1] == code) { - codes[1] = codes[0]; - codes[0] = code; - } - if (listener != null) { - listener.onKey(code, codes, x, y); - listener.onRelease(code); - } - } - mLastSentIndex = index; - mLastTapTime = eventTime; - } - } - - /** - * Handle multi-tap keys by producing the key label for the current multi-tap state. - */ - public CharSequence getPreviewText(Key key) { - if (mInMultiTap) { - // Multi-tap - mPreviewLabel.setLength(0); - mPreviewLabel.append((char) key.codes[mTapCount < 0 ? 0 : mTapCount]); - return mPreviewLabel; - } else { - return key.label; - } - } - - private void resetMultiTap() { - mLastSentIndex = NOT_A_KEY; - mTapCount = 0; - mLastTapTime = -1; - mInMultiTap = false; - } - - private void checkMultiTap(long eventTime, int keyIndex) { - Key key = getKey(keyIndex); - if (key == null) - return; - - final boolean isMultiTap = - (eventTime < mLastTapTime + mMultiTapKeyTimeout && keyIndex == mLastSentIndex); - if (key.codes.length > 1) { - mInMultiTap = true; - if (isMultiTap) { - mTapCount = (mTapCount + 1) % key.codes.length; - return; - } else { - mTapCount = -1; - return; - } - } - if (!isMultiTap) { - resetMultiTap(); - } - } - - private void debugLog(String title, int x, int y) { - int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); - Key key = getKey(keyIndex); - final String code; - if (key == null) { - code = "----"; - } else { - int primaryCode = key.codes[0]; - code = String.format((primaryCode < 0) ? "%4d" : "0x%02x", primaryCode); - } - Log.d(TAG, String.format("%s%s[%d] %3d,%3d %3d(%s) %s", title, - (mKeyAlreadyProcessed ? "-" : " "), mPointerId, x, y, keyIndex, code, - (isModifier() ? "modifier" : ""))); - } -} diff --git a/java/src/com/android/inputmethod/latin/ModifierKeyState.java b/java/src/com/android/inputmethod/latin/PrivateBinaryDictionaryGetter.java index 097e87abe..eb740e111 100644 --- a/java/src/com/android/inputmethod/latin/ModifierKeyState.java +++ b/java/src/com/android/inputmethod/latin/PrivateBinaryDictionaryGetter.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Google Inc. + * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -16,27 +16,14 @@ 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; +import android.content.Context; - private int mState = RELEASING; +import java.util.List; +import java.util.Locale; - public void onPress() { - mState = PRESSING; - } - - public void onRelease() { - mState = RELEASING; - } - - public void onOtherKeyPressed() { - if (mState == PRESSING) - mState = MOMENTARY; - } - - public boolean isMomentary() { - return mState == MOMENTARY; +class PrivateBinaryDictionaryGetter { + private PrivateBinaryDictionaryGetter() {} + public static List<AssetFileAddress> getDictionaryFiles(Locale locale, Context context) { + return null; } } diff --git a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java deleted file mode 100644 index 325ce674c..000000000 --- a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import android.inputmethodservice.Keyboard.Key; - -import java.util.Arrays; - -class ProximityKeyDetector extends KeyDetector { - private static final int MAX_NEARBY_KEYS = 12; - - // working area - private int[] mDistances = new int[MAX_NEARBY_KEYS]; - - @Override - protected int getMaxNearbyKeys() { - return MAX_NEARBY_KEYS; - } - - @Override - public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) { - final Key[] keys = getKeys(); - final int touchX = getTouchX(x); - final int touchY = getTouchY(y); - int primaryIndex = LatinKeyboardBaseView.NOT_A_KEY; - int closestKey = LatinKeyboardBaseView.NOT_A_KEY; - int closestKeyDist = mProximityThresholdSquare + 1; - int[] distances = mDistances; - Arrays.fill(distances, Integer.MAX_VALUE); - int [] nearestKeyIndices = mKeyboard.getNearestKeys(touchX, touchY); - final int keyCount = nearestKeyIndices.length; - for (int i = 0; i < keyCount; i++) { - final Key key = keys[nearestKeyIndices[i]]; - int dist = 0; - boolean isInside = key.isInside(touchX, touchY); - if (isInside) { - primaryIndex = nearestKeyIndices[i]; - } - - if (((mProximityCorrectOn - && (dist = key.squaredDistanceFrom(touchX, touchY)) < mProximityThresholdSquare) - || isInside) - && key.codes[0] > 32) { - // Find insertion point - final int nCodes = key.codes.length; - if (dist < closestKeyDist) { - closestKeyDist = dist; - closestKey = nearestKeyIndices[i]; - } - - if (allKeys == null) continue; - - for (int j = 0; j < distances.length; j++) { - if (distances[j] > dist) { - // Make space for nCodes codes - System.arraycopy(distances, j, distances, j + nCodes, - distances.length - j - nCodes); - System.arraycopy(allKeys, j, allKeys, j + nCodes, - allKeys.length - j - nCodes); - System.arraycopy(key.codes, 0, allKeys, j, nCodes); - Arrays.fill(distances, j, j + nCodes, dist); - break; - } - } - } - } - if (primaryIndex == LatinKeyboardBaseView.NOT_A_KEY) { - primaryIndex = closestKey; - } - return primaryIndex; - } -} diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java new file mode 100644 index 000000000..6c515c845 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/Settings.java @@ -0,0 +1,603 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import com.android.inputmethod.compat.CompatUtils; +import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; +import com.android.inputmethod.compat.InputMethodServiceCompatWrapper; +import com.android.inputmethod.deprecated.VoiceProxy; +import com.android.inputmethod.compat.VibratorCompatWrapper; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.backup.BackupManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.ListPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceActivity; +import android.preference.PreferenceGroup; +import android.preference.PreferenceScreen; +import android.speech.SpeechRecognizer; +import android.text.AutoText; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.util.Log; +import android.widget.TextView; + +import java.util.Arrays; +import java.util.Locale; + +public class Settings extends PreferenceActivity + implements SharedPreferences.OnSharedPreferenceChangeListener, + DialogInterface.OnDismissListener, OnPreferenceClickListener { + private static final String TAG = "Settings"; + + public static final String PREF_GENERAL_SETTINGS_KEY = "general_settings"; + public static final String PREF_VIBRATE_ON = "vibrate_on"; + public static final String PREF_SOUND_ON = "sound_on"; + public static final String PREF_KEY_PREVIEW_POPUP_ON = "popup_on"; + public static final String PREF_RECORRECTION_ENABLED = "recorrection_enabled"; + public static final String PREF_AUTO_CAP = "auto_cap"; + public static final String PREF_SETTINGS_KEY = "settings_key"; + public static final String PREF_VOICE_SETTINGS_KEY = "voice_mode"; + public static final String PREF_INPUT_LANGUAGE = "input_language"; + public static final String PREF_SELECTED_LANGUAGES = "selected_languages"; + public static final String PREF_SUBTYPES = "subtype_settings"; + + public static final String PREF_CONFIGURE_DICTIONARIES_KEY = "configure_dictionaries_key"; + public static final String PREF_CORRECTION_SETTINGS_KEY = "correction_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_DEBUG_SETTINGS = "debug_settings"; + + public static final String PREF_NGRAM_SETTINGS_KEY = "ngram_settings"; + public static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion"; + public static final String PREF_BIGRAM_PREDICTIONS = "bigram_prediction"; + + public static final String PREF_MISC_SETTINGS_KEY = "misc_settings"; + + public static final String PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY = + "pref_key_preview_popup_dismiss_delay"; + public static final String PREF_KEY_USE_CONTACTS_DICT = + "pref_key_use_contacts_dict"; + + public static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode"; + + // Dialog ids + private static final int VOICE_INPUT_CONFIRM_DIALOG = 0; + + public static class Values { + // From resources: + public final boolean mSwipeDownDismissKeyboardEnabled; + public final int mDelayBeforeFadeoutLanguageOnSpacebar; + public final int mDelayUpdateSuggestions; + public final int mDelayUpdateOldSuggestions; + public final int mDelayUpdateShiftState; + public final int mDurationOfFadeoutLanguageOnSpacebar; + public final float mFinalFadeoutFactorOfLanguageOnSpacebar; + public final long mDoubleSpacesTurnIntoPeriodTimeout; + public final String mWordSeparators; + public final String mMagicSpaceStrippers; + public final String mMagicSpaceSwappers; + public final String mSuggestPuncs; + public final SuggestedWords mSuggestPuncList; + + // From preferences: + public final boolean mSoundOn; // Sound setting private to Latin IME (see mSilentModeOn) + public final boolean mVibrateOn; + public final boolean mKeyPreviewPopupOn; + public final int mKeyPreviewPopupDismissDelay; + public final boolean mAutoCap; + public final boolean mQuickFixes; + public final boolean mAutoCorrectEnabled; + public final double mAutoCorrectionThreshold; + // Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary + public final boolean mBigramSuggestionEnabled; + // Prediction: use bigrams to predict the next word when there is no input for it yet + public final boolean mBigramPredictionEnabled; + public final boolean mUseContactsDict; + + public Values(final SharedPreferences prefs, final Context context, + final String localeStr) { + final Resources res = context.getResources(); + final Locale savedLocale; + if (null != localeStr) { + final Locale keyboardLocale = Utils.constructLocaleFromString(localeStr); + savedLocale = Utils.setSystemLocale(res, keyboardLocale); + } else { + savedLocale = null; + } + + // Get the resources + mSwipeDownDismissKeyboardEnabled = res.getBoolean( + R.bool.config_swipe_down_dismiss_keyboard_enabled); + mDelayBeforeFadeoutLanguageOnSpacebar = res.getInteger( + R.integer.config_delay_before_fadeout_language_on_spacebar); + mDelayUpdateSuggestions = + res.getInteger(R.integer.config_delay_update_suggestions); + mDelayUpdateOldSuggestions = res.getInteger( + R.integer.config_delay_update_old_suggestions); + mDelayUpdateShiftState = + res.getInteger(R.integer.config_delay_update_shift_state); + mDurationOfFadeoutLanguageOnSpacebar = res.getInteger( + R.integer.config_duration_of_fadeout_language_on_spacebar); + mFinalFadeoutFactorOfLanguageOnSpacebar = res.getInteger( + R.integer.config_final_fadeout_percentage_of_language_on_spacebar) / 100.0f; + mDoubleSpacesTurnIntoPeriodTimeout = res.getInteger( + R.integer.config_double_spaces_turn_into_period_timeout); + mMagicSpaceStrippers = res.getString(R.string.magic_space_stripping_symbols); + mMagicSpaceSwappers = res.getString(R.string.magic_space_swapping_symbols); + String wordSeparators = mMagicSpaceStrippers + mMagicSpaceSwappers + + res.getString(R.string.magic_space_promoting_symbols); + final String notWordSeparators = res.getString(R.string.non_word_separator_symbols); + for (int i = notWordSeparators.length() - 1; i >= 0; --i) { + wordSeparators = wordSeparators.replace(notWordSeparators.substring(i, i + 1), ""); + } + mWordSeparators = wordSeparators; + mSuggestPuncs = res.getString(R.string.suggested_punctuations); + // TODO: it would be nice not to recreate this each time we change the configuration + mSuggestPuncList = createSuggestPuncList(mSuggestPuncs); + + // Get the settings preferences + final boolean hasVibrator = VibratorCompatWrapper.getInstance(context).hasVibrator(); + mVibrateOn = hasVibrator && prefs.getBoolean(Settings.PREF_VIBRATE_ON, false); + mSoundOn = prefs.getBoolean(Settings.PREF_SOUND_ON, + res.getBoolean(R.bool.config_default_sound_enabled)); + + mKeyPreviewPopupOn = isKeyPreviewPopupEnabled(prefs, res); + mKeyPreviewPopupDismissDelay = getKeyPreviewPopupDismissDelay(prefs, res); + mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, true); + mQuickFixes = isQuickFixesEnabled(prefs, res); + + mAutoCorrectEnabled = isAutoCorrectEnabled(prefs, res); + mBigramSuggestionEnabled = mAutoCorrectEnabled + && isBigramSuggestionEnabled(prefs, res, mAutoCorrectEnabled); + mBigramPredictionEnabled = mBigramSuggestionEnabled + && isBigramPredictionEnabled(prefs, res); + + mAutoCorrectionThreshold = getAutoCorrectionThreshold(prefs, res); + + mUseContactsDict = prefs.getBoolean(Settings.PREF_KEY_USE_CONTACTS_DICT, true); + + Utils.setSystemLocale(res, savedLocale); + } + + public boolean isSuggestedPunctuation(int code) { + return mSuggestPuncs.contains(String.valueOf((char)code)); + } + + public boolean isWordSeparator(int code) { + return mWordSeparators.contains(String.valueOf((char)code)); + } + + public boolean isMagicSpaceStripper(int code) { + return mMagicSpaceStrippers.contains(String.valueOf((char)code)); + } + + public boolean isMagicSpaceSwapper(int code) { + return mMagicSpaceSwappers.contains(String.valueOf((char)code)); + } + + // Helper methods + private static boolean isQuickFixesEnabled(SharedPreferences sp, Resources resources) { + final boolean showQuickFixesOption = resources.getBoolean( + R.bool.config_enable_quick_fixes_option); + if (!showQuickFixesOption) { + return isAutoCorrectEnabled(sp, resources); + } + return sp.getBoolean(Settings.PREF_QUICK_FIXES, resources.getBoolean( + R.bool.config_default_quick_fixes)); + } + + private static boolean isAutoCorrectEnabled(SharedPreferences sp, Resources resources) { + final String currentAutoCorrectionSetting = sp.getString( + Settings.PREF_AUTO_CORRECTION_THRESHOLD, + resources.getString(R.string.auto_correction_threshold_mode_index_modest)); + final String autoCorrectionOff = resources.getString( + R.string.auto_correction_threshold_mode_index_off); + return !currentAutoCorrectionSetting.equals(autoCorrectionOff); + } + + // Public to access from KeyboardSwitcher. Should it have access to some + // process-global instance instead? + public static boolean isKeyPreviewPopupEnabled(SharedPreferences sp, Resources resources) { + final boolean showPopupOption = resources.getBoolean( + R.bool.config_enable_show_popup_on_keypress_option); + if (!showPopupOption) return resources.getBoolean(R.bool.config_default_popup_preview); + return sp.getBoolean(Settings.PREF_KEY_PREVIEW_POPUP_ON, + resources.getBoolean(R.bool.config_default_popup_preview)); + } + + // Likewise + public static int getKeyPreviewPopupDismissDelay(SharedPreferences sp, + Resources resources) { + return Integer.parseInt(sp.getString(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY, + Integer.toString(resources.getInteger(R.integer.config_delay_after_preview)))); + } + + private static boolean isBigramSuggestionEnabled(SharedPreferences sp, Resources resources, + boolean autoCorrectEnabled) { + final boolean showBigramSuggestionsOption = resources.getBoolean( + R.bool.config_enable_bigram_suggestions_option); + if (!showBigramSuggestionsOption) { + return autoCorrectEnabled; + } + return sp.getBoolean(Settings.PREF_BIGRAM_SUGGESTIONS, resources.getBoolean( + R.bool.config_default_bigram_suggestions)); + } + + private static boolean isBigramPredictionEnabled(SharedPreferences sp, + Resources resources) { + return sp.getBoolean(Settings.PREF_BIGRAM_PREDICTIONS, resources.getBoolean( + R.bool.config_default_bigram_prediction)); + } + + private static double getAutoCorrectionThreshold(SharedPreferences sp, + Resources resources) { + final String currentAutoCorrectionSetting = sp.getString( + Settings.PREF_AUTO_CORRECTION_THRESHOLD, + resources.getString(R.string.auto_correction_threshold_mode_index_modest)); + final String[] autoCorrectionThresholdValues = resources.getStringArray( + R.array.auto_correction_threshold_values); + // When autoCorrectionThreshold is greater than 1.0, it's like auto correction is off. + double autoCorrectionThreshold = Double.MAX_VALUE; + try { + final int arrayIndex = Integer.valueOf(currentAutoCorrectionSetting); + if (arrayIndex >= 0 && arrayIndex < autoCorrectionThresholdValues.length) { + autoCorrectionThreshold = Double.parseDouble( + autoCorrectionThresholdValues[arrayIndex]); + } + } 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)); + } + return autoCorrectionThreshold; + } + + private static SuggestedWords createSuggestPuncList(final String puncs) { + SuggestedWords.Builder builder = new SuggestedWords.Builder(); + if (puncs != null) { + for (int i = 0; i < puncs.length(); i++) { + builder.addWord(puncs.subSequence(i, i + 1)); + } + } + return builder.build(); + } + } + + private PreferenceScreen mInputLanguageSelection; + private CheckBoxPreference mQuickFixes; + private ListPreference mVoicePreference; + private ListPreference mSettingsKeyPreference; + private ListPreference mShowCorrectionSuggestionsPreference; + private ListPreference mAutoCorrectionThreshold; + private ListPreference mKeyPreviewPopupDismissDelay; + // Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary + private CheckBoxPreference mBigramSuggestion; + // Prediction: use bigrams to predict the next word when there is no input for it yet + private CheckBoxPreference mBigramPrediction; + private Preference mDebugSettingsPreference; + private boolean mVoiceOn; + + private AlertDialog mDialog; + + private VoiceProxy.VoiceLoggerWrapper mVoiceLogger; + + 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)); + mBigramPrediction.setEnabled(!currentSetting.equals(autoCorrectionOff)); + } + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + final Resources res = getResources(); + + addPreferencesFromResource(R.xml.prefs); + mInputLanguageSelection = (PreferenceScreen) findPreference(PREF_SUBTYPES); + mInputLanguageSelection.setOnPreferenceClickListener(this); + mQuickFixes = (CheckBoxPreference) findPreference(PREF_QUICK_FIXES); + mVoicePreference = (ListPreference) findPreference(PREF_VOICE_SETTINGS_KEY); + mSettingsKeyPreference = (ListPreference) findPreference(PREF_SETTINGS_KEY); + mShowCorrectionSuggestionsPreference = + (ListPreference) findPreference(PREF_SHOW_SUGGESTIONS_SETTING); + SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); + prefs.registerOnSharedPreferenceChangeListener(this); + + mVoiceModeOff = getString(R.string.voice_mode_off); + mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff) + .equals(mVoiceModeOff)); + mVoiceLogger = VoiceProxy.VoiceLoggerWrapper.getInstance(this); + + mAutoCorrectionThreshold = (ListPreference) findPreference(PREF_AUTO_CORRECTION_THRESHOLD); + mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTIONS); + mBigramPrediction = (CheckBoxPreference) findPreference(PREF_BIGRAM_PREDICTIONS); + mDebugSettingsPreference = findPreference(PREF_DEBUG_SETTINGS); + if (mDebugSettingsPreference != null) { + final Intent debugSettingsIntent = new Intent(Intent.ACTION_MAIN); + debugSettingsIntent.setClassName(getPackageName(), DebugSettings.class.getName()); + mDebugSettingsPreference.setIntent(debugSettingsIntent); + } + + ensureConsistencyOfAutoCorrectionSettings(); + + final PreferenceGroup generalSettings = + (PreferenceGroup) findPreference(PREF_GENERAL_SETTINGS_KEY); + final PreferenceGroup textCorrectionGroup = + (PreferenceGroup) findPreference(PREF_CORRECTION_SETTINGS_KEY); + + final boolean showSettingsKeyOption = res.getBoolean( + R.bool.config_enable_show_settings_key_option); + if (!showSettingsKeyOption) { + generalSettings.removePreference(mSettingsKeyPreference); + } + + final boolean showVoiceKeyOption = res.getBoolean( + R.bool.config_enable_show_voice_key_option); + if (!showVoiceKeyOption) { + generalSettings.removePreference(mVoicePreference); + } + + if (!VibratorCompatWrapper.getInstance(this).hasVibrator()) { + generalSettings.removePreference(findPreference(PREF_VIBRATE_ON)); + } + + if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED) { + generalSettings.removePreference(findPreference(PREF_SUBTYPES)); + } + + final boolean showPopupOption = res.getBoolean( + R.bool.config_enable_show_popup_on_keypress_option); + if (!showPopupOption) { + generalSettings.removePreference(findPreference(PREF_KEY_PREVIEW_POPUP_ON)); + } + + final boolean showRecorrectionOption = res.getBoolean( + R.bool.config_enable_show_recorrection_option); + if (!showRecorrectionOption) { + generalSettings.removePreference(findPreference(PREF_RECORRECTION_ENABLED)); + } + + final boolean showQuickFixesOption = res.getBoolean( + R.bool.config_enable_quick_fixes_option); + if (!showQuickFixesOption) { + textCorrectionGroup.removePreference(findPreference(PREF_QUICK_FIXES)); + } + + final boolean showBigramSuggestionsOption = res.getBoolean( + R.bool.config_enable_bigram_suggestions_option); + if (!showBigramSuggestionsOption) { + textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_SUGGESTIONS)); + textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_PREDICTIONS)); + } + + final boolean showUsabilityModeStudyOption = res.getBoolean( + R.bool.config_enable_usability_study_mode_option); + if (!showUsabilityModeStudyOption) { + getPreferenceScreen().removePreference(findPreference(PREF_USABILITY_STUDY_MODE)); + } + + mKeyPreviewPopupDismissDelay = + (ListPreference)findPreference(PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY); + final String[] entries = new String[] { + res.getString(R.string.key_preview_popup_dismiss_no_delay), + res.getString(R.string.key_preview_popup_dismiss_default_delay), + }; + final String popupDismissDelayDefaultValue = Integer.toString(res.getInteger( + R.integer.config_delay_after_preview)); + mKeyPreviewPopupDismissDelay.setEntries(entries); + mKeyPreviewPopupDismissDelay.setEntryValues( + new String[] { "0", popupDismissDelayDefaultValue }); + if (null == mKeyPreviewPopupDismissDelay.getValue()) { + mKeyPreviewPopupDismissDelay.setValue(popupDismissDelayDefaultValue); + } + mKeyPreviewPopupDismissDelay.setEnabled( + Settings.Values.isKeyPreviewPopupEnabled(prefs, res)); + + final PreferenceScreen dictionaryLink = + (PreferenceScreen) findPreference(PREF_CONFIGURE_DICTIONARIES_KEY); + final Intent intent = dictionaryLink.getIntent(); + + final int number = getPackageManager().queryIntentActivities(intent, 0).size(); + if (0 >= number) { + textCorrectionGroup.removePreference(dictionaryLink); + } + } + + @Override + protected void onResume() { + super.onResume(); + int autoTextSize = AutoText.getSize(getListView()); + if (autoTextSize < 1) { + ((PreferenceGroup) findPreference(PREF_CORRECTION_SETTINGS_KEY)) + .removePreference(mQuickFixes); + } + if (!VoiceProxy.VOICE_INSTALLED + || !SpeechRecognizer.isRecognitionAvailable(this)) { + getPreferenceScreen().removePreference(mVoicePreference); + } else { + updateVoiceModeSummary(); + } + updateSettingsKeySummary(); + updateShowCorrectionSuggestionsSummary(); + updateKeyPreviewPopupDelaySummary(); + } + + @Override + protected void onDestroy() { + getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( + this); + super.onDestroy(); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + (new BackupManager(this)).dataChanged(); + // If turning on voice input, show dialog + if (key.equals(PREF_VOICE_SETTINGS_KEY) && !mVoiceOn) { + if (!prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff) + .equals(mVoiceModeOff)) { + showVoiceConfirmation(); + } + } else if (key.equals(PREF_KEY_PREVIEW_POPUP_ON)) { + final ListPreference popupDismissDelay = + (ListPreference)findPreference(PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY); + if (null != popupDismissDelay) { + popupDismissDelay.setEnabled(prefs.getBoolean(PREF_KEY_PREVIEW_POPUP_ON, true)); + } + } + ensureConsistencyOfAutoCorrectionSettings(); + mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff) + .equals(mVoiceModeOff)); + updateVoiceModeSummary(); + updateSettingsKeySummary(); + updateShowCorrectionSuggestionsSummary(); + updateKeyPreviewPopupDelaySummary(); + } + + @Override + public boolean onPreferenceClick(Preference pref) { + if (pref == mInputLanguageSelection) { + startActivity(CompatUtils.getInputLanguageSelectionIntent( + Utils.getInputMethodId(InputMethodManagerCompatWrapper.getInstance(this), + getApplicationInfo().packageName), 0)); + return true; + } + return false; + } + + private void updateShowCorrectionSuggestionsSummary() { + mShowCorrectionSuggestionsPreference.setSummary( + getResources().getStringArray(R.array.prefs_suggestion_visibilities) + [mShowCorrectionSuggestionsPreference.findIndexOfValue( + mShowCorrectionSuggestionsPreference.getValue())]); + } + + private void updateSettingsKeySummary() { + mSettingsKeyPreference.setSummary( + getResources().getStringArray(R.array.settings_key_modes) + [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]); + } + + private void updateKeyPreviewPopupDelaySummary() { + final ListPreference lp = mKeyPreviewPopupDismissDelay; + lp.setSummary(lp.getEntries()[lp.findIndexOfValue(lp.getValue())]); + } + + private void showVoiceConfirmation() { + mOkClicked = false; + showDialog(VOICE_INPUT_CONFIRM_DIALOG); + // Make URL in the dialog message clickable + if (mDialog != null) { + TextView textView = (TextView) mDialog.findViewById(android.R.id.message); + if (textView != null) { + textView.setMovementMethod(LinkMovementMethod.getInstance()); + } + } + } + + private void updateVoiceModeSummary() { + mVoicePreference.setSummary( + getResources().getStringArray(R.array.voice_input_modes_summary) + [mVoicePreference.findIndexOfValue(mVoicePreference.getValue())]); + } + + @Override + protected Dialog onCreateDialog(int id) { + switch (id) { + case VOICE_INPUT_CONFIRM_DIALOG: + DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int whichButton) { + if (whichButton == DialogInterface.BUTTON_NEGATIVE) { + mVoicePreference.setValue(mVoiceModeOff); + mVoiceLogger.settingsWarningDialogCancel(); + } else if (whichButton == DialogInterface.BUTTON_POSITIVE) { + mOkClicked = true; + mVoiceLogger.settingsWarningDialogOk(); + } + updateVoicePreference(); + } + }; + AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setTitle(R.string.voice_warning_title) + .setPositiveButton(android.R.string.ok, listener) + .setNegativeButton(android.R.string.cancel, listener); + + // Get the current list of supported locales and check the current locale against + // that list, to decide whether to put a warning that voice input will not work in + // the current language as part of the pop-up confirmation dialog. + boolean localeSupported = SubtypeSwitcher.getInstance().isVoiceSupported( + Locale.getDefault().toString()); + + final CharSequence message; + if (localeSupported) { + message = TextUtils.concat( + getText(R.string.voice_warning_may_not_understand), "\n\n", + getText(R.string.voice_hint_dialog_message)); + } else { + message = TextUtils.concat( + getText(R.string.voice_warning_locale_not_supported), "\n\n", + getText(R.string.voice_warning_may_not_understand), "\n\n", + getText(R.string.voice_hint_dialog_message)); + } + builder.setMessage(message); + AlertDialog dialog = builder.create(); + mDialog = dialog; + dialog.setOnDismissListener(this); + mVoiceLogger.settingsWarningDialogShown(); + return dialog; + default: + Log.e(TAG, "unknown dialog " + id); + return null; + } + } + + @Override + public void onDismiss(DialogInterface dialog) { + mVoiceLogger.settingsWarningDialogDismissed(); + if (!mOkClicked) { + // This assumes that onPreferenceClick gets called first, and this if the user + // agreed after the warning, we set the mOkClicked value to true. + mVoicePreference.setValue(mVoiceModeOff); + } + } + + private void updateVoicePreference() { + boolean isChecked = !mVoicePreference.getValue().equals(mVoiceModeOff); + mVoiceLogger.voiceInputSettingEnabled(isChecked); + } +} diff --git a/java/src/com/android/inputmethod/latin/SubtypeLocale.java b/java/src/com/android/inputmethod/latin/SubtypeLocale.java new file mode 100644 index 000000000..917521c40 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/SubtypeLocale.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.latin; + +import android.content.Context; +import android.content.res.Resources; + +import java.util.Locale; + +public class SubtypeLocale { + private static String[] sExceptionKeys; + private static String[] sExceptionValues; + + private SubtypeLocale() { + // Intentional empty constructor for utility class. + } + + public static void init(Context context) { + final Resources res = context.getResources(); + sExceptionKeys = res.getStringArray(R.array.subtype_locale_exception_keys); + sExceptionValues = res.getStringArray(R.array.subtype_locale_exception_values); + } + + public static String getFullDisplayName(Locale locale) { + String localeCode = locale.toString(); + for (int index = 0; index < sExceptionKeys.length; index++) { + if (sExceptionKeys[index].equals(localeCode)) + return sExceptionValues[index]; + } + return locale.getDisplayName(locale); + } +} diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java new file mode 100644 index 000000000..6ca12c0c5 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java @@ -0,0 +1,674 @@ +/* + * 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.compat.InputMethodInfoCompatWrapper; +import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; +import com.android.inputmethod.compat.InputMethodSubtypeCompatWrapper; +import com.android.inputmethod.deprecated.VoiceProxy; +import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.keyboard.LatinKeyboard; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.AsyncTask; +import android.os.IBinder; +import android.text.TextUtils; +import android.util.Log; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public class SubtypeSwitcher { + private static boolean DBG = LatinImeLogger.sDBG; + private static final String TAG = SubtypeSwitcher.class.getSimpleName(); + + private static final char LOCALE_SEPARATER = '_'; + private static final String KEYBOARD_MODE = "keyboard"; + private static final String VOICE_MODE = "voice"; + private static final String SUBTYPE_EXTRAVALUE_REQUIRE_NETWORK_CONNECTIVITY = + "requireNetworkConnectivity"; + public static final String USE_SPACEBAR_LANGUAGE_SWITCH_KEY = "use_spacebar_language_switch"; + + private final TextUtils.SimpleStringSplitter mLocaleSplitter = + new TextUtils.SimpleStringSplitter(LOCALE_SEPARATER); + + private static final SubtypeSwitcher sInstance = new SubtypeSwitcher(); + private /* final */ LatinIME mService; + private /* final */ InputMethodManagerCompatWrapper mImm; + private /* final */ Resources mResources; + private /* final */ ConnectivityManager mConnectivityManager; + private /* final */ boolean mConfigUseSpacebarLanguageSwitcher; + private /* final */ SharedPreferences mPrefs; + private final ArrayList<InputMethodSubtypeCompatWrapper> + mEnabledKeyboardSubtypesOfCurrentInputMethod = + new ArrayList<InputMethodSubtypeCompatWrapper>(); + private final ArrayList<String> mEnabledLanguagesOfCurrentInputMethod = new ArrayList<String>(); + private final LanguageBarInfo mLanguageBarInfo = new LanguageBarInfo(); + + /*-----------------------------------------------------------*/ + // Variants which should be changed only by reload functions. + private boolean mNeedsToDisplayLanguage; + private boolean mIsSystemLanguageSameAsInputLanguage; + private InputMethodInfoCompatWrapper mShortcutInputMethodInfo; + private InputMethodSubtypeCompatWrapper mShortcutSubtype; + private List<InputMethodSubtypeCompatWrapper> mAllEnabledSubtypesOfCurrentInputMethod; + private InputMethodSubtypeCompatWrapper mCurrentSubtype; + private Locale mSystemLocale; + private Locale mInputLocale; + private String mInputLocaleStr; + private String mInputMethodId; + private VoiceProxy.VoiceInputWrapper mVoiceInputWrapper; + /*-----------------------------------------------------------*/ + + private boolean mIsNetworkConnected; + + public static SubtypeSwitcher getInstance() { + return sInstance; + } + + public static void init(LatinIME service, SharedPreferences prefs) { + SubtypeLocale.init(service); + sInstance.initialize(service, prefs); + sInstance.updateAllParameters(); + } + + private SubtypeSwitcher() { + // Intentional empty constructor for singleton. + } + + private void initialize(LatinIME service, SharedPreferences prefs) { + mService = service; + mResources = service.getResources(); + mImm = InputMethodManagerCompatWrapper.getInstance(service); + mConnectivityManager = (ConnectivityManager) service.getSystemService( + Context.CONNECTIVITY_SERVICE); + mEnabledKeyboardSubtypesOfCurrentInputMethod.clear(); + mEnabledLanguagesOfCurrentInputMethod.clear(); + mSystemLocale = null; + mInputLocale = null; + mInputLocaleStr = null; + mCurrentSubtype = null; + mAllEnabledSubtypesOfCurrentInputMethod = null; + mVoiceInputWrapper = null; + mPrefs = prefs; + + final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo(); + mIsNetworkConnected = (info != null && info.isConnected()); + mInputMethodId = Utils.getInputMethodId(mImm, service.getPackageName()); + } + + // 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() { + mConfigUseSpacebarLanguageSwitcher = mPrefs.getBoolean(USE_SPACEBAR_LANGUAGE_SWITCH_KEY, + mService.getResources().getBoolean( + R.bool.config_use_spacebar_language_switcher)); + updateEnabledSubtypes(); + updateShortcutIME(); + } + + // Reload enabledSubtypes from the framework. + private void updateEnabledSubtypes() { + final String currentMode = getCurrentSubtypeMode(); + boolean foundCurrentSubtypeBecameDisabled = true; + mAllEnabledSubtypesOfCurrentInputMethod = mImm.getEnabledInputMethodSubtypeList( + null, true); + mEnabledLanguagesOfCurrentInputMethod.clear(); + mEnabledKeyboardSubtypesOfCurrentInputMethod.clear(); + for (InputMethodSubtypeCompatWrapper ims : mAllEnabledSubtypesOfCurrentInputMethod) { + final String locale = ims.getLocale(); + final String mode = ims.getMode(); + mLocaleSplitter.setString(locale); + if (mLocaleSplitter.hasNext()) { + mEnabledLanguagesOfCurrentInputMethod.add(mLocaleSplitter.next()); + } + if (locale.equals(mInputLocaleStr) && mode.equals(currentMode)) { + foundCurrentSubtypeBecameDisabled = false; + } + if (KEYBOARD_MODE.equals(ims.getMode())) { + mEnabledKeyboardSubtypesOfCurrentInputMethod.add(ims); + } + } + mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1 + && mIsSystemLanguageSameAsInputLanguage); + if (foundCurrentSubtypeBecameDisabled) { + if (DBG) { + Log.w(TAG, "Current subtype: " + mInputLocaleStr + ", " + currentMode); + Log.w(TAG, "Last subtype was disabled. Update to the current one."); + } + updateSubtype(mImm.getCurrentInputMethodSubtype()); + } else { + // mLanguageBarInfo.update() will be called in updateSubtype so there is no need + // to call this in the if-clause above. + mLanguageBarInfo.update(); + } + } + + private void updateShortcutIME() { + if (DBG) { + Log.d(TAG, "Update shortcut IME from : " + + (mShortcutInputMethodInfo == null + ? "<null>" : mShortcutInputMethodInfo.getId()) + ", " + + (mShortcutSubtype == null ? "<null>" : (mShortcutSubtype.getLocale() + + ", " + mShortcutSubtype.getMode()))); + } + // TODO: Update an icon for shortcut IME + final Map<InputMethodInfoCompatWrapper, List<InputMethodSubtypeCompatWrapper>> shortcuts = + mImm.getShortcutInputMethodsAndSubtypes(); + for (InputMethodInfoCompatWrapper imi : shortcuts.keySet()) { + List<InputMethodSubtypeCompatWrapper> subtypes = shortcuts.get(imi); + // TODO: Returns the first found IMI for now. Should handle all shortcuts as + // appropriate. + mShortcutInputMethodInfo = imi; + // TODO: Pick up the first found subtype for now. Should handle all subtypes + // as appropriate. + mShortcutSubtype = subtypes.size() > 0 ? subtypes.get(0) : null; + break; + } + if (DBG) { + Log.d(TAG, "Update shortcut IME to : " + + (mShortcutInputMethodInfo == null + ? "<null>" : mShortcutInputMethodInfo.getId()) + ", " + + (mShortcutSubtype == null ? "<null>" : (mShortcutSubtype.getLocale() + + ", " + mShortcutSubtype.getMode()))); + } + } + + // Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function. + public void updateSubtype(InputMethodSubtypeCompatWrapper newSubtype) { + final String newLocale; + final String newMode; + final String oldMode = getCurrentSubtypeMode(); + if (newSubtype == null) { + // Normally, newSubtype shouldn't be null. But just in case newSubtype was null, + // fallback to the default locale. + Log.w(TAG, "Couldn't get the current subtype."); + newLocale = "en_US"; + newMode = KEYBOARD_MODE; + } else { + newLocale = newSubtype.getLocale(); + newMode = newSubtype.getMode(); + } + if (DBG) { + Log.w(TAG, "Update subtype to:" + newLocale + "," + newMode + + ", from: " + mInputLocaleStr + ", " + oldMode); + } + boolean languageChanged = false; + if (!newLocale.equals(mInputLocaleStr)) { + if (mInputLocaleStr != null) { + languageChanged = true; + } + updateInputLocale(newLocale); + } + boolean modeChanged = false; + if (!newMode.equals(oldMode)) { + if (oldMode != null) { + modeChanged = true; + } + } + mCurrentSubtype = newSubtype; + + // If the old mode is voice input, we need to reset or cancel its status. + // We cancel its status when we change mode, while we reset otherwise. + if (isKeyboardMode()) { + if (modeChanged) { + if (VOICE_MODE.equals(oldMode) && mVoiceInputWrapper != null) { + mVoiceInputWrapper.cancel(); + } + } + if (modeChanged || languageChanged) { + updateShortcutIME(); + mService.onRefreshKeyboard(); + } + } else if (isVoiceMode() && mVoiceInputWrapper != null) { + if (VOICE_MODE.equals(oldMode)) { + mVoiceInputWrapper.reset(); + } + // If needsToShowWarningDialog is true, voice input need to show warning before + // show recognition view. + if (languageChanged || modeChanged + || VoiceProxy.getInstance().needsToShowWarningDialog()) { + triggerVoiceIME(); + } + } else { + Log.w(TAG, "Unknown subtype mode: " + newMode); + if (VOICE_MODE.equals(oldMode) && mVoiceInputWrapper != null) { + // We need to reset the voice input to release the resources and to reset its status + // as it is not the current input mode. + mVoiceInputWrapper.reset(); + } + } + mLanguageBarInfo.update(); + } + + // 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 + if (!TextUtils.isEmpty(inputLocaleStr)) { + mInputLocale = Utils.constructLocaleFromString(inputLocaleStr); + 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() { + if (mShortcutInputMethodInfo == null) { + return; + } + + final String imiId = mShortcutInputMethodInfo.getId(); + final InputMethodSubtypeCompatWrapper subtype = mShortcutSubtype; + switchToTargetIME(imiId, subtype); + } + + private void switchToTargetIME( + final String imiId, final InputMethodSubtypeCompatWrapper subtype) { + final IBinder token = mService.getWindow().getWindow().getAttributes().token; + if (token == null) { + return; + } + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... params) { + mImm.setInputMethodAndSubtype(token, imiId, subtype); + return null; + } + + @Override + protected void onPostExecute(Void result) { + // Calls in this method need to be done in the same thread as the thread which + // called switchToShortcutIME(). + + // Notify an event that the current subtype was changed. This event will be + // handled if "onCurrentInputMethodSubtypeChanged" can't be implemented + // when the API level is 10 or previous. + mService.notifyOnCurrentInputMethodSubtypeChanged(subtype); + } + }.execute(); + } + + public Drawable getShortcutIcon() { + return getSubtypeIcon(mShortcutInputMethodInfo, mShortcutSubtype); + } + + private Drawable getSubtypeIcon( + InputMethodInfoCompatWrapper imi, InputMethodSubtypeCompatWrapper subtype) { + final PackageManager pm = mService.getPackageManager(); + if (imi != null) { + final String imiPackageName = imi.getPackageName(); + if (DBG) { + Log.d(TAG, "Update icons of IME: " + imiPackageName + "," + + subtype.getLocale() + "," + subtype.getMode()); + } + if (subtype != null) { + return pm.getDrawable(imiPackageName, subtype.getIconResId(), + imi.getServiceInfo().applicationInfo); + } else if (imi.getSubtypeCount() > 0 && imi.getSubtypeAt(0) != null) { + return pm.getDrawable(imiPackageName, + imi.getSubtypeAt(0).getIconResId(), + imi.getServiceInfo().applicationInfo); + } else { + try { + return pm.getApplicationInfo(imiPackageName, 0).loadIcon(pm); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "IME can't be found: " + imiPackageName); + } + } + } + return null; + } + + private static boolean contains(String[] hay, String needle) { + for (String element : hay) { + if (element.equals(needle)) + return true; + } + return false; + } + + public boolean isShortcutImeEnabled() { + if (mShortcutInputMethodInfo == null) + return false; + if (mShortcutSubtype == null) + return true; + // For compatibility, if the shortcut subtype is dummy, we assume the shortcut IME + // (built-in voice dummy subtype) is available. + if (!mShortcutSubtype.hasOriginalObject()) return true; + final boolean allowsImplicitlySelectedSubtypes = true; + for (final InputMethodSubtypeCompatWrapper enabledSubtype : + mImm.getEnabledInputMethodSubtypeList( + mShortcutInputMethodInfo, allowsImplicitlySelectedSubtypes)) { + if (enabledSubtype.equals(mShortcutSubtype)) { + return true; + } + } + return false; + } + + public boolean isShortcutImeReady() { + if (mShortcutInputMethodInfo == null) + return false; + if (mShortcutSubtype == null) + return true; + if (contains(mShortcutSubtype.getExtraValue().split(","), + SUBTYPE_EXTRAVALUE_REQUIRE_NETWORK_CONNECTIVITY)) { + return mIsNetworkConnected; + } + return true; + } + + public void onNetworkStateChanged(Intent intent) { + final boolean noConnection = intent.getBooleanExtra( + ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); + mIsNetworkConnected = !noConnection; + + final KeyboardSwitcher switcher = KeyboardSwitcher.getInstance(); + final LatinKeyboard keyboard = switcher.getLatinKeyboard(); + if (keyboard != null) { + keyboard.updateShortcutKey(isShortcutImeReady(), switcher.getKeyboardView()); + } + } + + ////////////////////////////////// + // Language Switching functions // + ////////////////////////////////// + + public int getEnabledKeyboardLocaleCount() { + return mEnabledKeyboardSubtypesOfCurrentInputMethod.size(); + } + + public boolean useSpacebarLanguageSwitcher() { + return mConfigUseSpacebarLanguageSwitcher; + } + + public boolean needsToDisplayLanguage() { + return mNeedsToDisplayLanguage; + } + + public Locale getInputLocale() { + return mInputLocale; + } + + public String getInputLocaleStr() { + return mInputLocaleStr; + } + + public String[] getEnabledLanguages() { + int enabledLanguageCount = mEnabledLanguagesOfCurrentInputMethod.size(); + // Workaround for explicitly specifying the voice language + if (enabledLanguageCount == 1) { + mEnabledLanguagesOfCurrentInputMethod.add(mEnabledLanguagesOfCurrentInputMethod + .get(0)); + ++enabledLanguageCount; + } + return mEnabledLanguagesOfCurrentInputMethod.toArray(new String[enabledLanguageCount]); + } + + public Locale getSystemLocale() { + return mSystemLocale; + } + + public boolean isSystemLanguageSameAsInputLanguage() { + 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())) { + updateAllParameters(); + } + } + + public boolean isKeyboardMode() { + return KEYBOARD_MODE.equals(getCurrentSubtypeMode()); + } + + + /////////////////////////// + // Voice Input functions // + /////////////////////////// + + public boolean setVoiceInputWrapper(VoiceProxy.VoiceInputWrapper vi) { + if (mVoiceInputWrapper == null && vi != null) { + mVoiceInputWrapper = vi; + if (isVoiceMode()) { + if (DBG) { + Log.d(TAG, "Set and call voice input.: " + getInputLocaleStr()); + } + triggerVoiceIME(); + return true; + } + } + return false; + } + + public boolean isVoiceMode() { + return null == mCurrentSubtype ? false : VOICE_MODE.equals(getCurrentSubtypeMode()); + } + + public boolean isDummyVoiceMode() { + return mCurrentSubtype != null && mCurrentSubtype.getOriginalObject() == null + && VOICE_MODE.equals(getCurrentSubtypeMode()); + } + + private void triggerVoiceIME() { + if (!mService.isInputViewShown()) return; + VoiceProxy.getInstance().startListening(false, + KeyboardSwitcher.getInstance().getKeyboardView().getWindowToken()); + } + + ////////////////////////////////////// + // Spacebar Language Switch support // + ////////////////////////////////////// + + private class LanguageBarInfo { + private int mCurrentKeyboardSubtypeIndex; + private InputMethodSubtypeCompatWrapper mNextKeyboardSubtype; + private InputMethodSubtypeCompatWrapper mPreviousKeyboardSubtype; + private String mNextLanguage; + private String mPreviousLanguage; + public LanguageBarInfo() { + update(); + } + + private String getNextLanguage() { + return mNextLanguage; + } + + private String getPreviousLanguage() { + return mPreviousLanguage; + } + + public InputMethodSubtypeCompatWrapper getNextKeyboardSubtype() { + return mNextKeyboardSubtype; + } + + public InputMethodSubtypeCompatWrapper getPreviousKeyboardSubtype() { + return mPreviousKeyboardSubtype; + } + + public void update() { + if (!mConfigUseSpacebarLanguageSwitcher + || mEnabledKeyboardSubtypesOfCurrentInputMethod == null + || mEnabledKeyboardSubtypesOfCurrentInputMethod.size() == 0) return; + mCurrentKeyboardSubtypeIndex = getCurrentIndex(); + mNextKeyboardSubtype = getNextKeyboardSubtypeInternal(mCurrentKeyboardSubtypeIndex); + Locale locale = Utils.constructLocaleFromString(mNextKeyboardSubtype.getLocale()); + mNextLanguage = getFullDisplayName(locale, true); + mPreviousKeyboardSubtype = getPreviousKeyboardSubtypeInternal( + mCurrentKeyboardSubtypeIndex); + locale = Utils.constructLocaleFromString(mPreviousKeyboardSubtype.getLocale()); + mPreviousLanguage = getFullDisplayName(locale, true); + } + + private int normalize(int index) { + final int N = mEnabledKeyboardSubtypesOfCurrentInputMethod.size(); + final int ret = index % N; + return ret < 0 ? ret + N : ret; + } + + private int getCurrentIndex() { + final int N = mEnabledKeyboardSubtypesOfCurrentInputMethod.size(); + for (int i = 0; i < N; ++i) { + if (mEnabledKeyboardSubtypesOfCurrentInputMethod.get(i).equals(mCurrentSubtype)) { + return i; + } + } + return 0; + } + + private InputMethodSubtypeCompatWrapper getNextKeyboardSubtypeInternal(int index) { + return mEnabledKeyboardSubtypesOfCurrentInputMethod.get(normalize(index + 1)); + } + + private InputMethodSubtypeCompatWrapper getPreviousKeyboardSubtypeInternal(int index) { + return mEnabledKeyboardSubtypesOfCurrentInputMethod.get(normalize(index - 1)); + } + } + + public static String getFullDisplayName(Locale locale, boolean returnsNameInThisLocale) { + if (returnsNameInThisLocale) { + return toTitleCase(SubtypeLocale.getFullDisplayName(locale), locale); + } else { + return toTitleCase(locale.getDisplayName(), locale); + } + } + + public static String getDisplayLanguage(Locale locale) { + return toTitleCase(SubtypeLocale.getFullDisplayName(locale), locale); + } + + public static String getMiddleDisplayLanguage(Locale locale) { + return toTitleCase((Utils.constructLocaleFromString( + locale.getLanguage()).getDisplayLanguage(locale)), locale); + } + + public static String getShortDisplayLanguage(Locale locale) { + return toTitleCase(locale.getLanguage(), locale); + } + + private static String toTitleCase(String s, Locale locale) { + if (s.length() == 0) { + return s; + } + return s.toUpperCase(locale).charAt(0) + s.substring(1); + } + + public String getInputLanguageName() { + return getDisplayLanguage(getInputLocale()); + } + + public String getNextInputLanguageName() { + return mLanguageBarInfo.getNextLanguage(); + } + + public String getPreviousInputLanguageName() { + return mLanguageBarInfo.getPreviousLanguage(); + } + + ///////////////////////////// + // Other utility functions // + ///////////////////////////// + + public String getCurrentSubtypeExtraValue() { + // If null, return what an empty ExtraValue would return : the empty string. + return null != mCurrentSubtype ? mCurrentSubtype.getExtraValue() : ""; + } + + public boolean currentSubtypeContainsExtraValueKey(String key) { + // If null, return what an empty ExtraValue would return : false. + return null != mCurrentSubtype ? mCurrentSubtype.containsExtraValueKey(key) : false; + } + + public String getCurrentSubtypeExtraValueOf(String key) { + // If null, return what an empty ExtraValue would return : null. + return null != mCurrentSubtype ? mCurrentSubtype.getExtraValueOf(key) : null; + } + + public String getCurrentSubtypeMode() { + return null != mCurrentSubtype ? mCurrentSubtype.getMode() : KEYBOARD_MODE; + } + + + 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 = VoiceProxy.getSupportedLocalesString( + mService.getContentResolver()); + List<String> voiceInputSupportedLocales = Arrays.asList( + supportedLocalesString.split("\\s+")); + return voiceInputSupportedLocales.contains(locale); + } + + private void changeToNextSubtype() { + final InputMethodSubtypeCompatWrapper subtype = + mLanguageBarInfo.getNextKeyboardSubtype(); + switchToTargetIME(mInputMethodId, subtype); + } + + private void changeToPreviousSubtype() { + final InputMethodSubtypeCompatWrapper subtype = + mLanguageBarInfo.getPreviousKeyboardSubtype(); + switchToTargetIME(mInputMethodId, subtype); + } + + public void toggleLanguage(boolean next) { + if (next) { + changeToNextSubtype(); + } else { + changeToPreviousSubtype(); + } + } +} diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 5015e9b3d..eb5ed5a65 100755..100644 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -1,12 +1,12 @@ /* * Copyright (C) 2008 The Android Open Source Project - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -22,18 +22,23 @@ import android.text.TextUtils; import android.util.Log; import android.view.View; -import java.nio.ByteBuffer; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; -import java.util.List; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Locale; +import java.util.Map; +import java.util.Set; /** - * This class loads a dictionary and provides a list of suggestions for a given sequence of + * This class loads a dictionary and provides a list of suggestions for a given sequence of * characters. This includes corrections and completions. - * @hide pending API Council Approval */ public class Suggest implements Dictionary.WordCallback { + public static final String TAG = Suggest.class.getSimpleName(); + public static final int APPROX_MAX_WORD_LENGTH = 32; public static final int CORRECTION_NONE = 0; @@ -43,7 +48,7 @@ public class Suggest implements Dictionary.WordCallback { /** * Words that appear in both bigram and unigram data gets multiplier ranging from - * BIGRAM_MULTIPLIER_MIN to BIGRAM_MULTIPLIER_MAX depending on the frequency score from + * BIGRAM_MULTIPLIER_MIN to BIGRAM_MULTIPLIER_MAX depending on the score from * bigram data. */ public static final double BIGRAM_MULTIPLIER_MIN = 1.2; @@ -51,7 +56,7 @@ public class Suggest implements Dictionary.WordCallback { /** * Maximum possible bigram frequency. Will depend on how many bits are being used in data - * structure. Maximum bigram freqeuncy will get the BIGRAM_MULTIPLIER_MAX as the multiplier. + * structure. Maximum bigram frequency will get the BIGRAM_MULTIPLIER_MAX as the multiplier. */ public static final int MAXIMUM_BIGRAM_FREQUENCY = 127; @@ -63,39 +68,36 @@ public class Suggest implements Dictionary.WordCallback { // If you add a type of dictionary, increment DIC_TYPE_LAST_ID public static final int DIC_TYPE_LAST_ID = 4; - static final int LARGE_DICTIONARY_THRESHOLD = 200 * 1000; - - private BinaryDictionary mMainDict; - - private Dictionary mUserDictionary; + public static final String DICT_KEY_MAIN = "main"; + public static final String DICT_KEY_CONTACTS = "contacts"; + public static final String DICT_KEY_AUTO = "auto"; + public static final String DICT_KEY_USER = "user"; + public static final String DICT_KEY_USER_BIGRAM = "user_bigram"; + public static final String DICT_KEY_WHITELIST ="whitelist"; - private Dictionary mAutoDictionary; + private static final boolean DBG = LatinImeLogger.sDBG; - private Dictionary mContactsDictionary; + private AutoCorrection mAutoCorrection; - private Dictionary mUserBigramDictionary; + private Dictionary mMainDict; + private WhitelistDictionary mWhiteListDictionary; + private final Map<String, Dictionary> mUnigramDictionaries = new HashMap<String, Dictionary>(); + private final Map<String, Dictionary> mBigramDictionaries = new HashMap<String, Dictionary>(); - private int mPrefMaxSuggestions = 12; + private int mPrefMaxSuggestions = 18; private static final int PREF_MAX_BIGRAMS = 60; - private boolean mAutoTextEnabled; + private boolean mQuickFixesEnabled; - private int[] mPriorities = new int[mPrefMaxSuggestions]; - private int[] mBigramPriorities = new int[PREF_MAX_BIGRAMS]; + private double mAutoCorrectionThreshold; + private int[] mScores = new int[mPrefMaxSuggestions]; + private int[] mBigramScores = new int[PREF_MAX_BIGRAMS]; - // Handle predictive correction for only the first 1280 characters for performance reasons - // If we support scripts that need latin characters beyond that, we should probably use some - // kind of a sparse array or language specific list with a mapping lookup table. - // 1280 is the size of the BASE_CHARS array in ExpandableDictionary, which is a basic set of - // latin characters. - private int[] mNextLettersFrequencies = new int[1280]; private ArrayList<CharSequence> mSuggestions = new ArrayList<CharSequence>(); ArrayList<CharSequence> mBigramSuggestions = new ArrayList<CharSequence>(); private ArrayList<CharSequence> mStringPool = new ArrayList<CharSequence>(); - private boolean mHaveCorrection; - private CharSequence mOriginalWord; - private String mLowerOriginalWord; + private CharSequence mTypedWord; // TODO: Remove these member variables by passing more context to addWord() callback method private boolean mIsFirstCharCapitalized; @@ -103,16 +105,45 @@ public class Suggest implements Dictionary.WordCallback { private int mCorrectionMode = CORRECTION_BASIC; - public Suggest(Context context, int[] dictionaryResId) { - mMainDict = new BinaryDictionary(context, dictionaryResId, DIC_MAIN); - initPool(); + public Suggest(Context context, int dictionaryResId, Locale locale) { + init(context, DictionaryFactory.createDictionaryFromManager(context, locale, + dictionaryResId)); + } + + /* package for test */ Suggest(Context context, File dictionary, long startOffset, long length, + Flag[] flagArray) { + init(null, DictionaryFactory.createDictionaryForTest(context, dictionary, startOffset, + length, flagArray)); } - public Suggest(Context context, ByteBuffer byteBuffer) { - mMainDict = new BinaryDictionary(context, byteBuffer, DIC_MAIN); + private void init(Context context, Dictionary mainDict) { + mMainDict = mainDict; + addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, mainDict); + addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, mainDict); + mWhiteListDictionary = WhitelistDictionary.init(context); + addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_WHITELIST, mWhiteListDictionary); + mAutoCorrection = new AutoCorrection(); initPool(); } + private void addOrReplaceDictionary(Map<String, Dictionary> dictionaries, String key, + Dictionary dict) { + final Dictionary oldDict = (dict == null) + ? dictionaries.remove(key) + : dictionaries.put(key, dict); + if (oldDict != null && dict != oldDict) { + oldDict.close(); + } + } + + public void resetMainDict(Context context, int dictionaryResId, Locale locale) { + final Dictionary newMainDict = DictionaryFactory.createDictionaryFromManager( + context, locale, dictionaryResId); + mMainDict = newMainDict; + addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, newMainDict); + addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, newMainDict); + } + private void initPool() { for (int i = 0; i < mPrefMaxSuggestions; i++) { StringBuilder sb = new StringBuilder(getApproxMaxWordLength()); @@ -120,8 +151,8 @@ public class Suggest implements Dictionary.WordCallback { } } - public void setAutoTextEnabled(boolean enabled) { - mAutoTextEnabled = enabled; + public void setQuickFixesEnabled(boolean enabled) { + mQuickFixesEnabled = enabled; } public int getCorrectionMode() { @@ -133,7 +164,11 @@ public class Suggest implements Dictionary.WordCallback { } public boolean hasMainDictionary() { - return mMainDict.getSize() > LARGE_DICTIONARY_THRESHOLD; + return mMainDict != null; + } + + public Map<String, Dictionary> getUnigramDictionaries() { + return mUnigramDictionaries; } public int getApproxMaxWordLength() { @@ -145,22 +180,33 @@ public class Suggest implements Dictionary.WordCallback { * before the main dictionary, if set. */ public void setUserDictionary(Dictionary userDictionary) { - mUserDictionary = userDictionary; + addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_USER, userDictionary); } /** - * Sets an optional contacts dictionary resource to be loaded. + * Sets an optional contacts dictionary resource to be loaded. It is also possible to remove + * the contacts dictionary by passing null to this method. In this case no contacts dictionary + * won't be used. */ - public void setContactsDictionary(Dictionary userDictionary) { - mContactsDictionary = userDictionary; + public void setContactsDictionary(Dictionary contactsDictionary) { + addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_CONTACTS, contactsDictionary); + addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_CONTACTS, contactsDictionary); } - + public void setAutoDictionary(Dictionary autoDictionary) { - mAutoDictionary = autoDictionary; + addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_AUTO, autoDictionary); } public void setUserBigramDictionary(Dictionary userBigramDictionary) { - mUserBigramDictionary = userBigramDictionary; + addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_USER_BIGRAM, userBigramDictionary); + } + + public void setAutoCorrectionThreshold(double threshold) { + mAutoCorrectionThreshold = threshold; + } + + public boolean isAggressiveAutoCorrectionMode() { + return (mAutoCorrectionThreshold == 0); } /** @@ -174,8 +220,8 @@ public class Suggest implements Dictionary.WordCallback { throw new IllegalArgumentException("maxSuggestions must be between 1 and 100"); } mPrefMaxSuggestions = maxSuggestions; - mPriorities = new int[mPrefMaxSuggestions]; - mBigramPriorities = new int[PREF_MAX_BIGRAMS]; + mScores = new int[mPrefMaxSuggestions]; + mBigramScores = new int[PREF_MAX_BIGRAMS]; collectGarbage(mSuggestions, mPrefMaxSuggestions); while (mStringPool.size() < mPrefMaxSuggestions) { StringBuilder sb = new StringBuilder(getApproxMaxWordLength()); @@ -183,172 +229,190 @@ public class Suggest implements Dictionary.WordCallback { } } - private boolean haveSufficientCommonality(String original, CharSequence suggestion) { - final int originalLength = original.length(); - final int suggestionLength = suggestion.length(); - final int minLength = Math.min(originalLength, suggestionLength); - if (minLength <= 2) return true; - int matching = 0; - int lessMatching = 0; // Count matches if we skip one character - int i; - for (i = 0; i < minLength; i++) { - final char origChar = ExpandableDictionary.toLowerCase(original.charAt(i)); - if (origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i))) { - matching++; - lessMatching++; - } else if (i + 1 < suggestionLength - && origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i + 1))) { - lessMatching++; - } - } - matching = Math.max(matching, lessMatching); - - if (minLength <= 4) { - return matching >= 2; - } else { - return matching > minLength / 2; - } - } - /** - * Returns a list of words that match the list of character codes passed in. - * This list will be overwritten the next time this function is called. + * Returns a object which represents suggested words that match the list of character codes + * passed in. This object contents will be overwritten the next time this function is called. * @param view a view for retrieving the context for AutoText * @param wordComposer contains what is currently being typed * @param prevWordForBigram previous word (used only for bigram) - * @return list of suggestions. + * @return suggested words object. */ - public List<CharSequence> getSuggestions(View view, WordComposer wordComposer, - boolean includeTypedWordIfValid, CharSequence prevWordForBigram) { + public SuggestedWords getSuggestions(View view, WordComposer wordComposer, + CharSequence prevWordForBigram) { + return getSuggestedWordBuilder(view, wordComposer, prevWordForBigram).build(); + } + + private CharSequence capitalizeWord(boolean all, boolean first, CharSequence word) { + if (TextUtils.isEmpty(word) || !(all || first)) return word; + final int wordLength = word.length(); + final int poolSize = mStringPool.size(); + final StringBuilder sb = + poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) + : new StringBuilder(getApproxMaxWordLength()); + sb.setLength(0); + // TODO: Must pay attention to locale when changing case. + if (all) { + sb.append(word.toString().toUpperCase()); + } else if (first) { + sb.append(Character.toUpperCase(word.charAt(0))); + if (wordLength > 1) { + sb.append(word.subSequence(1, wordLength)); + } + } + return sb; + } + + protected void addBigramToSuggestions(CharSequence bigram) { + final int poolSize = mStringPool.size(); + final StringBuilder sb = poolSize > 0 ? + (StringBuilder) mStringPool.remove(poolSize - 1) + : new StringBuilder(getApproxMaxWordLength()); + sb.setLength(0); + sb.append(bigram); + mSuggestions.add(sb); + } + + // TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder + public SuggestedWords.Builder getSuggestedWordBuilder(View view, WordComposer wordComposer, + CharSequence prevWordForBigram) { LatinImeLogger.onStartSuggestion(prevWordForBigram); - mHaveCorrection = false; + mAutoCorrection.init(); mIsFirstCharCapitalized = wordComposer.isFirstCharCapitalized(); mIsAllUpperCase = wordComposer.isAllUpperCase(); collectGarbage(mSuggestions, mPrefMaxSuggestions); - Arrays.fill(mPriorities, 0); - Arrays.fill(mNextLettersFrequencies, 0); + Arrays.fill(mScores, 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; // 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 = ""; } + mTypedWord = typedWord; - if (wordComposer.size() == 1 && (mCorrectionMode == CORRECTION_FULL_BIGRAM + if (wordComposer.size() <= 1 && (mCorrectionMode == CORRECTION_FULL_BIGRAM || mCorrectionMode == CORRECTION_BASIC)) { // At first character typed, search only the bigrams - Arrays.fill(mBigramPriorities, 0); + Arrays.fill(mBigramScores, 0); collectGarbage(mBigramSuggestions, PREF_MAX_BIGRAMS); if (!TextUtils.isEmpty(prevWordForBigram)) { CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase(); - if (mMainDict.isValidWord(lowerPrevWord)) { + if (mMainDict != null && mMainDict.isValidWord(lowerPrevWord)) { prevWordForBigram = lowerPrevWord; } - if (mUserBigramDictionary != null) { - mUserBigramDictionary.getBigrams(wordComposer, prevWordForBigram, this, - mNextLettersFrequencies); + for (final Dictionary dictionary : mBigramDictionaries.values()) { + dictionary.getBigrams(wordComposer, prevWordForBigram, this); } - if (mContactsDictionary != null) { - mContactsDictionary.getBigrams(wordComposer, prevWordForBigram, this, - mNextLettersFrequencies); - } - if (mMainDict != null) { - mMainDict.getBigrams(wordComposer, prevWordForBigram, this, - mNextLettersFrequencies); - } - char currentChar = wordComposer.getTypedWord().charAt(0); - // TODO: Must pay attention to locale when changing case. - char currentCharUpper = Character.toUpperCase(currentChar); - int count = 0; - int bigramSuggestionSize = mBigramSuggestions.size(); - for (int i = 0; i < bigramSuggestionSize; i++) { - if (mBigramSuggestions.get(i).charAt(0) == currentChar - || mBigramSuggestions.get(i).charAt(0) == currentCharUpper) { - int poolSize = mStringPool.size(); - StringBuilder sb = poolSize > 0 ? - (StringBuilder) mStringPool.remove(poolSize - 1) - : new StringBuilder(getApproxMaxWordLength()); - sb.setLength(0); - sb.append(mBigramSuggestions.get(i)); - mSuggestions.add(count++, sb); - if (count > mPrefMaxSuggestions) break; + if (TextUtils.isEmpty(typedWord)) { + // Nothing entered: return all bigrams for the previous word + int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions); + for (int i = 0; i < insertCount; ++i) { + addBigramToSuggestions(mBigramSuggestions.get(i)); + } + } else { + // Word entered: return only bigrams that match the first char of the typed word + final char currentChar = typedWord.charAt(0); + // TODO: Must pay attention to locale when changing case. + final char currentCharUpper = Character.toUpperCase(currentChar); + int count = 0; + final int bigramSuggestionSize = mBigramSuggestions.size(); + for (int i = 0; i < bigramSuggestionSize; i++) { + final CharSequence bigramSuggestion = mBigramSuggestions.get(i); + final char bigramSuggestionFirstChar = bigramSuggestion.charAt(0); + if (bigramSuggestionFirstChar == currentChar + || bigramSuggestionFirstChar == currentCharUpper) { + addBigramToSuggestions(bigramSuggestion); + if (++count > mPrefMaxSuggestions) break; + } } } } } else if (wordComposer.size() > 1) { // At second character typed, search the unigrams (scores being affected by bigrams) - if (mUserDictionary != null || mContactsDictionary != null) { - if (mUserDictionary != null) { - mUserDictionary.getWords(wordComposer, this, mNextLettersFrequencies); - } - if (mContactsDictionary != null) { - mContactsDictionary.getWords(wordComposer, this, mNextLettersFrequencies); - } - - if (mSuggestions.size() > 0 && isValidWord(mOriginalWord) - && (mCorrectionMode == CORRECTION_FULL - || mCorrectionMode == CORRECTION_FULL_BIGRAM)) { - mHaveCorrection = true; - } - } - mMainDict.getWords(wordComposer, this, mNextLettersFrequencies); - if ((mCorrectionMode == CORRECTION_FULL || mCorrectionMode == CORRECTION_FULL_BIGRAM) - && mSuggestions.size() > 0) { - mHaveCorrection = true; - } - } - if (mOriginalWord != null) { - mSuggestions.add(0, mOriginalWord.toString()); - } - - // Check if the first suggestion has a minimum number of characters in common - if (wordComposer.size() > 1 && mSuggestions.size() > 1 - && (mCorrectionMode == CORRECTION_FULL - || mCorrectionMode == CORRECTION_FULL_BIGRAM)) { - if (!haveSufficientCommonality(mLowerOriginalWord, mSuggestions.get(1))) { - mHaveCorrection = false; + for (final String key : mUnigramDictionaries.keySet()) { + // Skip AutoDictionary and WhitelistDictionary to lookup + if (key.equals(DICT_KEY_AUTO) || key.equals(DICT_KEY_WHITELIST)) + continue; + final Dictionary dictionary = mUnigramDictionaries.get(key); + dictionary.getWords(wordComposer, this); } } - if (mAutoTextEnabled) { - int i = 0; - int max = 6; - // Don't autotext the suggestions from the dictionaries - if (mCorrectionMode == CORRECTION_BASIC) max = 1; - while (i < mSuggestions.size() && i < max) { - String suggestedWord = mSuggestions.get(i).toString().toLowerCase(); - CharSequence autoText = - AutoText.get(suggestedWord, 0, suggestedWord.length(), view); - // Is there an AutoText correction? - boolean canAdd = autoText != null; + CharSequence autoText = null; + final String typedWordString = typedWord == null ? null : typedWord.toString(); + if (typedWord != null) { + // Apply quick fix only for the typed word. + if (mQuickFixesEnabled) { + final String lowerCaseTypedWord = typedWordString.toLowerCase(); + CharSequence tempAutoText = capitalizeWord( + mIsAllUpperCase, mIsFirstCharCapitalized, AutoText.get( + lowerCaseTypedWord, 0, lowerCaseTypedWord.length(), view)); + // TODO: cleanup canAdd + // Is there an AutoText (also known as Quick Fixes) correction? + // Capitalize as needed + boolean canAdd = tempAutoText != null; // Is that correction already the current prediction (or original word)? - canAdd &= !TextUtils.equals(autoText, mSuggestions.get(i)); + canAdd &= !TextUtils.equals(tempAutoText, typedWord); // Is that correction already the next predicted word? - if (canAdd && i + 1 < mSuggestions.size() && mCorrectionMode != CORRECTION_BASIC) { - canAdd &= !TextUtils.equals(autoText, mSuggestions.get(i + 1)); + if (canAdd && mSuggestions.size() > 0 && mCorrectionMode != CORRECTION_BASIC) { + canAdd &= !TextUtils.equals(tempAutoText, mSuggestions.get(0)); } if (canAdd) { - mHaveCorrection = true; - mSuggestions.add(i + 1, autoText); - i++; + if (DBG) { + Log.d(TAG, "Auto corrected by AUTOTEXT."); + } + autoText = tempAutoText; } - i++; } } + + CharSequence whitelistedWord = capitalizeWord(mIsAllUpperCase, mIsFirstCharCapitalized, + mWhiteListDictionary.getWhiteListedWord(typedWordString)); + + mAutoCorrection.updateAutoCorrectionStatus(mUnigramDictionaries, wordComposer, + mSuggestions, mScores, typedWord, mAutoCorrectionThreshold, mCorrectionMode, + autoText, whitelistedWord); + + if (autoText != null) { + mSuggestions.add(0, autoText); + } + + if (whitelistedWord != null) { + mSuggestions.add(0, whitelistedWord); + } + + if (typedWord != null) { + mSuggestions.add(0, typedWordString); + } removeDupes(); - return mSuggestions; - } - public int[] getNextLettersFrequencies() { - return mNextLettersFrequencies; + if (DBG) { + double normalizedScore = mAutoCorrection.getNormalizedScore(); + ArrayList<SuggestedWords.SuggestedWordInfo> scoreInfoList = + new ArrayList<SuggestedWords.SuggestedWordInfo>(); + scoreInfoList.add(new SuggestedWords.SuggestedWordInfo("+", false)); + for (int i = 0; i < mScores.length; ++i) { + if (normalizedScore > 0) { + final String scoreThreshold = String.format("%d (%4.2f)", mScores[i], + normalizedScore); + scoreInfoList.add( + new SuggestedWords.SuggestedWordInfo(scoreThreshold, false)); + normalizedScore = 0.0; + } else { + final String score = Integer.toString(mScores[i]); + scoreInfoList.add(new SuggestedWords.SuggestedWordInfo(score, false)); + } + } + for (int i = mScores.length; i < mSuggestions.size(); ++i) { + scoreInfoList.add(new SuggestedWords.SuggestedWordInfo("--", false)); + } + return new SuggestedWords.Builder().addWords(mSuggestions, scoreInfoList); + } + return new SuggestedWords.Builder().addWords(mSuggestions, null); } private void removeDupes() { @@ -378,45 +442,44 @@ public class Suggest implements Dictionary.WordCallback { } } - public boolean hasMinimalCorrection() { - return mHaveCorrection; - } - - private boolean compareCaseInsensitive(final String mLowerOriginalWord, - final char[] word, final int offset, final int length) { - final int originalLength = mLowerOriginalWord.length(); - if (originalLength == length && Character.isUpperCase(word[offset])) { - for (int i = 0; i < originalLength; i++) { - if (mLowerOriginalWord.charAt(i) != Character.toLowerCase(word[offset+i])) { - return false; - } - } - return true; - } - return false; + public boolean hasAutoCorrection() { + return mAutoCorrection.hasAutoCorrection(); } - public boolean addWord(final char[] word, final int offset, final int length, int freq, + @Override + public boolean addWord(final char[] word, final int offset, final int length, int score, final int dicTypeId, final Dictionary.DataType dataType) { Dictionary.DataType dataTypeForLog = dataType; - ArrayList<CharSequence> suggestions; - int[] priorities; - int prefMaxSuggestions; + final ArrayList<CharSequence> suggestions; + final int[] sortedScores; + final int prefMaxSuggestions; if(dataType == Dictionary.DataType.BIGRAM) { suggestions = mBigramSuggestions; - priorities = mBigramPriorities; + sortedScores = mBigramScores; prefMaxSuggestions = PREF_MAX_BIGRAMS; } else { suggestions = mSuggestions; - priorities = mPriorities; + sortedScores = mScores; prefMaxSuggestions = mPrefMaxSuggestions; } int pos = 0; // Check if it's the same word, only caps are different - if (compareCaseInsensitive(mLowerOriginalWord, word, offset, length)) { - pos = 0; + if (Utils.equalsIgnoreCase(mTypedWord, word, offset, length)) { + // TODO: remove this surrounding if clause and move this logic to + // getSuggestedWordBuilder. + if (suggestions.size() > 0) { + final String currentHighestWord = suggestions.get(0).toString(); + // If the current highest word is also equal to typed word, we need to compare + // frequency to determine the insertion position. This does not ensure strictly + // correct ordering, but ensures the top score is on top which is enough for + // removing duplicates correctly. + if (Utils.equalsIgnoreCase(currentHighestWord, word, offset, length) + && score <= sortedScores[0]) { + pos = 1; + } + } } else { if (dataType == Dictionary.DataType.UNIGRAM) { // Check if the word was already added before (by bigram data) @@ -424,24 +487,24 @@ public class Suggest implements Dictionary.WordCallback { if(bigramSuggestion >= 0) { dataTypeForLog = Dictionary.DataType.BIGRAM; // turn freq from bigram into multiplier specified above - double multiplier = (((double) mBigramPriorities[bigramSuggestion]) + double multiplier = (((double) mBigramScores[bigramSuggestion]) / MAXIMUM_BIGRAM_FREQUENCY) * (BIGRAM_MULTIPLIER_MAX - BIGRAM_MULTIPLIER_MIN) + BIGRAM_MULTIPLIER_MIN; /* Log.d(TAG,"bigram num: " + bigramSuggestion + " wordB: " + mBigramSuggestions.get(bigramSuggestion).toString() - + " currentPriority: " + freq + " bigramPriority: " - + mBigramPriorities[bigramSuggestion] + + " currentScore: " + score + " bigramScore: " + + mBigramScores[bigramSuggestion] + " multiplier: " + multiplier); */ - freq = (int)Math.round((freq * multiplier)); + score = (int)Math.round((score * multiplier)); } } - // Check the last one's priority and bail - if (priorities[prefMaxSuggestions - 1] >= freq) return true; + // Check the last one's score and bail + if (sortedScores[prefMaxSuggestions - 1] >= score) return true; while (pos < prefMaxSuggestions) { - if (priorities[pos] < freq - || (priorities[pos] == freq && length < suggestions.get(pos).length())) { + if (sortedScores[pos] < score + || (sortedScores[pos] == score && length < suggestions.get(pos).length())) { break; } pos++; @@ -451,11 +514,10 @@ public class Suggest implements Dictionary.WordCallback { return true; } - System.arraycopy(priorities, pos, priorities, pos + 1, - prefMaxSuggestions - pos - 1); - priorities[pos] = freq; + System.arraycopy(sortedScores, pos, sortedScores, pos + 1, prefMaxSuggestions - pos - 1); + sortedScores[pos] = score; int poolSize = mStringPool.size(); - StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) + StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) : new StringBuilder(getApproxMaxWordLength()); sb.setLength(0); // TODO: Must pay attention to locale when changing case. @@ -501,16 +563,6 @@ public class Suggest implements Dictionary.WordCallback { return -1; } - public boolean isValidWord(final CharSequence word) { - if (word == null || word.length() == 0) { - return false; - } - return mMainDict.isValidWord(word) - || (mUserDictionary != null && mUserDictionary.isValidWord(word)) - || (mAutoDictionary != null && mAutoDictionary.isValidWord(word)) - || (mContactsDictionary != null && mContactsDictionary.isValidWord(word)); - } - private void collectGarbage(ArrayList<CharSequence> suggestions, int prefMaxSuggestions) { int poolSize = mStringPool.size(); int garbageSize = suggestions.size(); @@ -529,8 +581,12 @@ public class Suggest implements Dictionary.WordCallback { } public void close() { - if (mMainDict != null) { - mMainDict.close(); + final Set<Dictionary> dictionaries = new HashSet<Dictionary>(); + dictionaries.addAll(mUnigramDictionaries.values()); + dictionaries.addAll(mBigramDictionaries.values()); + for (final Dictionary dictionary : dictionaries) { + dictionary.close(); } + mMainDict = null; } } diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java new file mode 100644 index 000000000..a8cdfc02e --- /dev/null +++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import android.view.inputmethod.CompletionInfo; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; + +public class SuggestedWords { + public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, null); + + public final List<CharSequence> mWords; + public final boolean mTypedWordValid; + public final boolean mHasMinimalSuggestion; + public final List<SuggestedWordInfo> mSuggestedWordInfoList; + + private SuggestedWords(List<CharSequence> words, boolean typedWordValid, + boolean hasMinimalSuggestion, List<SuggestedWordInfo> suggestedWordInfoList) { + if (words != null) { + mWords = words; + } else { + mWords = Collections.emptyList(); + } + mTypedWordValid = typedWordValid; + mHasMinimalSuggestion = hasMinimalSuggestion; + mSuggestedWordInfoList = suggestedWordInfoList; + } + + public int size() { + return mWords.size(); + } + + public CharSequence getWord(int pos) { + return mWords.get(pos); + } + + public boolean hasAutoCorrectionWord() { + return mHasMinimalSuggestion && size() > 1 && !mTypedWordValid; + } + + public boolean hasWordAboveAutoCorrectionScoreThreshold() { + return mHasMinimalSuggestion && ((size() > 1 && !mTypedWordValid) || mTypedWordValid); + } + + public static class Builder { + private List<CharSequence> mWords = new ArrayList<CharSequence>(); + private boolean mTypedWordValid; + private boolean mHasMinimalSuggestion; + private List<SuggestedWordInfo> mSuggestedWordInfoList = + new ArrayList<SuggestedWordInfo>(); + + public Builder() { + // Nothing to do here. + } + + public Builder addWords(List<CharSequence> words, + List<SuggestedWordInfo> suggestedWordInfoList) { + final int N = words.size(); + for (int i = 0; i < N; ++i) { + SuggestedWordInfo suggestedWordInfo = null; + if (suggestedWordInfoList != null) { + suggestedWordInfo = suggestedWordInfoList.get(i); + } + if (suggestedWordInfo == null) { + suggestedWordInfo = new SuggestedWordInfo(); + } + addWord(words.get(i), suggestedWordInfo); + } + return this; + } + + public Builder addWord(CharSequence word) { + return addWord(word, null, false); + } + + public Builder addWord(CharSequence word, CharSequence debugString, + boolean isPreviousSuggestedWord) { + SuggestedWordInfo info = new SuggestedWordInfo(debugString, isPreviousSuggestedWord); + return addWord(word, info); + } + + private Builder addWord(CharSequence word, SuggestedWordInfo suggestedWordInfo) { + mWords.add(word); + mSuggestedWordInfoList.add(suggestedWordInfo); + return this; + } + + public Builder setApplicationSpecifiedCompletions(CompletionInfo[] infos) { + for (CompletionInfo info : infos) + addWord(info.getText()); + return this; + } + + public Builder setTypedWordValid(boolean typedWordValid) { + mTypedWordValid = typedWordValid; + return this; + } + + public Builder setHasMinimalSuggestion(boolean hasMinimalSuggestion) { + mHasMinimalSuggestion = hasMinimalSuggestion; + return this; + } + + // Should get rid of the first one (what the user typed previously) from suggestions + // and replace it with what the user currently typed. + public Builder addTypedWordAndPreviousSuggestions(CharSequence typedWord, + SuggestedWords previousSuggestions) { + mWords.clear(); + mSuggestedWordInfoList.clear(); + final HashSet<String> alreadySeen = new HashSet<String>(); + addWord(typedWord, null, false); + alreadySeen.add(typedWord.toString()); + final int previousSize = previousSuggestions.size(); + for (int pos = 1; pos < previousSize; pos++) { + final String prevWord = previousSuggestions.getWord(pos).toString(); + // Filter out duplicate suggestion. + if (!alreadySeen.contains(prevWord)) { + addWord(prevWord, null, true); + alreadySeen.add(prevWord); + } + } + mTypedWordValid = false; + mHasMinimalSuggestion = false; + return this; + } + + public SuggestedWords build() { + return new SuggestedWords(mWords, mTypedWordValid, mHasMinimalSuggestion, + mSuggestedWordInfoList); + } + + public int size() { + return mWords.size(); + } + + public CharSequence getWord(int pos) { + return mWords.get(pos); + } + } + + public static class SuggestedWordInfo { + private final CharSequence mDebugString; + private final boolean mPreviousSuggestedWord; + + public SuggestedWordInfo() { + mDebugString = ""; + mPreviousSuggestedWord = false; + } + + public SuggestedWordInfo(CharSequence debugString, boolean previousSuggestedWord) { + mDebugString = debugString; + mPreviousSuggestedWord = previousSuggestedWord; + } + + public String getDebugString() { + if (mDebugString == null) { + return ""; + } else { + return mDebugString.toString(); + } + } + + public boolean isPreviousSuggestedWord () { + return mPreviousSuggestedWord; + } + } +} diff --git a/java/src/com/android/inputmethod/latin/SuggestionSpanPickedNotificationReceiver.java b/java/src/com/android/inputmethod/latin/SuggestionSpanPickedNotificationReceiver.java new file mode 100644 index 000000000..4a3f42d5d --- /dev/null +++ b/java/src/com/android/inputmethod/latin/SuggestionSpanPickedNotificationReceiver.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.latin; + +import com.android.inputmethod.compat.SuggestionSpanUtils; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +public class SuggestionSpanPickedNotificationReceiver extends BroadcastReceiver { + private static final boolean DBG = LatinImeLogger.sDBG; + private static final String TAG = + SuggestionSpanPickedNotificationReceiver.class.getSimpleName(); + + @Override + public void onReceive(Context context, Intent intent) { + if (SuggestionSpanUtils.ACTION_SUGGESTION_PICKED.equals(intent.getAction())) { + if (DBG) { + final String before = intent.getStringExtra( + SuggestionSpanUtils.SUGGESTION_SPAN_PICKED_BEFORE); + final String after = intent.getStringExtra( + SuggestionSpanUtils.SUGGESTION_SPAN_PICKED_AFTER); + Log.d(TAG, "Received notification picked: " + before + "," + after); + } + } + } +} diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java index 9011191f1..de13f3ae4 100644 --- a/java/src/com/android/inputmethod/latin/TextEntryState.java +++ b/java/src/com/android/inputmethod/latin/TextEntryState.java @@ -16,116 +16,43 @@ package com.android.inputmethod.latin; -import android.content.Context; -import android.inputmethodservice.Keyboard.Key; -import android.text.format.DateFormat; -import android.util.Log; +import com.android.inputmethod.latin.Utils.RingCharBuffer; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Calendar; +import android.util.Log; public class TextEntryState { - - private static final boolean DBG = false; - - private static final String TAG = "TextEntryState"; - - private static boolean LOGGING = false; - - private static int sBackspaceCount = 0; - - private static int sAutoSuggestCount = 0; - - private static int sAutoSuggestUndoneCount = 0; - - private static int sManualSuggestCount = 0; - - private static int sWordNotInDictionaryCount = 0; - - private static int sSessionCount = 0; - - private static int sTypedChars; - - private static int sActualChars; - - public enum State { - UNKNOWN, - START, - IN_WORD, - ACCEPTED_DEFAULT, - PICKED_SUGGESTION, - PUNCTUATION_AFTER_WORD, - PUNCTUATION_AFTER_ACCEPTED, - SPACE_AFTER_ACCEPTED, - SPACE_AFTER_PICKED, - UNDO_COMMIT, - CORRECTING, - PICKED_CORRECTION; + private static final String TAG = TextEntryState.class.getSimpleName(); + private static final boolean DEBUG = false; + + private static final int UNKNOWN = 0; + private static final int START = 1; + private static final int IN_WORD = 2; + private static final int ACCEPTED_DEFAULT = 3; + private static final int PICKED_SUGGESTION = 4; + private static final int PUNCTUATION_AFTER_WORD = 5; + private static final int PUNCTUATION_AFTER_ACCEPTED = 6; + private static final int SPACE_AFTER_ACCEPTED = 7; + private static final int SPACE_AFTER_PICKED = 8; + private static final int UNDO_COMMIT = 9; + private static final int RECORRECTING = 10; + private static final int PICKED_RECORRECTION = 11; + + private static int sState = UNKNOWN; + private static int sPreviousState = UNKNOWN; + + private static void setState(final int newState) { + sPreviousState = sState; + sState = newState; } - private static State sState = State.UNKNOWN; - - private static FileOutputStream sKeyLocationFile; - private static FileOutputStream sUserActionFile; - - public static void newSession(Context context) { - sSessionCount++; - sAutoSuggestCount = 0; - sBackspaceCount = 0; - sAutoSuggestUndoneCount = 0; - sManualSuggestCount = 0; - sWordNotInDictionaryCount = 0; - sTypedChars = 0; - sActualChars = 0; - sState = State.START; - - if (LOGGING) { - try { - sKeyLocationFile = context.openFileOutput("key.txt", Context.MODE_APPEND); - sUserActionFile = context.openFileOutput("action.txt", Context.MODE_APPEND); - } catch (IOException ioe) { - Log.e("TextEntryState", "Couldn't open file for output: " + ioe); - } - } - } - - public static void endSession() { - if (sKeyLocationFile == null) { - return; - } - try { - sKeyLocationFile.close(); - // Write to log file - // Write timestamp, settings, - String out = DateFormat.format("MM:dd hh:mm:ss", Calendar.getInstance().getTime()) - .toString() - + " BS: " + sBackspaceCount - + " auto: " + sAutoSuggestCount - + " manual: " + sManualSuggestCount - + " typed: " + sWordNotInDictionaryCount - + " undone: " + sAutoSuggestUndoneCount - + " saved: " + ((float) (sActualChars - sTypedChars) / sActualChars) - + "\n"; - sUserActionFile.write(out.getBytes()); - sUserActionFile.close(); - sKeyLocationFile = null; - sUserActionFile = null; - } catch (IOException ioe) { - - } - } - - public static void acceptedDefault(CharSequence typedWord, CharSequence actualWord) { + public static void acceptedDefault(CharSequence typedWord, CharSequence actualWord, + int separatorCode) { if (typedWord == null) return; - if (!typedWord.equals(actualWord)) { - sAutoSuggestCount++; - } - sTypedChars += typedWord.length(); - sActualChars += actualWord.length(); - sState = State.ACCEPTED_DEFAULT; - LatinImeLogger.logOnAutoSuggestion(typedWord.toString(), actualWord.toString()); - displayState(); + setState(ACCEPTED_DEFAULT); + LatinImeLogger.logOnAutoCorrection( + typedWord.toString(), actualWord.toString(), separatorCode); + if (DEBUG) + displayState("acceptedDefault", "typedWord", typedWord, "actualWord", actualWord); } // State.ACCEPTED_DEFAULT will be changed to other sub-states @@ -134,145 +61,176 @@ public class TextEntryState { public static void backToAcceptedDefault(CharSequence typedWord) { if (typedWord == null) return; switch (sState) { - case SPACE_AFTER_ACCEPTED: - case PUNCTUATION_AFTER_ACCEPTED: - case IN_WORD: - sState = State.ACCEPTED_DEFAULT; - break; + case SPACE_AFTER_ACCEPTED: + case PUNCTUATION_AFTER_ACCEPTED: + case IN_WORD: + setState(ACCEPTED_DEFAULT); + break; + default: + break; } - displayState(); + if (DEBUG) displayState("backToAcceptedDefault", "typedWord", typedWord); } public static void acceptedTyped(CharSequence typedWord) { - sWordNotInDictionaryCount++; - sState = State.PICKED_SUGGESTION; - displayState(); + setState(PICKED_SUGGESTION); + if (DEBUG) displayState("acceptedTyped", "typedWord", typedWord); } public static void acceptedSuggestion(CharSequence typedWord, CharSequence actualWord) { - sManualSuggestCount++; - State oldState = sState; - if (typedWord.equals(actualWord)) { - acceptedTyped(typedWord); - } - if (oldState == State.CORRECTING || oldState == State.PICKED_CORRECTION) { - sState = State.PICKED_CORRECTION; + if (sState == RECORRECTING || sState == PICKED_RECORRECTION) { + setState(PICKED_RECORRECTION); } else { - sState = State.PICKED_SUGGESTION; + setState(PICKED_SUGGESTION); } - displayState(); + if (DEBUG) + displayState("acceptedSuggestion", "typedWord", typedWord, "actualWord", actualWord); + } + + public static void selectedForRecorrection() { + setState(RECORRECTING); + if (DEBUG) displayState("selectedForRecorrection"); } - public static void selectedForCorrection() { - sState = State.CORRECTING; - displayState(); + public static void onAbortRecorrection() { + if (sState == RECORRECTING || sState == PICKED_RECORRECTION) { + setState(START); + } + if (DEBUG) displayState("onAbortRecorrection"); } - public static void typedCharacter(char c, boolean isSeparator) { - boolean isSpace = c == ' '; + public static void typedCharacter(char c, boolean isSeparator, int x, int y) { + final boolean isSpace = (c == ' '); switch (sState) { - case IN_WORD: - if (isSpace || isSeparator) { - sState = State.START; - } else { - // State hasn't changed. - } - break; - case ACCEPTED_DEFAULT: - case SPACE_AFTER_PICKED: - if (isSpace) { - sState = State.SPACE_AFTER_ACCEPTED; - } else if (isSeparator) { - sState = State.PUNCTUATION_AFTER_ACCEPTED; - } else { - sState = State.IN_WORD; - } - break; - case PICKED_SUGGESTION: - case PICKED_CORRECTION: - if (isSpace) { - sState = State.SPACE_AFTER_PICKED; - } else if (isSeparator) { - // Swap - sState = State.PUNCTUATION_AFTER_ACCEPTED; - } else { - sState = State.IN_WORD; - } - break; - case START: - case UNKNOWN: - case SPACE_AFTER_ACCEPTED: - case PUNCTUATION_AFTER_ACCEPTED: - case PUNCTUATION_AFTER_WORD: - if (!isSpace && !isSeparator) { - sState = State.IN_WORD; - } else { - sState = State.START; - } - break; - case UNDO_COMMIT: - if (isSpace || isSeparator) { - sState = State.ACCEPTED_DEFAULT; - } else { - sState = State.IN_WORD; - } - break; - case CORRECTING: - sState = State.START; - break; + case IN_WORD: + if (isSpace || isSeparator) { + setState(START); + } else { + // State hasn't changed. + } + break; + case ACCEPTED_DEFAULT: + case SPACE_AFTER_PICKED: + case PUNCTUATION_AFTER_ACCEPTED: + if (isSpace) { + setState(SPACE_AFTER_ACCEPTED); + } else if (isSeparator) { + // Swap + setState(PUNCTUATION_AFTER_ACCEPTED); + } else { + setState(IN_WORD); + } + break; + case PICKED_SUGGESTION: + case PICKED_RECORRECTION: + if (isSpace) { + setState(SPACE_AFTER_PICKED); + } else if (isSeparator) { + // Swap + setState(PUNCTUATION_AFTER_ACCEPTED); + } else { + setState(IN_WORD); + } + break; + case START: + case UNKNOWN: + case SPACE_AFTER_ACCEPTED: + case PUNCTUATION_AFTER_WORD: + if (!isSpace && !isSeparator) { + setState(IN_WORD); + } else { + setState(START); + } + break; + case UNDO_COMMIT: + if (isSpace || isSeparator) { + setState(ACCEPTED_DEFAULT); + } else { + setState(IN_WORD); + } + break; + case RECORRECTING: + setState(START); + break; + } + RingCharBuffer.getInstance().push(c, x, y); + if (isSeparator) { + LatinImeLogger.logOnInputSeparator(); + } else { + LatinImeLogger.logOnInputChar(); } - displayState(); + if (DEBUG) displayState("typedCharacter", "char", c, "isSeparator", isSeparator); } public static void backspace() { - if (sState == State.ACCEPTED_DEFAULT) { - sState = State.UNDO_COMMIT; - sAutoSuggestUndoneCount++; - LatinImeLogger.logOnAutoSuggestionCanceled(); - } else if (sState == State.UNDO_COMMIT) { - sState = State.IN_WORD; + if (sState == ACCEPTED_DEFAULT) { + setState(UNDO_COMMIT); + LatinImeLogger.logOnAutoCorrectionCancelled(); + } else if (sState == UNDO_COMMIT) { + setState(IN_WORD); } - sBackspaceCount++; - displayState(); + if (DEBUG) displayState("backspace"); } public static void reset() { - sState = State.START; - displayState(); + setState(START); + if (DEBUG) displayState("reset"); } - public static State getState() { - if (DBG) { - Log.d(TAG, "Returning state = " + sState); - } - return sState; + public static boolean isAcceptedDefault() { + return sState == ACCEPTED_DEFAULT; } - public static boolean isCorrecting() { - return sState == State.CORRECTING || sState == State.PICKED_CORRECTION; + public static boolean isSpaceAfterPicked() { + return sState == SPACE_AFTER_PICKED; } - public static void keyPressedAt(Key key, int x, int y) { - if (LOGGING && sKeyLocationFile != null && key.codes[0] >= 32) { - String out = - "KEY: " + (char) key.codes[0] - + " X: " + x - + " Y: " + y - + " MX: " + (key.x + key.width / 2) - + " MY: " + (key.y + key.height / 2) - + "\n"; - try { - sKeyLocationFile.write(out.getBytes()); - } catch (IOException ioe) { - // TODO: May run out of space - } + public static boolean isUndoCommit() { + return sState == UNDO_COMMIT; + } + + public static boolean isPunctuationAfterAccepted() { + return sState == PUNCTUATION_AFTER_ACCEPTED; + } + + public static boolean isRecorrecting() { + return sState == RECORRECTING || sState == PICKED_RECORRECTION; + } + + public static String getState() { + return stateName(sState); + } + + private static String stateName(int state) { + switch (state) { + case START: return "START"; + case IN_WORD: return "IN_WORD"; + case ACCEPTED_DEFAULT: return "ACCEPTED_DEFAULT"; + case PICKED_SUGGESTION: return "PICKED_SUGGESTION"; + case PUNCTUATION_AFTER_WORD: return "PUNCTUATION_AFTER_WORD"; + case PUNCTUATION_AFTER_ACCEPTED: return "PUNCTUATION_AFTER_ACCEPTED"; + case SPACE_AFTER_ACCEPTED: return "SPACE_AFTER_ACCEPTED"; + case SPACE_AFTER_PICKED: return "SPACE_AFTER_PICKED"; + case UNDO_COMMIT: return "UNDO_COMMIT"; + case RECORRECTING: return "RECORRECTING"; + case PICKED_RECORRECTION: return "PICKED_RECORRECTION"; + default: return "UNKNOWN"; } } - private static void displayState() { - if (DBG) { - Log.d(TAG, "State = " + sState); + private static void displayState(String title, Object ... args) { + final StringBuilder sb = new StringBuilder(title); + sb.append(':'); + for (int i = 0; i < args.length; i += 2) { + sb.append(' '); + sb.append(args[i]); + sb.append('='); + sb.append(args[i+1].toString()); } + sb.append(" state="); + sb.append(stateName(sState)); + sb.append(" previous="); + sb.append(stateName(sPreviousState)); + Log.d(TAG, sb.toString()); } } - diff --git a/java/src/com/android/inputmethod/latin/Tutorial.java b/java/src/com/android/inputmethod/latin/Tutorial.java deleted file mode 100644 index d3eaf30c6..000000000 --- a/java/src/com/android/inputmethod/latin/Tutorial.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.latin; - -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.os.Message; -import android.text.Layout; -import android.text.SpannableStringBuilder; -import android.text.StaticLayout; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnTouchListener; -import android.widget.PopupWindow; -import android.widget.TextView; - -import java.util.ArrayList; -import java.util.List; - -public class Tutorial implements OnTouchListener { - - private List<Bubble> mBubbles = new ArrayList<Bubble>(); - private View mInputView; - private LatinIME mIme; - private int[] mLocation = new int[2]; - - private static final int MSG_SHOW_BUBBLE = 0; - - private int mBubbleIndex; - - Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_SHOW_BUBBLE: - Bubble bubba = (Bubble) msg.obj; - bubba.show(mLocation[0], mLocation[1]); - break; - } - } - }; - - class Bubble { - Drawable bubbleBackground; - int x; - int y; - int width; - int gravity; - CharSequence text; - boolean dismissOnTouch; - boolean dismissOnClose; - PopupWindow window; - TextView textView; - View inputView; - - Bubble(Context context, View inputView, - int backgroundResource, int bx, int by, int textResource1, int textResource2) { - bubbleBackground = context.getResources().getDrawable(backgroundResource); - x = bx; - y = by; - width = (int) (inputView.getWidth() * 0.9); - this.gravity = Gravity.TOP | Gravity.LEFT; - text = new SpannableStringBuilder() - .append(context.getResources().getText(textResource1)) - .append("\n") - .append(context.getResources().getText(textResource2)); - this.dismissOnTouch = true; - this.dismissOnClose = false; - this.inputView = inputView; - window = new PopupWindow(context); - window.setBackgroundDrawable(null); - LayoutInflater inflate = - (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - textView = (TextView) inflate.inflate(R.layout.bubble_text, null); - textView.setBackgroundDrawable(bubbleBackground); - textView.setText(text); - //textView.setText(textResource1); - window.setContentView(textView); - window.setFocusable(false); - window.setTouchable(true); - window.setOutsideTouchable(false); - } - - private int chooseSize(PopupWindow pop, View parentView, CharSequence text, TextView tv) { - int wid = tv.getPaddingLeft() + tv.getPaddingRight(); - int ht = tv.getPaddingTop() + tv.getPaddingBottom(); - - /* - * Figure out how big the text would be if we laid it out to the - * full width of this view minus the border. - */ - int cap = width - wid; - - Layout l = new StaticLayout(text, tv.getPaint(), cap, - Layout.Alignment.ALIGN_NORMAL, 1, 0, true); - float max = 0; - for (int i = 0; i < l.getLineCount(); i++) { - max = Math.max(max, l.getLineWidth(i)); - } - - /* - * Now set the popup size to be big enough for the text plus the border. - */ - pop.setWidth(width); - pop.setHeight(ht + l.getHeight()); - return l.getHeight(); - } - - void show(int offx, int offy) { - int textHeight = chooseSize(window, inputView, text, textView); - offy -= textView.getPaddingTop() + textHeight; - if (inputView.getVisibility() == View.VISIBLE - && inputView.getWindowVisibility() == View.VISIBLE) { - try { - if ((gravity & Gravity.BOTTOM) == Gravity.BOTTOM) offy -= window.getHeight(); - if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) offx -= window.getWidth(); - textView.setOnTouchListener(new View.OnTouchListener() { - public boolean onTouch(View view, MotionEvent me) { - Tutorial.this.next(); - return true; - } - }); - window.showAtLocation(inputView, Gravity.NO_GRAVITY, x + offx, y + offy); - } catch (Exception e) { - // Input view is not valid - } - } - } - - void hide() { - if (window.isShowing()) { - textView.setOnTouchListener(null); - window.dismiss(); - } - } - - boolean isShowing() { - return window.isShowing(); - } - } - - public Tutorial(LatinIME ime, LatinKeyboardView inputView) { - Context context = inputView.getContext(); - mIme = ime; - int inputWidth = inputView.getWidth(); - final int x = inputWidth / 20; // Half of 1/10th - Bubble bWelcome = new Bubble(context, inputView, - R.drawable.dialog_bubble_step02, x, 0, - R.string.tip_to_open_keyboard, R.string.touch_to_continue); - mBubbles.add(bWelcome); - Bubble bAccents = new Bubble(context, inputView, - R.drawable.dialog_bubble_step02, x, 0, - R.string.tip_to_view_accents, R.string.touch_to_continue); - mBubbles.add(bAccents); - Bubble b123 = new Bubble(context, inputView, - R.drawable.dialog_bubble_step07, x, 0, - R.string.tip_to_open_symbols, R.string.touch_to_continue); - mBubbles.add(b123); - Bubble bABC = new Bubble(context, inputView, - R.drawable.dialog_bubble_step07, x, 0, - R.string.tip_to_close_symbols, R.string.touch_to_continue); - mBubbles.add(bABC); - Bubble bSettings = new Bubble(context, inputView, - R.drawable.dialog_bubble_step07, x, 0, - R.string.tip_to_launch_settings, R.string.touch_to_continue); - mBubbles.add(bSettings); - Bubble bDone = new Bubble(context, inputView, - R.drawable.dialog_bubble_step02, x, 0, - R.string.tip_to_start_typing, R.string.touch_to_finish); - mBubbles.add(bDone); - mInputView = inputView; - } - - void start() { - mInputView.getLocationInWindow(mLocation); - mBubbleIndex = -1; - mInputView.setOnTouchListener(this); - next(); - } - - boolean next() { - if (mBubbleIndex >= 0) { - // If the bubble is not yet showing, don't move to the next. - if (!mBubbles.get(mBubbleIndex).isShowing()) { - return true; - } - // Hide all previous bubbles as well, as they may have had a delayed show - for (int i = 0; i <= mBubbleIndex; i++) { - mBubbles.get(i).hide(); - } - } - mBubbleIndex++; - if (mBubbleIndex >= mBubbles.size()) { - mInputView.setOnTouchListener(null); - mIme.sendDownUpKeyEvents(-1); // Inform the setupwizard that tutorial is in last bubble - mIme.tutorialDone(); - return false; - } - if (mBubbleIndex == 3 || mBubbleIndex == 4) { - mIme.mKeyboardSwitcher.toggleSymbols(); - } - mHandler.sendMessageDelayed( - mHandler.obtainMessage(MSG_SHOW_BUBBLE, mBubbles.get(mBubbleIndex)), 500); - return true; - } - - void hide() { - for (int i = 0; i < mBubbles.size(); i++) { - mBubbles.get(i).hide(); - } - mInputView.setOnTouchListener(null); - } - - boolean close() { - mHandler.removeMessages(MSG_SHOW_BUBBLE); - hide(); - return true; - } - - public boolean onTouch(View v, MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { - next(); - } - return true; - } -} diff --git a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java index 67d9c0bcf..5b615ca29 100644 --- a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java +++ b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Google Inc. + * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -16,10 +16,6 @@ package com.android.inputmethod.latin; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; - import android.content.ContentValues; import android.content.Context; import android.database.Cursor; @@ -30,6 +26,10 @@ import android.os.AsyncTask; import android.provider.BaseColumns; import android.util.Log; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; + /** * Stores all the pairs user types in databases. Prune the database if the size * gets too big. Unlike AutoDictionary, it even stores the pairs that are already @@ -44,12 +44,6 @@ public class UserBigramDictionary extends ExpandableDictionary { /** Maximum frequency for all pairs */ private static final int FREQUENCY_MAX = 127; - /** - * If this pair is typed 6 times, it would be suggested. - * Should be smaller than ContactsDictionary.FREQUENCY_FOR_CONTACTS_BIGRAM - */ - protected static final int SUGGEST_THRESHOLD = 6 * FREQUENCY_FOR_TYPED; - /** Maximum number of pairs. Pruning will start when databases goes above this number. */ private static int sMaxUserBigrams = 10000; @@ -108,25 +102,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(); } } @@ -164,10 +158,14 @@ public class UserBigramDictionary extends ExpandableDictionary { * Pair will be added to the userbigram database. */ public int addBigrams(String word1, String word2) { - // remove caps + // remove caps if second word is autocapitalized if (mIme != null && mIme.getCurrentWord().isAutoCapitalized()) { word2 = Character.toLowerCase(word2.charAt(0)) + word2.substring(1); } + // Do not insert a word as a bigram of itself + if (word1.equals(word2)) { + return 0; + } int freq = super.addBigram(word1, word2, FREQUENCY_FOR_TYPED); if (freq > FREQUENCY_MAX) freq = FREQUENCY_MAX; @@ -357,7 +355,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 +366,7 @@ public class UserBigramDictionary extends ExpandableDictionary { } else { // new pair Long pairIdLong = db.insert(MAIN_TABLE_NAME, null, - getContentValues(bi.word1, bi.word2, mLocale)); + getContentValues(bi.mWord1, bi.mWord2, mLocale)); pairId = pairIdLong.intValue(); } c.close(); diff --git a/java/src/com/android/inputmethod/latin/UserDictionary.java b/java/src/com/android/inputmethod/latin/UserDictionary.java index 49b95e9aa..c06bd736e 100644 --- a/java/src/com/android/inputmethod/latin/UserDictionary.java +++ b/java/src/com/android/inputmethod/latin/UserDictionary.java @@ -21,18 +21,21 @@ import android.content.ContentValues; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; +import android.net.Uri; import android.provider.UserDictionary.Words; public class UserDictionary extends ExpandableDictionary { - private static final String[] PROJECTION = { - Words._ID, + private static final String[] PROJECTION_QUERY = { Words.WORD, - Words.FREQUENCY + Words.FREQUENCY, }; - private static final int INDEX_WORD = 1; - private static final int INDEX_FREQUENCY = 2; + private static final String[] PROJECTION_ADD = { + Words._ID, + Words.FREQUENCY, + Words.LOCALE, + }; private ContentObserver mObserver; private String mLocale; @@ -66,7 +69,7 @@ public class UserDictionary extends ExpandableDictionary { @Override public void loadDictionaryAsync() { Cursor cursor = getContext().getContentResolver() - .query(Words.CONTENT_URI, PROJECTION, "(locale IS NULL) or (locale=?)", + .query(Words.CONTENT_URI, PROJECTION_QUERY, "(locale IS NULL) or (locale=?)", new String[] { mLocale }, null); addWords(cursor); } @@ -80,7 +83,7 @@ public class UserDictionary extends ExpandableDictionary { * @TODO use a higher or float range for frequency */ @Override - public synchronized void addWord(String word, int frequency) { + public synchronized void addWord(final String word, final int frequency) { // Force load the dictionary here synchronously if (getRequiresReload()) loadDictionaryAsync(); // Safeguard against adding long words. Can cause stack overflow. @@ -97,8 +100,24 @@ public class UserDictionary extends ExpandableDictionary { final ContentResolver contentResolver = getContext().getContentResolver(); new Thread("addWord") { + @Override public void run() { - contentResolver.insert(Words.CONTENT_URI, values); + Cursor cursor = contentResolver.query(Words.CONTENT_URI, PROJECTION_ADD, + "word=? and ((locale IS NULL) or (locale=?))", + new String[] { word, mLocale }, null); + if (cursor != null && cursor.moveToFirst()) { + String locale = cursor.getString(cursor.getColumnIndex(Words.LOCALE)); + // If locale is null, we will not override the entry. + if (locale != null && locale.equals(mLocale.toString())) { + long id = cursor.getLong(cursor.getColumnIndex(Words._ID)); + Uri uri = Uri.withAppendedPath(Words.CONTENT_URI, Long.toString(id)); + // Update the entry with new frequency value. + contentResolver.update(uri, values, null, null); + } + } else { + // Insert new entry. + contentResolver.insert(Words.CONTENT_URI, values); + } } }.start(); @@ -107,9 +126,8 @@ public class UserDictionary extends ExpandableDictionary { } @Override - public synchronized void getWords(final WordComposer codes, final WordCallback callback, - int[] nextLettersFrequencies) { - super.getWords(codes, callback, nextLettersFrequencies); + public synchronized void getWords(final WordComposer codes, final WordCallback callback) { + super.getWords(codes, callback); } @Override @@ -119,12 +137,14 @@ public class UserDictionary extends ExpandableDictionary { private void addWords(Cursor cursor) { clearDictionary(); - + if (cursor == null) return; final int maxWordLength = getMaxWordLength(); if (cursor.moveToFirst()) { + final int indexWord = cursor.getColumnIndex(Words.WORD); + final int indexFrequency = cursor.getColumnIndex(Words.FREQUENCY); while (!cursor.isAfterLast()) { - String word = cursor.getString(INDEX_WORD); - int frequency = cursor.getInt(INDEX_FREQUENCY); + String word = cursor.getString(indexWord); + int frequency = cursor.getInt(indexFrequency); // Safeguard against adding really long words. Stack may overflow due // to recursion if (word.length() < maxWordLength) { diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java new file mode 100644 index 000000000..6bdc0a857 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/Utils.java @@ -0,0 +1,718 @@ +/* + * 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.compat.InputMethodInfoCompatWrapper; +import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; +import com.android.inputmethod.compat.InputMethodSubtypeCompatWrapper; +import com.android.inputmethod.compat.InputTypeCompatUtils; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardId; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.inputmethodservice.InputMethodService; +import android.os.AsyncTask; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Process; +import android.text.InputType; +import android.text.format.DateUtils; +import android.util.Log; +import android.view.inputmethod.EditorInfo; + +import 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.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; + +public class Utils { + private static final String TAG = Utils.class.getSimpleName(); + private static final int MINIMUM_SAFETY_NET_CHAR_LENGTH = 4; + private static boolean DBG = LatinImeLogger.sDBG; + private static boolean DBG_EDIT_DISTANCE = false; + + private Utils() { + // Intentional empty constructor for utility class. + } + + /** + * Cancel an {@link AsyncTask}. + * + * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this + * task should be interrupted; otherwise, in-progress tasks are allowed + * to complete. + */ + public static void cancelTask(AsyncTask<?, ?, ?> task, boolean mayInterruptIfRunning) { + if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) { + task.cancel(mayInterruptIfRunning); + } + } + + public static class GCUtils { + private static final String GC_TAG = GCUtils.class.getSimpleName(); + public static final int GC_TRY_COUNT = 2; + // GC_TRY_LOOP_MAX is used for the hard limit of GC wait, + // GC_TRY_LOOP_MAX should be greater than GC_TRY_COUNT. + public static final int GC_TRY_LOOP_MAX = 5; + private static final long GC_INTERVAL = DateUtils.SECOND_IN_MILLIS; + private static GCUtils sInstance = new GCUtils(); + private int mGCTryCount = 0; + + public static GCUtils getInstance() { + return sInstance; + } + + public void reset() { + mGCTryCount = 0; + } + + public boolean tryGCOrWait(String metaData, Throwable t) { + if (mGCTryCount == 0) { + System.gc(); + } + if (++mGCTryCount > GC_TRY_COUNT) { + LatinImeLogger.logOnException(metaData, t); + return false; + } else { + try { + Thread.sleep(GC_INTERVAL); + return true; + } catch (InterruptedException e) { + Log.e(GC_TAG, "Sleep was interrupted."); + LatinImeLogger.logOnException(metaData, t); + return false; + } + } + } + } + + public static boolean hasMultipleEnabledIMEsOrSubtypes(InputMethodManagerCompatWrapper imm) { + final List<InputMethodInfoCompatWrapper> enabledImis = imm.getEnabledInputMethodList(); + + // Filters out IMEs that have auxiliary subtypes only (including either implicitly or + // explicitly enabled ones). + final ArrayList<InputMethodInfoCompatWrapper> filteredImis = + new ArrayList<InputMethodInfoCompatWrapper>(); + + outerloop: + for (InputMethodInfoCompatWrapper imi : enabledImis) { + // We can return true immediately after we find two or more filtered IMEs. + if (filteredImis.size() > 1) return true; + final List<InputMethodSubtypeCompatWrapper> subtypes = + imm.getEnabledInputMethodSubtypeList(imi, true); + // IMEs that have no subtypes should be included. + if (subtypes.isEmpty()) { + filteredImis.add(imi); + continue; + } + // IMEs that have one or more non-auxiliary subtypes should be included. + for (InputMethodSubtypeCompatWrapper subtype : subtypes) { + if (!subtype.isAuxiliary()) { + filteredImis.add(imi); + continue outerloop; + } + } + } + + return filteredImis.size() > 1 + // imm.getEnabledInputMethodSubtypeList(null, false) will return the current IME's enabled + // input method subtype (The current IME should be LatinIME.) + || imm.getEnabledInputMethodSubtypeList(null, false).size() > 1; + } + + public static String getInputMethodId(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; + } + throw new RuntimeException("Can not find input method id for " + packageName); + } + + public static boolean shouldBlockedBySafetyNetForAutoCorrection(SuggestedWords suggestions, + Suggest suggest) { + // Safety net for auto correction. + // Actually if we hit this safety net, it's actually a bug. + if (suggestions.size() <= 1 || suggestions.mTypedWordValid) return false; + // If user selected aggressive auto correction mode, there is no need to use the safety + // net. + if (suggest.isAggressiveAutoCorrectionMode()) return false; + CharSequence typedWord = suggestions.getWord(0); + // If the length of typed word is less than MINIMUM_SAFETY_NET_CHAR_LENGTH, + // we should not use net because relatively edit distance can be big. + if (typedWord.length() < MINIMUM_SAFETY_NET_CHAR_LENGTH) return false; + CharSequence candidateWord = suggestions.getWord(1); + final int typedWordLength = typedWord.length(); + final int maxEditDistanceOfNativeDictionary = typedWordLength < 5 ? 2 : typedWordLength / 2; + final int distance = Utils.editDistance(typedWord, candidateWord); + if (DBG) { + Log.d(TAG, "Autocorrected edit distance = " + distance + + ", " + maxEditDistanceOfNativeDictionary); + } + if (distance > maxEditDistanceOfNativeDictionary) { + if (DBG) { + Log.d(TAG, "Safety net: before = " + typedWord + ", after = " + candidateWord); + Log.w(TAG, "(Error) The edit distance of this correction exceeds limit. " + + "Turning off auto-correction."); + } + return true; + } else { + return false; + } + } + + /* package */ static class RingCharBuffer { + private static RingCharBuffer sRingCharBuffer = new RingCharBuffer(); + private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC'; + private static final int INVALID_COORDINATE = -2; + /* package */ static final int BUFSIZE = 20; + private InputMethodService mContext; + private boolean mEnabled = false; + private boolean mUsabilityStudy = false; + private int mEnd = 0; + /* package */ int mLength = 0; + private char[] mCharBuf = new char[BUFSIZE]; + private int[] mXBuf = new int[BUFSIZE]; + private int[] mYBuf = new int[BUFSIZE]; + + private RingCharBuffer() { + // Intentional empty constructor for singleton. + } + public static RingCharBuffer getInstance() { + return sRingCharBuffer; + } + public static RingCharBuffer init(InputMethodService context, boolean enabled, + boolean usabilityStudy) { + sRingCharBuffer.mContext = context; + sRingCharBuffer.mEnabled = enabled || usabilityStudy; + sRingCharBuffer.mUsabilityStudy = usabilityStudy; + UsabilityStudyLogUtils.getInstance().init(context); + return sRingCharBuffer; + } + private int normalize(int in) { + int ret = in % BUFSIZE; + return ret < 0 ? ret + BUFSIZE : ret; + } + public void push(char c, int x, int y) { + if (!mEnabled) return; + if (mUsabilityStudy) { + UsabilityStudyLogUtils.getInstance().writeChar(c, x, y); + } + mCharBuf[mEnd] = c; + mXBuf[mEnd] = x; + mYBuf[mEnd] = y; + mEnd = normalize(mEnd + 1); + if (mLength < BUFSIZE) { + ++mLength; + } + } + public char pop() { + if (mLength < 1) { + return PLACEHOLDER_DELIMITER_CHAR; + } else { + mEnd = normalize(mEnd - 1); + --mLength; + return mCharBuf[mEnd]; + } + } + public char getBackwardNthChar(int n) { + if (mLength <= n || n < 0) { + return PLACEHOLDER_DELIMITER_CHAR; + } else { + return mCharBuf[normalize(mEnd - n - 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 getLastWord(int ignoreCharCount) { + StringBuilder sb = new StringBuilder(); + int i = ignoreCharCount; + for (; i < mLength; ++i) { + char c = mCharBuf[normalize(mEnd - 1 - i)]; + if (!((LatinIME)mContext).isWordSeparator(c)) { + break; + } + } + for (; 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; + } + } + + + /* Damerau-Levenshtein distance */ + 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) { + final char sc = Character.toLowerCase(s.charAt(i)); + final char tc = Character.toLowerCase(t.charAt(j)); + final int cost = sc == tc ? 0 : 1; + dp[i + 1][j + 1] = Math.min( + dp[i][j + 1] + 1, Math.min(dp[i + 1][j] + 1, dp[i][j] + cost)); + // Overwrite for transposition cases + if (i > 0 && j > 0 + && sc == Character.toLowerCase(t.charAt(j - 1)) + && tc == Character.toLowerCase(s.charAt(i - 1))) { + dp[i + 1][j + 1] = Math.min(dp[i + 1][j + 1], dp[i - 1][j - 1] + cost); + } + } + } + if (DBG_EDIT_DISTANCE) { + Log.d(TAG, "editDistance:" + s + "," + t); + for (int i = 0; i < dp.length; ++i) { + StringBuffer sb = new StringBuffer(); + for (int j = 0; j < dp[i].length; ++j) { + sb.append(dp[i][j]).append(','); + } + Log.d(TAG, i + ":" + sb.toString()); + } + } + return dp[sl][tl]; + } + + // Get the current stack trace + public static String getStackTrace() { + StringBuilder sb = new StringBuilder(); + try { + throw new RuntimeException(); + } catch (RuntimeException e) { + StackTraceElement[] frames = e.getStackTrace(); + // Start at 1 because the first frame is here and we don't care about it + for (int j = 1; j < frames.length; ++j) sb.append(frames[j].toString() + "\n"); + } + return sb.toString(); + } + + // In dictionary.cpp, getSuggestion() method, + // suggestion scores are computed using the below formula. + // original score + // := pow(mTypedLetterMultiplier (this is defined 2), + // (the number of matched characters between typed word and suggested word)) + // * (individual word's score which defined in the unigram dictionary, + // and this score is defined in range [0, 255].) + // Then, the following processing is applied. + // - If the dictionary word is matched up to the point of the user entry + // (full match up to min(before.length(), after.length()) + // => Then multiply by FULL_MATCHED_WORDS_PROMOTION_RATE (this is defined 1.2) + // - If the word is a true full match except for differences in accents or + // capitalization, then treat it as if the score was 255. + // - If before.length() == after.length() + // => multiply by mFullWordMultiplier (this is defined 2)) + // So, maximum original score is pow(2, min(before.length(), after.length())) * 255 * 2 * 1.2 + // For historical reasons we ignore the 1.2 modifier (because the measure for a good + // autocorrection threshold was done at a time when it didn't exist). This doesn't change + // the result. + // So, we can normalize original score by dividing pow(2, min(b.l(),a.l())) * 255 * 2. + private static final int MAX_INITIAL_SCORE = 255; + private static final int TYPED_LETTER_MULTIPLIER = 2; + private static final int FULL_WORD_MULTIPLIER = 2; + private static final int S_INT_MAX = 2147483647; + public static double calcNormalizedScore(CharSequence before, CharSequence after, int score) { + final int beforeLength = before.length(); + final int afterLength = after.length(); + if (beforeLength == 0 || afterLength == 0) return 0; + final int distance = editDistance(before, after); + // If afterLength < beforeLength, the algorithm is suggesting a word by excessive character + // correction. + int spaceCount = 0; + for (int i = 0; i < afterLength; ++i) { + if (after.charAt(i) == Keyboard.CODE_SPACE) { + ++spaceCount; + } + } + if (spaceCount == afterLength) return 0; + final double maximumScore = score == S_INT_MAX ? S_INT_MAX : MAX_INITIAL_SCORE + * Math.pow( + TYPED_LETTER_MULTIPLIER, Math.min(beforeLength, afterLength - spaceCount)) + * FULL_WORD_MULTIPLIER; + // add a weight based on edit distance. + // distance <= max(afterLength, beforeLength) == afterLength, + // so, 0 <= distance / afterLength <= 1 + final double weight = 1.0 - (double) distance / afterLength; + return (score / maximumScore) * weight; + } + + public static class UsabilityStudyLogUtils { + private static final String USABILITY_TAG = UsabilityStudyLogUtils.class.getSimpleName(); + private static final String FILENAME = "log.txt"; + private static final UsabilityStudyLogUtils sInstance = + new UsabilityStudyLogUtils(); + private final Handler mLoggingHandler; + private File mFile; + private File mDirectory; + private InputMethodService mIms; + private PrintWriter mWriter; + private final Date mDate; + private final SimpleDateFormat mDateFormat; + + private UsabilityStudyLogUtils() { + mDate = new Date(); + mDateFormat = new SimpleDateFormat("dd MMM HH:mm:ss.SSS"); + + HandlerThread handlerThread = new HandlerThread("UsabilityStudyLogUtils logging task", + Process.THREAD_PRIORITY_BACKGROUND); + handlerThread.start(); + mLoggingHandler = new Handler(handlerThread.getLooper()); + } + + public static UsabilityStudyLogUtils getInstance() { + return sInstance; + } + + public void init(InputMethodService ims) { + mIms = ims; + mDirectory = ims.getFilesDir(); + } + + private void createLogFileIfNotExist() { + if ((mFile == null || !mFile.exists()) + && (mDirectory != null && mDirectory.exists())) { + try { + mWriter = getPrintWriter(mDirectory, FILENAME, false); + } catch (IOException e) { + Log.e(USABILITY_TAG, "Can't create log file."); + } + } + } + + public void writeBackSpace() { + UsabilityStudyLogUtils.getInstance().write("<backspace>\t0\t0"); + } + + public void writeChar(char c, int x, int y) { + String inputChar = String.valueOf(c); + switch (c) { + case '\n': + inputChar = "<enter>"; + break; + case '\t': + inputChar = "<tab>"; + break; + case ' ': + inputChar = "<space>"; + break; + } + UsabilityStudyLogUtils.getInstance().write(inputChar + "\t" + x + "\t" + y); + LatinImeLogger.onPrintAllUsabilityStudyLogs(); + } + + public void write(final String log) { + mLoggingHandler.post(new Runnable() { + @Override + public void run() { + createLogFileIfNotExist(); + final long currentTime = System.currentTimeMillis(); + mDate.setTime(currentTime); + + final String printString = String.format("%s\t%d\t%s\n", + mDateFormat.format(mDate), currentTime, log); + if (LatinImeLogger.sDBG) { + Log.d(USABILITY_TAG, "Write: " + log); + } + mWriter.print(printString); + } + }); + } + + public void printAll() { + mLoggingHandler.post(new Runnable() { + @Override + public void run() { + mWriter.flush(); + StringBuilder sb = new StringBuilder(); + BufferedReader br = getBufferedReader(); + String line; + try { + while ((line = br.readLine()) != null) { + sb.append('\n'); + sb.append(line); + } + } catch (IOException e) { + Log.e(USABILITY_TAG, "Can't read log file."); + } finally { + if (LatinImeLogger.sDBG) { + Log.d(USABILITY_TAG, "output all logs\n" + sb.toString()); + } + mIms.getCurrentInputConnection().commitText(sb.toString(), 0); + try { + br.close(); + } catch (IOException e) { + // ignore. + } + } + } + }); + } + + public void clearAll() { + mLoggingHandler.post(new Runnable() { + @Override + public void run() { + if (mFile != null && mFile.exists()) { + if (LatinImeLogger.sDBG) { + Log.d(USABILITY_TAG, "Delete log file."); + } + mFile.delete(); + mWriter.close(); + } + } + }); + } + + private BufferedReader getBufferedReader() { + createLogFileIfNotExist(); + try { + return new BufferedReader(new FileReader(mFile)); + } catch (FileNotFoundException e) { + return null; + } + } + + private PrintWriter getPrintWriter( + File dir, String filename, boolean renew) throws IOException { + mFile = new File(dir, filename); + if (mFile.exists()) { + if (renew) { + mFile.delete(); + } + } + return new PrintWriter(new FileOutputStream(mFile), true /* autoFlush */); + } + } + + public static int getKeyboardMode(EditorInfo attribute) { + if (attribute == null) + return KeyboardId.MODE_TEXT; + + final int inputType = attribute.inputType; + final int variation = inputType & InputType.TYPE_MASK_VARIATION; + + switch (inputType & InputType.TYPE_MASK_CLASS) { + case InputType.TYPE_CLASS_NUMBER: + case InputType.TYPE_CLASS_DATETIME: + return KeyboardId.MODE_NUMBER; + case InputType.TYPE_CLASS_PHONE: + return KeyboardId.MODE_PHONE; + case InputType.TYPE_CLASS_TEXT: + if (InputTypeCompatUtils.isEmailVariation(variation)) { + return KeyboardId.MODE_EMAIL; + } else if (variation == InputType.TYPE_TEXT_VARIATION_URI) { + return KeyboardId.MODE_URL; + } else if (variation == InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE) { + return KeyboardId.MODE_IM; + } else if (variation == InputType.TYPE_TEXT_VARIATION_FILTER) { + return KeyboardId.MODE_TEXT; + } else { + return KeyboardId.MODE_TEXT; + } + default: + return KeyboardId.MODE_TEXT; + } + } + + public static boolean containsInCsv(String key, String csv) { + if (csv == null) + return false; + for (String option : csv.split(",")) { + if (option.equals(key)) + return true; + } + return false; + } + + public static boolean inPrivateImeOptions(String packageName, String key, + EditorInfo attribute) { + if (attribute == null) + return false; + return containsInCsv(packageName != null ? packageName + "." + key : key, + attribute.privateImeOptions); + } + + /** + * Returns a main dictionary resource id + * @return main dictionary resource id + */ + public static int getMainDictionaryResourceId(Resources res) { + final String MAIN_DIC_NAME = "main"; + String packageName = LatinIME.class.getPackage().getName(); + return res.getIdentifier(MAIN_DIC_NAME, "raw", packageName); + } + + public static void loadNativeLibrary() { + try { + System.loadLibrary("jni_latinime"); + } catch (UnsatisfiedLinkError ule) { + Log.e(TAG, "Could not load native library jni_latinime"); + } + } + + /** + * Returns true if a and b are equal ignoring the case of the character. + * @param a first character to check + * @param b second character to check + * @return {@code true} if a and b are equal, {@code false} otherwise. + */ + public static boolean equalsIgnoreCase(char a, char b) { + // Some language, such as Turkish, need testing both cases. + return a == b + || Character.toLowerCase(a) == Character.toLowerCase(b) + || Character.toUpperCase(a) == Character.toUpperCase(b); + } + + /** + * Returns true if a and b are equal ignoring the case of the characters, including if they are + * both null. + * @param a first CharSequence to check + * @param b second CharSequence to check + * @return {@code true} if a and b are equal, {@code false} otherwise. + */ + public static boolean equalsIgnoreCase(CharSequence a, CharSequence b) { + if (a == b) + return true; // including both a and b are null. + if (a == null || b == null) + return false; + final int length = a.length(); + if (length != b.length()) + return false; + for (int i = 0; i < length; i++) { + if (!equalsIgnoreCase(a.charAt(i), b.charAt(i))) + return false; + } + return true; + } + + /** + * Returns true if a and b are equal ignoring the case of the characters, including if a is null + * and b is zero length. + * @param a CharSequence to check + * @param b character array to check + * @param offset start offset of array b + * @param length length of characters in array b + * @return {@code true} if a and b are equal, {@code false} otherwise. + * @throws IndexOutOfBoundsException + * if {@code offset < 0 || length < 0 || offset + length > data.length}. + * @throws NullPointerException if {@code b == null}. + */ + public static boolean equalsIgnoreCase(CharSequence a, char[] b, int offset, int length) { + if (offset < 0 || length < 0 || length > b.length - offset) + throw new IndexOutOfBoundsException("array.length=" + b.length + " offset=" + offset + + " length=" + length); + if (a == null) + return length == 0; // including a is null and b is zero length. + if (a.length() != length) + return false; + for (int i = 0; i < length; i++) { + if (!equalsIgnoreCase(a.charAt(i), b[offset + i])) + return false; + } + 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) (dip * scale + 0.5); + } + + public static Locale setSystemLocale(Resources res, Locale newLocale) { + final Configuration conf = res.getConfiguration(); + final Locale saveLocale = conf.locale; + conf.locale = newLocale; + res.updateConfiguration(conf, res.getDisplayMetrics()); + return saveLocale; + } + + private static final HashMap<String, Locale> sLocaleCache = new HashMap<String, Locale>(); + + public static Locale constructLocaleFromString(String localeStr) { + if (localeStr == null) + return null; + synchronized (sLocaleCache) { + if (sLocaleCache.containsKey(localeStr)) + return sLocaleCache.get(localeStr); + Locale retval = null; + String[] localeParams = localeStr.split("_", 3); + if (localeParams.length == 1) { + retval = new Locale(localeParams[0]); + } else if (localeParams.length == 2) { + retval = new Locale(localeParams[0], localeParams[1]); + } else if (localeParams.length == 3) { + retval = new Locale(localeParams[0], localeParams[1], localeParams[2]); + } + if (retval != null) { + sLocaleCache.put(localeStr, retval); + } + return retval; + } + } +} diff --git a/java/src/com/android/inputmethod/latin/WhitelistDictionary.java b/java/src/com/android/inputmethod/latin/WhitelistDictionary.java new file mode 100644 index 000000000..4377373d2 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/WhitelistDictionary.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import android.content.Context; +import android.text.TextUtils; +import android.util.Log; +import android.util.Pair; + +import java.util.HashMap; + +public class WhitelistDictionary extends Dictionary { + + private static final boolean DBG = LatinImeLogger.sDBG; + private static final String TAG = WhitelistDictionary.class.getSimpleName(); + + private final HashMap<String, Pair<Integer, String>> mWhitelistWords = + new HashMap<String, Pair<Integer, String>>(); + + private static final WhitelistDictionary sInstance = new WhitelistDictionary(); + + private WhitelistDictionary() { + } + + public static WhitelistDictionary init(Context context) { + synchronized (sInstance) { + if (context != null) { + // Wordlist is initialized by the proper language in Suggestion.java#init + sInstance.initWordlist( + context.getResources().getStringArray(R.array.wordlist_whitelist)); + } else { + sInstance.mWhitelistWords.clear(); + } + } + return sInstance; + } + + private void initWordlist(String[] wordlist) { + mWhitelistWords.clear(); + final int N = wordlist.length; + if (N % 3 != 0) { + if (DBG) { + Log.d(TAG, "The number of the whitelist is invalid."); + } + return; + } + try { + for (int i = 0; i < N; i += 3) { + final int score = Integer.valueOf(wordlist[i]); + final String before = wordlist[i + 1]; + final String after = wordlist[i + 2]; + if (before != null && after != null) { + mWhitelistWords.put( + before.toLowerCase(), new Pair<Integer, String>(score, after)); + } + } + } catch (NumberFormatException e) { + if (DBG) { + Log.d(TAG, "The score of the word is invalid."); + } + } + } + + public String getWhiteListedWord(String before) { + if (before == null) return null; + final String lowerCaseBefore = before.toLowerCase(); + if(mWhitelistWords.containsKey(lowerCaseBefore)) { + if (DBG) { + Log.d(TAG, "--- found whiteListedWord: " + lowerCaseBefore); + } + return mWhitelistWords.get(lowerCaseBefore).second; + } + return null; + } + + // Not used for WhitelistDictionary. We use getWhitelistedWord() in Suggest.java instead + @Override + public void getWords(WordComposer composer, WordCallback callback) { + } + + @Override + public boolean isValidWord(CharSequence word) { + if (TextUtils.isEmpty(word)) return false; + return !TextUtils.isEmpty(getWhiteListedWord(word.toString())); + } +} diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index 2e415b771..af5e4b179 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -16,23 +16,33 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.keyboard.KeyDetector; + import java.util.ArrayList; /** * A place to store the currently composing word with information such as adjacent key codes as well */ public class WordComposer { + + public static final int NOT_A_CODE = KeyDetector.NOT_A_CODE; + public static final int NOT_A_COORDINATE = -1; + /** * The list of unicode values for each keystroke (including surrounding keys) */ - private final ArrayList<int[]> mCodes; - + private ArrayList<int[]> mCodes; + + private int mTypedLength; + private int[] mXCoordinates; + private int[] mYCoordinates; + /** * The word chosen from the candidate list, until it is committed. */ private String mPreferredWord; - - private final StringBuilder mTypedWord; + + private StringBuilder mTypedWord; private int mCapsCount; @@ -44,17 +54,28 @@ public class WordComposer { private boolean mIsFirstCharCapitalized; public WordComposer() { - mCodes = new ArrayList<int[]>(12); - mTypedWord = new StringBuilder(20); + final int N = BinaryDictionary.MAX_WORD_LENGTH; + mCodes = new ArrayList<int[]>(N); + mTypedWord = new StringBuilder(N); + mTypedLength = 0; + mXCoordinates = new int[N]; + mYCoordinates = new int[N]; } - WordComposer(WordComposer copy) { - mCodes = new ArrayList<int[]>(copy.mCodes); - mPreferredWord = copy.mPreferredWord; - mTypedWord = new StringBuilder(copy.mTypedWord); - mCapsCount = copy.mCapsCount; - mAutoCapitalized = copy.mAutoCapitalized; - mIsFirstCharCapitalized = copy.mIsFirstCharCapitalized; + public WordComposer(WordComposer source) { + init(source); + } + + public void init(WordComposer source) { + mCodes = new ArrayList<int[]>(source.mCodes); + mPreferredWord = source.mPreferredWord; + mTypedWord = new StringBuilder(source.mTypedWord); + mCapsCount = source.mCapsCount; + mAutoCapitalized = source.mAutoCapitalized; + mIsFirstCharCapitalized = source.mIsFirstCharCapitalized; + mTypedLength = source.mTypedLength; + mXCoordinates = source.mXCoordinates; + mYCoordinates = source.mYCoordinates; } /** @@ -62,6 +83,7 @@ public class WordComposer { */ public void reset() { mCodes.clear(); + mTypedLength = 0; mIsFirstCharCapitalized = false; mPreferredWord = null; mTypedWord.setLength(0); @@ -85,15 +107,28 @@ public class WordComposer { return mCodes.get(index); } + public int[] getXCoordinates() { + return mXCoordinates; + } + + public int[] getYCoordinates() { + return mYCoordinates; + } + /** * Add a new keystroke, with codes[0] containing the pressed key's unicode and the rest of * the array containing unicode for adjacent keys, sorted by reducing probability/proximity. * @param codes the array of unicode values */ - public void add(int primaryCode, int[] codes) { + public void add(int primaryCode, int[] codes, int x, int y) { mTypedWord.append((char) primaryCode); correctPrimaryJuxtapos(primaryCode, codes); mCodes.add(codes); + if (mTypedLength < BinaryDictionary.MAX_WORD_LENGTH) { + mXCoordinates[mTypedLength] = x; + mYCoordinates[mTypedLength] = y; + } + ++mTypedLength; if (Character.isUpperCase((char) primaryCode)) mCapsCount++; } @@ -124,6 +159,9 @@ public class WordComposer { mTypedWord.deleteCharAt(lastPos); if (Character.isUpperCase(last)) mCapsCount--; } + if (mTypedLength > 0) { + --mTypedLength; + } } /** diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SpellChecker.java b/java/src/com/android/inputmethod/latin/spellcheck/SpellChecker.java new file mode 100644 index 000000000..63c6d69d7 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/spellcheck/SpellChecker.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin.spellcheck; + +import android.content.Context; +import android.content.res.Resources; + +import com.android.inputmethod.compat.ArraysCompatUtils; +import com.android.inputmethod.latin.Dictionary; +import com.android.inputmethod.latin.Dictionary.DataType; +import com.android.inputmethod.latin.Dictionary.WordCallback; +import com.android.inputmethod.latin.DictionaryFactory; +import com.android.inputmethod.latin.Utils; +import com.android.inputmethod.latin.WordComposer; + +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; + +/** + * Implements spell checking methods. + */ +public class SpellChecker { + + public final Dictionary mDictionary; + + public SpellChecker(final Context context, final Locale locale) { + final Resources resources = context.getResources(); + final int fallbackResourceId = Utils.getMainDictionaryResourceId(resources); + mDictionary = DictionaryFactory.createDictionaryFromManager(context, locale, + fallbackResourceId); + } + + // Note : this must be reentrant + /** + * Finds out whether a word is in the dictionary or not. + * + * @param text the sequence containing the word to check for. + * @param start the index of the first character of the word in text. + * @param end the index of the next-to-last character in text. + * @return true if the word is in the dictionary, false otherwise. + */ + public boolean isCorrect(final CharSequence text, final int start, final int end) { + return mDictionary.isValidWord(text.subSequence(start, end)); + } + + private static class SuggestionsGatherer implements WordCallback { + private final int DEFAULT_SUGGESTION_LENGTH = 16; + private final List<String> mSuggestions = new LinkedList<String>(); + private int[] mScores = new int[DEFAULT_SUGGESTION_LENGTH]; + private int mLength = 0; + + @Override + synchronized public boolean addWord(char[] word, int wordOffset, int wordLength, int score, + int dicTypeId, DataType dataType) { + if (mLength >= mScores.length) { + final int newLength = mScores.length * 2; + mScores = new int[newLength]; + } + final int positionIndex = ArraysCompatUtils.binarySearch(mScores, 0, mLength, score); + // binarySearch returns the index if the element exists, and -<insertion index> - 1 + // if it doesn't. See documentation for binarySearch. + final int insertionIndex = positionIndex >= 0 ? positionIndex : -positionIndex - 1; + System.arraycopy(mScores, insertionIndex, mScores, insertionIndex + 1, + mLength - insertionIndex); + mLength += 1; + mScores[insertionIndex] = score; + mSuggestions.add(insertionIndex, new String(word, wordOffset, wordLength)); + return true; + } + + public List<String> getGatheredSuggestions() { + return mSuggestions; + } + } + + // Note : this must be reentrant + /** + * Gets a list of suggestions for a specific string. + * + * This returns a list of possible corrections for the text passed as an + * arguments. It may split or group words, and even perform grammatical + * analysis. + * + * @param text the sequence containing the word to check for. + * @param start the index of the first character of the word in text. + * @param end the index of the next-to-last character in text. + * @return a list of possible suggestions to replace the text. + */ + public List<String> getSuggestions(final CharSequence text, final int start, final int end) { + final SuggestionsGatherer suggestionsGatherer = new SuggestionsGatherer(); + final WordComposer composer = new WordComposer(); + for (int i = start; i < end; ++i) { + int character = text.charAt(i); + composer.add(character, new int[] { character }, + WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE); + } + mDictionary.getWords(composer, suggestionsGatherer); + return suggestionsGatherer.getGatheredSuggestions(); + } +} |