aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/res/values-af/strings.xml16
-rw-r--r--java/res/values-es/strings.xml2
-rw-r--r--java/res/values-hi/strings.xml2
-rw-r--r--java/res/values-ms/strings.xml4
-rw-r--r--java/res/values-vi/strings.xml14
-rw-r--r--java/res/values/attrs.xml4
-rw-r--r--java/res/values/strings.xml8
-rw-r--r--java/res/xml-sw600dp/kbd_key_styles.xml6
-rw-r--r--java/res/xml-sw768dp/kbd_key_styles.xml6
-rw-r--r--java/res/xml/kbd_key_styles.xml6
-rw-r--r--java/res/xml/spell_checker_settings.xml6
-rw-r--r--java/res/xml/spellchecker.xml3
-rw-r--r--java/src/com/android/inputmethod/keyboard/Key.java10
-rw-r--r--java/src/com/android/inputmethod/keyboard/Keyboard.java19
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java119
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java1
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryCollection.java22
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java96
18 files changed, 242 insertions, 102 deletions
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 2063b2dc3..36c9d4bc4 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -23,20 +23,20 @@
<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="spell_checker_service_name" msgid="2003013122022285508">"Android-korreksie"</string>
+ <string name="spell_checker_service_name" msgid="2003013122022285508">"Android-korrigering"</string>
<string name="android_spell_checker_settings" msgid="5822324635435443689">"Speltoetser se instellings"</string>
<string name="use_proximity_option_title" msgid="7469233942295924620">"Gebruik nabyheidsdata"</string>
<string name="use_proximity_option_summary" msgid="2857708859847261945">"Gebruik \'n sleutelbordagtige nabyheidsalgoritme vir die speltoetser"</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>
+ <string name="popup_on_keypress" msgid="123894815723512944">"Opspring met sleuteldruk"</string>
<string name="general_category" msgid="1859088467017573195">"Algemeen"</string>
- <string name="correction_category" msgid="2236750915056607613">"Tekskorreksie"</string>
+ <string name="correction_category" msgid="2236750915056607613">"Tekskorrigering"</string>
<string name="misc_category" msgid="6894192814868233453">"Ander opsies"</string>
<string name="advanced_settings" msgid="362895144495591463">"Gevorderde instellings"</string>
<string name="advanced_settings_summary" msgid="5193513161106637254">"Opsies vir gevorderde gebruikers"</string>
- <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Afwysvertraging vir sleutelopspringer"</string>
- <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Geen vertraging nie"</string>
+ <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Sleutelopspringer-wagperiode"</string>
+ <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Geen wagperiode nie"</string>
<string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Verstek"</string>
<string name="use_contacts_dict" msgid="4435317977804180815">"Stel kontakname voor"</string>
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Gebruik name van kontakte vir voorstelle en korreksies"</string>
@@ -54,7 +54,7 @@
<string name="auto_correction" msgid="4979925752001319458">"Outokorrigering"</string>
<string name="auto_correction_summary" msgid="5625751551134658006">"Spasiebalk en leestekens korrigeer outomaties woorde wat verkeerd gespel is"</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_modest" msgid="8788366690620799097">"Matig"</string>
<string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Aggressief"</string>
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Baie aggressief"</string>
<string name="bigram_suggestion" msgid="2636414079905220518">"Bigram-voorstelle"</string>
@@ -148,6 +148,6 @@
<string name="subtype_en_GB" msgid="88170601942311355">"Engels (VK)"</string>
<string name="subtype_en_US" msgid="6160452336634534239">"Engels (VS)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Bruikbaarheidstudie-modus"</string>
- <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Sleuteldruk se vibrasie-tydsduurinstellings"</string>
- <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Sleuteldruk se klankvolume-instellings"</string>
+ <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Vibrasie-tydsduur met sleuteldruk"</string>
+ <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Volume met sleuteldruk"</string>
</resources>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index 814a5f6de..fcd65e1fc 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -149,5 +149,5 @@
<string name="subtype_en_US" msgid="6160452336634534239">"inglés (EE.UU.)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modo de estudio de usabilidad"</string>
<string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Ajustes de duración de vibración al pulsar tecla"</string>
- <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Ajustes de volumen de sonido al pulsar tecla"</string>
+ <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Volumen de sonido al pulsar tecla"</string>
</resources>
diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml
index 58d515d9d..de95ab8d7 100644
--- a/java/res/values-hi/strings.xml
+++ b/java/res/values-hi/strings.xml
@@ -37,7 +37,7 @@
<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>
+ <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"डिफ़ॉल्ट"</string>
<string name="use_contacts_dict" msgid="4435317977804180815">"संपर्क नाम सुझाएं"</string>
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"सुझाव और सुधार के लिए संपर्क से नामों का उपयोग करें"</string>
<string name="enable_span_insert" msgid="7204653105667167620">"पुन: सुधार सक्षम करें"</string>
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
index 8a9954175..d6bf559e7 100644
--- a/java/res/values-ms/strings.xml
+++ b/java/res/values-ms/strings.xml
@@ -130,7 +130,7 @@
<string name="ok" msgid="7898366843681727667">"OK"</string>
<string name="voice_input" msgid="3583258583521397548">"Kunci 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_symbols_keyboard" msgid="7203213240786084067">"Pd ppn k’unci simbol"</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>
@@ -148,6 +148,6 @@
<string name="subtype_en_GB" msgid="88170601942311355">"Bahasa Inggeris (UK)"</string>
<string name="subtype_en_US" msgid="6160452336634534239">"Bahasa Inggeris (AS)"</string>
<string name="prefs_usability_study_mode" msgid="1261130555134595254">"Mod kajian kebolehgunaan"</string>
- <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Tetapan tempoh getaran tekanan kekunci"</string>
+ <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Tetapan tempoh getaran tekan kekunci"</string>
<string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Tetapan kelantangan bunyi tekanan kekunci"</string>
</resources>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index fbfe93a76..e602b495a 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -35,7 +35,7 @@
<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_delay" msgid="6213164897443068248">"Loại bỏ hiển thị phím trễ"</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>
<string name="use_contacts_dict" msgid="4435317977804180815">"Đề xuất tên liên hệ"</string>
@@ -62,10 +62,10 @@
<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="label_go_key" msgid="1635148082137219148">"Đến"</string>
+ <string name="label_go_key" msgid="1635148082137219148">"Tìm"</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_send_key" msgid="2815056534433717444">"Gửi"</string>
<string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
<string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
<string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
@@ -113,10 +113,10 @@
<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_listening" msgid="467518160751321844">"Nói ngay"</string>
<string name="voice_working" msgid="6666937792815731889">"Đang hoạt động"</string>
<string name="voice_initializing" msgid="661962047129906646"></string>
- <string name="voice_error" msgid="5140896300312186162">"Lỗi. Vui lòng thử lại."</string>
+ <string name="voice_error" msgid="5140896300312186162">"Lỗi. Vui lòng thử lại."</string>
<string name="voice_network_error" msgid="6649556447401862563">"Không thể kết nối"</string>
<string name="voice_too_much_speech" msgid="5746973620134227376">"Lỗi, quá nhiều câu thoại."</string>
<string name="voice_audio_error" msgid="5072707727016414454">"Sự cố âm thanh"</string>
@@ -134,7 +134,7 @@
<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="voice_input_modes_summary_off" msgid="63875609591897607">"Nhập liệu bằng giọng nói đã bị tắt"</string>
<string name="selectInputMethod" msgid="315076553378705821">"Chọn phương thức nhập"</string>
<string name="configure_input_method" msgid="373356270290742459">"Định cấu hình phương thức nhập"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Ngôn ngữ nhập"</string>
@@ -143,7 +143,7 @@
<string name="has_dictionary" msgid="6071847973466625007">"Có sẵn từ điển"</string>
<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="keyboard_layout" msgid="8451164783510487501">"Chủ đề bàn phím"</string>
+ <string name="keyboard_layout" msgid="8451164783510487501">"Chủ đề bàn phím"</string>
<string name="subtype_de_qwerty" msgid="3358900499589259491">"Bàn phím QWERTY tiếng Đức"</string>
<string name="subtype_en_GB" msgid="88170601942311355">"Tiếng Anh (Anh)"</string>
<string name="subtype_en_US" msgid="6160452336634534239">"Tiếng Anh (Mỹ)"</string>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index b11e25bc3..15e006593 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -185,6 +185,8 @@
<declare-styleable name="Keyboard_Key">
<!-- The unicode value that this key outputs. -->
<attr name="code" format="integer" />
+ <!-- The alternate unicode value that this key outputs while typing. -->
+ <attr name="altCode" format="integer" />
<!-- The keys to display in the more keys keyboard. -->
<attr name="moreKeys" format="string" />
<!-- Maximum column of more keys keyboard -->
@@ -201,7 +203,7 @@
<!-- This should be aligned with Key.ACTION_FLAGS_* -->
<flag name="isRepeatable" value="0x01" />
<flag name="noKeyPreview" value="0x02" />
- <flag name="ignoreWhileTyping" value="0x04" />
+ <flag name="altCodeWhileTyping" value="0x04" />
</attr>
<!-- The string of characters to output when this key is pressed. -->
<attr name="keyOutputText" format="string" />
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index e00547a62..8f999215e 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -31,11 +31,11 @@
<!-- Title for the spell checking service settings screen -->
<string name="android_spell_checker_settings">Spell checking settings</string>
- <!-- Title for the "use proximity" option for spell checking [CHAR LIMIT=25] -->
- <string name="use_proximity_option_title">Use proximity data</string>
+ <!-- Title for the spell checker option to turn on/off contact names lookup [CHAR LIMIT=25] -->
+ <string name="use_contacts_for_spellchecking_option_title">Look up contact names</string>
- <!-- Description for the "use proximity" option for spell checking [CHAR LIMIT=65] -->
- <string name="use_proximity_option_summary">Use a keyboard-like proximity algorithm for spell checking</string>
+ <!-- Description for the spell checker option to turn on/off contact names lookup. [CHAR LIMIT=65] -->
+ <string name="use_contacts_for_spellchecking_option_summary">Spell checker uses entries from your contact list</string>
<!-- Option to provide vibrate/haptic feedback on keypress -->
<string name="vibrate_on_keypress">Vibrate on keypress</string>
diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml
index 5e9a88dd7..aba1a8029 100644
--- a/java/res/xml-sw600dp/kbd_key_styles.xml
+++ b/java/res/xml-sw600dp/kbd_key_styles.xml
@@ -77,13 +77,15 @@
latin:styleName="shortcutKeyStyle"
latin:code="@integer/key_shortcut"
latin:keyIcon="iconShortcutKey"
- latin:keyActionFlags="noKeyPreview|ignoreWhileTyping"
+ latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
+ latin:altCode="@integer/key_space"
latin:parentStyle="f2PopupStyle" />
<key-style
latin:styleName="settingsKeyStyle"
latin:code="@integer/key_settings"
latin:keyIcon="iconSettingsKey"
- latin:keyActionFlags="noKeyPreview|ignoreWhileTyping"
+ latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
+ latin:altCode="@integer/key_space"
latin:backgroundType="functional" />
<key-style
latin:styleName="tabKeyStyle"
diff --git a/java/res/xml-sw768dp/kbd_key_styles.xml b/java/res/xml-sw768dp/kbd_key_styles.xml
index 499728d67..e6ec53dd1 100644
--- a/java/res/xml-sw768dp/kbd_key_styles.xml
+++ b/java/res/xml-sw768dp/kbd_key_styles.xml
@@ -59,13 +59,15 @@
latin:styleName="shortcutKeyStyle"
latin:code="@integer/key_shortcut"
latin:keyIcon="iconShortcutKey"
- latin:keyActionFlags="noKeyPreview|ignoreWhileTyping"
+ latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
+ latin:altCode="@integer/key_space"
latin:backgroundType="functional" />
<key-style
latin:styleName="settingsKeyStyle"
latin:code="@integer/key_settings"
latin:keyIcon="iconSettingsKey"
- latin:keyActionFlags="noKeyPreview|ignoreWhileTyping"
+ latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
+ latin:altCode="@integer/key_space"
latin:backgroundType="functional" />
<key-style
latin:styleName="tabKeyStyle"
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
index 835269a4a..5714e09c5 100644
--- a/java/res/xml/kbd_key_styles.xml
+++ b/java/res/xml/kbd_key_styles.xml
@@ -163,13 +163,15 @@
latin:styleName="shortcutKeyStyle"
latin:code="@integer/key_shortcut"
latin:keyIcon="iconShortcutKey"
- latin:keyActionFlags="noKeyPreview|ignoreWhileTyping"
+ latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
+ latin:altCode="@integer/key_space"
latin:parentStyle="f1PopupStyle" />
<key-style
latin:styleName="settingsKeyStyle"
latin:code="@integer/key_settings"
latin:keyIcon="iconSettingsKey"
- latin:keyActionFlags="noKeyPreview|ignoreWhileTyping"
+ latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
+ latin:altCode="@integer/key_space"
latin:backgroundType="functional" />
<key-style
latin:styleName="tabKeyStyle"
diff --git a/java/res/xml/spell_checker_settings.xml b/java/res/xml/spell_checker_settings.xml
index f402555c9..222b98b6b 100644
--- a/java/res/xml/spell_checker_settings.xml
+++ b/java/res/xml/spell_checker_settings.xml
@@ -18,9 +18,9 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/android_spell_checker_settings">
<CheckBoxPreference
- android:key="use_proximity"
- android:title="@string/use_proximity_option_title"
- android:summary="@string/use_proximity_option_summary"
+ android:key="pref_spellcheck_use_contacts"
+ android:title="@string/use_contacts_for_spellchecking_option_title"
+ android:summary="@string/use_contacts_for_spellchecking_option_summary"
android:persistent="true"
android:defaultValue="true" />
</PreferenceScreen>
diff --git a/java/res/xml/spellchecker.xml b/java/res/xml/spellchecker.xml
index 30fac5b20..d1269d878 100644
--- a/java/res/xml/spellchecker.xml
+++ b/java/res/xml/spellchecker.xml
@@ -21,7 +21,8 @@
<!-- for the spell checker -->
<spell-checker xmlns:android="http://schemas.android.com/apk/res/android"
- android:label="@string/spell_checker_service_name">
+ android:label="@string/spell_checker_service_name"
+ android:settingsActivity="com.android.inputmethod.latin.spellcheck.SpellCheckerSettingsActivity">
<subtype
android:label="@string/subtype_generic"
android:subtypeLocale="en"
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 84f2be585..b2b68f0ad 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -46,6 +46,7 @@ public class Key {
* The key code (unicode or custom code) that this key generates.
*/
public final int mCode;
+ public final int mAltCode;
/** Label to display */
public final CharSequence mLabel;
@@ -108,7 +109,7 @@ public class Key {
private final int mActionFlags;
private static final int ACTION_FLAGS_IS_REPEATABLE = 0x01;
private static final int ACTION_FLAGS_NO_KEY_PREVIEW = 0x02;
- private static final int ACTION_FLAGS_IGNORE_WHILE_TYPING = 0x04;
+ private static final int ACTION_FLAGS_ALT_CODE_WHILE_TYPING = 0x04;
/** The current pressed state of this key */
private boolean mPressed;
@@ -191,6 +192,7 @@ public class Key {
mLabel = label;
mOutputText = outputText;
mCode = code;
+ mAltCode = Keyboard.CODE_DUMMY;
mIcon = icon;
// Horizontal gap is divided equally to both sides of the key.
mX = x + mHorizontalGap / 2;
@@ -290,6 +292,8 @@ public class Key {
} else {
mCode = Keyboard.CODE_DUMMY;
}
+ mAltCode = style.getInt(keyAttr,
+ R.styleable.Keyboard_Key_altCode, Keyboard.CODE_DUMMY);
keyAttr.recycle();
}
@@ -334,8 +338,8 @@ public class Key {
return (mActionFlags & ACTION_FLAGS_NO_KEY_PREVIEW) != 0;
}
- public boolean ignoreWhileTyping() {
- return (mActionFlags & ACTION_FLAGS_IGNORE_WHILE_TYPING) != 0;
+ public boolean altCodeWhileTyping() {
+ return (mActionFlags & ACTION_FLAGS_ALT_CODE_WHILE_TYPING) != 0;
}
public Typeface selectTypeface(Typeface defaultTypeface) {
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 4a28bf1de..b3b20ca21 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -24,6 +24,7 @@ import com.android.inputmethod.keyboard.internal.KeyboardParams;
import com.android.inputmethod.keyboard.internal.KeyboardShiftState;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -65,7 +66,6 @@ public class Keyboard {
public static final int CODE_DIGIT0 = '0';
public static final int CODE_PLUS = '+';
-
/** 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;
@@ -111,6 +111,7 @@ public class Keyboard {
public final Map<Key, Drawable> mUnshiftedIcons;
public final KeyboardIconsSet mIconsSet;
+ private final Map<Integer, Key> mKeyCache = new HashMap<Integer, Key>();
private final KeyboardShiftState mShiftState = new KeyboardShiftState();
private final ProximityInfo mProximityInfo;
@@ -145,6 +146,22 @@ public class Keyboard {
return mProximityInfo;
}
+ public Key getKey(int code) {
+ final Integer keyCode = code;
+ if (mKeyCache.containsKey(keyCode)) {
+ return mKeyCache.get(keyCode);
+ }
+
+ for (final Key key : mKeys) {
+ if (key.mCode == code) {
+ mKeyCache.put(keyCode, key);
+ return key;
+ }
+ }
+ mKeyCache.put(keyCode, null);
+ return null;
+ }
+
public boolean hasShiftLockKey() {
return !mShiftLockKeys.isEmpty();
}
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index da60af3be..4e8765dcc 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -258,23 +258,27 @@ public class PointerTracker {
// primaryCode is different from {@link Key#mCode}.
private void callListenerOnCodeInput(Key key, int primaryCode, int[] keyCodes, int x, int y) {
final boolean ignoreModifierKey = mIgnoreModifierKey && key.isModifier();
- if (DEBUG_LISTENER)
- Log.d(TAG, "onCodeInput: " + keyCodePrintable(primaryCode)
+ final boolean alterCode = key.altCodeWhileTyping() && mTimerProxy.isTyping();
+ final int code = alterCode ? key.mAltCode : primaryCode;
+ // If code is CODE_DUMMY here, this key will be ignored or generate text.
+ final CharSequence text = (code != Keyboard.CODE_DUMMY) ? null : key.mOutputText;
+ if (DEBUG_LISTENER) {
+ Log.d(TAG, "onCodeInput: " + keyCodePrintable(code) + " text=" + text
+ " codes="+ Arrays.toString(keyCodes) + " x=" + x + " y=" + y
- + " ignoreModifier=" + ignoreModifierKey);
+ + " ignoreModifier=" + ignoreModifierKey + " alterCode=" + alterCode);
+ }
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);
+ if (code != Keyboard.CODE_DUMMY) {
+ mListener.onCodeInput(code, keyCodes, x, y);
+ } else if (text != null) {
+ mListener.onTextInput(text);
+ }
+ if (!key.altCodeWhileTyping() && !key.isModifier()) {
+ mTimerProxy.startKeyTypedTimer(sIgnoreSpecialKeyTimeout);
+ }
}
}
@@ -328,6 +332,23 @@ public class PointerTracker {
if (key != null && key.isEnabled()) {
key.onReleased();
mDrawingProxy.invalidateKey(key);
+
+ if (key.isShift()) {
+ for (final Key shiftKey : mKeyboard.mShiftKeys) {
+ if (shiftKey != key) {
+ shiftKey.onReleased();
+ mDrawingProxy.invalidateKey(shiftKey);
+ }
+ }
+ }
+
+ if (key.altCodeWhileTyping()) {
+ final Key altKey = mKeyboard.getKey(key.mAltCode);
+ if (altKey != null) {
+ altKey.onReleased();
+ mDrawingProxy.invalidateKey(altKey);
+ }
+ }
}
}
@@ -338,6 +359,24 @@ public class PointerTracker {
}
key.onPressed();
mDrawingProxy.invalidateKey(key);
+
+ if (key.isShift()) {
+ for (final Key shiftKey : mKeyboard.mShiftKeys) {
+ if (shiftKey != key) {
+ shiftKey.onPressed();
+ mDrawingProxy.invalidateKey(shiftKey);
+ }
+ }
+ }
+
+ if (key.altCodeWhileTyping() && mTimerProxy.isTyping()) {
+ final Key altKey = mKeyboard.getKey(key.mAltCode);
+ if (altKey != null) {
+ // TODO: Show altKey's preview.
+ altKey.onPressed();
+ mDrawingProxy.invalidateKey(altKey);
+ }
+ }
}
}
@@ -696,45 +735,27 @@ public class PointerTracker {
callListenerOnCancelInput();
return;
}
- if (key.mOutputText != null) {
- final boolean ignoreText = key.ignoreWhileTyping() && mTimerProxy.isTyping();
- if (!ignoreText) {
- callListenerOnTextInput(key);
- }
- callListenerOnRelease(key, key.mCode, false);
- if (!ignoreText) {
- mTimerProxy.startKeyTypedTimer(sIgnoreSpecialKeyTimeout);
- }
- } else {
- int code = key.mCode;
- final int[] codes = mKeyDetector.newCodeArray();
- mKeyDetector.getKeyAndNearbyCodes(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.mHintLabel.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;
- }
- final boolean ignoreCode = key.ignoreWhileTyping() && mTimerProxy.isTyping();
- if (!ignoreCode) {
- // TODO: It might be useful to register the nearest key code in codes[] instead of
- // just ignoring.
- callListenerOnCodeInput(key, code, codes, x, y);
- }
- callListenerOnRelease(key, code, false);
- if (!key.ignoreWhileTyping() && !key.isModifier()) {
- mTimerProxy.startKeyTypedTimer(sIgnoreSpecialKeyTimeout);
- }
+ int code = key.mCode;
+ final int[] codes = mKeyDetector.newCodeArray();
+ mKeyDetector.getKeyAndNearbyCodes(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.mHintLabel.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);
}
private long mPreviousEventTime;
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
index 565edb901..218793500 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
@@ -152,6 +152,7 @@ public class KeyStyles {
private void parseKeyStyleAttributes(TypedArray keyAttr) {
// TODO: Currently not all Key attributes can be declared as style.
readInt(keyAttr, R.styleable.Keyboard_Key_code);
+ readInt(keyAttr, R.styleable.Keyboard_Key_altCode);
readText(keyAttr, R.styleable.Keyboard_Key_keyLabel);
readText(keyAttr, R.styleable.Keyboard_Key_keyOutputText);
readText(keyAttr, R.styleable.Keyboard_Key_keyHintLabel);
diff --git a/java/src/com/android/inputmethod/latin/DictionaryCollection.java b/java/src/com/android/inputmethod/latin/DictionaryCollection.java
index 739153044..c19a5a718 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryCollection.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryCollection.java
@@ -18,6 +18,8 @@ package com.android.inputmethod.latin;
import com.android.inputmethod.keyboard.ProximityInfo;
+import android.util.Log;
+
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -27,7 +29,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
* Class for a collection of dictionaries that behave like one dictionary.
*/
public class DictionaryCollection extends Dictionary {
-
+ private final String TAG = DictionaryCollection.class.getSimpleName();
protected final List<Dictionary> mDictionaries;
public DictionaryCollection() {
@@ -75,7 +77,21 @@ public class DictionaryCollection extends Dictionary {
dict.close();
}
- public void addDictionary(Dictionary newDict) {
- if (null != newDict) mDictionaries.add(newDict);
+ // Warning: this is not thread-safe. Take necessary precaution when calling.
+ public void addDictionary(final Dictionary newDict) {
+ if (null == newDict) return;
+ if (mDictionaries.contains(newDict)) {
+ Log.w(TAG, "This collection already contains this dictionary: " + newDict);
+ }
+ mDictionaries.add(newDict);
+ }
+
+ // Warning: this is not thread-safe. Take necessary precaution when calling.
+ public void removeDictionary(final Dictionary dict) {
+ if (mDictionaries.contains(dict)) {
+ mDictionaries.remove(dict);
+ } else {
+ Log.w(TAG, "This collection does not contain this dictionary: " + dict);
+ }
}
}
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
index 93540ab12..9dfbe7a54 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -17,7 +17,9 @@
package com.android.inputmethod.latin.spellcheck;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.content.res.Resources;
+import android.preference.PreferenceManager;
import android.service.textservice.SpellCheckerService;
import android.text.TextUtils;
import android.util.Log;
@@ -41,21 +43,27 @@ import com.android.inputmethod.latin.Utils;
import com.android.inputmethod.latin.WhitelistDictionary;
import com.android.inputmethod.latin.WordComposer;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
+import java.util.HashSet;
/**
* Service for spell checking, using LatinIME's dictionaries and mechanisms.
*/
-public class AndroidSpellCheckerService extends SpellCheckerService {
+public class AndroidSpellCheckerService extends SpellCheckerService
+ implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = AndroidSpellCheckerService.class.getSimpleName();
private static final boolean DBG = false;
private static final int POOL_SIZE = 2;
+ public static final String PREF_USE_CONTACTS_KEY = "pref_spellcheck_use_contacts";
+
private static final int CAPITALIZE_NONE = 0; // No caps, or mixed case
private static final int CAPITALIZE_FIRST = 1; // First only
private static final int CAPITALIZE_ALL = 2; // All caps
@@ -84,6 +92,12 @@ public class AndroidSpellCheckerService extends SpellCheckerService {
private double mSuggestionThreshold;
// The threshold for a suggestion to be considered "recommended".
private double mRecommendedThreshold;
+ // Whether to use the contacts dictionary
+ private boolean mUseContactsDictionary;
+ private final Object mUseContactsLock = new Object();
+
+ private final HashSet<WeakReference<DictionaryCollection>> mDictionaryCollectionsList =
+ new HashSet<WeakReference<DictionaryCollection>>();
@Override public void onCreate() {
super.onCreate();
@@ -91,6 +105,57 @@ public class AndroidSpellCheckerService extends SpellCheckerService {
Double.parseDouble(getString(R.string.spellchecker_suggestion_threshold_value));
mRecommendedThreshold =
Double.parseDouble(getString(R.string.spellchecker_recommended_threshold_value));
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ prefs.registerOnSharedPreferenceChangeListener(this);
+ onSharedPreferenceChanged(prefs, PREF_USE_CONTACTS_KEY);
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
+ if (!PREF_USE_CONTACTS_KEY.equals(key)) return;
+ synchronized(mUseContactsLock) {
+ mUseContactsDictionary = prefs.getBoolean(PREF_USE_CONTACTS_KEY, true);
+ if (mUseContactsDictionary) {
+ startUsingContactsDictionaryLocked();
+ } else {
+ stopUsingContactsDictionaryLocked();
+ }
+ }
+ }
+
+ private void startUsingContactsDictionaryLocked() {
+ if (null == mContactsDictionary) {
+ mContactsDictionary = new SynchronouslyLoadedContactsDictionary(this);
+ }
+ final Iterator<WeakReference<DictionaryCollection>> iterator =
+ mDictionaryCollectionsList.iterator();
+ while (iterator.hasNext()) {
+ final WeakReference<DictionaryCollection> dictRef = iterator.next();
+ final DictionaryCollection dict = dictRef.get();
+ if (null == dict) {
+ iterator.remove();
+ } else {
+ dict.addDictionary(mContactsDictionary);
+ }
+ }
+ }
+
+ private void stopUsingContactsDictionaryLocked() {
+ if (null == mContactsDictionary) return;
+ final SynchronouslyLoadedContactsDictionary contactsDict = mContactsDictionary;
+ mContactsDictionary = null;
+ final Iterator<WeakReference<DictionaryCollection>> iterator =
+ mDictionaryCollectionsList.iterator();
+ while (iterator.hasNext()) {
+ final WeakReference<DictionaryCollection> dictRef = iterator.next();
+ final DictionaryCollection dict = dictRef.get();
+ if (null == dict) {
+ iterator.remove();
+ } else {
+ dict.removeDictionary(contactsDict);
+ }
+ }
+ contactsDict.close();
}
@Override
@@ -274,13 +339,15 @@ public class AndroidSpellCheckerService extends SpellCheckerService {
for (Dictionary dict : oldWhitelistDictionaries.values()) {
dict.close();
}
- if (null != mContactsDictionary) {
- // The synchronously loaded contacts dictionary should have been in one
- // or several pools, but it is shielded against multiple closing and it's
- // safe to call it several times.
- final SynchronouslyLoadedContactsDictionary dictToClose = mContactsDictionary;
- mContactsDictionary = null;
- dictToClose.close();
+ synchronized(mUseContactsLock) {
+ if (null != mContactsDictionary) {
+ // The synchronously loaded contacts dictionary should have been in one
+ // or several pools, but it is shielded against multiple closing and it's
+ // safe to call it several times.
+ final SynchronouslyLoadedContactsDictionary dictToClose = mContactsDictionary;
+ mContactsDictionary = null;
+ dictToClose.close();
+ }
}
return false;
}
@@ -315,11 +382,16 @@ public class AndroidSpellCheckerService extends SpellCheckerService {
mWhitelistDictionaries.put(localeStr, whitelistDictionary);
}
dictionaryCollection.addDictionary(whitelistDictionary);
- if (null == mContactsDictionary) {
- mContactsDictionary = new SynchronouslyLoadedContactsDictionary(this);
+ synchronized(mUseContactsLock) {
+ if (mUseContactsDictionary) {
+ if (null == mContactsDictionary) {
+ mContactsDictionary = new SynchronouslyLoadedContactsDictionary(this);
+ }
+ }
+ dictionaryCollection.addDictionary(mContactsDictionary);
+ mDictionaryCollectionsList.add(
+ new WeakReference<DictionaryCollection>(dictionaryCollection));
}
- // TODO: add a setting to use or not contacts when checking spelling
- dictionaryCollection.addDictionary(mContactsDictionary);
return new DictAndProximity(dictionaryCollection, proximityInfo);
}