diff options
39 files changed, 830 insertions, 438 deletions
diff --git a/java/res/values-ar/keycodes.xml b/java/res/values-ar/keycodes.xml deleted file mode 100644 index 1f65a7cad..000000000 --- a/java/res/values-ar/keycodes.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2012, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT 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"> - <!-- U+0029: ")" RIGHT PARENTHESIS --> - <integer name="keycode_for_left_parenthesis">0x0029</integer> - <!-- U+0028: "(" LEFT PARENTHESIS --> - <integer name="keycode_for_right_parenthesis">0x0028</integer> - <!-- U+003E: ">" GREATER-THAN SIGN --> - <integer name="keycode_for_less_than">0x003E</integer> - <!-- U+003C: "<" LESS-THAN SIGN --> - <integer name="keycode_for_greater_than">0x003C</integer> - <!-- U+005D: "]" RIGHT SQUARE BRACKET --> - <integer name="keycode_for_left_square_bracket">0x005D</integer> - <!-- U+005B: "[" LEFT SQUARE BRACKET --> - <integer name="keycode_for_right_square_bracket">0x005B</integer> - <!-- U+007D: "}" RIGHT CURLY BRACKET --> - <integer name="keycode_for_left_curly_bracket">0x007D</integer> - <!-- U+007B: "{" LEFT CURLY BRACKET --> - <integer name="keycode_for_right_curly_bracket">0x007B</integer> -</resources> diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml index 338bc38a2..68715fca7 100644 --- a/java/res/values-ca/strings.xml +++ b/java/res/values-ca/strings.xml @@ -61,12 +61,9 @@ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderada"</string> <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Total"</string> <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Molt agressiu"</string> - <!-- no translation found for bigram_suggestion (8169311444438922902) --> - <skip /> - <!-- no translation found for bigram_suggestion_summary (6635527607242625713) --> - <skip /> - <!-- no translation found for bigram_prediction (3216364899483135294) --> - <skip /> + <string name="bigram_suggestion" msgid="8169311444438922902">"Suggeriments de paraula següent"</string> + <string name="bigram_suggestion_summary" msgid="6635527607242625713">"Utilitza la paraula anterior per millorar els suggeriments"</string> + <string name="bigram_prediction" msgid="3216364899483135294">"Predicció de paraula següent"</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="label_go_key" msgid="1635148082137219148">"Vés"</string> @@ -121,8 +118,7 @@ <string name="keyboard_layout" msgid="8451164783510487501">"Tema del teclat"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Anglès (Regne Unit)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Anglès (EUA)"</string> - <!-- no translation found for subtype_no_language_qwerty (2956121451616633133) --> - <skip /> + <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"Cap idioma (QWERTY)"</string> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Mode d\'estudi d\'usabilitat"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Configuració de la durada de les vibracions per pulsació de tecla"</string> <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Configuració del volum de so de pulsació de tecla"</string> diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index 1ab030b27..399069e96 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -61,12 +61,9 @@ <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="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Sehr stark"</string> - <!-- no translation found for bigram_suggestion (8169311444438922902) --> - <skip /> - <!-- no translation found for bigram_suggestion_summary (6635527607242625713) --> - <skip /> - <!-- no translation found for bigram_prediction (3216364899483135294) --> - <skip /> + <string name="bigram_suggestion" msgid="8169311444438922902">"Vorschläge für nächstes Wort"</string> + <string name="bigram_suggestion_summary" msgid="6635527607242625713">"Zur Verbesserung von Vorschlägen vorheriges Wort verwenden"</string> + <string name="bigram_prediction" msgid="3216364899483135294">"Vervollständigung für nächstes Wort"</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="label_go_key" msgid="1635148082137219148">"Los"</string> @@ -121,8 +118,7 @@ <string name="keyboard_layout" msgid="8451164783510487501">"Tastaturdesign"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Englisch (Großbritannien)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Englisch (USA)"</string> - <!-- no translation found for subtype_no_language_qwerty (2956121451616633133) --> - <skip /> + <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"Keine Sprache (QWERTY)"</string> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modus der Studie zur Benutzerfreundlichkeit"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Einstellungen für Vibrationsdauer bei Tastendruck"</string> <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Einstellungen für Tonlautstärke bei Tastendruck"</string> diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index ea042f850..7552a2865 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -61,12 +61,9 @@ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Μέτρια"</string> <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Υψηλή"</string> <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Πολύ επιθετική"</string> - <!-- no translation found for bigram_suggestion (8169311444438922902) --> - <skip /> - <!-- no translation found for bigram_suggestion_summary (6635527607242625713) --> - <skip /> - <!-- no translation found for bigram_prediction (3216364899483135294) --> - <skip /> + <string name="bigram_suggestion" msgid="8169311444438922902">"Προτάσεις επόμενων λέξεων"</string> + <string name="bigram_suggestion_summary" msgid="6635527607242625713">"Χρήση προηγούμενης λέξης για τη βελτίωση προτάσεων"</string> + <string name="bigram_prediction" msgid="3216364899483135294">"Πρόβλεψη επόμενης λέξης"</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="label_go_key" msgid="1635148082137219148">"Μετ."</string> @@ -121,8 +118,7 @@ <string name="keyboard_layout" msgid="8451164783510487501">"Θέμα πληκτρολογίου"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Αγγλικά (Η.Β.)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Αγγλικά (Η.Π.Α)"</string> - <!-- no translation found for subtype_no_language_qwerty (2956121451616633133) --> - <skip /> + <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"Καμία γλώσσα (QWERTY)"</string> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Λειτουργία μελέτης χρηστικότητας"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Ρυθμίσεις διάρκειας δόνησης κατά το πάτημα πλήκτρων"</string> <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Ρυθμίσεις έντασης ήχου κατά το πάτημα πλήκτρων"</string> diff --git a/java/res/values-fa/keycodes.xml b/java/res/values-fa/keycodes.xml deleted file mode 100644 index 1f65a7cad..000000000 --- a/java/res/values-fa/keycodes.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2012, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT 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"> - <!-- U+0029: ")" RIGHT PARENTHESIS --> - <integer name="keycode_for_left_parenthesis">0x0029</integer> - <!-- U+0028: "(" LEFT PARENTHESIS --> - <integer name="keycode_for_right_parenthesis">0x0028</integer> - <!-- U+003E: ">" GREATER-THAN SIGN --> - <integer name="keycode_for_less_than">0x003E</integer> - <!-- U+003C: "<" LESS-THAN SIGN --> - <integer name="keycode_for_greater_than">0x003C</integer> - <!-- U+005D: "]" RIGHT SQUARE BRACKET --> - <integer name="keycode_for_left_square_bracket">0x005D</integer> - <!-- U+005B: "[" LEFT SQUARE BRACKET --> - <integer name="keycode_for_right_square_bracket">0x005B</integer> - <!-- U+007D: "}" RIGHT CURLY BRACKET --> - <integer name="keycode_for_left_curly_bracket">0x007D</integer> - <!-- U+007B: "{" LEFT CURLY BRACKET --> - <integer name="keycode_for_right_curly_bracket">0x007B</integer> -</resources> diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml index e50be020c..6951ab4a9 100644 --- a/java/res/values-fa/strings.xml +++ b/java/res/values-fa/strings.xml @@ -74,9 +74,9 @@ <string name="label_previous_key" msgid="1211868118071386787">"قبلی"</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_to_symbol_key" msgid="8516904117128967293">"?123"</string> - <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"ابپ"</string> + <string name="label_to_symbol_key" msgid="8516904117128967293">"۳۲۱؟"</string> + <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"۳۲۱"</string> <string name="label_pause_key" msgid="181098308428035340">"توقف موقت"</string> <string name="label_wait_key" msgid="6402152600878093134">"منتظر بمانید"</string> <string name="spoken_use_headphones" msgid="896961781287283493">"برای شنیدن کلیدهای گذرواژه که با صدای بلند خوانده میشوند، از هدست استفاده کنید."</string> diff --git a/java/res/values-iw/keycodes.xml b/java/res/values-iw/keycodes.xml deleted file mode 100644 index 1f65a7cad..000000000 --- a/java/res/values-iw/keycodes.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2012, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT 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"> - <!-- U+0029: ")" RIGHT PARENTHESIS --> - <integer name="keycode_for_left_parenthesis">0x0029</integer> - <!-- U+0028: "(" LEFT PARENTHESIS --> - <integer name="keycode_for_right_parenthesis">0x0028</integer> - <!-- U+003E: ">" GREATER-THAN SIGN --> - <integer name="keycode_for_less_than">0x003E</integer> - <!-- U+003C: "<" LESS-THAN SIGN --> - <integer name="keycode_for_greater_than">0x003C</integer> - <!-- U+005D: "]" RIGHT SQUARE BRACKET --> - <integer name="keycode_for_left_square_bracket">0x005D</integer> - <!-- U+005B: "[" LEFT SQUARE BRACKET --> - <integer name="keycode_for_right_square_bracket">0x005B</integer> - <!-- U+007D: "}" RIGHT CURLY BRACKET --> - <integer name="keycode_for_left_curly_bracket">0x007D</integer> - <!-- U+007B: "{" LEFT CURLY BRACKET --> - <integer name="keycode_for_right_curly_bracket">0x007B</integer> -</resources> diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index b4d7a46d6..f9524cc68 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -61,12 +61,9 @@ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"약"</string> <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"중"</string> <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"강"</string> - <!-- no translation found for bigram_suggestion (8169311444438922902) --> - <skip /> - <!-- no translation found for bigram_suggestion_summary (6635527607242625713) --> - <skip /> - <!-- no translation found for bigram_prediction (3216364899483135294) --> - <skip /> + <string name="bigram_suggestion" msgid="8169311444438922902">"다음 추천 검색어"</string> + <string name="bigram_suggestion_summary" msgid="6635527607242625713">"이전 단어를 사용하여 추천 검색어 개선"</string> + <string name="bigram_prediction" msgid="3216364899483135294">"다음 예상 검색어"</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="label_go_key" msgid="1635148082137219148">"이동"</string> @@ -121,8 +118,7 @@ <string name="keyboard_layout" msgid="8451164783510487501">"키보드 테마"</string> <string name="subtype_en_GB" msgid="88170601942311355">"영어(영국)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"영어(미국)"</string> - <!-- no translation found for subtype_no_language_qwerty (2956121451616633133) --> - <skip /> + <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"언어가 없음(QWERTY)"</string> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"가용성 연구 모드"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"키를 누를 때 진동 시간 설정"</string> <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"키를 누를 때 효과음 설정"</string> diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml index 23481576e..95f9706f9 100644 --- a/java/res/values-ms/strings.xml +++ b/java/res/values-ms/strings.xml @@ -61,12 +61,9 @@ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Sederhana"</string> <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresif"</string> <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Sangat agresif"</string> - <!-- no translation found for bigram_suggestion (8169311444438922902) --> - <skip /> - <!-- no translation found for bigram_suggestion_summary (6635527607242625713) --> - <skip /> - <!-- no translation found for bigram_prediction (3216364899483135294) --> - <skip /> + <string name="bigram_suggestion" msgid="8169311444438922902">"Cadangan perkataan seterusnya"</string> + <string name="bigram_suggestion_summary" msgid="6635527607242625713">"Gunakan perkataan sebelumnya untuk memperbaik cadangan"</string> + <string name="bigram_prediction" msgid="3216364899483135294">"Ramalan perkataan seterusnya"</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> @@ -121,8 +118,7 @@ <string name="keyboard_layout" msgid="8451164783510487501">"Tema papan kekunci"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Bahasa Inggeris (UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Bahasa Inggeris (AS)"</string> - <!-- no translation found for subtype_no_language_qwerty (2956121451616633133) --> - <skip /> + <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"Tiada bahasa (QWERTY)"</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 tekan kekunci"</string> <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Tetapan kelantangan bunyi tekanan kekunci"</string> diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index d1fb0dcdd..037ceb915 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -61,12 +61,9 @@ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderada"</string> <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agressiva"</string> <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Muito agressivo"</string> - <!-- no translation found for bigram_suggestion (8169311444438922902) --> - <skip /> - <!-- no translation found for bigram_suggestion_summary (6635527607242625713) --> - <skip /> - <!-- no translation found for bigram_prediction (3216364899483135294) --> - <skip /> + <string name="bigram_suggestion" msgid="8169311444438922902">"Sugestões da palavra seguinte"</string> + <string name="bigram_suggestion_summary" msgid="6635527607242625713">"Utilizar palavra anterior para melhorar sugestões"</string> + <string name="bigram_prediction" msgid="3216364899483135294">"Previsão da palavra seguinte"</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="label_go_key" msgid="1635148082137219148">"OK"</string> @@ -121,8 +118,7 @@ <string name="keyboard_layout" msgid="8451164783510487501">"Tema do teclado"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Inglês (RU)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Inglês (EUA)"</string> - <!-- no translation found for subtype_no_language_qwerty (2956121451616633133) --> - <skip /> + <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"Nenhum idioma (QWERTY)"</string> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modo de estudo da capacidade de utilização"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Definições de duração da vibração ao premir as teclas"</string> <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Definições de volume de som ao premir as teclas"</string> diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml index 78222ac5f..3595796de 100644 --- a/java/res/values-th/strings.xml +++ b/java/res/values-th/strings.xml @@ -61,12 +61,9 @@ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"ปานกลาง"</string> <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"เข้มงวด"</string> <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"เข้มงวดมาก"</string> - <!-- no translation found for bigram_suggestion (8169311444438922902) --> - <skip /> - <!-- no translation found for bigram_suggestion_summary (6635527607242625713) --> - <skip /> - <!-- no translation found for bigram_prediction (3216364899483135294) --> - <skip /> + <string name="bigram_suggestion" msgid="8169311444438922902">"คำแนะนำสำหรับคำถัดไป"</string> + <string name="bigram_suggestion_summary" msgid="6635527607242625713">"ใช้คำก่อนหน้านี้เพื่อปรับปรุงคำแนะนำ"</string> + <string name="bigram_prediction" msgid="3216364899483135294">"การคาดคะเนคำถัดไป"</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="label_go_key" msgid="1635148082137219148">"ไป"</string> @@ -121,8 +118,7 @@ <string name="keyboard_layout" msgid="8451164783510487501">"ชุดรูปแบบแป้นพิมพ์"</string> <string name="subtype_en_GB" msgid="88170601942311355">"อังกฤษ (สหราชอาณาจักร)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"อังกฤษ (อเมริกัน)"</string> - <!-- no translation found for subtype_no_language_qwerty (2956121451616633133) --> - <skip /> + <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"ไม่มีภาษา (QWERTY)"</string> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"โหมดศึกษาประโยชน์ในการใช้งาน"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"การตั้งค่าระยะเวลาการสั่นเมื่อกดแป้นพิมพ์"</string> <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"การตั้งค่าระดับเสียงเมื่อกดแป้นพิมพ์"</string> diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml index ae188aadf..1bc2ca791 100644 --- a/java/res/values-uk/strings.xml +++ b/java/res/values-uk/strings.xml @@ -61,12 +61,9 @@ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Середнє"</string> <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Повне"</string> <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Повне виправлення"</string> - <!-- no translation found for bigram_suggestion (8169311444438922902) --> - <skip /> - <!-- no translation found for bigram_suggestion_summary (6635527607242625713) --> - <skip /> - <!-- no translation found for bigram_prediction (3216364899483135294) --> - <skip /> + <string name="bigram_suggestion" msgid="8169311444438922902">"Пропозиції наступного слова"</string> + <string name="bigram_suggestion_summary" msgid="6635527607242625713">"Використати попереднє слово для покращення пропозицій"</string> + <string name="bigram_prediction" msgid="3216364899483135294">"Передбачення наступного слова"</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="label_go_key" msgid="1635148082137219148">"Іти"</string> @@ -74,7 +71,7 @@ <string name="label_previous_key" msgid="1211868118071386787">"Назад"</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">"Алфавіт"</string> + <string name="label_to_alpha_key" msgid="4793983863798817523">"АБВ"</string> <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string> <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string> <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string> @@ -121,8 +118,7 @@ <string name="keyboard_layout" msgid="8451164783510487501">"Тема клавіатури"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Англійська (Великобританія)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Англійська (США)"</string> - <!-- no translation found for subtype_no_language_qwerty (2956121451616633133) --> - <skip /> + <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"Немає мови (QWERTY)"</string> <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Режим вивчення зручності у використанні"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Налаштування тривалості вібрації під час натискання клавіші"</string> <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Налаштування гучності звуку під час натискання клавіші"</string> diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 39d50e348..573ec68b7 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -229,10 +229,14 @@ </declare-styleable> <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 unicode value that this key outputs. + Code value represented in hexadecimal prefixed with "0x" or code value reference using + "!code/<code_name>" notation. --> + <attr name="code" format="string" /> + <!-- The alternate unicode value that this key outputs while typing. + Code value represented in hexadecimal prefixed with "0x" or code value reference using + "!code/<code_name>" notation. --> + <attr name="altCode" format="string" /> <!-- The keys to display in the more keys keyboard. --> <attr name="moreKeys" format="string" /> <!-- The keys to display in the more keys keyboard in addition to moreKeys. @@ -296,6 +300,7 @@ <flag name="disableAdditionalMoreKeys" value="0x80000000" /> </attr> <!-- The icon to display on the key instead of the label. --> + <!-- TODO: Use string format !icon/name. --> <attr name="keyIcon" format="enum"> <!-- This should be aligned with the KeyboardIconsSet.ICON_* --> <enum name="iconUndefined" value="0" /> @@ -315,11 +320,13 @@ <enum name="iconZwjKey" value="16" /> </attr> <!-- The icon for disabled key --> + <!-- TODO: Use string format !icon/name. --> <attr name="keyIconDisabled" format="enum"> <!-- This should be aligned with the KeyboardIconsSet.ICON_* --> <enum name="iconDisabledShortcutKey" value="12" /> </attr> <!-- The icon to show in the popup preview. --> + <!-- TODO: Use string format !icon/name. --> <attr name="keyIconPreview" format="enum"> <!-- This should be aligned with the KeyboardIconsSet.ICON_* --> <enum name="iconPreviewTabKey" value="13" /> diff --git a/java/res/values/donottranslate-more-keys.xml b/java/res/values/donottranslate-more-keys.xml index f50dd4f40..14c278af9 100644 --- a/java/res/values/donottranslate-more-keys.xml +++ b/java/res/values/donottranslate-more-keys.xml @@ -120,11 +120,11 @@ U+2205: "∅" EMPTY SET --> <string name="more_keys_for_symbols_0">ⁿ,∅</string> <string name="more_keys_for_am_pm">!fixedColumnOrder!2,!hasLabels!,\@string/label_time_am,\@string/label_time_pm</string> - <string name="settings_as_more_key">\@icon/settingsKey|\@integer/key_settings</string> + <string name="settings_as_more_key">!icon/settingsKey|!code/key_settings</string> <string name="keylabel_for_comma">,</string> <string name="more_keys_for_comma"></string> - <string name="action_next_as_more_key">!hasLabels!,\@string/label_next_key|\@integer/key_action_next</string> - <string name="action_previous_as_more_key">!hasLabels!,\@string/label_previous_key|\@integer/key_action_previous</string> + <string name="action_next_as_more_key">!hasLabels!,\@string/label_next_key|!code/key_action_next</string> + <string name="action_previous_as_more_key">!hasLabels!,\@string/label_previous_key|!code/key_action_previous</string> <string name="keylabel_for_symbols_question">\?</string> <string name="keylabel_for_symbols_semicolon">;</string> <string name="keylabel_for_symbols_percent">%</string> diff --git a/java/res/values/keycodes.xml b/java/res/values/keycodes.xml deleted file mode 100644 index f42495a75..000000000 --- a/java/res/values/keycodes.xml +++ /dev/null @@ -1,53 +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. -*/ ---> - -<resources> - <!-- These code should be aligned with Keyboard.CODE_*. --> - <integer name="key_tab">9</integer> - <integer name="key_enter">10</integer> - <integer name="key_space">32</integer> - <integer name="key_shift">-1</integer> - <integer name="key_switch_alpha_symbol">-2</integer> - <integer name="key_output_text">-3</integer> - <integer name="key_delete">-4</integer> - <integer name="key_settings">-5</integer> - <integer name="key_shortcut">-6</integer> - <integer name="key_action_enter">-7</integer> - <integer name="key_action_next">-8</integer> - <integer name="key_action_previous">-9</integer> - <integer name="key_language_switch">-10</integer> - <integer name="key_unspecified">-11</integer> - <!-- U+0028: "(" LEFT PARENTHESIS --> - <integer name="keycode_for_left_parenthesis">0x0028</integer> - <!-- U+0029: ")" RIGHT PARENTHESIS --> - <integer name="keycode_for_right_parenthesis">0x0029</integer> - <!-- U+003C: "<" LESS-THAN SIGN --> - <integer name="keycode_for_less_than">0x003C</integer> - <!-- U+003E: ">" GREATER-THAN SIGN --> - <integer name="keycode_for_greater_than">0x003E</integer> - <!-- U+005B: "[" LEFT SQUARE BRACKET --> - <integer name="keycode_for_left_square_bracket">0x005B</integer> - <!-- U+005D: "]" RIGHT SQUARE BRACKET --> - <integer name="keycode_for_right_square_bracket">0x005D</integer> - <!-- U+007B: "{" LEFT CURLY BRACKET --> - <integer name="keycode_for_left_curly_bracket">0x007B</integer> - <!-- U+007D: "}" RIGHT CURLY BRACKET --> - <integer name="keycode_for_right_curly_bracket">0x007D</integer> -</resources> diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml index 45e22fce3..b0f610912 100644 --- a/java/res/xml-sw600dp/key_styles_common.xml +++ b/java/res/xml-sw600dp/key_styles_common.xml @@ -42,7 +42,7 @@ > <key-style latin:styleName="shiftKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyIcon="iconShiftKeyShifted" latin:keyActionFlags="noKeyPreview" latin:backgroundType="stickyOff" /> @@ -52,7 +52,7 @@ > <key-style latin:styleName="shiftKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyIcon="iconShiftKeyShifted" latin:keyActionFlags="noKeyPreview" latin:backgroundType="stickyOn" /> @@ -60,7 +60,7 @@ <default> <key-style latin:styleName="shiftKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyIcon="iconShiftKey" latin:keyActionFlags="noKeyPreview" latin:backgroundType="stickyOff" /> @@ -68,7 +68,7 @@ </switch> <key-style latin:styleName="deleteKeyStyle" - latin:code="@integer/key_delete" + latin:code="!code/key_delete" latin:keyIcon="iconDeleteKey" latin:keyActionFlags="isRepeatable|noKeyPreview" latin:backgroundType="functional" /> @@ -76,7 +76,7 @@ latin:keyboardLayout="@xml/key_styles_enter" /> <key-style latin:styleName="spaceKeyStyle" - latin:code="@integer/key_space" + latin:code="!code/key_space" latin:keyActionFlags="noKeyPreview" /> <!-- U+200C: ZERO WIDTH NON-JOINER U+200D: ZERO WIDTH JOINER --> @@ -84,7 +84,7 @@ latin:styleName="zwnjKeyStyle" latin:code="0x200C" latin:keyIcon="iconZwnjKey" - latin:moreKeys="\@icon/zwjKey|‍" + latin:moreKeys="!icon/zwjKey|‍" latin:keyLabelFlags="hasPopupHint" latin:keyActionFlags="noKeyPreview" /> <key-style @@ -95,7 +95,7 @@ latin:moreKeys="@string/more_keys_for_smiley" /> <key-style latin:styleName="shortcutKeyStyle" - latin:code="@integer/key_shortcut" + latin:code="!code/key_shortcut" latin:keyIcon="iconShortcutKey" latin:keyIconDisabled="iconDisabledShortcutKey" latin:keyLabelFlags="preserveCase" @@ -103,7 +103,7 @@ latin:backgroundType="functional" /> <key-style latin:styleName="settingsKeyStyle" - latin:code="@integer/key_settings" + latin:code="!code/key_settings" latin:keyIcon="iconSettingsKey" latin:keyActionFlags="noKeyPreview|altCodeWhileTyping" latin:backgroundType="functional" /> @@ -114,7 +114,7 @@ > <key-style latin:styleName="tabKeyStyle" - latin:code="@integer/key_action_previous" + latin:code="!code/key_action_previous" latin:keyIcon="iconTabKey" latin:keyIconPreview="iconPreviewTabKey" latin:backgroundType="functional" /> @@ -122,7 +122,7 @@ <default> <key-style latin:styleName="tabKeyStyle" - latin:code="@integer/key_tab" + latin:code="!code/key_tab" latin:keyIcon="iconTabKey" latin:keyIconPreview="iconPreviewTabKey" latin:backgroundType="functional" /> @@ -130,28 +130,28 @@ </switch> <key-style latin:styleName="toSymbolKeyStyle" - latin:code="@integer/key_switch_alpha_symbol" + latin:code="!code/key_switch_alpha_symbol" latin:keyLabel="@string/label_to_symbol_key" latin:keyLabelFlags="preserveCase" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="toAlphaKeyStyle" - latin:code="@integer/key_switch_alpha_symbol" + latin:code="!code/key_switch_alpha_symbol" latin:keyLabel="@string/label_to_alpha_key" latin:keyLabelFlags="preserveCase" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="toMoreSymbolKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyLabel="@string/label_to_more_symbol_for_tablet_key" latin:keyLabelFlags="preserveCase" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="backFromMoreSymbolKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyLabel="@string/label_to_symbol_key" latin:keyLabelFlags="preserveCase" latin:keyActionFlags="noKeyPreview" diff --git a/java/res/xml-sw768dp/key_styles_common.xml b/java/res/xml-sw768dp/key_styles_common.xml index e1c236912..aa9cd692a 100644 --- a/java/res/xml-sw768dp/key_styles_common.xml +++ b/java/res/xml-sw768dp/key_styles_common.xml @@ -41,7 +41,7 @@ > <key-style latin:styleName="shiftKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyIcon="iconShiftKeyShifted" latin:keyActionFlags="noKeyPreview" latin:backgroundType="stickyOff" /> @@ -51,7 +51,7 @@ > <key-style latin:styleName="shiftKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyIcon="iconShiftKeyShifted" latin:keyActionFlags="noKeyPreview" latin:backgroundType="stickyOn" /> @@ -59,7 +59,7 @@ <default> <key-style latin:styleName="shiftKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyIcon="iconShiftKey" latin:keyActionFlags="noKeyPreview" latin:backgroundType="stickyOff" /> @@ -67,7 +67,7 @@ </switch> <key-style latin:styleName="deleteKeyStyle" - latin:code="@integer/key_delete" + latin:code="!code/key_delete" latin:keyIcon="iconDeleteKey" latin:keyActionFlags="isRepeatable|noKeyPreview" latin:backgroundType="functional" /> @@ -75,7 +75,7 @@ latin:keyboardLayout="@xml/key_styles_enter" /> <key-style latin:styleName="spaceKeyStyle" - latin:code="@integer/key_space" + latin:code="!code/key_space" latin:keyActionFlags="noKeyPreview" /> <!-- U+200C: ZERO WIDTH NON-JOINER U+200D: ZERO WIDTH JOINER --> @@ -83,7 +83,7 @@ latin:styleName="zwnjKeyStyle" latin:code="0x200C" latin:keyIcon="iconZwnjKey" - latin:moreKeys="\@icon/zwjKey|‍" + latin:moreKeys="!icon/zwjKey|‍" latin:keyLabelFlags="hasPopupHint" latin:keyActionFlags="noKeyPreview" /> <key-style @@ -94,7 +94,7 @@ latin:moreKeys="@string/more_keys_for_smiley" /> <key-style latin:styleName="shortcutKeyStyle" - latin:code="@integer/key_shortcut" + latin:code="!code/key_shortcut" latin:keyIcon="iconShortcutKey" latin:keyIconDisabled="iconDisabledShortcutKey" latin:keyLabelFlags="preserveCase" @@ -102,7 +102,7 @@ latin:backgroundType="functional" /> <key-style latin:styleName="settingsKeyStyle" - latin:code="@integer/key_settings" + latin:code="!code/key_settings" latin:keyIcon="iconSettingsKey" latin:keyActionFlags="noKeyPreview|altCodeWhileTyping" latin:backgroundType="functional" /> @@ -113,7 +113,7 @@ > <key-style latin:styleName="tabKeyStyle" - latin:code="@integer/key_action_previous" + latin:code="!code/key_action_previous" latin:keyLabel="@string/label_tab_key" latin:keyLabelFlags="fontNormal|preserveCase" latin:backgroundType="functional" /> @@ -121,7 +121,7 @@ <default> <key-style latin:styleName="tabKeyStyle" - latin:code="@integer/key_tab" + latin:code="!code/key_tab" latin:keyLabel="@string/label_tab_key" latin:keyLabelFlags="fontNormal|preserveCase" latin:backgroundType="functional" /> @@ -129,28 +129,28 @@ </switch> <key-style latin:styleName="toSymbolKeyStyle" - latin:code="@integer/key_switch_alpha_symbol" + latin:code="!code/key_switch_alpha_symbol" latin:keyLabel="@string/label_to_symbol_key" latin:keyLabelFlags="fontNormal|preserveCase" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="toAlphaKeyStyle" - latin:code="@integer/key_switch_alpha_symbol" + latin:code="!code/key_switch_alpha_symbol" latin:keyLabel="@string/label_to_alpha_key" latin:keyLabelFlags="fontNormal|preserveCase" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="toMoreSymbolKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyLabel="@string/label_to_more_symbol_for_tablet_key" latin:keyLabelFlags="fontNormal|preserveCase" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="backFromMoreSymbolKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyLabel="@string/label_to_symbol_key" latin:keyLabelFlags="fontNormal|preserveCase" latin:keyActionFlags="noKeyPreview" diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml index 8d01091d6..b0b87a810 100644 --- a/java/res/xml/key_styles_common.xml +++ b/java/res/xml/key_styles_common.xml @@ -46,7 +46,7 @@ > <key-style latin:styleName="shiftKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyIcon="iconShiftKeyShifted" latin:keyActionFlags="noKeyPreview" latin:backgroundType="stickyOff" /> @@ -56,7 +56,7 @@ > <key-style latin:styleName="shiftKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyIcon="iconShiftKeyShifted" latin:keyActionFlags="noKeyPreview" latin:backgroundType="stickyOn" /> @@ -64,7 +64,7 @@ <default> <key-style latin:styleName="shiftKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyIcon="iconShiftKey" latin:keyActionFlags="noKeyPreview" latin:backgroundType="stickyOff" /> @@ -72,7 +72,7 @@ </switch> <key-style latin:styleName="deleteKeyStyle" - latin:code="@integer/key_delete" + latin:code="!code/key_delete" latin:keyIcon="iconDeleteKey" latin:keyActionFlags="isRepeatable|noKeyPreview" latin:backgroundType="functional" /> @@ -104,7 +104,7 @@ </switch> <key-style latin:styleName="spaceKeyStyle" - latin:code="@integer/key_space" + latin:code="!code/key_space" latin:keyActionFlags="noKeyPreview|enableLongPress" latin:backgroundType="functional" /> <!-- U+200C: ZERO WIDTH NON-JOINER @@ -113,29 +113,29 @@ latin:styleName="zwnjKeyStyle" latin:code="0x200C" latin:keyIcon="iconZwnjKey" - latin:moreKeys="\@icon/zwjKey|‍" + latin:moreKeys="!icon/zwjKey|‍" latin:keyLabelFlags="hasPopupHint" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="shortcutKeyStyle" - latin:code="@integer/key_shortcut" + latin:code="!code/key_shortcut" latin:keyIcon="iconShortcutKey" latin:keyIconDisabled="iconDisabledShortcutKey" latin:keyLabelFlags="preserveCase" latin:keyActionFlags="noKeyPreview|altCodeWhileTyping" - latin:altCode="@integer/key_space" + latin:altCode="!code/key_space" latin:parentStyle="f1MoreKeysStyle" /> <key-style latin:styleName="languageSwitchKeyStyle" - latin:code="@integer/key_language_switch" + latin:code="!code/key_language_switch" latin:keyIcon="iconLanguageSwitchKey" latin:keyActionFlags="noKeyPreview|altCodeWhileTyping|enableLongPress" - latin:altCode="@integer/key_space" + latin:altCode="!code/key_space" latin:backgroundType="functional" /> <key-style latin:styleName="tabKeyStyle" - latin:code="@integer/key_tab" + latin:code="!code/key_tab" latin:keyIcon="iconTabKey" latin:keyIconPreview="iconPreviewTabKey" latin:backgroundType="functional" /> @@ -143,7 +143,7 @@ laid out as normal letter key. --> <key-style latin:styleName="nonSpecialBackgroundTabKeyStyle" - latin:code="@integer/key_tab" + latin:code="!code/key_tab" latin:keyIcon="iconTabKey" latin:keyIconPreview="iconPreviewTabKey" /> <switch> @@ -156,7 +156,7 @@ > <key-style latin:styleName="toSymbolKeyStyle" - latin:code="@integer/key_switch_alpha_symbol" + latin:code="!code/key_switch_alpha_symbol" latin:keyIcon="iconShortcutForLabel" latin:keyLabel="@string/label_to_symbol_with_microphone_key" latin:keyLabelFlags="withIconRight|preserveCase" @@ -166,7 +166,7 @@ <default> <key-style latin:styleName="toSymbolKeyStyle" - latin:code="@integer/key_switch_alpha_symbol" + latin:code="!code/key_switch_alpha_symbol" latin:keyLabel="@string/label_to_symbol_key" latin:keyLabelFlags="preserveCase" latin:keyActionFlags="noKeyPreview" @@ -175,21 +175,21 @@ </switch> <key-style latin:styleName="toAlphaKeyStyle" - latin:code="@integer/key_switch_alpha_symbol" + latin:code="!code/key_switch_alpha_symbol" latin:keyLabel="@string/label_to_alpha_key" latin:keyLabelFlags="preserveCase" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="toMoreSymbolKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyLabel="@string/label_to_more_symbol_key" latin:keyLabelFlags="preserveCase" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="backFromMoreSymbolKeyStyle" - latin:code="@integer/key_shift" + latin:code="!code/key_shift" latin:keyLabel="@string/label_to_symbol_key" latin:keyLabelFlags="preserveCase" latin:keyActionFlags="noKeyPreview" diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml index e15a0bec7..49759c470 100644 --- a/java/res/xml/key_styles_enter.xml +++ b/java/res/xml/key_styles_enter.xml @@ -92,7 +92,7 @@ <!-- Enter key style --> <key-style latin:styleName="defaultEnterKeyStyle" - latin:code="@integer/key_enter" + latin:code="!code/key_enter" latin:keyIcon="iconReturnKey" latin:keyLabelFlags="autoXScale|preserveCase" latin:keyActionFlags="noKeyPreview" @@ -100,7 +100,7 @@ latin:parentStyle="navigateMoreKeysStyle" /> <key-style latin:styleName="defaultActionKeyStyle" - latin:code="@integer/key_action_enter" + latin:code="!code/key_action_enter" latin:keyIcon="iconUndefined" latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> diff --git a/java/res/xml/key_styles_number.xml b/java/res/xml/key_styles_number.xml index 1fc21694d..e1c5e5bca 100644 --- a/java/res/xml/key_styles_number.xml +++ b/java/res/xml/key_styles_number.xml @@ -99,12 +99,12 @@ <!-- Only for non-tablet device --> <key-style latin:styleName="numPhoneToSymbolKeyStyle" - latin:code="@integer/key_switch_alpha_symbol" + latin:code="!code/key_switch_alpha_symbol" latin:keyLabel="@string/label_to_phone_symbols_key" latin:parentStyle="numModeKeyStyle" /> <key-style latin:styleName="numPhoneToNumericKeyStyle" - latin:code="@integer/key_switch_alpha_symbol" + latin:code="!code/key_switch_alpha_symbol" latin:keyLabel="@string/label_to_phone_numeric_key" latin:parentStyle="numModeKeyStyle" /> <!-- U+002C: "," COMMA --> @@ -127,7 +127,7 @@ latin:parentStyle="tabKeyStyle" /> <key-style latin:styleName="numSpaceKeyStyle" - latin:code="@integer/key_space" + latin:code="!code/key_space" latin:keyIcon="iconSpaceKeyForNumberLayout" latin:keyActionFlags="enableLongPress" latin:parentStyle="numKeyBaseStyle" /> diff --git a/java/res/xml/keys_curly_brackets.xml b/java/res/xml/keys_curly_brackets.xml index d21a09281..6a4b1a945 100644 --- a/java/res/xml/keys_curly_brackets.xml +++ b/java/res/xml/keys_curly_brackets.xml @@ -23,8 +23,8 @@ > <Key latin:keyLabel="{" - latin:code="@integer/keycode_for_left_curly_bracket" /> + latin:code="!code/key_left_curly_bracket" /> <Key latin:keyLabel="}" - latin:code="@integer/keycode_for_right_curly_bracket" /> + latin:code="!code/key_right_curly_bracket" /> </merge> diff --git a/java/res/xml/keys_less_greater.xml b/java/res/xml/keys_less_greater.xml index 8961d9ce6..831f2dd86 100644 --- a/java/res/xml/keys_less_greater.xml +++ b/java/res/xml/keys_less_greater.xml @@ -23,10 +23,10 @@ > <Key latin:keyLabel="<" - latin:code="@integer/keycode_for_less_than" + latin:code="!code/key_less_than" latin:moreKeys="@string/more_keys_for_less_than" /> <Key latin:keyLabel=">" - latin:code="@integer/keycode_for_greater_than" + latin:code="!code/key_greater_than" latin:moreKeys="@string/more_keys_for_greater_than" /> </merge> diff --git a/java/res/xml/keys_parentheses.xml b/java/res/xml/keys_parentheses.xml index 6853bf167..502a84ede 100644 --- a/java/res/xml/keys_parentheses.xml +++ b/java/res/xml/keys_parentheses.xml @@ -23,10 +23,10 @@ > <Key latin:keyLabel="(" - latin:code="@integer/keycode_for_left_parenthesis" + latin:code="!code/key_left_parenthesis" latin:moreKeys="@string/more_keys_for_left_parenthesis" /> <Key latin:keyLabel=")" - latin:code="@integer/keycode_for_right_parenthesis" + latin:code="!code/key_right_parenthesis" latin:moreKeys="@string/more_keys_for_right_parenthesis" /> </merge> diff --git a/java/res/xml/keys_square_brackets.xml b/java/res/xml/keys_square_brackets.xml index 44387c3bf..5c128fd0c 100644 --- a/java/res/xml/keys_square_brackets.xml +++ b/java/res/xml/keys_square_brackets.xml @@ -23,8 +23,8 @@ > <Key latin:keyLabel="[" - latin:code="@integer/keycode_for_left_square_bracket" /> + latin:code="!code/key_left_square_bracket" /> <Key latin:keyLabel="]" - latin:code="@integer/keycode_for_right_square_bracket" /> + latin:code="!code/key_right_square_bracket" /> </merge> diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index 0a2b010b6..fbb13c25f 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -26,6 +26,7 @@ import android.util.Log; import android.util.Xml; import com.android.inputmethod.keyboard.internal.KeySpecParser; +import com.android.inputmethod.keyboard.internal.KeySpecParser.MoreKeySpec; import com.android.inputmethod.keyboard.internal.KeyStyles; import com.android.inputmethod.keyboard.internal.KeyStyles.KeyStyle; import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; @@ -104,7 +105,7 @@ public class Key { /** Text to output when pressed. This can be multiple characters, like ".com" */ public final CharSequence mOutputText; /** More keys */ - public final String[] mMoreKeys; + public final MoreKeySpec[] mMoreKeys; /** More keys column number and flags */ private final int mMoreKeysColumnAndFlags; private static final int MORE_KEYS_COLUMN_MASK = 0x000000ff; @@ -140,15 +141,12 @@ public class Key { private boolean mEnabled = true; /** - * This constructor is being used only for key in more keys keyboard. + * This constructor is being used only for keys in more keys keyboard. */ - public Key(Resources res, Keyboard.Params params, String moreKeySpec, - int x, int y, int width, int height, int labelFlags) { - this(params, KeySpecParser.getLabel(moreKeySpec), null, - KeySpecParser.getIconId(moreKeySpec), - KeySpecParser.getCode(res, moreKeySpec), - KeySpecParser.getOutputText(moreKeySpec), - x, y, width, height, labelFlags); + public Key(Keyboard.Params params, MoreKeySpec moreKeySpec, int x, int y, int width, int height, + int labelFlags) { + this(params, moreKeySpec.mLabel, null, moreKeySpec.mIconId, moreKeySpec.mCode, + moreKeySpec.mOutputText, x, y, width, height, labelFlags); } /** @@ -278,13 +276,15 @@ public class Key { moreKeys = KeySpecParser.insertAddtionalMoreKeys(moreKeys, additionalMoreKeys); if (moreKeys != null) { actionFlags |= ACTION_FLAGS_ENABLE_LONG_PRESS; + mMoreKeys = new MoreKeySpec[moreKeys.length]; for (int i = 0; i < moreKeys.length; i++) { - moreKeys[i] = adjustCaseOfStringForKeyboardId( - moreKeys[i], preserveCase, params.mId); + mMoreKeys[i] = new MoreKeySpec(adjustCaseOfStringForKeyboardId( + moreKeys[i], preserveCase, params.mId), params.mCodesSet); } + } else { + mMoreKeys = null; } mActionFlags = actionFlags; - mMoreKeys = moreKeys; if ((mLabelFlags & LABEL_FLAGS_FROM_CUSTOM_ACTION_LABEL) != 0) { mLabel = params.mId.mCustomActionLabel; @@ -300,8 +300,9 @@ public class Key { } String outputText = adjustCaseOfStringForKeyboardId(style.getString( keyAttr, R.styleable.Keyboard_Key_keyOutputText), preserveCase, params.mId); - final int code = style.getInt( - keyAttr, R.styleable.Keyboard_Key_code, Keyboard.CODE_UNSPECIFIED); + final int code = KeySpecParser.parseCode(style.getString( + keyAttr, R.styleable.Keyboard_Key_code), + params.mCodesSet, Keyboard.CODE_UNSPECIFIED); // Choose the first letter of the label as primary code if not specified. if (code == Keyboard.CODE_UNSPECIFIED && TextUtils.isEmpty(outputText) && !TextUtils.isEmpty(mLabel)) { @@ -331,9 +332,10 @@ public class Key { mCode = adjustCaseOfCodeForKeyboardId(code, preserveCase, params.mId); } mOutputText = outputText; - mAltCode = adjustCaseOfCodeForKeyboardId(style.getInt(keyAttr, - R.styleable.Keyboard_Key_altCode, Keyboard.CODE_UNSPECIFIED), preserveCase, - params.mId); + mAltCode = adjustCaseOfCodeForKeyboardId(KeySpecParser.parseCode(style.getString( + keyAttr, R.styleable.Keyboard_Key_altCode), + params.mCodesSet, Keyboard.CODE_UNSPECIFIED), + preserveCase, params.mId); mHashCode = computeHashCode(this); keyAttr.recycle(); diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java index 950b5e99b..36a988bb6 100644 --- a/java/src/com/android/inputmethod/keyboard/Keyboard.java +++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java @@ -28,6 +28,7 @@ import android.util.Xml; import android.view.InflateException; import com.android.inputmethod.keyboard.internal.KeyStyles; +import com.android.inputmethod.keyboard.internal.KeyboardCodesSet; import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; @@ -238,6 +239,7 @@ public class Keyboard { public final ArrayList<Key> mShiftKeys = new ArrayList<Key>(); public final ArrayList<Key> mAltCodeKeysWhileTyping = new ArrayList<Key>(); public final KeyboardIconsSet mIconsSet = new KeyboardIconsSet(); + public final KeyboardCodesSet mCodesSet = new KeyboardCodesSet(); public KeyboardLayoutSet.KeysCache mKeysCache; @@ -775,6 +777,7 @@ public class Keyboard { params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0); params.mIconsSet.loadIcons(keyboardAttr); + params.mCodesSet.setLanguage(params.mId.mLocale.getLanguage()); final int resourceId = keyboardAttr.getResourceId( R.styleable.Keyboard_touchPositionCorrectionData, 0); diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java index 2689e6e13..5ebf92cf7 100644 --- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java @@ -41,7 +41,6 @@ import com.android.inputmethod.accessibility.AccessibilityUtils; import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy; import com.android.inputmethod.keyboard.PointerTracker.DrawingProxy; import com.android.inputmethod.keyboard.PointerTracker.TimerProxy; -import com.android.inputmethod.keyboard.internal.KeySpecParser; import com.android.inputmethod.latin.LatinIME; import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; @@ -555,9 +554,12 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke * method on the base class if the subclass doesn't wish to handle the call. */ protected boolean onLongPress(Key parentKey, PointerTracker tracker) { + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.latinKeyboardView_onLongPress(); + } final int primaryCode = parentKey.mCode; if (parentKey.hasEmbeddedMoreKey()) { - final int embeddedCode = KeySpecParser.getCode(getResources(), parentKey.mMoreKeys[0]); + final int embeddedCode = parentKey.mMoreKeys[0].mCode; tracker.onLongPressed(); invokeCodeInput(embeddedCode); invokeReleaseKey(primaryCode); @@ -695,17 +697,8 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke } } if (ProductionFlag.IS_EXPERIMENTAL) { - if (ResearchLogger.sIsLogging) { - // TODO: remove redundant calculations of size and pressure by - // removing UsabilityStudyLog code once the ResearchLogger is mature enough - final float size = me.getSize(index); - final float pressure = me.getPressure(index); - if (action != MotionEvent.ACTION_MOVE) { - // Skip ACTION_MOVE events as they are logged below - ResearchLogger.getInstance().logMotionEvent(action, eventTime, id, x, y, - size, pressure); - } - } + ResearchLogger.latinKeyboardView_processMotionEvent(me, action, eventTime, index, id, + x, y); } if (mKeyTimerHandler.isInKeyRepeat()) { @@ -773,13 +766,8 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke + pointerSize + "," + pointerPressure); } if (ProductionFlag.IS_EXPERIMENTAL) { - if (ResearchLogger.sIsLogging) { - // TODO: earlier comment about redundant calculations applies here too - final float pointerSize = me.getSize(i); - final float pointerPressure = me.getPressure(i); - ResearchLogger.getInstance().logMotionEvent(action, eventTime, pointerId, - px, py, pointerSize, pointerPressure); - } + ResearchLogger.latinKeyboardView_processMotionEvent(me, action, eventTime, + i, pointerId, px, py); } } } else { diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java index 72a5d0f05..f8682d8ca 100644 --- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java +++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java @@ -19,7 +19,7 @@ package com.android.inputmethod.keyboard; import android.graphics.Paint; import android.graphics.drawable.Drawable; -import com.android.inputmethod.keyboard.internal.KeySpecParser; +import com.android.inputmethod.keyboard.internal.KeySpecParser.MoreKeySpec; import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.StringUtils; @@ -301,8 +301,8 @@ public class MoreKeysKeyboard extends Keyboard { ? view.mKeyDrawParams.mKeyLabelSize : view.mKeyDrawParams.mKeyLetterSize); int maxWidth = minKeyWidth; - for (String moreKeySpec : parentKey.mMoreKeys) { - final String label = KeySpecParser.getLabel(moreKeySpec); + for (final MoreKeySpec spec : parentKey.mMoreKeys) { + final String label = spec.mLabel; // If the label is single letter, minKeyWidth is enough to hold the label. if (label != null && StringUtils.codePointCount(label) > 1) { final int width = (int)view.getLabelWidth(label, paint) + padding; @@ -336,13 +336,13 @@ public class MoreKeysKeyboard extends Keyboard { // label's code point count. final int moreKeyFlags = mParentKey.hasLabelsInMoreKeys() ? 0 : Key.LABEL_FLAGS_FOLLOW_KEY_LETTER_RATIO; - final String[] moreKeys = mParentKey.mMoreKeys; + final MoreKeySpec[] moreKeys = mParentKey.mMoreKeys; for (int n = 0; n < moreKeys.length; n++) { - final String moreKeySpec = moreKeys[n]; + final MoreKeySpec moreKeySpec = moreKeys[n]; final int row = n / params.mNumColumns; final int x = params.getX(n, row); final int y = params.getY(row); - final Key key = new Key(mResources, params, moreKeySpec, x, y, + final Key key = new Key(params, moreKeySpec, x, y, params.mDefaultKeyWidth, params.mDefaultRowHeight, moreKeyFlags); params.markAsEdgeKey(key, row); params.onAddKey(key); diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index ec9081681..24ab54730 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -23,6 +23,8 @@ import android.widget.TextView; import com.android.inputmethod.keyboard.internal.PointerTrackerQueue; import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.ResearchLogger; +import com.android.inputmethod.latin.define.ProductionFlag; import java.util.ArrayList; @@ -235,6 +237,10 @@ public class PointerTracker { + " ignoreModifier=" + ignoreModifierKey + " enabled=" + key.isEnabled()); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.pointerTracker_callListenerOnPressAndCheckKeyboardLayoutChange(key, + ignoreModifierKey); + } if (ignoreModifierKey) { return false; } @@ -259,6 +265,10 @@ public class PointerTracker { + " ignoreModifier=" + ignoreModifierKey + " altersCode=" + altersCode + " enabled=" + key.isEnabled()); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.pointerTracker_callListenerOnCodeInput(key, x, y, ignoreModifierKey, + altersCode, code); + } if (ignoreModifierKey) { return; } @@ -284,6 +294,10 @@ public class PointerTracker { + " sliding=" + withSliding + " ignoreModifier=" + ignoreModifierKey + " enabled="+ key.isEnabled()); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.pointerTracker_callListenerOnRelease(key, primaryCode, withSliding, + ignoreModifierKey); + } if (ignoreModifierKey) { return; } @@ -295,6 +309,9 @@ public class PointerTracker { private void callListenerOnCancelInput() { if (DEBUG_LISTENER) Log.d(TAG, "onCancelInput"); + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.pointerTracker_callListenerOnCancelInput(); + } mListener.onCancelInput(); } @@ -479,6 +496,9 @@ public class PointerTracker { if (DEBUG_MODE) Log.w(TAG, "onDownEvent: ignore potential noise: time=" + deltaT + " distance=" + distanceSquared); + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.pointerTracker_onDownEvent(deltaT, distanceSquared); + } mKeyAlreadyProcessed = true; return; } @@ -583,6 +603,9 @@ public class PointerTracker { 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)); + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.pointerTracker_onMoveEvent(x, y, lastX, lastY); + } onUpEventInternal(lastX, lastY, eventTime); onDownEventInternal(x, y, eventTime); } else { diff --git a/java/src/com/android/inputmethod/keyboard/SuddenJumpingTouchEventHandler.java b/java/src/com/android/inputmethod/keyboard/SuddenJumpingTouchEventHandler.java index 347383f95..107138395 100644 --- a/java/src/com/android/inputmethod/keyboard/SuddenJumpingTouchEventHandler.java +++ b/java/src/com/android/inputmethod/keyboard/SuddenJumpingTouchEventHandler.java @@ -22,7 +22,9 @@ import android.view.MotionEvent; import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.ResearchLogger; import com.android.inputmethod.latin.Utils; +import com.android.inputmethod.latin.define.ProductionFlag; public class SuddenJumpingTouchEventHandler { private static final String TAG = SuddenJumpingTouchEventHandler.class.getSimpleName(); @@ -141,6 +143,9 @@ public class SuddenJumpingTouchEventHandler { if (handleSuddenJumping(me)) { if (DEBUG_MODE) Log.w(TAG, "onTouchEvent: ignore sudden jump " + me); + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.suddenJumpingTouchEventHandler_onTouchEvent(me); + } return true; } return mView.processMotionEvent(me); diff --git a/java/src/com/android/inputmethod/keyboard/internal/AlphabetShiftState.java b/java/src/com/android/inputmethod/keyboard/internal/AlphabetShiftState.java index 5712df1fc..392afca97 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/AlphabetShiftState.java +++ b/java/src/com/android/inputmethod/keyboard/internal/AlphabetShiftState.java @@ -18,6 +18,9 @@ package com.android.inputmethod.keyboard.internal; import android.util.Log; +import com.android.inputmethod.latin.ResearchLogger; +import com.android.inputmethod.latin.define.ProductionFlag; + public class AlphabetShiftState { private static final String TAG = AlphabetShiftState.class.getSimpleName(); private static final boolean DEBUG = false; @@ -59,6 +62,9 @@ public class AlphabetShiftState { } if (DEBUG) Log.d(TAG, "setShifted(" + newShiftState + "): " + toString(oldState) + " > " + this); + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.alphabetShiftState_setShifted(newShiftState, oldState, this); + } } public void setShiftLocked(boolean newShiftLockState) { @@ -78,6 +84,9 @@ public class AlphabetShiftState { if (DEBUG) Log.d(TAG, "setShiftLocked(" + newShiftLockState + "): " + toString(oldState) + " > " + this); + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.alphabetShiftState_setShiftLocked(newShiftLockState, oldState, this); + } } public void setAutomaticShifted() { @@ -85,6 +94,9 @@ public class AlphabetShiftState { mState = AUTOMATIC_SHIFTED; if (DEBUG) Log.d(TAG, "setAutomaticShifted: " + toString(oldState) + " > " + this); + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.alphabetShiftState_setAutomaticShifted(oldState, this); + } } public boolean isShiftedOrShiftLocked() { diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java index 4abd887f0..288fb4556 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java @@ -21,7 +21,6 @@ import android.text.TextUtils; import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.latin.LatinImeLogger; -import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.StringUtils; import java.util.ArrayList; @@ -33,9 +32,11 @@ import java.util.Arrays; * - String resource can be embedded into specification @string/name. This is done before parsing * comma. * Each "more key" specification 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_name|@integer/key_code) + * - Icon followed by keyOutputText or code (!icon/icon_name|!code/code_name) + * - Icon should be a string representation of icon (!icon/icon_name). + * - Code should be a code point presented by hexadecimal string prefixed with "0x". + * Or a string representation of code (!code/code_name). * 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_name. @@ -52,10 +53,25 @@ public class KeySpecParser { private static final char SUFFIX_SLASH = '/'; private static final String PREFIX_STRING = PREFIX_AT + "string" + SUFFIX_SLASH; private static final char LABEL_END = '|'; - private static final String PREFIX_ICON = PREFIX_AT + "icon" + SUFFIX_SLASH; - private static final String PREFIX_CODE = PREFIX_AT + "integer" + SUFFIX_SLASH; + private static final String PREFIX_ICON = "!icon/"; + private static final String PREFIX_CODE = "!code/"; + private static final String PREFIX_HEX = "0x"; private static final String ADDITIONAL_MORE_KEY_MARKER = "%"; + public static class MoreKeySpec { + public final int mCode; + public final String mLabel; + public final String mOutputText; + public final int mIconId; + + public MoreKeySpec(final String moreKeySpec, final KeyboardCodesSet codesSet) { + mCode = getCode(moreKeySpec, codesSet); + mLabel = getLabel(moreKeySpec); + mOutputText = getOutputText(moreKeySpec); + mIconId = getIconId(moreKeySpec); + } + } + private KeySpecParser() { // Intentional empty constructor for utility class. } @@ -144,7 +160,7 @@ public class KeySpecParser { return parseEscape(moreKeySpec.substring(end + /* LABEL_END */1)); } - public static String getOutputText(String moreKeySpec) { + private static String getOutputText(String moreKeySpec) { if (hasCode(moreKeySpec)) { return null; } @@ -168,17 +184,13 @@ public class KeySpecParser { return (StringUtils.codePointCount(label) == 1) ? null : label; } - public static int getCode(Resources res, String moreKeySpec) { + private static int getCode(String moreKeySpec, KeyboardCodesSet codesSet) { if (hasCode(moreKeySpec)) { final int end = indexOfLabelEnd(moreKeySpec, 0); if (indexOfLabelEnd(moreKeySpec, end + 1) >= 0) { throw new KeySpecParserError("Multiple " + LABEL_END + ": " + moreKeySpec); } - final int resId = getResourceId(res, - moreKeySpec.substring(end + /* LABEL_END */1 + /* PREFIX_AT */1), - R.string.english_ime_name); - final int code = res.getInteger(resId); - return code; + return parseCode(moreKeySpec.substring(end + 1), codesSet, Keyboard.CODE_UNSPECIFIED); } final String outputText = getOutputTextInternal(moreKeySpec); if (outputText != null) { @@ -197,7 +209,18 @@ public class KeySpecParser { return Keyboard.CODE_OUTPUT_TEXT; } - public static int getIconId(String moreKeySpec) { + public static int parseCode(String text, KeyboardCodesSet codesSet, int defCode) { + if (text == null) return defCode; + if (text.startsWith(PREFIX_CODE)) { + return codesSet.getCode(text.substring(PREFIX_CODE.length())); + } else if (text.startsWith(PREFIX_HEX)) { + return Integer.parseInt(text.substring(PREFIX_HEX.length()), 16); + } else { + return Integer.parseInt(text); + } + } + + private static int getIconId(String moreKeySpec) { if (hasIcon(moreKeySpec)) { final int end = moreKeySpec.indexOf(LABEL_END, PREFIX_ICON.length()); final String name = moreKeySpec.substring(PREFIX_ICON.length(), end); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java index 9e5c227eb..405b7ad05 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java @@ -102,8 +102,8 @@ public class KeyStyles { void readKeyAttributes(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); + readString(keyAttr, R.styleable.Keyboard_Key_code); + readString(keyAttr, R.styleable.Keyboard_Key_altCode); readString(keyAttr, R.styleable.Keyboard_Key_keyLabel); readString(keyAttr, R.styleable.Keyboard_Key_keyOutputText); readString(keyAttr, R.styleable.Keyboard_Key_keyHintLabel); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java new file mode 100644 index 000000000..736a96c56 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * 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.Keyboard; + +import java.util.HashMap; + +public class KeyboardCodesSet { + private static final HashMap<String, int[]> sLanguageToCodesMap = + new HashMap<String, int[]>(); + private static final HashMap<String, Integer> sNameToIdMap = new HashMap<String, Integer>(); + + private int[] mCodes = DEFAULT; + + public void setLanguage(final String language) { + final int[] codes = sLanguageToCodesMap.get(language); + mCodes = (codes != null) ? codes : DEFAULT; + } + + public int getCode(final String name) { + final Integer id = sNameToIdMap.get(name); + if (id == null) throw new RuntimeException("Unknown key code: " + name); + return mCodes[id]; + } + + private static final String[] ID_TO_NAME = { + "key_tab", + "key_enter", + "key_space", + "key_shift", + "key_switch_alpha_symbol", + "key_output_text", + "key_delete", + "key_settings", + "key_shortcut", + "key_action_enter", + "key_action_next", + "key_action_previous", + "key_language_switch", + "key_unspecified", + "key_left_parenthesis", + "key_right_parenthesis", + "key_less_than", + "key_greater_than", + "key_left_square_bracket", + "key_right_square_bracket", + "key_left_curly_bracket", + "key_right_curly_bracket", + }; + + private static final int CODE_LEFT_PARENTHESIS = '('; + private static final int CODE_RIGHT_PARENTHESIS = ')'; + private static final int CODE_LESS_THAN_SIGN = '<'; + private static final int CODE_GREATER_THAN_SIGN = '>'; + private static final int CODE_LEFT_SQUARE_BRACKET = '['; + private static final int CODE_RIGHT_SQUARE_BRACKET = ']'; + private static final int CODE_LEFT_CURLY_BRACKET = '{'; + private static final int CODE_RIGHT_CURLY_BRACKET = '}'; + + private static final int[] DEFAULT = { + Keyboard.CODE_TAB, + Keyboard.CODE_ENTER, + Keyboard.CODE_SPACE, + Keyboard.CODE_SHIFT, + Keyboard.CODE_SWITCH_ALPHA_SYMBOL, + Keyboard.CODE_OUTPUT_TEXT, + Keyboard.CODE_DELETE, + Keyboard.CODE_SETTINGS, + Keyboard.CODE_SHORTCUT, + Keyboard.CODE_ACTION_ENTER, + Keyboard.CODE_ACTION_NEXT, + Keyboard.CODE_ACTION_PREVIOUS, + Keyboard.CODE_LANGUAGE_SWITCH, + Keyboard.CODE_UNSPECIFIED, + CODE_LEFT_PARENTHESIS, + CODE_RIGHT_PARENTHESIS, + CODE_LESS_THAN_SIGN, + CODE_GREATER_THAN_SIGN, + CODE_LEFT_SQUARE_BRACKET, + CODE_RIGHT_SQUARE_BRACKET, + CODE_LEFT_CURLY_BRACKET, + CODE_RIGHT_CURLY_BRACKET, + }; + + private static final int[] RTL = { + DEFAULT[0], + DEFAULT[1], + DEFAULT[2], + DEFAULT[3], + DEFAULT[4], + DEFAULT[5], + DEFAULT[6], + DEFAULT[7], + DEFAULT[8], + DEFAULT[9], + DEFAULT[10], + DEFAULT[11], + DEFAULT[12], + DEFAULT[13], + CODE_RIGHT_PARENTHESIS, + CODE_LEFT_PARENTHESIS, + CODE_GREATER_THAN_SIGN, + CODE_LESS_THAN_SIGN, + CODE_RIGHT_SQUARE_BRACKET, + CODE_LEFT_SQUARE_BRACKET, + CODE_RIGHT_CURLY_BRACKET, + CODE_LEFT_CURLY_BRACKET, + }; + + private static final String LANGUAGE_DEFAULT = "DEFAULT"; + private static final String LANGUAGE_ARABIC = "ar"; + private static final String LANGUAGE_PERSIAN = "fa"; + private static final String LANGUAGE_HEBREW = "iw"; + + private static final Object[] LANGUAGE_AND_CODES = { + LANGUAGE_DEFAULT, DEFAULT, + LANGUAGE_ARABIC, RTL, + LANGUAGE_PERSIAN, RTL, + LANGUAGE_HEBREW, RTL, + }; + + static { + for (int i = 0; i < ID_TO_NAME.length; i++) { + sNameToIdMap.put(ID_TO_NAME[i], i); + } + + for (int i = 0; i < LANGUAGE_AND_CODES.length; i += 2) { + final String language = (String)LANGUAGE_AND_CODES[i]; + final int[] codes = (int[])LANGUAGE_AND_CODES[i + 1]; + sLanguageToCodesMap.put(language, codes); + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java index 18a3f9794..6949c9d12 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java @@ -20,6 +20,8 @@ import android.text.TextUtils; import android.util.Log; import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.latin.ResearchLogger; +import com.android.inputmethod.latin.define.ProductionFlag; /** * Keyboard state machine. @@ -139,6 +141,9 @@ public class KeyboardState { if (DEBUG_EVENT) { Log.d(TAG, "onSaveKeyboardState: saved=" + state + " " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_onSaveKeyboardState(this, state.toString()); + } } private void onRestoreKeyboardState() { @@ -146,6 +151,9 @@ public class KeyboardState { if (DEBUG_EVENT) { Log.d(TAG, "onRestoreKeyboardState: saved=" + state + " " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_onRestoreKeyboardState(this, state.toString()); + } if (!state.mIsValid || state.mIsAlphabetMode) { setAlphabetKeyboard(); } else { @@ -178,6 +186,9 @@ public class KeyboardState { if (DEBUG_ACTION) { Log.d(TAG, "setShifted: shiftMode=" + shiftModeToString(shiftMode) + " " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_setShifted(this, shiftModeToString(shiftMode)); + } if (!mIsAlphabetMode) return; final int prevShiftMode; if (mAlphabetShiftState.isAutomaticShifted()) { @@ -217,6 +228,9 @@ public class KeyboardState { if (DEBUG_ACTION) { Log.d(TAG, "setShiftLocked: shiftLocked=" + shiftLocked + " " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_setShiftLocked(this, shiftLocked); + } if (!mIsAlphabetMode) return; if (shiftLocked && (!mAlphabetShiftState.isShiftLocked() || mAlphabetShiftState.isShiftLockShifted())) { @@ -232,6 +246,9 @@ public class KeyboardState { if (DEBUG_ACTION) { Log.d(TAG, "toggleAlphabetAndSymbols: " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_toggleAlphabetAndSymbols(this); + } if (mIsAlphabetMode) { mPrevMainKeyboardWasShiftLocked = mAlphabetShiftState.isShiftLocked(); if (mPrevSymbolsKeyboardWasShifted) { @@ -262,6 +279,10 @@ public class KeyboardState { if (DEBUG_ACTION) { Log.d(TAG, "setAlphabetKeyboard"); } + + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_setAlphabetKeyboard(); + } mSwitchActions.setAlphabetKeyboard(); mIsAlphabetMode = true; mIsSymbolShifted = false; @@ -273,6 +294,9 @@ public class KeyboardState { if (DEBUG_ACTION) { Log.d(TAG, "setSymbolsKeyboard"); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_setSymbolsKeyboard(); + } mSwitchActions.setSymbolsKeyboard(); mIsAlphabetMode = false; mIsSymbolShifted = false; @@ -285,6 +309,9 @@ public class KeyboardState { if (DEBUG_ACTION) { Log.d(TAG, "setSymbolsShiftedKeyboard"); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_setSymbolsShiftedKeyboard(); + } mSwitchActions.setSymbolsShiftedKeyboard(); mIsAlphabetMode = false; mIsSymbolShifted = true; @@ -297,6 +324,9 @@ public class KeyboardState { if (DEBUG_EVENT) { Log.d(TAG, "onPressKey: code=" + Keyboard.printableCode(code) + " " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_onPressKey(code, this); + } if (code == Keyboard.CODE_SHIFT) { onPressShift(); } else if (code == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { @@ -314,6 +344,9 @@ public class KeyboardState { Log.d(TAG, "onReleaseKey: code=" + Keyboard.printableCode(code) + " sliding=" + withSliding + " " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_onReleaseKey(this, code, withSliding); + } if (code == Keyboard.CODE_SHIFT) { onReleaseShift(withSliding); } else if (code == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { @@ -345,6 +378,9 @@ public class KeyboardState { if (DEBUG_EVENT) { Log.d(TAG, "onLongPressTimeout: code=" + Keyboard.printableCode(code) + " " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_onLongPressTimeout(code, this); + } if (mIsAlphabetMode && code == Keyboard.CODE_SHIFT) { if (mAlphabetShiftState.isShiftLocked()) { setShiftLocked(false); @@ -363,6 +399,9 @@ public class KeyboardState { if (DEBUG_EVENT) { Log.d(TAG, "onUpdateShiftState: autoCaps=" + autoCaps + " " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_onUpdateShiftState(this, autoCaps); + } updateAlphabetShiftState(autoCaps); } @@ -481,6 +520,9 @@ public class KeyboardState { if (DEBUG_EVENT) { Log.d(TAG, "onCancelInput: single=" + isSinglePointer + " " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_onCancelInput(isSinglePointer, this); + } // Switch back to the previous keyboard mode if the user cancels sliding input. if (isSinglePointer) { if (mSwitchState == SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL) { @@ -512,6 +554,9 @@ public class KeyboardState { + " single=" + isSinglePointer + " autoCaps=" + autoCaps + " " + this); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.keyboardState_onCodeInput(code, isSinglePointer, autoCaps, this); + } switch (mSwitchState) { case SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL: diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index f5c09974e..e0fa2f838 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -665,6 +665,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen + String.format("inputType=0x%08x imeOptions=0x%08x", editorInfo.inputType, editorInfo.imeOptions)); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.latinIME_onStartInputViewInternal(editorInfo); + } if (StringUtils.inPrivateImeOptions(null, IME_OPTION_NO_MICROPHONE_COMPAT, editorInfo)) { Log.w(TAG, "Deprecated private IME option specified: " + editorInfo.privateImeOptions); @@ -762,19 +765,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, composingSpanStart, composingSpanEnd); - if (ProductionFlag.IS_EXPERIMENTAL) { - if (ResearchLogger.UnsLogGroup.ON_UPDATE_SELECTION.isEnabled) { - final String s = "onUpdateSelection: oss=" + oldSelStart - + ", ose=" + oldSelEnd - + ", lss=" + mLastSelectionStart - + ", lse=" + mLastSelectionEnd - + ", nss=" + newSelStart - + ", nse=" + newSelEnd - + ", cs=" + composingSpanStart - + ", ce=" + composingSpanEnd; - ResearchLogger.logUnstructured(ResearchLogger.UnsLogGroup.ON_UPDATE_SELECTION, s); - } - } if (DEBUG) { Log.i(TAG, "onUpdateSelection: oss=" + oldSelStart + ", ose=" + oldSelEnd @@ -785,6 +775,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen + ", cs=" + composingSpanStart + ", ce=" + composingSpanEnd); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.latinIME_onUpdateSelection(mLastSelectionStart, mLastSelectionEnd, + oldSelStart, oldSelEnd, newSelStart, newSelEnd, composingSpanStart, + composingSpanEnd); + } // TODO: refactor the following code to be less contrived. // "newSelStart != composingSpanEnd" || "newSelEnd != composingSpanEnd" means @@ -886,6 +881,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } } } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.latinIME_onDisplayCompletions(applicationSpecifiedCompletions); + } if (mInputAttributes.mApplicationSpecifiedCompletionOn) { mApplicationSpecifiedCompletions = applicationSpecifiedCompletions; if (applicationSpecifiedCompletions == null) { @@ -1660,6 +1658,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen if (DEBUG) { Log.d(TAG, "Switch to keyboard view."); } + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.latinIME_switchToKeyboardView(); + } View v = mKeyboardSwitcher.getKeyboardView(); if (v != null) { // Confirms that the keyboard view doesn't have parent view. diff --git a/java/src/com/android/inputmethod/latin/ResearchLogger.java b/java/src/com/android/inputmethod/latin/ResearchLogger.java index c5fb61f78..08c26a5df 100644 --- a/java/src/com/android/inputmethod/latin/ResearchLogger.java +++ b/java/src/com/android/inputmethod/latin/ResearchLogger.java @@ -25,15 +25,20 @@ import android.os.SystemClock; import android.text.TextUtils; import android.util.Log; import android.view.MotionEvent; +import android.view.inputmethod.CompletionInfo; +import android.view.inputmethod.EditorInfo; +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.KeyDetector; import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.internal.AlphabetShiftState; +import com.android.inputmethod.keyboard.internal.KeyboardState; +import com.android.inputmethod.latin.define.ProductionFlag; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter; -import java.text.SimpleDateFormat; -import java.util.Date; /** * Logs the use of the LatinIME keyboard. @@ -46,13 +51,12 @@ import java.util.Date; public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = ResearchLogger.class.getSimpleName(); private static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode"; + private static final boolean DEBUG = false; private static final ResearchLogger sInstance = new ResearchLogger(new LogFileManager()); public static boolean sIsLogging = false; /* package */ final Handler mLoggingHandler; private InputMethodService mIms; - private final Date mDate; - private final SimpleDateFormat mDateFormat; /** * Isolates management of files. This variable should never be null, but can be changed @@ -79,35 +83,36 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang /* package */ LogFileManager() { } - public void init(InputMethodService ims) { + public void init(final InputMethodService ims) { mIms = ims; } - public synchronized void createLogFile() { + public synchronized boolean createLogFile() { try { - createLogFile(DEFAULT_LOG_DIRECTORY, DEFAULT_FILENAME); - } catch (FileNotFoundException e) { + return createLogFile(DEFAULT_LOG_DIRECTORY, DEFAULT_FILENAME); + } catch (final FileNotFoundException e) { Log.w(TAG, e); + return false; } } - public synchronized void createLogFile(String dir, String filename) + public synchronized boolean createLogFile(final String dir, final String filename) throws FileNotFoundException { if (mIms == null) { Log.w(TAG, "InputMethodService is not configured. Logging is off."); - return; + return false; } - File filesDir = mIms.getFilesDir(); + final File filesDir = mIms.getFilesDir(); if (filesDir == null || !filesDir.exists()) { Log.w(TAG, "Storage directory does not exist. Logging is off."); - return; + return false; } - File directory = new File(filesDir, dir); + final File directory = new File(filesDir, dir); if (!directory.exists()) { - boolean wasCreated = directory.mkdirs(); + final boolean wasCreated = directory.mkdirs(); if (!wasCreated) { Log.w(TAG, "Log directory cannot be created. Logging is off."); - return; + return false; } } @@ -120,16 +125,23 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang append = false; } mPrintWriter = new PrintWriter(new FileOutputStream(mFile, append), true); + return true; } - public synchronized boolean append(String s) { + public synchronized boolean append(final String s) { if (mPrintWriter == null) { - Log.w(TAG, "PrintWriter is null"); - return false; - } else { - mPrintWriter.print(s); - return !mPrintWriter.checkError(); + if (DEBUG) { + Log.w(TAG, "PrintWriter is null... attempting to create default log file"); + } + if (!createLogFile()) { + if (DEBUG) { + Log.w(TAG, "Failed to create log file. Not logging."); + return false; + } + } } + mPrintWriter.print(s); + return !mPrintWriter.checkError(); } public synchronized void reset() { @@ -152,11 +164,8 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } } - private ResearchLogger(LogFileManager logFileManager) { - mDate = new Date(); - mDateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss.SSSZ"); - - HandlerThread handlerThread = new HandlerThread("ResearchLogger logging task", + private ResearchLogger(final LogFileManager logFileManager) { + final HandlerThread handlerThread = new HandlerThread("ResearchLogger logging task", Process.THREAD_PRIORITY_BACKGROUND); handlerThread.start(); mLoggingHandler = new Handler(handlerThread.getLooper()); @@ -167,11 +176,11 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang return sInstance; } - public static void init(InputMethodService ims, SharedPreferences prefs) { + public static void init(final InputMethodService ims, final SharedPreferences prefs) { sInstance.initInternal(ims, prefs); } - public void initInternal(InputMethodService ims, SharedPreferences prefs) { + public void initInternal(final InputMethodService ims, final SharedPreferences prefs) { mIms = ims; if (mLogFileManager != null) { mLogFileManager.init(ims); @@ -188,7 +197,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang * * @throws IllegalArgumentException if logFileManager is null */ - void setLogFileManager(LogFileManager manager) { + void setLogFileManager(final LogFileManager manager) { if (manager == null) { throw new IllegalArgumentException("warning: trying to set null logFileManager"); } else { @@ -203,11 +212,12 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang MOTION_EVENT("m"), KEY("k"), CORRECTION("c"), - STATE_CHANGE("s"); + STATE_CHANGE("s"), + UNSTRUCTURED("u"); private final String mLogString; - private LogGroup(String logString) { + private LogGroup(final String logString) { mLogString = logString; } } @@ -226,7 +236,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang default: eventTag = "[Action" + action + "]"; break; } if (!TextUtils.isEmpty(eventTag)) { - StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(); sb.append(eventTag); sb.append('\t'); sb.append(eventTime); sb.append('\t'); sb.append(id); @@ -238,7 +248,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } } - public void logKeyEvent(int code, int x, int y) { + public void logKeyEvent(final int code, final int x, final int y) { final StringBuilder sb = new StringBuilder(); sb.append(Keyboard.printableCode(code)); sb.append('\t'); sb.append(x); @@ -246,7 +256,8 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang write(LogGroup.KEY, sb.toString()); } - public void logCorrection(String subgroup, String before, String after, int position) { + public void logCorrection(final String subgroup, final String before, final String after, + final int position) { final StringBuilder sb = new StringBuilder(); sb.append(subgroup); sb.append('\t'); sb.append(before); @@ -255,19 +266,58 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang write(LogGroup.CORRECTION, sb.toString()); } - public void logStateChange(String subgroup, String details) { + public void logStateChange(final String subgroup, final String details) { write(LogGroup.STATE_CHANGE, subgroup + "\t" + details); } - public static enum UnsLogGroup { - // TODO: expand to include one flag per log point - // TODO: support selective enabling of flags - ON_UPDATE_SELECTION; - - public boolean isEnabled = true; + public static class UnsLogGroup { + private static final boolean DEFAULT_ENABLED = true; + + private static final boolean ALPHABETSHIFTSTATE_SETSHIFTED_ENABLED = DEFAULT_ENABLED; + private static final boolean ALPHABETSHIFTSTATE_SETSHIFTLOCKED_ENABLED = DEFAULT_ENABLED; + private static final boolean ALPHABETSHIFTSTATE_SETAUTOMATICSHIFTED_ENABLED + = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_ONCANCELINPUT_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_ONCODEINPUT_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_ONLONGPRESSTIMEOUT_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_ONPRESSKEY_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_ONRELEASEKEY_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_ONRESTOREKEYBOARDSTATE_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_ONSAVEKEYBOARDSTATE_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_ONUPDATESHIFTSTATE_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_SETALPHABETKEYBOARD_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_SETSHIFTED_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_SETSHIFTLOCKED_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_SETSYMBOLSKEYBOARD_ENABLED = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_SETSYMBOLSSHIFTEDKEYBOARD_ENABLED + = DEFAULT_ENABLED; + private static final boolean KEYBOARDSTATE_TOGGLEALPHABETANDSYMBOLS_ENABLED + = DEFAULT_ENABLED; + private static final boolean LATINIME_ONDISPLAYCOMPLETIONS_ENABLED = DEFAULT_ENABLED; + private static final boolean LATINIME_ONSTARTINPUTVIEWINTERNAL_ENABLED = DEFAULT_ENABLED; + private static final boolean LATINIME_ONUPDATESELECTION_ENABLED = DEFAULT_ENABLED; + private static final boolean LATINIME_SWITCHTOKEYBOARDVIEW_ENABLED = DEFAULT_ENABLED; + private static final boolean LATINKEYBOARDVIEW_ONLONGPRESS_ENABLED = DEFAULT_ENABLED; + private static final boolean LATINKEYBOARDVIEW_ONPROCESSMOTIONEVENT_ENABLED + = DEFAULT_ENABLED; + private static final boolean POINTERTRACKER_CALLLISTENERONCANCELINPUT_ENABLED + = DEFAULT_ENABLED; + private static final boolean POINTERTRACKER_CALLLISTENERONCODEINPUT_ENABLED + = DEFAULT_ENABLED; + private static final boolean + POINTERTRACKER_CALLLISTENERONPRESSANDCHECKKEYBOARDLAYOUTCHANGE_ENABLED + = DEFAULT_ENABLED; + private static final boolean POINTERTRACKER_CALLLISTENERONRELEASE_ENABLED = DEFAULT_ENABLED; + private static final boolean POINTERTRACKER_ONDOWNEVENT_ENABLED = DEFAULT_ENABLED; + private static final boolean POINTERTRACKER_ONMOVEEVENT_ENABLED = DEFAULT_ENABLED; + private static final boolean SUDDENJUMPINGTOUCHEVENTHANDLER_ONTOUCHEVENT_ENABLED + = DEFAULT_ENABLED; + private static final boolean SUGGESTIONSVIEW_SETSUGGESTIONS_ENABLED = DEFAULT_ENABLED; } - public static void logUnstructured(UnsLogGroup logGroup, String details) { + public static void logUnstructured(String logGroup, final String details) { + // TODO: improve performance by making entire class static and/or implementing natively + getInstance().write(LogGroup.UNSTRUCTURED, logGroup + "\t" + details); } private void write(final LogGroup logGroup, final String log) { @@ -282,13 +332,14 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang builder.append('\t'); builder.append(upTime); builder.append('\t'); builder.append(logGroup.mLogString); builder.append('\t'); builder.append(log); - if (LatinImeLogger.sDBG) { + builder.append('\n'); + if (DEBUG) { Log.d(TAG, "Write: " + '[' + logGroup.mLogString + ']' + log); } if (mLogFileManager.append(builder.toString())) { // success } else { - if (LatinImeLogger.sDBG) { + if (DEBUG) { Log.w(TAG, "Unable to write to log."); } } @@ -300,7 +351,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang mLoggingHandler.post(new Runnable() { @Override public void run() { - if (LatinImeLogger.sDBG) { + if (DEBUG) { Log.d(TAG, "Delete log file."); } mLogFileManager.reset(); @@ -315,4 +366,287 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } sIsLogging = prefs.getBoolean(PREF_USABILITY_STUDY_MODE, false); } + + public static void alphabetShiftState_setShifted(final boolean newShiftState, + final int oldState, final AlphabetShiftState alphabetShiftState) { + if (UnsLogGroup.ALPHABETSHIFTSTATE_SETSHIFTED_ENABLED) { + final String s = "setShifted(" + newShiftState + "): " + oldState + + " > " + alphabetShiftState; + logUnstructured("AlphabetShiftState_setShifted", s); + } + } + + public static void alphabetShiftState_setShiftLocked(final boolean newShiftLockState, + final int oldState, final AlphabetShiftState alphabetShiftState) { + if (UnsLogGroup.ALPHABETSHIFTSTATE_SETSHIFTLOCKED_ENABLED) { + final String s = "setShiftLocked(" + newShiftLockState + "): " + + oldState + " > " + alphabetShiftState; + logUnstructured("AlphabetShiftState_setShiftLocked", s); + } + } + + public static void alphabetShiftState_setAutomaticShifted(final int oldState, + final AlphabetShiftState alphabetShiftState) { + if (UnsLogGroup.ALPHABETSHIFTSTATE_SETAUTOMATICSHIFTED_ENABLED) { + final String s = "setAutomaticShifted: " + oldState + " > " + alphabetShiftState; + logUnstructured("AlphabetShiftState_setAutomaticShifted", s); + } + } + + public static void keyboardState_onCancelInput(final boolean isSinglePointer, + final KeyboardState keyboardState) { + if (UnsLogGroup.KEYBOARDSTATE_ONCANCELINPUT_ENABLED) { + final String s = "onCancelInput: single=" + isSinglePointer + " " + keyboardState; + logUnstructured("KeyboardState_onCancelInput", s); + } + } + + public static void keyboardState_onCodeInput( + final int code, final boolean isSinglePointer, final boolean autoCaps, + final KeyboardState keyboardState) { + if (UnsLogGroup.KEYBOARDSTATE_ONCODEINPUT_ENABLED) { + final String s = "onCodeInput: code=" + Keyboard.printableCode(code) + + " single=" + isSinglePointer + + " autoCaps=" + autoCaps + " " + keyboardState; + logUnstructured("KeyboardState_onCodeInput", s); + } + } + + public static void keyboardState_onLongPressTimeout(final int code, + final KeyboardState keyboardState) { + if (UnsLogGroup.KEYBOARDSTATE_ONLONGPRESSTIMEOUT_ENABLED) { + final String s = "onLongPressTimeout: code=" + Keyboard.printableCode(code) + " " + + keyboardState; + logUnstructured("KeyboardState_onLongPressTimeout", s); + } + } + + public static void keyboardState_onPressKey(final int code, + final KeyboardState keyboardState) { + if (UnsLogGroup.KEYBOARDSTATE_ONPRESSKEY_ENABLED) { + final String s = "onPressKey: code=" + Keyboard.printableCode(code) + " " + + keyboardState; + logUnstructured("KeyboardState_onPressKey", s); + } + } + + public static void keyboardState_onReleaseKey(final KeyboardState keyboardState, final int code, + final boolean withSliding) { + if (UnsLogGroup.KEYBOARDSTATE_ONRELEASEKEY_ENABLED) { + final String s = "onReleaseKey: code=" + Keyboard.printableCode(code) + + " sliding=" + withSliding + " " + keyboardState; + logUnstructured("KeyboardState_onReleaseKey", s); + } + } + + public static void keyboardState_onRestoreKeyboardState(final KeyboardState keyboardState, + final String savedKeyboardState) { + if (UnsLogGroup.KEYBOARDSTATE_ONRESTOREKEYBOARDSTATE_ENABLED) { + final String s = "onRestoreKeyboardState: saved=" + savedKeyboardState + " " + + keyboardState; + logUnstructured("KeyboardState_onRestoreKeyboardState", s); + } + } + + public static void keyboardState_onSaveKeyboardState(final KeyboardState keyboardState, + final String savedKeyboardState) { + if (UnsLogGroup.KEYBOARDSTATE_ONSAVEKEYBOARDSTATE_ENABLED) { + final String s = "onSaveKeyboardState: saved=" + savedKeyboardState + " " + + keyboardState; + logUnstructured("KeyboardState_onSaveKeyboardState", s); + } + } + + public static void keyboardState_onUpdateShiftState(final KeyboardState keyboardState, + final boolean autoCaps) { + if (UnsLogGroup.KEYBOARDSTATE_ONUPDATESHIFTSTATE_ENABLED) { + final String s = "onUpdateShiftState: autoCaps=" + autoCaps + " " + keyboardState; + logUnstructured("KeyboardState_onUpdateShiftState", s); + } + } + + public static void keyboardState_setAlphabetKeyboard() { + if (UnsLogGroup.KEYBOARDSTATE_SETALPHABETKEYBOARD_ENABLED) { + final String s = "setAlphabetKeyboard"; + logUnstructured("KeyboardState_setAlphabetKeyboard", s); + } + } + + public static void keyboardState_setShifted(final KeyboardState keyboardState, + final String shiftMode) { + if (UnsLogGroup.KEYBOARDSTATE_SETSHIFTED_ENABLED) { + final String s = "setShifted: shiftMode=" + shiftMode + " " + keyboardState; + logUnstructured("KeyboardState_setShifted", s); + } + } + + public static void keyboardState_setShiftLocked(final KeyboardState keyboardState, + final boolean shiftLocked) { + if (UnsLogGroup.KEYBOARDSTATE_SETSHIFTLOCKED_ENABLED) { + final String s = "setShiftLocked: shiftLocked=" + shiftLocked + " " + keyboardState; + logUnstructured("KeyboardState_setShiftLocked", s); + } + } + + public static void keyboardState_setSymbolsKeyboard() { + if (UnsLogGroup.KEYBOARDSTATE_SETSYMBOLSKEYBOARD_ENABLED) { + final String s = "setSymbolsKeyboard"; + logUnstructured("KeyboardState_setSymbolsKeyboard", s); + } + } + + public static void keyboardState_setSymbolsShiftedKeyboard() { + if (UnsLogGroup.KEYBOARDSTATE_SETSYMBOLSSHIFTEDKEYBOARD_ENABLED) { + final String s = "setSymbolsShiftedKeyboard"; + logUnstructured("KeyboardState_setSymbolsShiftedKeyboard", s); + } + } + + public static void keyboardState_toggleAlphabetAndSymbols(final KeyboardState keyboardState) { + if (UnsLogGroup.KEYBOARDSTATE_TOGGLEALPHABETANDSYMBOLS_ENABLED) { + final String s = "toggleAlphabetAndSymbols: " + keyboardState; + logUnstructured("KeyboardState_toggleAlphabetAndSymbols", s); + } + } + + public static void latinIME_onDisplayCompletions( + final CompletionInfo[] applicationSpecifiedCompletions) { + if (UnsLogGroup.LATINIME_ONDISPLAYCOMPLETIONS_ENABLED) { + final StringBuilder builder = new StringBuilder(); + builder.append("Received completions:"); + if (applicationSpecifiedCompletions != null) { + for (int i = 0; i < applicationSpecifiedCompletions.length; i++) { + builder.append(" #"); + builder.append(i); + builder.append(": "); + builder.append(applicationSpecifiedCompletions[i]); + builder.append("\n"); + } + } + logUnstructured("LatinIME_onDisplayCompletions", builder.toString()); + } + } + + public static void latinIME_onStartInputViewInternal(final EditorInfo editorInfo) { + if (UnsLogGroup.LATINIME_ONSTARTINPUTVIEWINTERNAL_ENABLED) { + final StringBuilder builder = new StringBuilder(); + builder.append("onStartInputView: editorInfo:"); + builder.append("inputType="); + builder.append(editorInfo.inputType); + builder.append("imeOptions="); + builder.append(editorInfo.imeOptions); + logUnstructured("LatinIME_onStartInputViewInternal", builder.toString()); + } + } + + public static void latinIME_onUpdateSelection(final int lastSelectionStart, + final int lastSelectionEnd, final int oldSelStart, final int oldSelEnd, + final int newSelStart, final int newSelEnd, final int composingSpanStart, + final int composingSpanEnd) { + if (UnsLogGroup.LATINIME_ONUPDATESELECTION_ENABLED) { + final String s = "onUpdateSelection: oss=" + oldSelStart + + ", ose=" + oldSelEnd + + ", lss=" + lastSelectionStart + + ", lse=" + lastSelectionEnd + + ", nss=" + newSelStart + + ", nse=" + newSelEnd + + ", cs=" + composingSpanStart + + ", ce=" + composingSpanEnd; + logUnstructured("LatinIME_onUpdateSelection", s); + } + } + + public static void latinIME_switchToKeyboardView() { + if (UnsLogGroup.LATINIME_SWITCHTOKEYBOARDVIEW_ENABLED) { + final String s = "Switch to keyboard view."; + logUnstructured("LatinIME_switchToKeyboardView", s); + } + } + + public static void latinKeyboardView_onLongPress() { + if (UnsLogGroup.LATINKEYBOARDVIEW_ONLONGPRESS_ENABLED) { + final String s = "long press detected"; + logUnstructured("LatinKeyboardView_onLongPress", s); + } + } + + public static void latinKeyboardView_processMotionEvent(MotionEvent me, int action, + long eventTime, int index, int id, int x, int y) { + if (UnsLogGroup.LATINKEYBOARDVIEW_ONPROCESSMOTIONEVENT_ENABLED) { + final float size = me.getSize(index); + final float pressure = me.getPressure(index); + if (action != MotionEvent.ACTION_MOVE) { + getInstance().logMotionEvent(action, eventTime, id, x, y, size, pressure); + } + } + } + + public static void pointerTracker_callListenerOnCancelInput() { + final String s = "onCancelInput"; + if (UnsLogGroup.POINTERTRACKER_CALLLISTENERONCANCELINPUT_ENABLED) { + logUnstructured("PointerTracker_callListenerOnCancelInput", s); + } + } + + public static void pointerTracker_callListenerOnCodeInput(final Key key, final int x, + final int y, final boolean ignoreModifierKey, final boolean altersCode, + final int code) { + if (UnsLogGroup.POINTERTRACKER_CALLLISTENERONCODEINPUT_ENABLED) { + final String s = "onCodeInput: " + Keyboard.printableCode(code) + + " text=" + key.mOutputText + " x=" + x + " y=" + y + + " ignoreModifier=" + ignoreModifierKey + " altersCode=" + altersCode + + " enabled=" + key.isEnabled(); + logUnstructured("PointerTracker_callListenerOnCodeInput", s); + } + } + + public static void pointerTracker_callListenerOnPressAndCheckKeyboardLayoutChange( + final Key key, final boolean ignoreModifierKey) { + if (UnsLogGroup.POINTERTRACKER_CALLLISTENERONPRESSANDCHECKKEYBOARDLAYOUTCHANGE_ENABLED) { + final String s = "onPress : " + KeyDetector.printableCode(key) + + " ignoreModifier=" + ignoreModifierKey + + " enabled=" + key.isEnabled(); + logUnstructured("PointerTracker_callListenerOnPressAndCheckKeyboardLayoutChange", s); + } + } + + public static void pointerTracker_callListenerOnRelease(final Key key, final int primaryCode, + final boolean withSliding, final boolean ignoreModifierKey) { + if (UnsLogGroup.POINTERTRACKER_CALLLISTENERONRELEASE_ENABLED) { + final String s = "onRelease : " + Keyboard.printableCode(primaryCode) + + " sliding=" + withSliding + " ignoreModifier=" + ignoreModifierKey + + " enabled="+ key.isEnabled(); + logUnstructured("PointerTracker_callListenerOnRelease", s); + } + } + + public static void pointerTracker_onDownEvent(long deltaT, int distanceSquared) { + if (UnsLogGroup.POINTERTRACKER_ONDOWNEVENT_ENABLED) { + final String s = "onDownEvent: ignore potential noise: time=" + deltaT + + " distance=" + distanceSquared; + logUnstructured("PointerTracker_onDownEvent", s); + } + } + + public static void pointerTracker_onMoveEvent(final int x, final int y, final int lastX, + final int lastY) { + if (UnsLogGroup.POINTERTRACKER_ONMOVEEVENT_ENABLED) { + final String s = String.format("onMoveEvent: sudden move is translated to " + + "up[%d,%d]/down[%d,%d] events", lastX, lastY, x, y); + logUnstructured("PointerTracker_onMoveEvent", s); + } + } + + public static void suddenJumpingTouchEventHandler_onTouchEvent(final MotionEvent me) { + if (UnsLogGroup.SUDDENJUMPINGTOUCHEVENTHANDLER_ONTOUCHEVENT_ENABLED) { + final String s = "onTouchEvent: ignore sudden jump " + me; + logUnstructured("SuddenJumpingTouchEventHandler_onTouchEvent", s); + } + } + + public static void suggestionsView_setSuggestions(SuggestedWords mSuggestedWords) { + if (UnsLogGroup.SUGGESTIONSVIEW_SETSUGGESTIONS_ENABLED) { + logUnstructured("SuggestionsView_setSuggestions", mSuggestedWords.toString()); + } + } } diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionsView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionsView.java index 1ad37b933..01d51d463 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionsView.java +++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionsView.java @@ -59,10 +59,12 @@ import com.android.inputmethod.keyboard.PointerTracker; import com.android.inputmethod.keyboard.ViewLayoutUtils; import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.ResearchLogger; import com.android.inputmethod.latin.StaticInnerHandlerWrapper; import com.android.inputmethod.latin.Suggest; import com.android.inputmethod.latin.SuggestedWords; import com.android.inputmethod.latin.Utils; +import com.android.inputmethod.latin.define.ProductionFlag; import java.util.ArrayList; @@ -663,6 +665,9 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener, clear(); mSuggestedWords = suggestedWords; mParams.layout(mSuggestedWords, mSuggestionsStrip, this, getWidth()); + if (ProductionFlag.IS_EXPERIMENTAL) { + ResearchLogger.suggestionsView_setSuggestions(mSuggestedWords); + } } public int setMoreSuggestionsHeight(int remainingHeight) { diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java index 3fc2b021a..980b1e4d5 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java @@ -16,54 +16,46 @@ package com.android.inputmethod.keyboard.internal; -import android.content.res.Resources; import android.test.AndroidTestCase; import com.android.inputmethod.keyboard.Keyboard; -import com.android.inputmethod.latin.R; +import com.android.inputmethod.keyboard.internal.KeySpecParser.MoreKeySpec; import java.util.Arrays; +import java.util.Locale; public class KeySpecParserTests extends AndroidTestCase { - private Resources mRes; + private final KeyboardCodesSet mCodesSet = new KeyboardCodesSet(); private static final int ICON_UNDEFINED = KeyboardIconsSet.ICON_UNDEFINED; - private static final String CODE_SETTINGS_RES = "integer/key_settings"; + private static final String CODE_SETTINGS_NAME = "key_settings"; private static final String ICON_SETTINGS_NAME = "settingsKey"; - private static final String CODE_SETTINGS = "@" + CODE_SETTINGS_RES; - private static final String ICON_SETTINGS = "@icon/" + ICON_SETTINGS_NAME; - private static final String CODE_NON_EXISTING = "@integer/non_existing"; - private static final String ICON_NON_EXISTING = "@icon/non_existing"; + private static final String CODE_SETTINGS = "!code/" + CODE_SETTINGS_NAME; + private static final String ICON_SETTINGS = "!icon/" + ICON_SETTINGS_NAME; + private static final String CODE_NON_EXISTING = "!code/non_existing"; + private static final String ICON_NON_EXISTING = "!icon/non_existing"; private int mCodeSettings; private int mSettingsIconId; @Override - protected void setUp() { - Resources res = getContext().getResources(); - mRes = res; + protected void setUp() throws Exception { + super.setUp(); - final String packageName = res.getResourcePackageName(R.string.english_ime_name); - final int codeId = res.getIdentifier(CODE_SETTINGS_RES, null, packageName); - mCodeSettings = res.getInteger(codeId); + mCodesSet.setLanguage(Locale.ENGLISH.getLanguage()); + mCodeSettings = mCodesSet.getCode(CODE_SETTINGS_NAME); mSettingsIconId = KeyboardIconsSet.getIconId(ICON_SETTINGS_NAME); } private void assertParser(String message, String moreKeySpec, String expectedLabel, String expectedOutputText, int expectedIcon, int expectedCode) { - String actualLabel = KeySpecParser.getLabel(moreKeySpec); - assertEquals(message + ": label:", expectedLabel, actualLabel); - - String actualOutputText = KeySpecParser.getOutputText(moreKeySpec); - assertEquals(message + ": ouptputText:", expectedOutputText, actualOutputText); - - int actualIcon = KeySpecParser.getIconId(moreKeySpec); - assertEquals(message + ": icon:", expectedIcon, actualIcon); - - int actualCode = KeySpecParser.getCode(mRes, moreKeySpec); - assertEquals(message + ": codes value:", expectedCode, actualCode); + final MoreKeySpec spec = new MoreKeySpec(moreKeySpec, mCodesSet); + assertEquals(message + ": label:", expectedLabel, spec.mLabel); + assertEquals(message + ": ouptputText:", expectedOutputText, spec.mOutputText); + assertEquals(message + ": icon:", expectedIcon, spec.mIconId); + assertEquals(message + ": codes value:", expectedCode, spec.mCode); } private void assertParserError(String message, String moreKeySpec, String expectedLabel, |