Merge remote-tracking branch 'goog/master' into merge

Conflicts:
	java/res/xml/method.xml

Change-Id: I455cb689f3a1baca7cc8b8ef88d9dbcdca8128a3
This commit is contained in:
satok 2011-05-13 21:11:19 +09:00
commit def6b35a9e
97 changed files with 890 additions and 1414 deletions

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"المزيد"</string> <string name="label_more_key" msgid="3760239494604948502">"المزيد"</string>
<string name="label_pause_key" msgid="181098308428035340">"توقف مؤقت"</string> <string name="label_pause_key" msgid="181098308428035340">"توقف مؤقت"</string>
<string name="label_wait_key" msgid="6402152600878093134">"انتظار"</string> <string name="label_wait_key" msgid="6402152600878093134">"انتظار"</string>
<string name="description_delete_key" msgid="5586406298531883960">"حذف"</string>
<string name="description_return_key" msgid="8750044000806461678">"رجوع"</string>
<string name="description_settings_key" msgid="7484527796782969219">"الإعدادات"</string>
<string name="description_shift_key" msgid="346906866277787836">"العالي"</string>
<string name="description_space_key" msgid="8512130111575878517">"مسافة"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"الرموز"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"الإدخال الصوتي"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"تشغيل الرموز"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"إيقاف الرموز"</string>
<string name="description_shift_on" msgid="6983188949895971587">"تشغيل العالي"</string>
<string name="description_shift_off" msgid="8553265474523069034">"إيقاف العالي"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"الإدخال الصوتي"</string> <string name="voice_warning_title" msgid="4419354150908395008">"الإدخال الصوتي"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"الإدخال الصوتي غير معتمد حاليًا للغتك، ولكنه يعمل باللغة الإنجليزية."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"الإدخال الصوتي غير معتمد حاليًا للغتك، ولكنه يعمل باللغة الإنجليزية."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"يستخدم الإدخال الصوتي خاصية التعرف على الكلام من Google. تنطبق "<a href="http://m.google.com/privacy">"سياسة خصوصية الجوال"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"يستخدم الإدخال الصوتي خاصية التعرف على الكلام من Google. تنطبق "<a href="http://m.google.com/privacy">"سياسة خصوصية الجوال"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Още"</string> <string name="label_more_key" msgid="3760239494604948502">"Още"</string>
<string name="label_pause_key" msgid="181098308428035340">"Пауза"</string> <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Чака"</string> <string name="label_wait_key" msgid="6402152600878093134">"Чака"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Изтриване"</string>
<string name="description_return_key" msgid="8750044000806461678">"Return"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Настройки"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Интервал"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Символи"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Гласово въвеждане"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Символите са включени"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Символите са изключени"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift е включен"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift е изключен"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Гласово въвеждане"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Гласово въвеждане"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"За вашия език понастоящем не се поддържа гласово въвеждане, но можете да го използвате на английски."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"За вашия език понастоящем не се поддържа гласово въвеждане, но можете да го използвате на английски."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовото въвеждане използва функцията на Google за разпознаване на говор. В сила е "<a href="http://m.google.com/privacy">"Декларацията за поверителност за мобилни устройства"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовото въвеждане използва функцията на Google за разпознаване на говор. В сила е "<a href="http://m.google.com/privacy">"Декларацията за поверителност за мобилни устройства"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Més"</string> <string name="label_more_key" msgid="3760239494604948502">"Més"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Espera"</string> <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Suprimeix"</string>
<string name="description_return_key" msgid="8750044000806461678">"Retorn"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Configuració"</string>
<string name="description_shift_key" msgid="346906866277787836">"Majúscules"</string>
<string name="description_space_key" msgid="8512130111575878517">"Espai"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Símbols"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tabulador"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Entrada de veu"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Símbols activats"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Símbols desactivats"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Majúscules activades"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Majúscules desactivades"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada de veu"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada de veu"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualment, l\'entrada de veu no és compatible amb el vostre idioma, però funciona en anglès."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualment, l\'entrada de veu no és compatible amb el vostre idioma, però funciona en anglès."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'entrada de veu utilitza el reconeixement de veu de Google. S\'hi aplica la "<a href="http://m.google.com/privacy">"Política de privadesa de Google Mobile"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'entrada de veu utilitza el reconeixement de veu de Google. S\'hi aplica la "<a href="http://m.google.com/privacy">"Política de privadesa de Google Mobile"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Další"</string> <string name="label_more_key" msgid="3760239494604948502">"Další"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pauza"</string> <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Čekat"</string> <string name="label_wait_key" msgid="6402152600878093134">"Čekat"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Smazat"</string>
<string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Nastavení"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"mezera"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboly"</string>
<string name="description_tab_key" msgid="828186583738307137">"Karta"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Hlasový vstup"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Symboly jsou zapnuty"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Symboly jsou vypnuty"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Režim Shift je zapnutý"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Režim Shift je vypnutý"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pro váš jazyk aktuálně není hlasový vstup podporován, ale funguje v angličtině."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pro váš jazyk aktuálně není hlasový vstup podporován, ale funguje v angličtině."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup používá rozpoznávání hlasu Google a vztahují se na něj "<a href="http://m.google.com/privacy">"Zásady ochrany osobních údajů pro mobilní služby"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup používá rozpoznávání hlasu Google a vztahují se na něj "<a href="http://m.google.com/privacy">"Zásady ochrany osobních údajů pro mobilní služby"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Mere"</string> <string name="label_more_key" msgid="3760239494604948502">"Mere"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string> <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Vent"</string> <string name="label_wait_key" msgid="6402152600878093134">"Vent"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Slet"</string>
<string name="description_return_key" msgid="8750044000806461678">"Tilbage"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Indstillinger"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Mellemrum"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboler"</string>
<string name="description_tab_key" msgid="828186583738307137">"Fane"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Stemmeinput"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Symboler: Til"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Symboler: Fra"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift: Til"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift: Fra"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Stemmeinput"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Stemmeinput"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmeinput understøttes i øjeblikket ikke for dit sprog, men fungerer på engelsk."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmeinput understøttes i øjeblikket ikke for dit sprog, men fungerer på engelsk."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Stemmeinput anvender Googles stemmegenkendelse. "<a href="http://m.google.com/privacy">"Fortrolighedspolitikken for mobilenheder"</a>" gælder."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Stemmeinput anvender Googles stemmegenkendelse. "<a href="http://m.google.com/privacy">"Fortrolighedspolitikken for mobilenheder"</a>" gælder."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Mehr"</string> <string name="label_more_key" msgid="3760239494604948502">"Mehr"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string> <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Warten"</string> <string name="label_wait_key" msgid="6402152600878093134">"Warten"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Löschen"</string>
<string name="description_return_key" msgid="8750044000806461678">"Eingabe"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Einstellungen"</string>
<string name="description_shift_key" msgid="346906866277787836">"Umschalt"</string>
<string name="description_space_key" msgid="8512130111575878517">"Leerzeichen"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symbole"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Spracheingabe"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Symbole an"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Symbole aus"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Umschalt an"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Umschalt aus"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Spracheingabe"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Spracheingabe"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spracheingaben werden derzeit nicht für Ihre Sprache unterstützt, funktionieren jedoch in Englisch."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spracheingaben werden derzeit nicht für Ihre Sprache unterstützt, funktionieren jedoch in Englisch."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Die Spracheingabe verwendet die Spracherkennung von Google. Es gelten die "<a href="http://m.google.com/privacy">"Google Mobile-Datenschutzbestimmungen"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Die Spracheingabe verwendet die Spracherkennung von Google. Es gelten die "<a href="http://m.google.com/privacy">"Google Mobile-Datenschutzbestimmungen"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Περισσότερα"</string> <string name="label_more_key" msgid="3760239494604948502">"Περισσότερα"</string>
<string name="label_pause_key" msgid="181098308428035340">"Παύση"</string> <string name="label_pause_key" msgid="181098308428035340">"Παύση"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Αναμ."</string> <string name="label_wait_key" msgid="6402152600878093134">"Αναμ."</string>
<string name="description_delete_key" msgid="5586406298531883960">"Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Return"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Ρυθμίσεις"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Κενό"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Σύμβολα"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Φωνητική εντολή"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Σύμβολα ενεργά"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Σύμβολα ανενεργά"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift ενεργό"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift ανενεργό"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Φωνητική είσοδος"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Φωνητική είσοδος"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Η φωνητική είσοδος δεν υποστηρίζεται αυτή τη στιγμή για τη γλώσσα σας, ωστόσο λειτουργεί στα Αγγλικά."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Η φωνητική είσοδος δεν υποστηρίζεται αυτή τη στιγμή για τη γλώσσα σας, ωστόσο λειτουργεί στα Αγγλικά."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Οι φωνητικές εντολές χρησιμοποιούν την τεχνολογία αναγνώρισης φωνής της Google. Ισχύει "<a href="http://m.google.com/privacy">"η Πολιτική Απορρήτου για κινητά"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Οι φωνητικές εντολές χρησιμοποιούν την τεχνολογία αναγνώρισης φωνής της Google. Ισχύει "<a href="http://m.google.com/privacy">"η Πολιτική Απορρήτου για κινητά"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"More"</string> <string name="label_more_key" msgid="3760239494604948502">"More"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string> <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Wait"</string> <string name="label_wait_key" msgid="6402152600878093134">"Wait"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Return"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Settings"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Space"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symbols"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Voice Input"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Symbols on"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Symbols off"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift on"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift off"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Voice input"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Voice input"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Voice input is not currently supported for your language, but does work in English."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Voice input is not currently supported for your language, but does work in English."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Voice input uses Google\'s speech recognition. "<a href="http://m.google.com/privacy">"The Mobile Privacy Policy"</a>" applies."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Voice input uses Google\'s speech recognition. "<a href="http://m.google.com/privacy">"The Mobile Privacy Policy"</a>" applies."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Más"</string> <string name="label_more_key" msgid="3760239494604948502">"Más"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Espera"</string> <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Eliminar"</string>
<string name="description_return_key" msgid="8750044000806461678">"Volver"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Configuración"</string>
<string name="description_shift_key" msgid="346906866277787836">"Mayús"</string>
<string name="description_space_key" msgid="8512130111575878517">"Espacio"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Símbolos"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Entrada de voz"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Símbolos activados"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Símbolos desactivados"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Mayús activado"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Mayús desactivado"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada por voz"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada por voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La entrada por voz no está admitida en tu idioma, pero sí funciona en inglés."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La entrada por voz no está admitida en tu idioma, pero sí funciona en inglés."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada de voz usa el reconocimiento de voz de Google. "<a href="http://m.google.com/privacy">"Se aplica la política de privacidad para"</a>" celulares."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada de voz usa el reconocimiento de voz de Google. "<a href="http://m.google.com/privacy">"Se aplica la política de privacidad para"</a>" celulares."</string>

View file

@ -67,18 +67,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Más"</string> <string name="label_more_key" msgid="3760239494604948502">"Más"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Espera"</string> <string name="label_wait_key" msgid="6402152600878093134">"Espera"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Eliminar"</string>
<string name="description_return_key" msgid="8750044000806461678">"Retroceso"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Ajustes"</string>
<string name="description_shift_key" msgid="346906866277787836">"Mayús"</string>
<string name="description_space_key" msgid="8512130111575878517">"Espacio"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Símbolos"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tabulador"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Entrada de voz"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Símbolos activados"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Símbolos desactivados"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Mayús activadas"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Mayús desactivadas"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Introducción de voz"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Introducción de voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente la introducción de voz no está disponible en tu idioma, pero se puede utilizar en inglés."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente la introducción de voz no está disponible en tu idioma, pero se puede utilizar en inglés."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada de voz utiliza el reconocimiento de voz de Google. Se aplica la "<a href="http://m.google.com/privacy">"Política de privacidad de Google para móviles"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La entrada de voz utiliza el reconocimiento de voz de Google. Se aplica la "<a href="http://m.google.com/privacy">"Política de privacidad de Google para móviles"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"بیشتر"</string> <string name="label_more_key" msgid="3760239494604948502">"بیشتر"</string>
<string name="label_pause_key" msgid="181098308428035340">"توقف موقت"</string> <string name="label_pause_key" msgid="181098308428035340">"توقف موقت"</string>
<string name="label_wait_key" msgid="6402152600878093134">"منتظر بمانید"</string> <string name="label_wait_key" msgid="6402152600878093134">"منتظر بمانید"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Return"</string>
<string name="description_settings_key" msgid="7484527796782969219">"تنظیمات"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"فاصله"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"نمادها"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"ورودی صوتی"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"نمادها روشن"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"نمادها خاموش"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift روشن"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift خاموش"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"ورودی صوتی"</string> <string name="voice_warning_title" msgid="4419354150908395008">"ورودی صوتی"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ورودی صوتی در حال حاضر برای زبان شما پشتیبانی نمی شود اما برای زبان انگلیسی فعال است."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ورودی صوتی در حال حاضر برای زبان شما پشتیبانی نمی شود اما برای زبان انگلیسی فعال است."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ورودی صوتی از تشخیص صدای Google استفاده می کند. "<a href="http://m.google.com/privacy">"خط مشی رازداری Mobile "</a>" اعمال می شود."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ورودی صوتی از تشخیص صدای Google استفاده می کند. "<a href="http://m.google.com/privacy">"خط مشی رازداری Mobile "</a>" اعمال می شود."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Lisää"</string> <string name="label_more_key" msgid="3760239494604948502">"Lisää"</string>
<string name="label_pause_key" msgid="181098308428035340">"Tauko"</string> <string name="label_pause_key" msgid="181098308428035340">"Tauko"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Odota"</string> <string name="label_wait_key" msgid="6402152600878093134">"Odota"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Poista"</string>
<string name="description_return_key" msgid="8750044000806461678">"Rivinvaihto"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Asetukset"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Välilyönti"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symbolit"</string>
<string name="description_tab_key" msgid="828186583738307137">"Sarkain"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Äänisyöte"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Symbolit käytössä"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Symbolit pois käytöstä"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift käytössä"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift pois käytöstä"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Äänisyöte"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Äänisyöte"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Äänisyötettä ei vielä tueta kielelläsi, mutta voit käyttää sitä englanniksi."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Äänisyötettä ei vielä tueta kielelläsi, mutta voit käyttää sitä englanniksi."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Äänisyöte käyttää Googlen puheentunnistusta. "<a href="http://m.google.com/privacy">"Mobile-tietosuojakäytäntö"</a>" on voimassa."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Äänisyöte käyttää Googlen puheentunnistusta. "<a href="http://m.google.com/privacy">"Mobile-tietosuojakäytäntö"</a>" on voimassa."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Plus"</string> <string name="label_more_key" msgid="3760239494604948502">"Plus"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string> <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Attente"</string> <string name="label_wait_key" msgid="6402152600878093134">"Attente"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Supprimer"</string>
<string name="description_return_key" msgid="8750044000806461678">"Entrée"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Paramètres"</string>
<string name="description_shift_key" msgid="346906866277787836">"Maj"</string>
<string name="description_space_key" msgid="8512130111575878517">"Espace"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboles"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tabulation"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Saisie vocale"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Symboles activés"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Symboles désactivés"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Maj activée"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Maj désactivée"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Saisie vocale"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Saisie vocale"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La saisie vocale n\'est pas encore prise en charge pour votre langue, mais elle fonctionne en anglais."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"La saisie vocale n\'est pas encore prise en charge pour votre langue, mais elle fonctionne en anglais."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La saisie vocale fait appel à la reconnaissance vocale de Google. Les "<a href="http://m.google.com/privacy">"Règles de confidentialité Google Mobile"</a>" s\'appliquent."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"La saisie vocale fait appel à la reconnaissance vocale de Google. Les "<a href="http://m.google.com/privacy">"Règles de confidentialité Google Mobile"</a>" s\'appliquent."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Više"</string> <string name="label_more_key" msgid="3760239494604948502">"Više"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pauza"</string> <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Pričekaj"</string> <string name="label_wait_key" msgid="6402152600878093134">"Pričekaj"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Postavke"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Razmaknica"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simboli"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tabulator"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Glasovni unos"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Simboli uključeni"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Simboli isključeni"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift uključen"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift isključen"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Glasovni unos"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Glasovni unos"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Vaš jezik trenutno nije podržan za glasovni unos, ali radi za engleski."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Vaš jezik trenutno nije podržan za glasovni unos, ali radi za engleski."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni unos upotrebljava Googleovo prepoznavanje govora. Primjenjuju se "<a href="http://m.google.com/privacy">"Pravila o privatnosti za uslugu Mobile"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni unos upotrebljava Googleovo prepoznavanje govora. Primjenjuju se "<a href="http://m.google.com/privacy">"Pravila o privatnosti za uslugu Mobile"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Egyebek"</string> <string name="label_more_key" msgid="3760239494604948502">"Egyebek"</string>
<string name="label_pause_key" msgid="181098308428035340">"Szün."</string> <string name="label_pause_key" msgid="181098308428035340">"Szün."</string>
<string name="label_wait_key" msgid="6402152600878093134">"Vár"</string> <string name="label_wait_key" msgid="6402152600878093134">"Vár"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Törlés"</string>
<string name="description_return_key" msgid="8750044000806461678">"Vissza"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Beállítások"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Szóköz"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Szimbólumok"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Hangbevitel"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Szimbólumok be"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Szimbólumok ki"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift be"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift ki"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Hangbevitel"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Hangbevitel"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A hangbevitel szolgáltatás jelenleg nem támogatja az Ön nyelvét, ám angolul működik."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A hangbevitel szolgáltatás jelenleg nem támogatja az Ön nyelvét, ám angolul működik."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A hangbevitel a Google beszédfelismerő technológiáját használja, amelyre a "<a href="http://m.google.com/privacy">"Mobil adatvédelmi irányelvek"</a>" érvényesek."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A hangbevitel a Google beszédfelismerő technológiáját használja, amelyre a "<a href="http://m.google.com/privacy">"Mobil adatvédelmi irányelvek"</a>" érvényesek."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Lainnya"</string> <string name="label_more_key" msgid="3760239494604948502">"Lainnya"</string>
<string name="label_pause_key" msgid="181098308428035340">"Jeda"</string> <string name="label_pause_key" msgid="181098308428035340">"Jeda"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Tunggu"</string> <string name="label_wait_key" msgid="6402152600878093134">"Tunggu"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Hapus"</string>
<string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Setelan"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Spasi"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simbol"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Masukan Suara"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Simbol hidup"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Simbol mati"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift hidup"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift mati"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Masukan suara"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Masukan suara"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Masukan suara saat ini tidak didukung untuk bahasa Anda, tetapi bekerja dalam Bahasa Inggris."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Masukan suara saat ini tidak didukung untuk bahasa Anda, tetapi bekerja dalam Bahasa Inggris."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Masukan suara menggunakan pengenalan ucapan Google. "<a href="http://m.google.com/privacy">"Kebijakan Privasi Seluler"</a>" berlaku."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Masukan suara menggunakan pengenalan ucapan Google. "<a href="http://m.google.com/privacy">"Kebijakan Privasi Seluler"</a>" berlaku."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Altro"</string> <string name="label_more_key" msgid="3760239494604948502">"Altro"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Attesa"</string> <string name="label_wait_key" msgid="6402152600878093134">"Attesa"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Cancella"</string>
<string name="description_return_key" msgid="8750044000806461678">"Invio"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Impostazioni"</string>
<string name="description_shift_key" msgid="346906866277787836">"Maiuscolo"</string>
<string name="description_space_key" msgid="8512130111575878517">"Spazio"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simboli"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tabulazione"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Input vocale"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Simboli attivati"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Simboli disattivati"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Maiuscole attivate"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Maiuscole disattivate"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Comandi vocali"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Comandi vocali"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"I comandi vocali non sono attualmente supportati per la tua lingua ma funzionano in inglese."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"I comandi vocali non sono attualmente supportati per la tua lingua ma funzionano in inglese."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'input vocale utilizza il riconoscimento vocale di Google. Sono valide le "<a href="http://m.google.com/privacy">"norme sulla privacy di Google Mobile"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"L\'input vocale utilizza il riconoscimento vocale di Google. Sono valide le "<a href="http://m.google.com/privacy">"norme sulla privacy di Google Mobile"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"עוד"</string> <string name="label_more_key" msgid="3760239494604948502">"עוד"</string>
<string name="label_pause_key" msgid="181098308428035340">"השהה"</string> <string name="label_pause_key" msgid="181098308428035340">"השהה"</string>
<string name="label_wait_key" msgid="6402152600878093134">"המתן"</string> <string name="label_wait_key" msgid="6402152600878093134">"המתן"</string>
<string name="description_delete_key" msgid="5586406298531883960">"מחק"</string>
<string name="description_return_key" msgid="8750044000806461678">"חזור"</string>
<string name="description_settings_key" msgid="7484527796782969219">"הגדרות"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"רווח"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"סמלים"</string>
<string name="description_tab_key" msgid="828186583738307137">"כרטיסייה"</string>
<string name="description_voice_key" msgid="3057731675774652754">"קלט קולי"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"מצב סמלים פועל"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"מצב סמלים כבוי"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift פועל"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift כבוי"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"קלט קולי"</string> <string name="voice_warning_title" msgid="4419354150908395008">"קלט קולי"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"קלט קולי אינו נתמך בשלב זה בשפתך, אך הוא פועל באנגלית."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"קלט קולי אינו נתמך בשלב זה בשפתך, אך הוא פועל באנגלית."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"קלט קולי משתמש בזיהוי דיבור של Google. "<a href="http://m.google.com/privacy">"מדיניות הפרטיות של \'Google לנייד\'"</a>" חלה במקרה זה."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"קלט קולי משתמש בזיהוי דיבור של Google. "<a href="http://m.google.com/privacy">"מדיניות הפרטיות של \'Google לנייד\'"</a>" חלה במקרה זה."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Shift"</string> <string name="label_more_key" msgid="3760239494604948502">"Shift"</string>
<string name="label_pause_key" msgid="181098308428035340">"停止"</string> <string name="label_pause_key" msgid="181098308428035340">"停止"</string>
<string name="label_wait_key" msgid="6402152600878093134">"待機"</string> <string name="label_wait_key" msgid="6402152600878093134">"待機"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Del"</string>
<string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
<string name="description_settings_key" msgid="7484527796782969219">"設定"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Space"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"記号"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"音声入力"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"記号ON"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"記号OFF"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift ON"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift OFF"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"音声入力"</string> <string name="voice_warning_title" msgid="4419354150908395008">"音声入力"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"音声入力は現在英語には対応していますが、日本語には対応していません。"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"音声入力は現在英語には対応していますが、日本語には対応していません。"</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"音声入力ではGoogleの音声認識技術を利用します。"<a href="http://m.google.com/privacy">"モバイルプライバシーポリシー"</a>"が適用されます。"</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"音声入力ではGoogleの音声認識技術を利用します。"<a href="http://m.google.com/privacy">"モバイルプライバシーポリシー"</a>"が適用されます。"</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"더보기"</string> <string name="label_more_key" msgid="3760239494604948502">"더보기"</string>
<string name="label_pause_key" msgid="181098308428035340">"일시 중지"</string> <string name="label_pause_key" msgid="181098308428035340">"일시 중지"</string>
<string name="label_wait_key" msgid="6402152600878093134">"대기"</string> <string name="label_wait_key" msgid="6402152600878093134">"대기"</string>
<string name="description_delete_key" msgid="5586406298531883960">"삭제"</string>
<string name="description_return_key" msgid="8750044000806461678">"리턴"</string>
<string name="description_settings_key" msgid="7484527796782969219">"설정"</string>
<string name="description_shift_key" msgid="346906866277787836">"시프트"</string>
<string name="description_space_key" msgid="8512130111575878517">"스페이스"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"기호"</string>
<string name="description_tab_key" msgid="828186583738307137">"탭"</string>
<string name="description_voice_key" msgid="3057731675774652754">"음성 입력"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"기호 사용"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"기호 사용 안함"</string>
<string name="description_shift_on" msgid="6983188949895971587">"시프트 사용"</string>
<string name="description_shift_off" msgid="8553265474523069034">"시프트 사용 안함"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"음성 입력"</string> <string name="voice_warning_title" msgid="4419354150908395008">"음성 입력"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"음성 입력은 현재 자국어로 지원되지 않으며 영어로 작동됩니다."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"음성 입력은 현재 자국어로 지원되지 않으며 영어로 작동됩니다."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"음성 입력에서는 Google의 음성 인식 기능을 사용합니다. "<a href="http://m.google.com/privacy">"모바일 개인정보취급방침"</a>"이 적용됩니다."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"음성 입력에서는 Google의 음성 인식 기능을 사용합니다. "<a href="http://m.google.com/privacy">"모바일 개인정보취급방침"</a>"이 적용됩니다."</string>

View file

@ -21,6 +21,7 @@
<resources> <resources>
<!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=0.260in --> <!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=0.260in -->
<dimen name="keyboardHeight">1.100in</dimen> <dimen name="keyboardHeight">1.100in</dimen>
<fraction name="minKeyboardHeight">45%p</fraction>
<!-- key_height + key_bottom_gap = popup_key_height --> <!-- key_height + key_bottom_gap = popup_key_height -->
<!-- <dimen name="key_height">0.260in</dimen>--> <!-- <dimen name="key_height">0.260in</dimen>-->
<dimen name="key_bottom_gap">0.020in</dimen> <dimen name="key_bottom_gap">0.020in</dimen>
@ -28,6 +29,10 @@
<dimen name="keyboard_top_padding">0.0in</dimen> <dimen name="keyboard_top_padding">0.0in</dimen>
<dimen name="keyboard_bottom_padding">0.0in</dimen> <dimen name="keyboard_bottom_padding">0.0in</dimen>
<dimen name="keyboard_horizontal_edges_padding">0.0in</dimen> <dimen name="keyboard_horizontal_edges_padding">0.0in</dimen>
<fraction name="key_letter_ratio">55%</fraction>
<fraction name="key_label_text_ratio">35%</fraction>
<dimen name="key_preview_offset">0.08in</dimen>
<fraction name="key_preview_text_ratio">90%</fraction>
<dimen name="candidate_strip_height">38dip</dimen> <dimen name="candidate_strip_height">38dip</dimen>
<dimen name="candidate_strip_fading_edge_length">63dip</dimen> <dimen name="candidate_strip_fading_edge_length">63dip</dimen>
<dimen name="spacebar_vertical_correction">2dip</dimen> <dimen name="spacebar_vertical_correction">2dip</dimen>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Daugiau"</string> <string name="label_more_key" msgid="3760239494604948502">"Daugiau"</string>
<string name="label_pause_key" msgid="181098308428035340">"Prist."</string> <string name="label_pause_key" msgid="181098308428035340">"Prist."</string>
<string name="label_wait_key" msgid="6402152600878093134">"Lauk."</string> <string name="label_wait_key" msgid="6402152600878093134">"Lauk."</string>
<string name="description_delete_key" msgid="5586406298531883960">"Ištrinti"</string>
<string name="description_return_key" msgid="8750044000806461678">"Grįžti"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Nustatymai"</string>
<string name="description_shift_key" msgid="346906866277787836">"Keitimas"</string>
<string name="description_space_key" msgid="8512130111575878517">"Tarpas"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simboliai"</string>
<string name="description_tab_key" msgid="828186583738307137">"Skirtukas"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Balso įvestis"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Simboliai įjungti"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Simboliai išjungti"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Keitimas įjungtas"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Keitimas išjungtas"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Balso įvestis"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Balso įvestis"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Šiuo metu balso įvestis jūsų kompiuteryje nepalaikoma, bet ji veikia anglų k."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Šiuo metu balso įvestis jūsų kompiuteryje nepalaikoma, bet ji veikia anglų k."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balso įvesčiai naudojamas „Google“ kalbos atpažinimas. Taikoma "<a href="http://m.google.com/privacy">"privatumo politika mobiliesiems"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balso įvesčiai naudojamas „Google“ kalbos atpažinimas. Taikoma "<a href="http://m.google.com/privacy">"privatumo politika mobiliesiems"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Vairāk"</string> <string name="label_more_key" msgid="3760239494604948502">"Vairāk"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pauze"</string> <string name="label_pause_key" msgid="181098308428035340">"Pauze"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Gaidīt"</string> <string name="label_wait_key" msgid="6402152600878093134">"Gaidīt"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Dzēšanas taustiņš"</string>
<string name="description_return_key" msgid="8750044000806461678">"Atgriešanās taustiņš"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Iestatījumu taustiņš"</string>
<string name="description_shift_key" msgid="346906866277787836">"Pārslēgšanas taustiņš"</string>
<string name="description_space_key" msgid="8512130111575878517">"Atstarpes taustiņš"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simbolu taustiņš"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tabulēšanas taustiņš"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Runas ievades taustiņš"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Simbolu režīms ir ieslēgts."</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Simbolu režīms ir izslēgts."</string>
<string name="description_shift_on" msgid="6983188949895971587">"Pārslēgšanas režīms ir ieslēgts."</string>
<string name="description_shift_off" msgid="8553265474523069034">"Pārslēgšanas režīms ir izslēgts."</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Balss ievade"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Balss ievade"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Balss ievade jūsu valodā pašlaik netiek atbalstīta, taču tā ir pieejama angļu valodā."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Balss ievade jūsu valodā pašlaik netiek atbalstīta, taču tā ir pieejama angļu valodā."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balss ievadei tiek izmantota Google runas atpazīšanas funkcija. Uz šīs funkcijas lietošanu attiecas "<a href="http://m.google.com/privacy">"mobilo sakaru ierīču lietošanas konfidencialitātes politika"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Balss ievadei tiek izmantota Google runas atpazīšanas funkcija. Uz šīs funkcijas lietošanu attiecas "<a href="http://m.google.com/privacy">"mobilo sakaru ierīču lietošanas konfidencialitātes politika"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Mer"</string> <string name="label_more_key" msgid="3760239494604948502">"Mer"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string> <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Vent"</string> <string name="label_wait_key" msgid="6402152600878093134">"Vent"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Innstillinger"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Mellomrom"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboler"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Taleinndata"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Symboler er slått på"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Symboler er slått av"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift på"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift av"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Stemmedata"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Stemmedata"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmedata håndteres foreløpig ikke på ditt språk, men fungerer på engelsk."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Stemmedata håndteres foreløpig ikke på ditt språk, men fungerer på engelsk."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Google Voice bruker Googles talegjenkjenning. "<a href="http://m.google.com/privacy">"Personvernreglene for mobil"</a>" gjelder."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Google Voice bruker Googles talegjenkjenning. "<a href="http://m.google.com/privacy">"Personvernreglene for mobil"</a>" gjelder."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Meer"</string> <string name="label_more_key" msgid="3760239494604948502">"Meer"</string>
<string name="label_pause_key" msgid="181098308428035340">"Onderbr."</string> <string name="label_pause_key" msgid="181098308428035340">"Onderbr."</string>
<string name="label_wait_key" msgid="6402152600878093134">"Wacht"</string> <string name="label_wait_key" msgid="6402152600878093134">"Wacht"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Return"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Instellingen"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Spatie"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symbolen"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Spraakinvoer"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Symbolen aan"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Symbolen uit"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift aan"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift uit"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Spraakinvoer"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Spraakinvoer"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spraakinvoer wordt momenteel niet ondersteund in uw taal, maar is wel beschikbaar in het Engels."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Spraakinvoer wordt momenteel niet ondersteund in uw taal, maar is wel beschikbaar in het Engels."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Spraakinvoer maakt gebruik van de spraakherkenning van Google. Het "<a href="http://m.google.com/privacy">"Privacybeleid van Google Mobile"</a>" is van toepassing."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Spraakinvoer maakt gebruik van de spraakherkenning van Google. Het "<a href="http://m.google.com/privacy">"Privacybeleid van Google Mobile"</a>" is van toepassing."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Więcej"</string> <string name="label_more_key" msgid="3760239494604948502">"Więcej"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pauza"</string> <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Czekaj"</string> <string name="label_wait_key" msgid="6402152600878093134">"Czekaj"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Ustawienia"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Spacja"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symbole"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Wprowadzanie głosowe"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Symbole włączone"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Symbole wyłączone"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift włączony"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift wyłączony"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Wprowadzanie głosowe"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Wprowadzanie głosowe"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Wprowadzanie głosowe obecnie nie jest obsługiwane w Twoim języku, ale działa w języku angielskim."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Wprowadzanie głosowe obecnie nie jest obsługiwane w Twoim języku, ale działa w języku angielskim."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Funkcja wprowadzania głosowego wykorzystuje mechanizm rozpoznawania mowy. Obowiązuje "<a href="http://m.google.com/privacy">"Polityka prywatności Google Mobile"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Funkcja wprowadzania głosowego wykorzystuje mechanizm rozpoznawania mowy. Obowiązuje "<a href="http://m.google.com/privacy">"Polityka prywatności Google Mobile"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Mais"</string> <string name="label_more_key" msgid="3760239494604948502">"Mais"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Esp."</string> <string name="label_wait_key" msgid="6402152600878093134">"Esp."</string>
<string name="description_delete_key" msgid="5586406298531883960">"Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Enter"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Definições"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Espaço"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Símbolos"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Entrada de voz"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Símbolos ativados"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Símbolos desativados"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift ativado"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift desativado"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente, a entrada de voz não é suportada para o seu idioma, mas funciona em inglês."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Actualmente, a entrada de voz não é suportada para o seu idioma, mas funciona em inglês."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de voz utiliza o reconhecimento de voz da Google. É aplicável a "<a href="http://m.google.com/privacy">"Política de privacidade do Google Mobile"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de voz utiliza o reconhecimento de voz da Google. É aplicável a "<a href="http://m.google.com/privacy">"Política de privacidade do Google Mobile"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Mais"</string> <string name="label_more_key" msgid="3760239494604948502">"Mais"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Esp."</string> <string name="label_wait_key" msgid="6402152600878093134">"Esp."</string>
<string name="description_delete_key" msgid="5586406298531883960">"Excluir"</string>
<string name="description_return_key" msgid="8750044000806461678">"Voltar"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Configurações"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Espaço"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Símbolos"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Entrada de texto por voz"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Símbolos ativados"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Símbolos desativados"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift ativado"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift desativado"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Entrada de voz"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A entrada de voz não é suportada no momento para o seu idioma, mas funciona em inglês."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"A entrada de voz não é suportada no momento para o seu idioma, mas funciona em inglês."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de texto por voz usa o reconhecimento de voz do Google. "<a href="http://m.google.com/privacy">"A política de privacidade para celulares"</a>" é aplicada."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"A entrada de texto por voz usa o reconhecimento de voz do Google. "<a href="http://m.google.com/privacy">"A política de privacidade para celulares"</a>" é aplicada."</string>

View file

@ -85,30 +85,6 @@
<skip /> <skip />
<!-- no translation found for label_wait_key (6402152600878093134) --> <!-- no translation found for label_wait_key (6402152600878093134) -->
<skip /> <skip />
<!-- no translation found for description_delete_key (5586406298531883960) -->
<skip />
<!-- no translation found for description_return_key (8750044000806461678) -->
<skip />
<!-- no translation found for description_settings_key (7484527796782969219) -->
<skip />
<!-- no translation found for description_shift_key (346906866277787836) -->
<skip />
<!-- no translation found for description_space_key (8512130111575878517) -->
<skip />
<!-- no translation found for description_switch_alpha_symbol_key (4537975384274405537) -->
<skip />
<!-- no translation found for description_tab_key (828186583738307137) -->
<skip />
<!-- no translation found for description_voice_key (3057731675774652754) -->
<skip />
<!-- no translation found for description_symbols_on (2994366855822840559) -->
<skip />
<!-- no translation found for description_symbols_off (3209578267079515136) -->
<skip />
<!-- no translation found for description_shift_on (6983188949895971587) -->
<skip />
<!-- no translation found for description_shift_off (8553265474523069034) -->
<skip />
<string name="voice_warning_title" msgid="4419354150908395008">"Cumonds vocals"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Cumonds vocals"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"\"Cumonds vocals en Vossa lingua na vegnan actualmain betg sustegnids, ma la funcziun è disponibla per englais.\""</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"\"Cumonds vocals en Vossa lingua na vegnan actualmain betg sustegnids, ma la funcziun è disponibla per englais.\""</string>
<!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google."</string> <!-- outdated translation 4611518823070986445 --> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Mai multe"</string> <string name="label_more_key" msgid="3760239494604948502">"Mai multe"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pauză"</string> <string name="label_pause_key" msgid="181098308428035340">"Pauză"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Aşt."</string> <string name="label_wait_key" msgid="6402152600878093134">"Aşt."</string>
<string name="description_delete_key" msgid="5586406298531883960">"Ştergeţi"</string>
<string name="description_return_key" msgid="8750044000806461678">"Tasta Enter"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Setări"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Tasta Space"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simboluri"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tasta Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Intrare vocală"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Simbolurile sunt activate"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Simbolurile sunt dezactivate"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Tasta Shift este activată"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Tasta Shift este dezactivată"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Intrare voce"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Intrare voce"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Intrarea vocală nu este acceptată în prezent pentru limba dvs., însă funcţionează în limba engleză."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Intrarea vocală nu este acceptată în prezent pentru limba dvs., însă funcţionează în limba engleză."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Intrarea vocală utilizează funcţia Google de recunoaştere vocală. Se aplică "<a href="http://m.google.com/privacy">"Politica de confidenţialitate Google Mobil"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Intrarea vocală utilizează funcţia Google de recunoaştere vocală. Se aplică "<a href="http://m.google.com/privacy">"Politica de confidenţialitate Google Mobil"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Ещё"</string> <string name="label_more_key" msgid="3760239494604948502">"Ещё"</string>
<string name="label_pause_key" msgid="181098308428035340">"Приостановить"</string> <string name="label_pause_key" msgid="181098308428035340">"Приостановить"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Подождите"</string> <string name="label_wait_key" msgid="6402152600878093134">"Подождите"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Клавиша удаления"</string>
<string name="description_return_key" msgid="8750044000806461678">"Клавиша \"Ввод\""</string>
<string name="description_settings_key" msgid="7484527796782969219">"Клавиша настроек"</string>
<string name="description_shift_key" msgid="346906866277787836">"Клавиша верхнего регистра"</string>
<string name="description_space_key" msgid="8512130111575878517">"Клавиша \"Пробел\""</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Клавиша символов"</string>
<string name="description_tab_key" msgid="828186583738307137">"Клавиша табуляции"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Клавиша голосового ввода"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Клавиши символов выключены"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Клавиши символов включены"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Верхний регистр включен"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Верхний регистр выключен"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Голосовой ввод"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Голосовой ввод"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"В настоящее время функция голосового ввода не поддерживает ваш язык, но вы можете пользоваться ей на английском."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"В настоящее время функция голосового ввода не поддерживает ваш язык, но вы можете пользоваться ей на английском."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовой ввод использует алгоритмы распознавания речи Google. Действует "<a href="http://m.google.com/privacy">"политика конфиденциальности для мобильных устройств"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовой ввод использует алгоритмы распознавания речи Google. Действует "<a href="http://m.google.com/privacy">"политика конфиденциальности для мобильных устройств"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Viac"</string> <string name="label_more_key" msgid="3760239494604948502">"Viac"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pozastaviť"</string> <string name="label_pause_key" msgid="181098308428035340">"Pozastaviť"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Čakajte"</string> <string name="label_wait_key" msgid="6402152600878093134">"Čakajte"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Return"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Nastavenia"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Medzera"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboly"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Hlasový vstup"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Symboly zapnuté"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Symboly vypnuté"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift zapnutý"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift vypnutý"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Hlasový vstup"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pre váš jazyk aktuálne nie je hlasový vstup podporovaný, ale funguje v angličtine."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Pre váš jazyk aktuálne nie je hlasový vstup podporovaný, ale funguje v angličtine."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup používa rozpoznávanie hlasu Google. Na používanie hlasového vstupu sa vzťahujú "<a href="http://m.google.com/privacy">"Pravidlá ochrany osobných údajov pre mobilné služby"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Hlasový vstup používa rozpoznávanie hlasu Google. Na používanie hlasového vstupu sa vzťahujú "<a href="http://m.google.com/privacy">"Pravidlá ochrany osobných údajov pre mobilné služby"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Več"</string> <string name="label_more_key" msgid="3760239494604948502">"Več"</string>
<string name="label_pause_key" msgid="181098308428035340">"Premor"</string> <string name="label_pause_key" msgid="181098308428035340">"Premor"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Čakaj"</string> <string name="label_wait_key" msgid="6402152600878093134">"Čakaj"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Izbriši"</string>
<string name="description_return_key" msgid="8750044000806461678">"Vračalka"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Nastavitve"</string>
<string name="description_shift_key" msgid="346906866277787836">"Dvigalka"</string>
<string name="description_space_key" msgid="8512130111575878517">"Preslednica"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Znaki"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tabulatorka"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Glasovni vnos"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Znaki vklopljeni"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Znaki izklopljeni"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Dvigalka vklopljena"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Dvigalka izklopljena"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Glasovni vnos"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Glasovni vnos"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Glasovni vnos trenutno ni podprt v vašem jeziku, deluje pa v angleščini."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Glasovni vnos trenutno ni podprt v vašem jeziku, deluje pa v angleščini."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni vnos uporablja Googlovo prepoznavanje govora. Zanj velja "<a href="http://m.google.com/privacy">"pravilnik o zasebnosti za mobilne naprave"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Glasovni vnos uporablja Googlovo prepoznavanje govora. Zanj velja "<a href="http://m.google.com/privacy">"pravilnik o zasebnosti za mobilne naprave"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Још"</string> <string name="label_more_key" msgid="3760239494604948502">"Још"</string>
<string name="label_pause_key" msgid="181098308428035340">"Паузирај"</string> <string name="label_pause_key" msgid="181098308428035340">"Паузирај"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Сачекајте"</string> <string name="label_wait_key" msgid="6402152600878093134">"Сачекајте"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Return"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Подешавања"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Размак"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Симболи"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Гласовни унос"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Симболи су укључени"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Симболи су искључени"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift је укључен"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift је искључен"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Гласовни унос"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Гласовни унос"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Гласовни унос тренутно није подржан за ваш језик, али функционише на енглеском."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Гласовни унос тренутно није подржан за ваш језик, али функционише на енглеском."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовни унос користи Google-ову функцију за препознавање гласа. Примењује се "<a href="http://m.google.com/privacy">"политика приватности за мобилне уређаје"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Гласовни унос користи Google-ову функцију за препознавање гласа. Примењује се "<a href="http://m.google.com/privacy">"политика приватности за мобилне уређаје"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Mer"</string> <string name="label_more_key" msgid="3760239494604948502">"Mer"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pausa"</string> <string name="label_pause_key" msgid="181098308428035340">"Pausa"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Vänta"</string> <string name="label_wait_key" msgid="6402152600878093134">"Vänta"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Ta bort"</string>
<string name="description_return_key" msgid="8750044000806461678">"Retur"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Inställningar"</string>
<string name="description_shift_key" msgid="346906866277787836">"Skift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Blanksteg"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Symboler"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tabb"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Röstinmatning"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Aktivera symboler"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Inaktivera symboler"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Aktivera Skift"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Inaktivera Skift"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Röstindata"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Röstindata"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Röstindata stöds inte på ditt språk än, men tjänsten fungerar på engelska."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Röstindata stöds inte på ditt språk än, men tjänsten fungerar på engelska."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Röstinmatning använder sig av Googles tjänst för taligenkänning. "<a href="http://m.google.com/privacy">"Sekretesspolicyn för mobila enheter"</a>" gäller."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Röstinmatning använder sig av Googles tjänst för taligenkänning. "<a href="http://m.google.com/privacy">"Sekretesspolicyn för mobila enheter"</a>" gäller."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"เพิ่มเติม"</string> <string name="label_more_key" msgid="3760239494604948502">"เพิ่มเติม"</string>
<string name="label_pause_key" msgid="181098308428035340">"หยุดชั่วคราว"</string> <string name="label_pause_key" msgid="181098308428035340">"หยุดชั่วคราว"</string>
<string name="label_wait_key" msgid="6402152600878093134">"รอ"</string> <string name="label_wait_key" msgid="6402152600878093134">"รอ"</string>
<string name="description_delete_key" msgid="5586406298531883960">"ลบ"</string>
<string name="description_return_key" msgid="8750044000806461678">"Return"</string>
<string name="description_settings_key" msgid="7484527796782969219">"การตั้งค่า"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Space"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"สัญลักษณ์"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"ป้อนข้อมูลด้วยเสียง"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"สัญลักษณ์เปิดอยู่"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"สัญลักษณ์ปิดอยู่"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift เปิดอยู่"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift ปิดอยู่"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"การป้อนข้อมูลด้วยเสียง"</string> <string name="voice_warning_title" msgid="4419354150908395008">"การป้อนข้อมูลด้วยเสียง"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ขณะนี้การป้อนข้อมูลด้วยเสียงยังไม่ได้รับการสนับสนุนในภาษาของคุณ แต่ใช้ได้ในภาษาอังกฤษ"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"ขณะนี้การป้อนข้อมูลด้วยเสียงยังไม่ได้รับการสนับสนุนในภาษาของคุณ แต่ใช้ได้ในภาษาอังกฤษ"</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ป้อนข้อมูลด้วยเสียงใช้การจดจำคำพูดของ Google "<a href="http://m.google.com/privacy">" นโยบายส่วนบุคคลของมือถือ"</a>"มีผลบังคับใช้"</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"ป้อนข้อมูลด้วยเสียงใช้การจดจำคำพูดของ Google "<a href="http://m.google.com/privacy">" นโยบายส่วนบุคคลของมือถือ"</a>"มีผลบังคับใช้"</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Higit pa"</string> <string name="label_more_key" msgid="3760239494604948502">"Higit pa"</string>
<string name="label_pause_key" msgid="181098308428035340">"Pause"</string> <string name="label_pause_key" msgid="181098308428035340">"Pause"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Intay"</string> <string name="label_wait_key" msgid="6402152600878093134">"Intay"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Tanggalin"</string>
<string name="description_return_key" msgid="8750044000806461678">"Bumalik"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Mga Setting"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Puwang"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Mga Simbolo"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Input ng Boses"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Naka-on ang mga simbolo"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Naka-off ang mga simbolo"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Naka-on ang shift"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Naka-off ang shift"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Pag-input ng boses"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Pag-input ng boses"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Hindi kasalukuyang suportado ang pag-input ng boses para sa iyong wika, ngunit gumagana sa Ingles."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Hindi kasalukuyang suportado ang pag-input ng boses para sa iyong wika, ngunit gumagana sa Ingles."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Gumagamit ang pag-input ng boses ng speech recognition ng Google. Nalalapat "<a href="http://m.google.com/privacy">"Ang Patakaran sa Privacy ng Mobile"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Gumagamit ang pag-input ng boses ng speech recognition ng Google. Nalalapat "<a href="http://m.google.com/privacy">"Ang Patakaran sa Privacy ng Mobile"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Diğer"</string> <string name="label_more_key" msgid="3760239494604948502">"Diğer"</string>
<string name="label_pause_key" msgid="181098308428035340">"Durkl"</string> <string name="label_pause_key" msgid="181098308428035340">"Durkl"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Bekle"</string> <string name="label_wait_key" msgid="6402152600878093134">"Bekle"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Sil"</string>
<string name="description_return_key" msgid="8750044000806461678">"Return"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Ayarlar"</string>
<string name="description_shift_key" msgid="346906866277787836">"Üst Karakter"</string>
<string name="description_space_key" msgid="8512130111575878517">"Boşluk"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Simgeler"</string>
<string name="description_tab_key" msgid="828186583738307137">"Sekme"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Ses Girişi"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Simgeler açık"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Simgeler kapalı"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Üst Karakter açık"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Üst Karakter kapalı"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Ses girişi"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Ses girişi"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Ses girişi, şu anda sizin diliniz için desteklenmiyor ama İngilizce dilinde kullanılabilir."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Ses girişi, şu anda sizin diliniz için desteklenmiyor ama İngilizce dilinde kullanılabilir."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ses girişi Google\'ın konuşma tanıma işlevini kullanır. "<a href="http://m.google.com/privacy">" Mobil Gizlilik Politikası"</a>" geçerlidir."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Ses girişi Google\'ın konuşma tanıma işlevini kullanır. "<a href="http://m.google.com/privacy">" Mobil Gizlilik Politikası"</a>" geçerlidir."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Більше"</string> <string name="label_more_key" msgid="3760239494604948502">"Більше"</string>
<string name="label_pause_key" msgid="181098308428035340">"Пауза"</string> <string name="label_pause_key" msgid="181098308428035340">"Пауза"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Чек."</string> <string name="label_wait_key" msgid="6402152600878093134">"Чек."</string>
<string name="description_delete_key" msgid="5586406298531883960">"Клавіша Delete"</string>
<string name="description_return_key" msgid="8750044000806461678">"Клавіша Return"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Клавіша Settings"</string>
<string name="description_shift_key" msgid="346906866277787836">"Клавіша Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Клавіша Space"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Клавіша Symbols"</string>
<string name="description_tab_key" msgid="828186583738307137">"Клавіша Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Клавіша Voice Input"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Символи ввімкнено"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Символи вимкнено"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift увімкнено"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift вимкнено"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Голос. ввід"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Голос. ввід"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Голос. ввід наразі не підтрим. для вашої мови, але можна користуватися англійською."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Голос. ввід наразі не підтрим. для вашої мови, але можна користуватися англійською."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовий ввід використовує розпізнавання мовлення Google. Застосовується "<a href="http://m.google.com/privacy">"Політика конфіденційності для мобільних пристроїв"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Голосовий ввід використовує розпізнавання мовлення Google. Застосовується "<a href="http://m.google.com/privacy">"Політика конфіденційності для мобільних пристроїв"</a>"."</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"Khác"</string> <string name="label_more_key" msgid="3760239494604948502">"Khác"</string>
<string name="label_pause_key" msgid="181098308428035340">"Tạm dừng"</string> <string name="label_pause_key" msgid="181098308428035340">"Tạm dừng"</string>
<string name="label_wait_key" msgid="6402152600878093134">"Đợi"</string> <string name="label_wait_key" msgid="6402152600878093134">"Đợi"</string>
<string name="description_delete_key" msgid="5586406298531883960">"Xóa"</string>
<string name="description_return_key" msgid="8750044000806461678">"Quay lại"</string>
<string name="description_settings_key" msgid="7484527796782969219">"Cài đặt"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"Dấu cách"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"Biểu tượng"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"Nhập liệu bằng giọng nói"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"Bật biểu tượng"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"Tắt biểu tượng"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Bật Shift"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Tắt Shift"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"Nhập liệu bằng giọng nói"</string> <string name="voice_warning_title" msgid="4419354150908395008">"Nhập liệu bằng giọng nói"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Nhập liệu bằng giọng nói hiện không được hỗ trợ cho ngôn ngữ của bạn nhưng hoạt động với ngôn ngữ tiếng Anh."</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Nhập liệu bằng giọng nói hiện không được hỗ trợ cho ngôn ngữ của bạn nhưng hoạt động với ngôn ngữ tiếng Anh."</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Nhập liệu bằng giọng nói sử dụng nhận dạng giọng nói của Google. Áp dụng "<a href="http://m.google.com/privacy">"Chính sách bảo mật dành cho điện thoại di động"</a>"."</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Nhập liệu bằng giọng nói sử dụng nhận dạng giọng nói của Google. Áp dụng "<a href="http://m.google.com/privacy">"Chính sách bảo mật dành cho điện thoại di động"</a>"."</string>

View file

@ -30,8 +30,8 @@
<dimen name="keyboard_bottom_padding">0.0mm</dimen> <dimen name="keyboard_bottom_padding">0.0mm</dimen>
<dimen name="keyboard_horizontal_edges_padding">0.0mm</dimen> <dimen name="keyboard_horizontal_edges_padding">0.0mm</dimen>
<dimen name="key_letter_size">28dip</dimen> <fraction name="key_letter_ratio">30.7%</fraction>
<dimen name="key_label_text_size">20dip</dimen> <fraction name="key_label_text_ratio">21.9%</fraction>
<!-- left or right padding of label alignment --> <!-- left or right padding of label alignment -->
<dimen name="key_label_horizontal_alignment_padding">18dip</dimen> <dimen name="key_label_horizontal_alignment_padding">18dip</dimen>
<dimen name="key_preview_height_holo">26.5mm</dimen> <dimen name="key_preview_height_holo">26.5mm</dimen>

View file

@ -37,11 +37,11 @@
<!-- popup_key_height x -1.0 --> <!-- popup_key_height x -1.0 -->
<dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen> <dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen>
<dimen name="key_letter_size">26dip</dimen> <fraction name="key_letter_ratio">34.4%</fraction>
<dimen name="key_label_text_size">16dip</dimen> <fraction name="key_label_text_ratio">21.2%</fraction>
<!-- left or right padding of label alignment --> <!-- left or right padding of label alignment -->
<dimen name="key_label_horizontal_alignment_padding">6dip</dimen> <dimen name="key_label_horizontal_alignment_padding">6dip</dimen>
<dimen name="key_preview_text_size_large">24dip</dimen> <fraction name="key_preview_text_ratio">26.3%</fraction>
<dimen name="key_preview_height_holo">23.0mm</dimen> <dimen name="key_preview_height_holo">23.0mm</dimen>
<dimen name="key_preview_offset_holo">8.0mm</dimen> <dimen name="key_preview_offset_holo">8.0mm</dimen>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"更多"</string> <string name="label_more_key" msgid="3760239494604948502">"更多"</string>
<string name="label_pause_key" msgid="181098308428035340">"暂停"</string> <string name="label_pause_key" msgid="181098308428035340">"暂停"</string>
<string name="label_wait_key" msgid="6402152600878093134">"等待"</string> <string name="label_wait_key" msgid="6402152600878093134">"等待"</string>
<string name="description_delete_key" msgid="5586406298531883960">"删除"</string>
<string name="description_return_key" msgid="8750044000806461678">"回车"</string>
<string name="description_settings_key" msgid="7484527796782969219">"设置"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift"</string>
<string name="description_space_key" msgid="8512130111575878517">"空格"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"符号"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab"</string>
<string name="description_voice_key" msgid="3057731675774652754">"语音输入"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"符号模式已打开"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"符号模式已关闭"</string>
<string name="description_shift_on" msgid="6983188949895971587">"Shift 模式已打开"</string>
<string name="description_shift_off" msgid="8553265474523069034">"Shift 模式已关闭"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"语音输入"</string> <string name="voice_warning_title" msgid="4419354150908395008">"语音输入"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"语音输入功能当前还不支持您的语言,您只能输入英语语音。"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"语音输入功能当前还不支持您的语言,您只能输入英语语音。"</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"语音输入采用了 Google 的语音识别技术,因此请遵守"<a href="http://m.google.com/privacy">"“Google 移动”隐私权政策"</a>"。"</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"语音输入采用了 Google 的语音识别技术,因此请遵守"<a href="http://m.google.com/privacy">"“Google 移动”隐私权政策"</a>"。"</string>

View file

@ -61,18 +61,6 @@
<string name="label_more_key" msgid="3760239494604948502">"更多"</string> <string name="label_more_key" msgid="3760239494604948502">"更多"</string>
<string name="label_pause_key" msgid="181098308428035340">"暫停"</string> <string name="label_pause_key" msgid="181098308428035340">"暫停"</string>
<string name="label_wait_key" msgid="6402152600878093134">"等候"</string> <string name="label_wait_key" msgid="6402152600878093134">"等候"</string>
<string name="description_delete_key" msgid="5586406298531883960">"刪除"</string>
<string name="description_return_key" msgid="8750044000806461678">"返回"</string>
<string name="description_settings_key" msgid="7484527796782969219">"設定"</string>
<string name="description_shift_key" msgid="346906866277787836">"Shift 鍵"</string>
<string name="description_space_key" msgid="8512130111575878517">"空白鍵"</string>
<string name="description_switch_alpha_symbol_key" msgid="4537975384274405537">"符號"</string>
<string name="description_tab_key" msgid="828186583738307137">"Tab 鍵"</string>
<string name="description_voice_key" msgid="3057731675774652754">"語音輸入"</string>
<string name="description_symbols_on" msgid="2994366855822840559">"開啟符號"</string>
<string name="description_symbols_off" msgid="3209578267079515136">"關閉符號"</string>
<string name="description_shift_on" msgid="6983188949895971587">"開啟位移"</string>
<string name="description_shift_off" msgid="8553265474523069034">"關閉位移"</string>
<string name="voice_warning_title" msgid="4419354150908395008">"語音輸入"</string> <string name="voice_warning_title" msgid="4419354150908395008">"語音輸入"</string>
<string name="voice_warning_locale_not_supported" msgid="637923019716442333">"語音輸入目前不支援您的語言,但是可以辨識英文。"</string> <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"語音輸入目前不支援您的語言,但是可以辨識英文。"</string>
<string name="voice_warning_may_not_understand" msgid="5596289095878251072">"語音輸入使用 Google 的語音辨識功能,並遵循《"<a href="http://m.google.com/privacy">"行動服務隱私權政策"</a>"》。"</string> <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"語音輸入使用 Google 的語音辨識功能,並遵循《"<a href="http://m.google.com/privacy">"行動服務隱私權政策"</a>"》。"</string>

View file

@ -25,11 +25,13 @@
checkable+checked+pressed. --> checkable+checked+pressed. -->
<attr name="keyBackground" format="reference" /> <attr name="keyBackground" format="reference" />
<!-- Size of the text for one letter character keys. --> <!-- Size of the text for one letter character keys, in the proportion of key height.
<attr name="keyLetterSize" format="dimension" /> -->
<attr name="keyLetterRatio" format="float" />
<!-- Size of the text for custom keys with some text and no icon. --> <!-- Size of the text for custom keys with some text and no icon, in the proportion of key
<attr name="labelTextSize" format="dimension" /> height. -->
<attr name="labelTextRatio" format="float" />
<!-- Color to use for the label in a key. --> <!-- Color to use for the label in a key. -->
<attr name="keyTextColor" format="color" /> <attr name="keyTextColor" format="color" />
@ -80,6 +82,9 @@
<attr name="keyboardHeight" format="dimension" /> <attr name="keyboardHeight" format="dimension" />
<!-- Maximum keyboard height, in pixels or percentage of display height --> <!-- Maximum keyboard height, in pixels or percentage of display height -->
<attr name="maxKeyboardHeight" format="dimension|fraction" /> <attr name="maxKeyboardHeight" format="dimension|fraction" />
<!-- Minimum keyboard height represented in pixels, percentage of display height if fraction
is positive, or percentage of display width if fraction is negative. -->
<attr name="minKeyboardHeight" format="dimension|fraction" />
<!-- Default width of a key, in pixels or percentage of display width. --> <!-- Default width of a key, in pixels or percentage of display width. -->
<attr name="keyWidth" format="dimension|fraction" /> <attr name="keyWidth" format="dimension|fraction" />
<!-- Default height of a row (key height + vertical gap), in pixels or percentage of <!-- Default height of a row (key height + vertical gap), in pixels or percentage of

View file

@ -21,6 +21,8 @@
<resources> <resources>
<!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=0.295in --> <!-- keyboardHeight = key_height*4 + key_bottom_gap*3, key_height=0.295in -->
<dimen name="keyboardHeight">1.285in</dimen> <dimen name="keyboardHeight">1.285in</dimen>
<fraction name="maxKeyboardHeight">50%p</fraction>
<fraction name="minKeyboardHeight">-61.8%p</fraction>
<!-- key_height + key_bottom_gap = popup_key_height --> <!-- key_height + key_bottom_gap = popup_key_height -->
<!-- <dimen name="key_height">0.295in</dimen> --> <!-- <dimen name="key_height">0.295in</dimen> -->
<dimen name="key_bottom_gap">0.035in</dimen> <dimen name="key_bottom_gap">0.035in</dimen>
@ -41,13 +43,13 @@
to user's finger. --> to user's finger. -->
<dimen name="keyboard_vertical_correction">-0.05in</dimen> <dimen name="keyboard_vertical_correction">-0.05in</dimen>
<dimen name="key_letter_size">0.13in</dimen> <fraction name="key_letter_ratio">45%</fraction>
<dimen name="key_label_text_size">0.083in</dimen> <fraction name="key_label_text_ratio">29%</fraction>
<!-- left or right padding of label alignment --> <!-- left or right padding of label alignment -->
<dimen name="key_label_horizontal_alignment_padding">0.13in</dimen> <dimen name="key_label_horizontal_alignment_padding">21dip</dimen>
<dimen name="key_preview_height">80sp</dimen> <dimen name="key_preview_height">80sp</dimen>
<dimen name="key_preview_offset">0.000in</dimen> <dimen name="key_preview_offset">0.1in</dimen>
<dimen name="key_preview_text_size_large">36sp</dimen> <fraction name="key_preview_text_ratio">82%</fraction>
<dimen name="key_preview_height_holo">130sp</dimen> <dimen name="key_preview_height_holo">130sp</dimen>
<dimen name="key_preview_offset_holo">0.193in</dimen> <dimen name="key_preview_offset_holo">0.193in</dimen>

View file

@ -31,24 +31,4 @@
<integer name="key_delete">-5</integer> <integer name="key_delete">-5</integer>
<integer name="key_settings">-6</integer> <integer name="key_settings">-6</integer>
<integer name="key_shortcut">-8</integer> <integer name="key_shortcut">-8</integer>
<!-- Array used for mapping key codes to description strings. -->
<array name="key_descriptions">
<item>@integer/key_tab</item>
<item>@string/description_tab_key</item>
<item>@integer/key_return</item>
<item>@string/description_return_key</item>
<item>@integer/key_space</item>
<item>@string/description_space_key</item>
<item>@integer/key_shift</item>
<item>@string/description_shift_key</item>
<item>@integer/key_switch_alpha_symbol</item>
<item>@string/description_switch_alpha_symbol_key</item>
<item>@integer/key_delete</item>
<item>@string/description_delete_key</item>
<item>@integer/key_settings</item>
<item>@string/description_settings_key</item>
<item>@integer/key_shortcut</item>
<item>@string/description_voice_key</item>
</array>
</resources> </resources>

View file

@ -46,6 +46,18 @@
<!-- Category title for misc options --> <!-- Category title for misc options -->
<string name="misc_category">Other options</string> <string name="misc_category">Other options</string>
<!-- Option name for advanced settings screen [CHAR LIMIT=25] -->
<string name="advanced_settings">Advanced settings</string>
<!-- Option summary for advanced settings screen [CHAR LIMIT=65 (two lines) or 30 (fits on one line, preferable)] -->
<string name="advanced_settings_summary">Options for expert users</string>
<!-- Option for the dismiss delay of the key popup [CHAR LIMIT=25] -->
<string name="key_preview_popup_dismiss_delay">Key popup dismiss delay</string>
<!-- Description for delay for dismissing a popup on keypress: no delay [CHAR LIMIT=15] -->
<string name="key_preview_popup_dismiss_no_delay">No delay</string>
<!-- Description for delay for dismissing a popup on screen: default value of the delay [CHAR LIMIT=15] -->
<string name="key_preview_popup_dismiss_default_delay">Default</string>
<!-- Option to enable auto capitalization of sentences --> <!-- Option to enable auto capitalization of sentences -->
<string name="auto_cap">Auto-capitalization</string> <string name="auto_cap">Auto-capitalization</string>
@ -114,31 +126,6 @@
<!-- Label for "Wait" key of phone number keyboard. Must be short to fit on key! [CHAR LIMIT=5]--> <!-- Label for "Wait" key of phone number keyboard. Must be short to fit on key! [CHAR LIMIT=5]-->
<string name="label_wait_key">Wait</string> <string name="label_wait_key">Wait</string>
<!-- Spoken text description for delete key. -->
<string name="description_delete_key">Delete</string>
<!-- Spoken text description for return key. -->
<string name="description_return_key">Return</string>
<!-- Spoken text description for settings key. -->
<string name="description_settings_key">Settings</string>
<!-- Spoken text description for shift key. -->
<string name="description_shift_key">Shift</string>
<!-- Spoken text description for space key. -->
<string name="description_space_key">Space</string>
<!-- Spoken text description for symbols key. -->
<string name="description_switch_alpha_symbol_key">Symbols</string>
<!-- Spoken text description for tab key. -->
<string name="description_tab_key">Tab</string>
<!-- Spoken text description for voice input key. -->
<string name="description_voice_key">Voice Input</string>
<!-- Spoken text description for symbols mode on. -->
<string name="description_symbols_on">Symbols on</string>
<!-- Spoken text description for symbols mode off. -->
<string name="description_symbols_off">Symbols off</string>
<!-- Spoken text description for shift mode on. -->
<string name="description_shift_on">Shift on</string>
<!-- Spoken text description for shift mode off. -->
<string name="description_shift_off">Shift off</string>
<!-- Voice related labels --> <!-- Voice related labels -->
<!-- Title of the warning dialog that shows when a user initiates voice input for <!-- Title of the warning dialog that shows when a user initiates voice input for
@ -285,6 +272,8 @@
<string name="subtype_mode_nl_keyboard">Dutch Keyboard</string> <string name="subtype_mode_nl_keyboard">Dutch Keyboard</string>
<!-- Description for Polish keyboard subtype [CHAR LIMIT=35] --> <!-- Description for Polish keyboard subtype [CHAR LIMIT=35] -->
<string name="subtype_mode_pl_keyboard">Polish Keyboard</string> <string name="subtype_mode_pl_keyboard">Polish Keyboard</string>
<!-- Description for Portuguese keyboard subtype [CHAR LIMIT=35] -->
<string name="subtype_mode_pt_keyboard">Portuguese Keyboard</string>
<!-- Description for Russian keyboard subtype [CHAR LIMIT=35] --> <!-- Description for Russian keyboard subtype [CHAR LIMIT=35] -->
<string name="subtype_mode_ru_keyboard">Russian Keyboard</string> <string name="subtype_mode_ru_keyboard">Russian Keyboard</string>
<!-- Description for Serbian keyboard subtype [CHAR LIMIT=35] --> <!-- Description for Serbian keyboard subtype [CHAR LIMIT=35] -->

View file

@ -19,14 +19,14 @@
<item name="android:background">@drawable/keyboard_background</item> <item name="android:background">@drawable/keyboard_background</item>
<item name="keyBackground">@drawable/btn_keyboard_key</item> <item name="keyBackground">@drawable/btn_keyboard_key</item>
<item name="keyLetterSize">@dimen/key_letter_size</item> <item name="keyLetterRatio">@fraction/key_letter_ratio</item>
<item name="keyLetterStyle">normal</item> <item name="keyLetterStyle">normal</item>
<item name="keyTextColor">#FFFFFFFF</item> <item name="keyTextColor">#FFFFFFFF</item>
<item name="keyTextColorDisabled">#FFFFFFFF</item> <item name="keyTextColorDisabled">#FFFFFFFF</item>
<item name="keyPreviewLayout">@layout/key_preview</item> <item name="keyPreviewLayout">@layout/key_preview</item>
<item name="keyPreviewOffset">@dimen/key_preview_offset</item> <item name="keyPreviewOffset">@dimen/key_preview_offset</item>
<item name="keyPreviewHeight">@dimen/key_preview_height</item> <item name="keyPreviewHeight">@dimen/key_preview_height</item>
<item name="labelTextSize">@dimen/key_label_text_size</item> <item name="labelTextRatio">@fraction/key_label_text_ratio</item>
<item name="popupLayout">@layout/keyboard_popup</item> <item name="popupLayout">@layout/keyboard_popup</item>
<item name="keyHysteresisDistance">@dimen/key_hysteresis_distance</item> <item name="keyHysteresisDistance">@dimen/key_hysteresis_distance</item>
<item name="verticalCorrection">@dimen/keyboard_vertical_correction</item> <item name="verticalCorrection">@dimen/keyboard_vertical_correction</item>

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"

View file

@ -21,14 +21,15 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"
latin:popupKeyboardTemplate="@xml/kbd_popup_template" latin:popupKeyboardTemplate="@xml/kbd_popup_template"
latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
latin:keyboardLocale="de_DE" latin:keyboardLocale="de"
> >
<include <include
latin:keyboardLayout="@xml/kbd_qwertz_rows" /> latin:keyboardLayout="@xml/kbd_qwertz_rows" />

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p"
latin:rowHeight="25%p"
latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap"
latin:popupKeyboardTemplate="@xml/kbd_popup_template"
latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
latin:keyboardLocale="es,es_US"
>
<include
latin:keyboardLayout="@xml/kbd_qwerty_rows" />
</Keyboard>

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,14 +21,15 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"
latin:popupKeyboardTemplate="@xml/kbd_popup_template" latin:popupKeyboardTemplate="@xml/kbd_popup_template"
latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
latin:keyboardLocale="fr_FR" latin:keyboardLocale="fr"
> >
<include <include
latin:keyboardLayout="@xml/kbd_azerty_rows" /> latin:keyboardLayout="@xml/kbd_azerty_rows" />

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"

View file

@ -28,7 +28,7 @@
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"
latin:popupKeyboardTemplate="@xml/kbd_popup_template" latin:popupKeyboardTemplate="@xml/kbd_popup_template"
latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
latin:keyboardLocale="pl_PL" latin:keyboardLocale="pl"
> >
<include <include
latin:keyboardLayout="@xml/kbd_qwerty_rows" /> latin:keyboardLayout="@xml/kbd_qwerty_rows" />

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p"
latin:rowHeight="25%p"
latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap"
latin:popupKeyboardTemplate="@xml/kbd_popup_template"
latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
latin:keyboardLocale="pt"
>
<include
latin:keyboardLayout="@xml/kbd_qwerty_rows" />
</Keyboard>

View file

@ -21,13 +21,14 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"
latin:popupKeyboardTemplate="@xml/kbd_popup_template" latin:popupKeyboardTemplate="@xml/kbd_popup_template"
latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column" latin:maxPopupKeyboardColumn="@integer/config_max_popup_keyboard_column"
latin:keyboardLocale="ru_RU" latin:keyboardLocale="ru"
> >
<include <include
latin:keyboardLayout="@xml/kbd_ru_rows" /> latin:keyboardLayout="@xml/kbd_ru_rows" />

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="11.949%p" latin:keyWidth="11.949%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="11.949%p" latin:keyWidth="11.949%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="11.949%p" latin:keyWidth="11.949%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -30,7 +30,7 @@
<Key <Key
latin:keyStyle="tabKeyStyle" latin:keyStyle="tabKeyStyle"
latin:keyLabelOption="alignLeft" latin:keyLabelOption="alignLeft"
latin:keyWidth="7.949%p" latin:keyWidth="8.640%p"
latin:keyEdgeFlags="left" /> latin:keyEdgeFlags="left" />
<Key <Key
latin:keyLabel="љ" latin:keyLabel="љ"
@ -66,7 +66,7 @@
latin:keyLabel="ш" /> latin:keyLabel="ш" />
<Key <Key
latin:keyStyle="deleteKeyStyle" latin:keyStyle="deleteKeyStyle"
latin:keyWidth="9.331%p" latin:keyWidth="8.640%p"
latin:keyEdgeFlags="right" /> latin:keyEdgeFlags="right" />
</Row> </Row>
<Row <Row
@ -75,7 +75,7 @@
<Key <Key
latin:keyStyle="toSymbolKeyStyle" latin:keyStyle="toSymbolKeyStyle"
latin:keyLabelOption="alignLeft" latin:keyLabelOption="alignLeft"
latin:keyWidth="7.949%p" latin:keyWidth="8.640%p"
latin:keyEdgeFlags="left" /> latin:keyEdgeFlags="left" />
<Key <Key
latin:keyLabel="а" /> latin:keyLabel="а" />
@ -101,7 +101,7 @@
latin:keyLabel="ћ" /> latin:keyLabel="ћ" />
<Key <Key
latin:keyStyle="returnKeyStyle" latin:keyStyle="returnKeyStyle"
latin:keyWidth="9.331%p" latin:keyWidth="8.640%p"
latin:keyEdgeFlags="right" /> latin:keyEdgeFlags="right" />
</Row> </Row>
<Row <Row
@ -109,12 +109,10 @@
> >
<Key <Key
latin:keyStyle="shiftKeyStyle" latin:keyStyle="shiftKeyStyle"
latin:keyWidth="12.400%p" latin:keyWidth="8.640%p"
latin:keyEdgeFlags="left" /> latin:keyEdgeFlags="left" />
<Key <Key
latin:keyLabel="ђ" /> latin:keyLabel="ѕ" />
<Key
latin:keyLabel="ж" />
<Key <Key
latin:keyLabel="џ" /> latin:keyLabel="џ" />
<Key <Key
@ -127,6 +125,10 @@
latin:keyLabel="н" /> latin:keyLabel="н" />
<Key <Key
latin:keyLabel="м" /> latin:keyLabel="м" />
<Key
latin:keyLabel="ђ" />
<Key
latin:keyLabel="ж" />
<Key <Key
latin:keyLabel="," latin:keyLabel=","
latin:manualTemporaryUpperCaseCode="33" latin:manualTemporaryUpperCaseCode="33"
@ -141,7 +143,7 @@
latin:popupCharacters="\?" /> latin:popupCharacters="\?" />
<Key <Key
latin:keyStyle="shiftKeyStyle" latin:keyStyle="shiftKeyStyle"
latin:keyWidth="12.400%p" latin:keyWidth="8.640%p"
latin:keyEdgeFlags="right" /> latin:keyEdgeFlags="right" />
</Row> </Row>
<include <include

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"
@ -137,7 +138,8 @@
latin:mode="url" latin:mode="url"
> >
<Key <Key
latin:keyLabel="\'" /> latin:keyLabel="\'"
latin:popupCharacters=",,," />
</case> </case>
<default> <default>
<Key <Key
@ -151,10 +153,13 @@
latin:languageCode="ru" latin:languageCode="ru"
> >
<Key <Key
latin:keyLabel="\'" /> latin:keyLabel="\'"
latin:popupCharacters=",,," />
<!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
<!-- latin:popupCharacters="“,”,„,‟,«,»" -->
<Key <Key
latin:keyLabel="&quot;" latin:keyLabel="&quot;"
latin:popupCharacters="“,”,«,»,˝" /> latin:popupCharacters="“,”,«,»" />
<Key <Key
latin:keyLabel="." /> latin:keyLabel="." />
<Key <Key
@ -212,9 +217,10 @@
</case> </case>
<default> <default>
<!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. --> <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
<!-- latin:popupCharacters="“,”,„,‟,«,»,,,," -->
<Key <Key
latin:keyLabel="&quot;" latin:keyLabel="&quot;"
latin:popupCharacters="“,”,„,‟,«,»,,,," /> latin:popupCharacters="“,”,«,»,,,," />
<Key <Key
latin:keyLabel="_" /> latin:keyLabel="_" />
</default> </default>

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
latin:verticalGap="@dimen/key_bottom_gap" latin:verticalGap="@dimen/key_bottom_gap"

View file

@ -128,7 +128,8 @@
latin:keyLabel="n" latin:keyLabel="n"
latin:popupCharacters="@string/alternates_for_n" /> latin:popupCharacters="@string/alternates_for_n" />
<Key <Key
latin:keyLabel="\'" /> latin:keyLabel="\'"
latin:popupCharacters=",,," />
<Key <Key
latin:keyStyle="deleteKeyStyle" latin:keyStyle="deleteKeyStyle"
latin:keyWidth="15%p" latin:keyWidth="15%p"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="26.67%p" latin:keyWidth="26.67%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="26.67%p" latin:keyWidth="26.67%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="26.67%p" latin:keyWidth="26.67%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -73,7 +73,7 @@
latin:keyEdgeFlags="right" /> latin:keyEdgeFlags="right" />
</Row> </Row>
<Row <Row
latin:keyWidth="8.333%p" latin:keyWidth="9.09%p"
> >
<Key <Key
latin:keyLabel="а" latin:keyLabel="а"
@ -97,20 +97,17 @@
<Key <Key
latin:keyLabel="ч" /> latin:keyLabel="ч" />
<Key <Key
latin:keyLabel="ћ" /> latin:keyLabel="ћ"
<Key
latin:keyLabel="ђ"
latin:keyEdgeFlags="right" /> latin:keyEdgeFlags="right" />
</Row> </Row>
<Row <Row
latin:keyWidth="8.5%p" latin:keyWidth="8.90%p"
> >
<Key <Key
latin:keyStyle="shiftKeyStyle" latin:keyStyle="shiftKeyStyle"
latin:keyWidth="11.75%p"
latin:keyEdgeFlags="left" /> latin:keyEdgeFlags="left" />
<Key <Key
latin:keyLabel="ж" /> latin:keyLabel="ѕ" />
<Key <Key
latin:keyLabel="џ" /> latin:keyLabel="џ" />
<Key <Key
@ -123,9 +120,13 @@
latin:keyLabel="н" /> latin:keyLabel="н" />
<Key <Key
latin:keyLabel="м" /> latin:keyLabel="м" />
<Key
latin:keyLabel="ђ" />
<Key
latin:keyLabel="ж" />
<Key <Key
latin:keyStyle="deleteKeyStyle" latin:keyStyle="deleteKeyStyle"
latin:keyWidth="11.75%p" latin:keyWidth="11.00%p"
latin:keyEdgeFlags="right" /> latin:keyEdgeFlags="right" />
</Row> </Row>
<include <include

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"
@ -106,13 +107,14 @@
latin:keyLabel="!" latin:keyLabel="!"
latin:popupCharacters="¡" /> latin:popupCharacters="¡" />
<!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. --> <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
<!-- latin:popupCharacters="“,”,„,‟,«,»" -->
<Key <Key
latin:keyLabel="&quot;" latin:keyLabel="&quot;"
latin:popupCharacters="“,”,„,‟,«,»" latin:popupCharacters="“,”,«,»"
latin:maxPopupKeyboardColumn="6" /> latin:maxPopupKeyboardColumn="6" />
<Key <Key
latin:keyLabel="\'" latin:keyLabel="\'"
latin:popupCharacters=",,,,´" /> latin:popupCharacters=",,," />
<Key <Key
latin:keyLabel=":" /> latin:keyLabel=":" />
<Key <Key

View file

@ -21,7 +21,8 @@
<Keyboard <Keyboard
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
latin:keyboardHeight="@dimen/keyboardHeight" latin:keyboardHeight="@dimen/keyboardHeight"
latin:maxKeyboardHeight="50%p" latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
latin:minKeyboardHeight="@fraction/minKeyboardHeight"
latin:rowHeight="25%p" latin:rowHeight="25%p"
latin:keyWidth="10%p" latin:keyWidth="10%p"
latin:horizontalGap="@dimen/key_horizontal_gap" latin:horizontalGap="@dimen/key_horizontal_gap"

View file

@ -130,6 +130,15 @@
android:entries="@array/keyboard_layout_modes" android:entries="@array/keyboard_layout_modes"
android:defaultValue="@string/config_default_keyboard_theme_id" /> android:defaultValue="@string/config_default_keyboard_theme_id" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceScreen
android:key="pref_advanced_settings"
android:title="@string/advanced_settings"
android:summary="@string/advanced_settings_summary">
<!-- Values for popup dismiss delay are added programatically -->
<ListPreference
android:key="pref_key_preview_popup_dismiss_delay"
android:title="@string/key_preview_popup_dismiss_delay" />
</PreferenceScreen>
<!-- <Preference <!-- <Preference
android:title="Debug Settings" android:title="Debug Settings"
android:key="debug_settings"> android:key="debug_settings">

View file

@ -43,6 +43,8 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map.Entry;
import java.util.TreeMap;
public class InputLanguageSelection extends PreferenceActivity { public class InputLanguageSelection extends PreferenceActivity {
@ -51,21 +53,17 @@ public class InputLanguageSelection extends PreferenceActivity {
private HashMap<CheckBoxPreference, Locale> mLocaleMap = private HashMap<CheckBoxPreference, Locale> mLocaleMap =
new HashMap<CheckBoxPreference, Locale>(); new HashMap<CheckBoxPreference, Locale>();
private static class Loc implements Comparable<Object> { private static class LocaleEntry implements Comparable<Object> {
private static Collator sCollator = Collator.getInstance(); private static Collator sCollator = Collator.getInstance();
private String mLabel; private String mLabel;
public final Locale mLocale; public final Locale mLocale;
public Loc(String label, Locale locale) { public LocaleEntry(String label, Locale locale) {
this.mLabel = label; this.mLabel = label;
this.mLocale = locale; this.mLocale = locale;
} }
public void setLabel(String label) {
this.mLabel = label;
}
@Override @Override
public String toString() { public String toString() {
return this.mLabel; return this.mLabel;
@ -73,7 +71,7 @@ public class InputLanguageSelection extends PreferenceActivity {
@Override @Override
public int compareTo(Object o) { public int compareTo(Object o) {
return sCollator.compare(this.mLabel, ((Loc) o).mLabel); return sCollator.compare(this.mLabel, ((LocaleEntry) o).mLabel);
} }
} }
@ -85,21 +83,58 @@ public class InputLanguageSelection extends PreferenceActivity {
mPrefs = PreferenceManager.getDefaultSharedPreferences(this); mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
mSelectedLanguages = mPrefs.getString(Settings.PREF_SELECTED_LANGUAGES, ""); mSelectedLanguages = mPrefs.getString(Settings.PREF_SELECTED_LANGUAGES, "");
String[] languageList = mSelectedLanguages.split(","); String[] languageList = mSelectedLanguages.split(",");
ArrayList<Loc> availableLanguages = getUniqueLocales(); ArrayList<LocaleEntry> availableLanguages = getUniqueLocales();
PreferenceGroup parent = getPreferenceScreen(); PreferenceGroup parent = getPreferenceScreen();
final HashMap<Long, LocaleEntry> dictionaryIdLocaleMap = new HashMap<Long, LocaleEntry>();
final TreeMap<LocaleEntry, Boolean> localeHasDictionaryMap =
new TreeMap<LocaleEntry, Boolean>();
for (int i = 0; i < availableLanguages.size(); i++) { for (int i = 0; i < availableLanguages.size(); i++) {
Locale locale = availableLanguages.get(i).mLocale; LocaleEntry loc = availableLanguages.get(i);
final Pair<Boolean, Boolean> hasDictionaryOrLayout = hasDictionaryOrLayout(locale); Locale locale = loc.mLocale;
final boolean hasDictionary = hasDictionaryOrLayout.first; final Pair<Long, Boolean> hasDictionaryOrLayout = hasDictionaryOrLayout(locale);
final Long dictionaryId = hasDictionaryOrLayout.first;
final boolean hasLayout = hasDictionaryOrLayout.second; final boolean hasLayout = hasDictionaryOrLayout.second;
final boolean hasDictionary = dictionaryId != null;
// Add this locale to the supported list if: // Add this locale to the supported list if:
// 1) this locale has a layout/ 2) this locale has a dictionary and the length // 1) this locale has a layout/ 2) this locale has a dictionary
// of the locale is equal to or larger than 5. // If some locales have no layout but have a same dictionary, the shortest locale
if (!hasLayout && !(hasDictionary && locale.toString().length() >= 5)) { // will be added to the supported list.
if (!hasLayout && !hasDictionary) {
continue; continue;
} }
if (hasLayout) {
localeHasDictionaryMap.put(loc, hasDictionary);
}
if (!hasDictionary) {
continue;
}
if (dictionaryIdLocaleMap.containsKey(dictionaryId)) {
final String newLocale = locale.toString();
final String oldLocale =
dictionaryIdLocaleMap.get(dictionaryId).mLocale.toString();
// Check if this locale is more appropriate to be the candidate of the input locale.
if (oldLocale.length() <= newLocale.length() && !hasLayout) {
// Don't add this new locale to the map<dictionary id, locale> if:
// 1) the new locale's name is longer than the existing one, and
// 2) the new locale doesn't have its layout
continue;
}
}
dictionaryIdLocaleMap.put(dictionaryId, loc);
}
for (LocaleEntry localeEntry : dictionaryIdLocaleMap.values()) {
if (!localeHasDictionaryMap.containsKey(localeEntry)) {
localeHasDictionaryMap.put(localeEntry, true);
}
}
for (Entry<LocaleEntry, Boolean> entry : localeHasDictionaryMap.entrySet()) {
final LocaleEntry localeEntry = entry.getKey();
final Locale locale = localeEntry.mLocale;
final Boolean hasDictionary = entry.getValue();
CheckBoxPreference pref = new CheckBoxPreference(this); CheckBoxPreference pref = new CheckBoxPreference(this);
pref.setTitle(SubtypeSwitcher.getFullDisplayName(locale, true)); pref.setTitle(localeEntry.mLabel);
boolean checked = isLocaleIn(locale, languageList); boolean checked = isLocaleIn(locale, languageList);
pref.setChecked(checked); pref.setChecked(checked);
if (hasDictionary) { if (hasDictionary) {
@ -118,11 +153,11 @@ public class InputLanguageSelection extends PreferenceActivity {
return false; return false;
} }
private Pair<Boolean, Boolean> hasDictionaryOrLayout(Locale locale) { private Pair<Long, Boolean> hasDictionaryOrLayout(Locale locale) {
if (locale == null) return new Pair<Boolean, Boolean>(false, false); if (locale == null) return new Pair<Long, Boolean>(null, false);
final Resources res = getResources(); final Resources res = getResources();
final Locale saveLocale = Utils.setSystemLocale(res, locale); final Locale saveLocale = Utils.setSystemLocale(res, locale);
final boolean hasDictionary = DictionaryFactory.isDictionaryAvailable(this, locale); final Long dictionaryId = DictionaryFactory.getDictionaryId(this, locale);
boolean hasLayout = false; boolean hasLayout = false;
try { try {
@ -141,7 +176,7 @@ public class InputLanguageSelection extends PreferenceActivity {
} catch (IOException e) { } catch (IOException e) {
} }
Utils.setSystemLocale(res, saveLocale); Utils.setSystemLocale(res, saveLocale);
return new Pair<Boolean, Boolean>(hasDictionary, hasLayout); return new Pair<Long, Boolean>(dictionaryId, hasLayout);
} }
private String get5Code(Locale locale) { private String get5Code(Locale locale) {
@ -174,13 +209,13 @@ public class InputLanguageSelection extends PreferenceActivity {
SharedPreferencesCompat.apply(editor); SharedPreferencesCompat.apply(editor);
} }
public ArrayList<Loc> getUniqueLocales() { public ArrayList<LocaleEntry> getUniqueLocales() {
String[] locales = getAssets().getLocales(); String[] locales = getAssets().getLocales();
Arrays.sort(locales); Arrays.sort(locales);
ArrayList<Loc> uniqueLocales = new ArrayList<Loc>(); ArrayList<LocaleEntry> uniqueLocales = new ArrayList<LocaleEntry>();
final int origSize = locales.length; final int origSize = locales.length;
Loc[] preprocess = new Loc[origSize]; LocaleEntry[] preprocess = new LocaleEntry[origSize];
int finalSize = 0; int finalSize = 0;
for (int i = 0 ; i < origSize; i++ ) { for (int i = 0 ; i < origSize; i++ ) {
String s = locales[i]; String s = locales[i];
@ -202,26 +237,13 @@ public class InputLanguageSelection extends PreferenceActivity {
if (finalSize == 0) { if (finalSize == 0) {
preprocess[finalSize++] = preprocess[finalSize++] =
new Loc(SubtypeSwitcher.getFullDisplayName(l, true), l); new LocaleEntry(SubtypeSwitcher.getFullDisplayName(l, false), l);
} else { } else {
// check previous entry: if (s.equals("zz_ZZ")) {
// same lang and a country -> upgrade to full name and // ignore this locale
// insert ours with full name
// diff lang -> insert ours with lang-only name
if (preprocess[finalSize-1].mLocale.getLanguage().equals(
language)) {
preprocess[finalSize-1].setLabel(SubtypeSwitcher.getFullDisplayName(
preprocess[finalSize-1].mLocale, false));
preprocess[finalSize++] =
new Loc(SubtypeSwitcher.getFullDisplayName(l, false), l);
} else { } else {
String displayName; final String displayName = SubtypeSwitcher.getFullDisplayName(l, false);
if (s.equals("zz_ZZ")) { preprocess[finalSize++] = new LocaleEntry(displayName, l);
// ignore this locale
} else {
displayName = SubtypeSwitcher.getFullDisplayName(l, true);
preprocess[finalSize++] = new Loc(displayName, l);
}
} }
} }
} }

View file

@ -14,11 +14,21 @@
* the License. * the License.
*/ */
package com.android.inputmethod.latin; package com.android.inputmethod.deprecated.recorrection;
import com.android.inputmethod.compat.InputConnectionCompatUtils; import com.android.inputmethod.compat.InputConnectionCompatUtils;
import com.android.inputmethod.deprecated.VoiceProxy; import com.android.inputmethod.deprecated.VoiceProxy;
import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.latin.AutoCorrection;
import com.android.inputmethod.latin.CandidateView;
import com.android.inputmethod.latin.EditingUtils;
import com.android.inputmethod.latin.LatinIME;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.Settings;
import com.android.inputmethod.latin.Suggest;
import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.TextEntryState;
import com.android.inputmethod.latin.WordComposer;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Resources; import android.content.res.Resources;
@ -32,12 +42,14 @@ import java.util.ArrayList;
/** /**
* Manager of re-correction functionalities * Manager of re-correction functionalities
*/ */
public class Recorrection { public class Recorrection implements SharedPreferences.OnSharedPreferenceChangeListener {
public static final boolean USE_LEGACY_RECORRECTION = true;
private static final Recorrection sInstance = new Recorrection(); private static final Recorrection sInstance = new Recorrection();
private LatinIME mService; private LatinIME mService;
private boolean mRecorrectionEnabled = false; private boolean mRecorrectionEnabled = false;
private final ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>(); private final ArrayList<RecorrectionSuggestionEntries> mRecorrectionSuggestionsList =
new ArrayList<RecorrectionSuggestionEntries>();
public static Recorrection getInstance() { public static Recorrection getInstance() {
return sInstance; return sInstance;
@ -58,20 +70,17 @@ public class Recorrection {
} }
private void initInternal(LatinIME context, SharedPreferences prefs) { private void initInternal(LatinIME context, SharedPreferences prefs) {
final Resources res = context.getResources(); if (!USE_LEGACY_RECORRECTION) {
// If the option should not be shown, do not read the re-correction preference mRecorrectionEnabled = false;
// but always use the default setting defined in the resources. return;
if (res.getBoolean(R.bool.config_enable_show_recorrection_option)) {
mRecorrectionEnabled = prefs.getBoolean(Settings.PREF_RECORRECTION_ENABLED,
res.getBoolean(R.bool.config_default_recorrection_enabled));
} else {
mRecorrectionEnabled = res.getBoolean(R.bool.config_default_recorrection_enabled);
} }
updateRecorrectionEnabled(context.getResources(), prefs);
mService = context; mService = context;
prefs.registerOnSharedPreferenceChangeListener(this);
} }
public void checkRecorrectionOnStart() { public void checkRecorrectionOnStart() {
if (!mRecorrectionEnabled) return; if (!USE_LEGACY_RECORRECTION || !mRecorrectionEnabled) return;
final InputConnection ic = mService.getCurrentInputConnection(); final InputConnection ic = mService.getCurrentInputConnection();
if (ic == null) return; if (ic == null) return;
@ -98,42 +107,42 @@ public class Recorrection {
} }
public void updateRecorrectionSelection(KeyboardSwitcher keyboardSwitcher, public void updateRecorrectionSelection(KeyboardSwitcher keyboardSwitcher,
CandidateView candidateView, int candidatesStart, int candidatesEnd, int newSelStart, CandidateView candidateView, int candidatesStart, int candidatesEnd,
int newSelEnd, int oldSelStart, int lastSelectionStart, int newSelStart, int newSelEnd, int oldSelStart, int lastSelectionStart,
int lastSelectionEnd, boolean hasUncommittedTypedChars) { int lastSelectionEnd, boolean hasUncommittedTypedChars) {
if (mRecorrectionEnabled && mService.isShowingSuggestionsStrip()) { if (!USE_LEGACY_RECORRECTION || !mRecorrectionEnabled) return;
// Don't look for corrections if the keyboard is not visible if (!mService.isShowingSuggestionsStrip()) return;
if (keyboardSwitcher.isInputViewShown()) { if (!keyboardSwitcher.isInputViewShown()) return;
// Check if we should go in or out of correction mode. if (!mService.isSuggestionsRequested()) return;
if (mService.isSuggestionsRequested() // Don't look for corrections if the keyboard is not visible
&& (candidatesStart == candidatesEnd || newSelStart != oldSelStart // Check if we should go in or out of correction mode.
|| TextEntryState.isRecorrecting()) if ((candidatesStart == candidatesEnd || newSelStart != oldSelStart || TextEntryState
&& (newSelStart < newSelEnd - 1 || !hasUncommittedTypedChars)) { .isRecorrecting())
if (mService.isCursorTouchingWord() || lastSelectionStart < lastSelectionEnd) { && (newSelStart < newSelEnd - 1 || !hasUncommittedTypedChars)) {
mService.mHandler.cancelUpdateBigramPredictions(); if (mService.isCursorTouchingWord() || lastSelectionStart < lastSelectionEnd) {
mService.mHandler.postUpdateOldSuggestions(); mService.mHandler.cancelUpdateBigramPredictions();
} else { mService.mHandler.postUpdateOldSuggestions();
abortRecorrection(false); } else {
// If showing the "touch again to save" hint, do not replace it. Else, abortRecorrection(false);
// show the bigrams if we are at the end of the text, punctuation otherwise. // If showing the "touch again to save" hint, do not replace it. Else,
if (candidateView != null // show the bigrams if we are at the end of the text, punctuation
&& !candidateView.isShowingAddToDictionaryHint()) { // otherwise.
InputConnection ic = mService.getCurrentInputConnection(); if (candidateView != null && !candidateView.isShowingAddToDictionaryHint()) {
if (null == ic || !TextUtils.isEmpty(ic.getTextAfterCursor(1, 0))) { InputConnection ic = mService.getCurrentInputConnection();
if (!mService.isShowingPunctuationList()) { if (null == ic || !TextUtils.isEmpty(ic.getTextAfterCursor(1, 0))) {
mService.setPunctuationSuggestions(); if (!mService.isShowingPunctuationList()) {
} mService.setPunctuationSuggestions();
} else {
mService.mHandler.postUpdateBigramPredictions();
}
} }
} else {
mService.mHandler.postUpdateBigramPredictions();
} }
} }
} }
} }
} }
public void saveWordInHistory(WordComposer word, CharSequence result) { public void saveRecorrectionSuggestion(WordComposer word, CharSequence result) {
if (!USE_LEGACY_RECORRECTION || !mRecorrectionEnabled) return;
if (word.size() <= 1) { if (word.size() <= 1) {
return; return;
} }
@ -144,12 +153,13 @@ public class Recorrection {
// Make a copy of the CharSequence, since it is/could be a mutable CharSequence // Make a copy of the CharSequence, since it is/could be a mutable CharSequence
final String resultCopy = result.toString(); final String resultCopy = result.toString();
WordAlternatives entry = new WordAlternatives(resultCopy, new WordComposer(word)); RecorrectionSuggestionEntries entry = new RecorrectionSuggestionEntries(
mWordHistory.add(entry); resultCopy, new WordComposer(word));
mRecorrectionSuggestionsList.add(entry);
} }
public void clearWordsInHistory() { public void clearWordsInHistory() {
mWordHistory.clear(); mRecorrectionSuggestionsList.clear();
} }
/** /**
@ -160,11 +170,12 @@ public class Recorrection {
*/ */
public boolean applyTypedAlternatives(WordComposer word, Suggest suggest, public boolean applyTypedAlternatives(WordComposer word, Suggest suggest,
KeyboardSwitcher keyboardSwitcher, EditingUtils.SelectedWord touching) { KeyboardSwitcher keyboardSwitcher, EditingUtils.SelectedWord touching) {
if (!USE_LEGACY_RECORRECTION || !mRecorrectionEnabled) return false;
// If we didn't find a match, search for result in typed word history // If we didn't find a match, search for result in typed word history
WordComposer foundWord = null; WordComposer foundWord = null;
WordAlternatives alternatives = null; RecorrectionSuggestionEntries alternatives = null;
// Search old suggestions to suggest re-corrected suggestions. // Search old suggestions to suggest re-corrected suggestions.
for (WordAlternatives entry : mWordHistory) { for (RecorrectionSuggestionEntries entry : mRecorrectionSuggestionsList) {
if (TextUtils.equals(entry.getChosenWord(), touching.mWord)) { if (TextUtils.equals(entry.getChosenWord(), touching.mWord)) {
foundWord = entry.mWordComposer; foundWord = entry.mWordComposer;
alternatives = entry; alternatives = entry;
@ -186,7 +197,7 @@ public class Recorrection {
// Found a match, show suggestions // Found a match, show suggestions
if (foundWord != null || alternatives != null) { if (foundWord != null || alternatives != null) {
if (alternatives == null) { if (alternatives == null) {
alternatives = new WordAlternatives(touching.mWord, foundWord); alternatives = new RecorrectionSuggestionEntries(touching.mWord, foundWord);
} }
showRecorrections(suggest, keyboardSwitcher, alternatives); showRecorrections(suggest, keyboardSwitcher, alternatives);
if (foundWord != null) { if (foundWord != null) {
@ -201,10 +212,10 @@ public class Recorrection {
private void showRecorrections(Suggest suggest, KeyboardSwitcher keyboardSwitcher, private void showRecorrections(Suggest suggest, KeyboardSwitcher keyboardSwitcher,
WordAlternatives alternatives) { RecorrectionSuggestionEntries entries) {
SuggestedWords.Builder builder = alternatives.getAlternatives(suggest, keyboardSwitcher); SuggestedWords.Builder builder = entries.getAlternatives(suggest, keyboardSwitcher);
builder.setTypedWordValid(false).setHasMinimalSuggestion(false); builder.setTypedWordValid(false).setHasMinimalSuggestion(false);
mService.showSuggestions(builder.build(), alternatives.getOriginalWord()); mService.showSuggestions(builder.build(), entries.getOriginalWord());
} }
public void setRecorrectionSuggestions(VoiceProxy voiceProxy, CandidateView candidateView, public void setRecorrectionSuggestions(VoiceProxy voiceProxy, CandidateView candidateView,
@ -212,6 +223,7 @@ public class Recorrection {
boolean hasUncommittedTypedChars, int lastSelectionStart, int lastSelectionEnd, boolean hasUncommittedTypedChars, int lastSelectionStart, int lastSelectionEnd,
String wordSeparators) { String wordSeparators) {
if (!InputConnectionCompatUtils.RECORRECTION_SUPPORTED) return; if (!InputConnectionCompatUtils.RECORRECTION_SUPPORTED) return;
if (!USE_LEGACY_RECORRECTION || !mRecorrectionEnabled) return;
voiceProxy.setShowingVoiceSuggestions(false); voiceProxy.setShowingVoiceSuggestions(false);
if (candidateView != null && candidateView.isShowingAddToDictionaryHint()) { if (candidateView != null && candidateView.isShowingAddToDictionaryHint()) {
return; return;
@ -245,6 +257,7 @@ public class Recorrection {
} }
public void abortRecorrection(boolean force) { public void abortRecorrection(boolean force) {
if (!USE_LEGACY_RECORRECTION) return;
if (force || TextEntryState.isRecorrecting()) { if (force || TextEntryState.isRecorrecting()) {
TextEntryState.onAbortRecorrection(); TextEntryState.onAbortRecorrection();
mService.setCandidatesViewShown(mService.isCandidateStripVisible()); mService.setCandidatesViewShown(mService.isCandidateStripVisible());
@ -252,4 +265,23 @@ public class Recorrection {
mService.clearSuggestions(); mService.clearSuggestions();
} }
} }
public void updateRecorrectionEnabled(Resources res, SharedPreferences prefs) {
// If the option should not be shown, do not read the re-correction preference
// but always use the default setting defined in the resources.
if (res.getBoolean(R.bool.config_enable_show_recorrection_option)) {
mRecorrectionEnabled = prefs.getBoolean(Settings.PREF_RECORRECTION_ENABLED,
res.getBoolean(R.bool.config_default_recorrection_enabled));
} else {
mRecorrectionEnabled = res.getBoolean(R.bool.config_default_recorrection_enabled);
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (!USE_LEGACY_RECORRECTION) return;
if (key.equals(Settings.PREF_RECORRECTION_ENABLED)) {
updateRecorrectionEnabled(mService.getResources(), prefs);
}
}
} }

View file

@ -14,17 +14,20 @@
* the License. * the License.
*/ */
package com.android.inputmethod.latin; package com.android.inputmethod.deprecated.recorrection;
import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.latin.Suggest;
import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.WordComposer;
import android.text.TextUtils; import android.text.TextUtils;
public class WordAlternatives { public class RecorrectionSuggestionEntries {
public final CharSequence mChosenWord; public final CharSequence mChosenWord;
public final WordComposer mWordComposer; public final WordComposer mWordComposer;
public WordAlternatives(CharSequence chosenWord, WordComposer wordComposer) { public RecorrectionSuggestionEntries(CharSequence chosenWord, WordComposer wordComposer) {
mChosenWord = chosenWord; mChosenWord = chosenWord;
mWordComposer = wordComposer; mWordComposer = wordComposer;
} }

View file

@ -143,9 +143,9 @@ public class Key {
* This constructor is being used only for key in mini popup keyboard. * This constructor is being used only for key in mini popup keyboard.
*/ */
public Key(Resources res, Keyboard keyboard, CharSequence popupCharacter, int x, int y, public Key(Resources res, Keyboard keyboard, CharSequence popupCharacter, int x, int y,
int width, int edgeFlags) { int width, int height, int edgeFlags) {
mKeyboard = keyboard; mKeyboard = keyboard;
mHeight = keyboard.getRowHeight() - keyboard.getVerticalGap(); mHeight = height - keyboard.getVerticalGap();
mGap = keyboard.getHorizontalGap(); mGap = keyboard.getHorizontalGap();
mVisualInsetsLeft = mVisualInsetsRight = 0; mVisualInsetsLeft = mVisualInsetsRight = 0;
mWidth = width - mGap; mWidth = width - mGap;

View file

@ -196,9 +196,20 @@ public class KeyboardParser {
final int keyboardHeight = (int)keyboardAttr.getDimension( final int keyboardHeight = (int)keyboardAttr.getDimension(
R.styleable.Keyboard_keyboardHeight, displayHeight / 2); R.styleable.Keyboard_keyboardHeight, displayHeight / 2);
final int maxKeyboardHeight = getDimensionOrFraction(keyboardAttr, final int maxKeyboardHeight = getDimensionOrFraction(keyboardAttr,
R.styleable.Keyboard_maxKeyboardHeight, displayHeight, displayHeight / 2); R.styleable.Keyboard_maxKeyboardHeight, displayHeight, displayHeight / 2);
// Keyboard height will not exceed maxKeyboardHeight. int minKeyboardHeight = getDimensionOrFraction(keyboardAttr,
final int height = Math.min(keyboardHeight, maxKeyboardHeight); R.styleable.Keyboard_minKeyboardHeight, displayHeight, displayHeight / 2);
if (minKeyboardHeight < 0) {
// Specified fraction was negative, so it should be calculated against display
// width.
final int displayWidth = keyboard.getDisplayWidth();
minKeyboardHeight = -getDimensionOrFraction(keyboardAttr,
R.styleable.Keyboard_minKeyboardHeight, displayWidth, displayWidth / 2);
}
// Keyboard height will not exceed maxKeyboardHeight and will not be less than
// minKeyboardHeight.
final int height = Math.max(
Math.min(keyboardHeight, maxKeyboardHeight), minKeyboardHeight);
final int width = keyboard.getDisplayWidth(); final int width = keyboard.getDisplayWidth();
keyboard.setKeyboardHeight(height); keyboard.setKeyboardHeight(height);

View file

@ -153,7 +153,9 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
final KeyboardId id = getKeyboardId(attribute, isSymbols); final KeyboardId id = getKeyboardId(attribute, isSymbols);
makeSymbolsKeyboardIds(id.mMode, attribute); makeSymbolsKeyboardIds(id.mMode, attribute);
mCurrentId = id; mCurrentId = id;
mInputView.setKeyPreviewEnabled(mInputMethodService.getPopupOn()); final Resources res = mInputMethodService.getResources();
mInputView.setKeyPreviewPopupEnabled(Settings.Values.isKeyPreviewPopupEnabled(mPrefs, res),
Settings.Values.getKeyPreviewPopupDismissDelay(mPrefs, res));
setKeyboard(getKeyboard(id)); setKeyboard(getKeyboard(id));
} }
@ -340,8 +342,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
// state when shift key is pressed to go to normal mode. // state when shift key is pressed to go to normal mode.
// On the other hand, on distinct multi touch panel device, turning off the shift locked // On the other hand, on distinct multi touch panel device, turning off the shift locked
// state with shift key pressing is handled by onReleaseShift(). // state with shift key pressing is handled by onReleaseShift().
if ((!hasDistinctMultitouch() || isAccessibilityEnabled()) if (!hasDistinctMultitouch() && !shifted && latinKeyboard.isShiftLocked()) {
&& !shifted && latinKeyboard.isShiftLocked()) {
latinKeyboard.setShiftLocked(false); latinKeyboard.setShiftLocked(false);
} }
if (latinKeyboard.setShifted(shifted)) { if (latinKeyboard.setShifted(shifted)) {
@ -439,9 +440,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
public void onPressShift(boolean withSliding) { public void onPressShift(boolean withSliding) {
if (!isKeyboardAvailable()) if (!isKeyboardAvailable())
return; return;
// If accessibility is enabled, disable momentary shift lock.
if (isAccessibilityEnabled())
return;
ShiftKeyState shiftKeyState = mShiftKeyState; ShiftKeyState shiftKeyState = mShiftKeyState;
if (DEBUG_STATE) if (DEBUG_STATE)
Log.d(TAG, "onPressShift:" Log.d(TAG, "onPressShift:"
@ -478,9 +476,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
public void onReleaseShift(boolean withSliding) { public void onReleaseShift(boolean withSliding) {
if (!isKeyboardAvailable()) if (!isKeyboardAvailable())
return; return;
// If accessibility is enabled, disable momentary shift lock.
if (isAccessibilityEnabled())
return;
ShiftKeyState shiftKeyState = mShiftKeyState; ShiftKeyState shiftKeyState = mShiftKeyState;
if (DEBUG_STATE) if (DEBUG_STATE)
Log.d(TAG, "onReleaseShift:" Log.d(TAG, "onReleaseShift:"
@ -518,9 +513,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
} }
public void onPressSymbol() { public void onPressSymbol() {
// If accessibility is enabled, disable momentary symbol lock.
if (isAccessibilityEnabled())
return;
if (DEBUG_STATE) if (DEBUG_STATE)
Log.d(TAG, "onPressSymbol:" Log.d(TAG, "onPressSymbol:"
+ " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
@ -531,9 +523,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
} }
public void onReleaseSymbol() { public void onReleaseSymbol() {
// If accessibility is enabled, disable momentary symbol lock.
if (isAccessibilityEnabled())
return;
if (DEBUG_STATE) if (DEBUG_STATE)
Log.d(TAG, "onReleaseSymbol:" Log.d(TAG, "onReleaseSymbol:"
+ " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
@ -547,9 +536,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
} }
public void onOtherKeyPressed() { public void onOtherKeyPressed() {
// If accessibility is enabled, disable momentary mode locking.
if (isAccessibilityEnabled())
return;
if (DEBUG_STATE) if (DEBUG_STATE)
Log.d(TAG, "onOtherKeyPressed:" Log.d(TAG, "onOtherKeyPressed:"
+ " keyboard=" + getLatinKeyboard().getKeyboardShiftState() + " keyboard=" + getLatinKeyboard().getKeyboardShiftState()
@ -612,10 +598,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
} }
} }
public boolean isAccessibilityEnabled() {
return mInputView != null && mInputView.isAccessibilityEnabled();
}
public boolean hasDistinctMultitouch() { public boolean hasDistinctMultitouch() {
return mInputView != null && mInputView.hasDistinctMultitouch(); return mInputView != null && mInputView.hasDistinctMultitouch();
} }

View file

@ -58,14 +58,22 @@ import java.util.WeakHashMap;
* A view that renders a virtual {@link Keyboard}. It handles rendering of keys and detecting key * A view that renders a virtual {@link Keyboard}. It handles rendering of keys and detecting key
* presses and touch movements. * presses and touch movements.
* *
* @attr ref R.styleable#KeyboardView_backgroundDimAmount
* @attr ref R.styleable#KeyboardView_colorScheme
* @attr ref R.styleable#KeyboardView_keyBackground * @attr ref R.styleable#KeyboardView_keyBackground
* @attr ref R.styleable#KeyboardView_keyHysteresisDistance
* @attr ref R.styleable#KeyboardView_keyLetterRatio
* @attr ref R.styleable#KeyboardView_keyLetterStyle
* @attr ref R.styleable#KeyboardView_keyPreviewLayout * @attr ref R.styleable#KeyboardView_keyPreviewLayout
* @attr ref R.styleable#KeyboardView_keyPreviewOffset * @attr ref R.styleable#KeyboardView_keyPreviewOffset
* @attr ref R.styleable#KeyboardView_labelTextSize * @attr ref R.styleable#KeyboardView_keyPreviewHeight
* @attr ref R.styleable#KeyboardView_keyTextSize
* @attr ref R.styleable#KeyboardView_keyTextColor * @attr ref R.styleable#KeyboardView_keyTextColor
* @attr ref R.styleable#KeyboardView_keyTextColorDisabled
* @attr ref R.styleable#KeyboardView_labelTextRatio
* @attr ref R.styleable#KeyboardView_verticalCorrection * @attr ref R.styleable#KeyboardView_verticalCorrection
* @attr ref R.styleable#KeyboardView_popupLayout * @attr ref R.styleable#KeyboardView_popupLayout
* @attr ref R.styleable#KeyboardView_shadowColor
* @attr ref R.styleable#KeyboardView_shadowRadius
*/ */
public class KeyboardView extends View implements PointerTracker.UIProxy { public class KeyboardView extends View implements PointerTracker.UIProxy {
private static final String TAG = KeyboardView.class.getSimpleName(); private static final String TAG = KeyboardView.class.getSimpleName();
@ -86,33 +94,36 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
private static final int HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL = -1; private static final int HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL = -1;
// XML attribute // XML attribute
private int mKeyLetterSize; private final float mKeyLetterRatio;
private int mKeyTextColor; private final int mKeyTextColor;
private int mKeyTextColorDisabled; private final int mKeyTextColorDisabled;
private Typeface mKeyLetterStyle = Typeface.DEFAULT; private final Typeface mKeyLetterStyle;
private int mLabelTextSize; private final float mLabelTextRatio;
private int mColorScheme = COLOR_SCHEME_WHITE; private final int mColorScheme;
private int mShadowColor; private final int mShadowColor;
private float mShadowRadius; private final float mShadowRadius;
private Drawable mKeyBackground; private final Drawable mKeyBackground;
private float mBackgroundDimAmount; private final float mBackgroundDimAmount;
private float mKeyHysteresisDistance; private final float mKeyHysteresisDistance;
private float mVerticalCorrection; private final float mVerticalCorrection;
private int mPreviewOffset; private final int mPreviewOffset;
private int mPreviewHeight; private final int mPreviewHeight;
private int mPopupLayout; private final int mPopupLayout;
// Main keyboard // Main keyboard
private Keyboard mKeyboard; private Keyboard mKeyboard;
private int mKeyLetterSize;
private int mLabelTextSize;
// Key preview // Key preview
private boolean mInForeground; private boolean mInForeground;
private TextView mPreviewText; private TextView mPreviewText;
private int mPreviewTextSizeLarge; private float mPreviewTextRatio;
private boolean mShowKeyPreview = true; private int mPreviewTextSize;
private int mKeyPreviewDisplayedY; private boolean mShowKeyPreviewPopup = true;
private int mKeyPreviewPopupDisplayedY;
private final int mDelayBeforePreview; private final int mDelayBeforePreview;
private final int mDelayAfterPreview; private int mDelayAfterPreview;
private ViewGroup mPreviewPlacer; private ViewGroup mPreviewPlacer;
private final int[] mCoordinates = new int[2]; private final int[] mCoordinates = new int[2];
@ -134,9 +145,6 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
private int mOldPointerCount = 1; private int mOldPointerCount = 1;
private int mOldKeyIndex; private int mOldKeyIndex;
// Accessibility
private boolean mIsAccessibilityEnabled;
protected KeyDetector mKeyDetector = new KeyDetector(); protected KeyDetector mKeyDetector = new KeyDetector();
// Swipe gesture detector // Swipe gesture detector
@ -303,74 +311,36 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
final TypedArray a = context.obtainStyledAttributes( final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.KeyboardView, defStyle, R.style.KeyboardView); attrs, R.styleable.KeyboardView, defStyle, R.style.KeyboardView);
int previewLayout = 0;
int keyTextSize = 0;
int n = a.getIndexCount(); mKeyBackground = a.getDrawable(R.styleable.KeyboardView_keyBackground);
mKeyHysteresisDistance = a.getDimensionPixelOffset(
for (int i = 0; i < n; i++) { R.styleable.KeyboardView_keyHysteresisDistance, 0);
int attr = a.getIndex(i); mVerticalCorrection = a.getDimensionPixelOffset(
R.styleable.KeyboardView_verticalCorrection, 0);
switch (attr) { final int previewLayout = a.getResourceId(R.styleable.KeyboardView_keyPreviewLayout, 0);
case R.styleable.KeyboardView_keyBackground: mPreviewOffset = a.getDimensionPixelOffset(R.styleable.KeyboardView_keyPreviewOffset, 0);
mKeyBackground = a.getDrawable(attr); mPreviewHeight = a.getDimensionPixelSize(R.styleable.KeyboardView_keyPreviewHeight, 80);
break; mKeyLetterRatio = getRatio(a, R.styleable.KeyboardView_keyLetterRatio);
case R.styleable.KeyboardView_keyHysteresisDistance: mKeyTextColor = a.getColor(R.styleable.KeyboardView_keyTextColor, 0xFF000000);
mKeyHysteresisDistance = a.getDimensionPixelOffset(attr, 0); mKeyTextColorDisabled = a.getColor(
break; R.styleable.KeyboardView_keyTextColorDisabled, 0xFF000000);
case R.styleable.KeyboardView_verticalCorrection: mLabelTextRatio = getRatio(a, R.styleable.KeyboardView_labelTextRatio);
mVerticalCorrection = a.getDimensionPixelOffset(attr, 0); mPopupLayout = a.getResourceId(R.styleable.KeyboardView_popupLayout, 0);
break; mShadowColor = a.getColor(R.styleable.KeyboardView_shadowColor, 0);
case R.styleable.KeyboardView_keyPreviewLayout: mShadowRadius = a.getFloat(R.styleable.KeyboardView_shadowRadius, 0f);
previewLayout = a.getResourceId(attr, 0); // TODO: Use Theme (android.R.styleable.Theme_backgroundDimAmount)
break; mBackgroundDimAmount = a.getFloat(R.styleable.KeyboardView_backgroundDimAmount, 0.5f);
case R.styleable.KeyboardView_keyPreviewOffset: mKeyLetterStyle = Typeface.defaultFromStyle(
mPreviewOffset = a.getDimensionPixelOffset(attr, 0); a.getInt(R.styleable.KeyboardView_keyLetterStyle, Typeface.NORMAL));
break; mColorScheme = a.getInt(R.styleable.KeyboardView_colorScheme, COLOR_SCHEME_WHITE);
case R.styleable.KeyboardView_keyPreviewHeight:
mPreviewHeight = a.getDimensionPixelSize(attr, 80);
break;
case R.styleable.KeyboardView_keyLetterSize:
mKeyLetterSize = a.getDimensionPixelSize(attr, 18);
break;
case R.styleable.KeyboardView_keyTextColor:
mKeyTextColor = a.getColor(attr, 0xFF000000);
break;
case R.styleable.KeyboardView_keyTextColorDisabled:
mKeyTextColorDisabled = a.getColor(attr, 0xFF000000);
break;
case R.styleable.KeyboardView_labelTextSize:
mLabelTextSize = a.getDimensionPixelSize(attr, 14);
break;
case R.styleable.KeyboardView_popupLayout:
mPopupLayout = a.getResourceId(attr, 0);
break;
case R.styleable.KeyboardView_shadowColor:
mShadowColor = a.getColor(attr, 0);
break;
case R.styleable.KeyboardView_shadowRadius:
mShadowRadius = a.getFloat(attr, 0f);
break;
// TODO: Use Theme (android.R.styleable.Theme_backgroundDimAmount)
case R.styleable.KeyboardView_backgroundDimAmount:
mBackgroundDimAmount = a.getFloat(attr, 0.5f);
break;
case R.styleable.KeyboardView_keyLetterStyle:
mKeyLetterStyle = Typeface.defaultFromStyle(a.getInt(attr, Typeface.NORMAL));
break;
case R.styleable.KeyboardView_colorScheme:
mColorScheme = a.getInt(attr, COLOR_SCHEME_WHITE);
break;
}
}
final Resources res = getResources(); final Resources res = getResources();
if (previewLayout != 0) { if (previewLayout != 0) {
mPreviewText = (TextView) LayoutInflater.from(context).inflate(previewLayout, null); mPreviewText = (TextView) LayoutInflater.from(context).inflate(previewLayout, null);
mPreviewTextSizeLarge = (int) res.getDimension(R.dimen.key_preview_text_size_large); mPreviewTextRatio = getRatio(res, R.fraction.key_preview_text_ratio);
} else { } else {
mShowKeyPreview = false; mShowKeyPreviewPopup = false;
} }
mDelayBeforePreview = res.getInteger(R.integer.config_delay_before_preview); mDelayBeforePreview = res.getInteger(R.integer.config_delay_before_preview);
mDelayAfterPreview = res.getInteger(R.integer.config_delay_after_preview); mDelayAfterPreview = res.getInteger(R.integer.config_delay_after_preview);
@ -379,7 +349,6 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
mPaint = new Paint(); mPaint = new Paint();
mPaint.setAntiAlias(true); mPaint.setAntiAlias(true);
mPaint.setTextSize(keyTextSize);
mPaint.setTextAlign(Align.CENTER); mPaint.setTextAlign(Align.CENTER);
mPaint.setAlpha(255); mPaint.setAlpha(255);
@ -463,6 +432,16 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval);
} }
// Read fraction value in TypedArray as float.
private static float getRatio(TypedArray a, int index) {
return a.getFraction(index, 1000, 1000, 1) / 1000.0f;
}
// Read fraction value in resource as float.
private static float getRatio(Resources res, int id) {
return res.getFraction(id, 1000, 1000) / 1000.0f;
}
public void startIgnoringDoubleTap() { public void startIgnoringDoubleTap() {
if (ENABLE_CAPSLOCK_BY_DOUBLETAP) if (ENABLE_CAPSLOCK_BY_DOUBLETAP)
mHandler.startIgnoringDoubleTap(); mHandler.startIgnoringDoubleTap();
@ -509,6 +488,10 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
invalidateAllKeys(); invalidateAllKeys();
mKeyDetector.setProximityThreshold(keyboard.getMostCommonKeyWidth()); mKeyDetector.setProximityThreshold(keyboard.getMostCommonKeyWidth());
mPopupPanelCache.clear(); mPopupPanelCache.clear();
final int keyHeight = keyboard.getRowHeight() - keyboard.getVerticalGap();
mKeyLetterSize = (int)(keyHeight * mKeyLetterRatio);
mLabelTextSize = (int)(keyHeight * mLabelTextRatio);
mPreviewTextSize = (int)(keyHeight * mPreviewTextRatio);
} }
/** /**
@ -530,44 +513,24 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
} }
/** /**
* Enables or disables accessibility. * Enables or disables the key feedback popup. This is a popup that shows a magnified
* @param accessibilityEnabled whether or not to enable accessibility
*/
public void setAccessibilityEnabled(boolean accessibilityEnabled) {
mIsAccessibilityEnabled = accessibilityEnabled;
// Propagate this change to all existing pointer trackers.
for (PointerTracker tracker : mPointerTrackers) {
tracker.setAccessibilityEnabled(accessibilityEnabled);
}
}
/**
* Returns whether the device has accessibility enabled.
* @return true if the device has accessibility enabled.
*/
@Override
public boolean isAccessibilityEnabled() {
return mIsAccessibilityEnabled;
}
/**
* Enables or disables the key feedback preview. This is a preview that shows a magnified
* version of the depressed key. By default the preview is enabled. * version of the depressed key. By default the preview is enabled.
* @param previewEnabled whether or not to enable the key feedback preview * @param previewEnabled whether or not to enable the key feedback preview
* @see #isKeyPreviewEnabled() * @param delay the delay after which the preview is dismissed
* @see #isKeyPreviewPopupEnabled()
*/ */
public void setKeyPreviewEnabled(boolean previewEnabled) { public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) {
mShowKeyPreview = previewEnabled; mShowKeyPreviewPopup = previewEnabled;
mDelayAfterPreview = delay;
} }
/** /**
* Returns the enabled state of the key feedback preview * Returns the enabled state of the key feedback preview
* @return whether or not the key feedback preview is enabled * @return whether or not the key feedback preview is enabled
* @see #setKeyPreviewEnabled(boolean) * @see #setKeyPreviewPopupEnabled(boolean, int)
*/ */
public boolean isKeyPreviewEnabled() { public boolean isKeyPreviewPopupEnabled() {
return mShowKeyPreview; return mShowKeyPreviewPopup;
} }
public int getColorScheme() { public int getColorScheme() {
@ -890,7 +853,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
@Override @Override
public void showKeyPreview(int keyIndex, PointerTracker tracker) { public void showKeyPreview(int keyIndex, PointerTracker tracker) {
if (mShowKeyPreview) { if (mShowKeyPreviewPopup) {
mHandler.showKeyPreview(mDelayBeforePreview, keyIndex, tracker); mHandler.showKeyPreview(mDelayBeforePreview, keyIndex, tracker);
} else if (mKeyboard.needSpacebarPreview(keyIndex)) { } else if (mKeyboard.needSpacebarPreview(keyIndex)) {
// Show key preview (in this case, slide language switcher) without any delay. // Show key preview (in this case, slide language switcher) without any delay.
@ -900,7 +863,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
@Override @Override
public void dismissKeyPreview(PointerTracker tracker) { public void dismissKeyPreview(PointerTracker tracker) {
if (mShowKeyPreview) { if (mShowKeyPreviewPopup) {
mHandler.cancelShowKeyPreview(tracker); mHandler.cancelShowKeyPreview(tracker);
mHandler.dismissKeyPreview(mDelayAfterPreview, tracker); mHandler.dismissKeyPreview(mDelayAfterPreview, tracker);
} else if (mKeyboard.needSpacebarPreview(KeyDetector.NOT_A_KEY)) { } else if (mKeyboard.needSpacebarPreview(KeyDetector.NOT_A_KEY)) {
@ -963,7 +926,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyLetterSize); previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyLetterSize);
previewText.setTypeface(Typeface.DEFAULT_BOLD); previewText.setTypeface(Typeface.DEFAULT_BOLD);
} else { } else {
previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge); previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSize);
previewText.setTypeface(mKeyLetterStyle); previewText.setTypeface(mKeyLetterStyle);
} }
} else { } else {
@ -985,7 +948,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
final int previewX = keyDrawX - (previewWidth - keyDrawWidth) / 2 + mCoordinates[0]; final int previewX = keyDrawX - (previewWidth - keyDrawWidth) / 2 + mCoordinates[0];
final int previewY = key.mY - previewHeight + mCoordinates[1] + mPreviewOffset; final int previewY = key.mY - previewHeight + mCoordinates[1] + mPreviewOffset;
// Record key preview position to display mini-keyboard later at the same position // Record key preview position to display mini-keyboard later at the same position
mKeyPreviewDisplayedY = previewY; mKeyPreviewPopupDisplayedY = previewY;
// Place the key preview. // Place the key preview.
// TODO: Adjust position of key previews which touch screen edges // TODO: Adjust position of key previews which touch screen edges
@ -1103,7 +1066,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
}); });
final Keyboard keyboard = new MiniKeyboardBuilder(this, mKeyboard.getPopupKeyboardResId(), final Keyboard keyboard = new MiniKeyboardBuilder(this, mKeyboard.getPopupKeyboardResId(),
parentKey).build(); parentKey, mKeyboard).build();
miniKeyboardView.setKeyboard(keyboard); miniKeyboardView.setKeyboard(keyboard);
container.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), container.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
@ -1136,7 +1099,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
mPopupWindow.setClippingEnabled(false); mPopupWindow.setClippingEnabled(false);
} }
mPopupMiniKeyboardPanel = popupPanel; mPopupMiniKeyboardPanel = popupPanel;
popupPanel.showPanel(this, parentKey, tracker, mKeyPreviewDisplayedY, mPopupWindow); popupPanel.showPanel(this, parentKey, tracker, mKeyPreviewPopupDisplayedY, mPopupWindow);
invalidateAllKeys(); invalidateAllKeys();
return true; return true;
@ -1182,19 +1145,16 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
// TODO: cleanup this code into a multi-touch to single-touch event converter class? // TODO: cleanup this code into a multi-touch to single-touch event converter class?
// If the device does not have distinct multi-touch support panel, ignore all multi-touch // If the device does not have distinct multi-touch support panel, ignore all multi-touch
// events except a transition from/to single-touch. // events except a transition from/to single-touch.
if ((!mHasDistinctMultitouch || mIsAccessibilityEnabled) if (!mHasDistinctMultitouch && pointerCount > 1 && oldPointerCount > 1) {
&& pointerCount > 1 && oldPointerCount > 1) {
return true; return true;
} }
// Track the last few movements to look for spurious swipes. // Track the last few movements to look for spurious swipes.
mSwipeTracker.addMovement(me); mSwipeTracker.addMovement(me);
// Gesture detector must be enabled only when mini-keyboard is not on the screen and // Gesture detector must be enabled only when mini-keyboard is not on the screen.
// accessibility is not enabled. if (mPopupMiniKeyboardPanel == null && mGestureDetector != null
// TODO: Reconcile gesture detection and accessibility features. && mGestureDetector.onTouchEvent(me)) {
if (mPopupMiniKeyboardPanel == null && !mIsAccessibilityEnabled
&& mGestureDetector != null && mGestureDetector.onTouchEvent(me)) {
dismissAllKeyPreviews(); dismissAllKeyPreviews();
mHandler.cancelKeyTimers(); mHandler.cancelKeyTimers();
return true; return true;
@ -1225,7 +1185,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
// TODO: cleanup this code into a multi-touch to single-touch event converter class? // TODO: cleanup this code into a multi-touch to single-touch event converter class?
// Translate mutli-touch event to single-touch events on the device that has no distinct // Translate mutli-touch event to single-touch events on the device that has no distinct
// multi-touch panel. // multi-touch panel.
if (!mHasDistinctMultitouch || mIsAccessibilityEnabled) { if (!mHasDistinctMultitouch) {
// Use only main (id=0) pointer tracker. // Use only main (id=0) pointer tracker.
PointerTracker tracker = getPointerTracker(0); PointerTracker tracker = getPointerTracker(0);
if (pointerCount == 1 && oldPointerCount == 2) { if (pointerCount == 1 && oldPointerCount == 2) {

View file

@ -55,14 +55,14 @@ public class LatinKeyboardView extends KeyboardView {
} }
@Override @Override
public void setKeyPreviewEnabled(boolean previewEnabled) { public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) {
LatinKeyboard latinKeyboard = getLatinKeyboard(); LatinKeyboard latinKeyboard = getLatinKeyboard();
if (latinKeyboard != null if (latinKeyboard != null
&& (latinKeyboard.isPhoneKeyboard() || latinKeyboard.isNumberKeyboard())) { && (latinKeyboard.isPhoneKeyboard() || latinKeyboard.isNumberKeyboard())) {
// Phone and number keyboard never shows popup preview (except language switch). // Phone and number keyboard never shows popup preview (except language switch).
super.setKeyPreviewEnabled(false); super.setKeyPreviewPopupEnabled(false, delay);
} else { } else {
super.setKeyPreviewEnabled(previewEnabled); super.setKeyPreviewPopupEnabled(previewEnabled, delay);
} }
} }
@ -140,10 +140,6 @@ public class LatinKeyboardView extends KeyboardView {
// If device has distinct multi touch panel, there is no need to check sudden jump. // If device has distinct multi touch panel, there is no need to check sudden jump.
if (hasDistinctMultitouch()) if (hasDistinctMultitouch())
return false; return false;
// If accessibiliy is enabled, stop looking for sudden jumps because it interferes
// with touch exploration of the keyboard.
if (isAccessibilityEnabled())
return false;
final int action = me.getAction(); final int action = me.getAction();
final int x = (int) me.getX(); final int x = (int) me.getX();
final int y = (int) me.getY(); final int y = (int) me.getY();
@ -177,7 +173,8 @@ public class LatinKeyboardView extends KeyboardView {
if (!mDroppingEvents) { if (!mDroppingEvents) {
mDroppingEvents = true; mDroppingEvents = true;
// Send an up event // Send an up event
MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(), MotionEvent translated = MotionEvent.obtain(
me.getEventTime(), me.getEventTime(),
MotionEvent.ACTION_UP, MotionEvent.ACTION_UP,
mLastX, mLastY, me.getMetaState()); mLastX, mLastY, me.getMetaState());
super.onTouchEvent(translated); super.onTouchEvent(translated);

View file

@ -181,7 +181,8 @@ public class MiniKeyboardBuilder {
} }
} }
public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key parentKey) { public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key parentKey,
Keyboard parentKeyboard) {
final Context context = view.getContext(); final Context context = view.getContext();
mRes = context.getResources(); mRes = context.getResources();
final MiniKeyboard keyboard = new MiniKeyboard(context, layoutTemplateResId, null); final MiniKeyboard keyboard = new MiniKeyboard(context, layoutTemplateResId, null);
@ -191,12 +192,13 @@ public class MiniKeyboardBuilder {
final int keyWidth = getMaxKeyWidth(view, mPopupCharacters, keyboard.getKeyWidth()); final int keyWidth = getMaxKeyWidth(view, mPopupCharacters, keyboard.getKeyWidth());
final MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams( final MiniKeyboardLayoutParams params = new MiniKeyboardLayoutParams(
mPopupCharacters.length, parentKey.mMaxPopupColumn, mPopupCharacters.length, parentKey.mMaxPopupColumn,
keyWidth, keyboard.getRowHeight(), keyWidth, parentKeyboard.getRowHeight(),
parentKey.mX + (parentKey.mWidth + parentKey.mGap) / 2 - keyWidth / 2, parentKey.mX + (parentKey.mWidth + parentKey.mGap) / 2 - keyWidth / 2,
view.getMeasuredWidth()); view.getMeasuredWidth());
mParams = params; mParams = params;
keyboard.setHeight(params.mNumRows * params.mRowHeight - keyboard.getVerticalGap()); keyboard.setRowHeight(params.mRowHeight);
keyboard.setHeight(params.mNumRows * params.mRowHeight);
keyboard.setMinWidth(params.mNumColumns * params.mKeyWidth); keyboard.setMinWidth(params.mNumColumns * params.mKeyWidth);
keyboard.setDefaultCoordX(params.getDefaultKeyCoordX() + params.mKeyWidth / 2); keyboard.setDefaultCoordX(params.getDefaultKeyCoordX() + params.mKeyWidth / 2);
} }
@ -235,7 +237,7 @@ public class MiniKeyboardBuilder {
final CharSequence label = mPopupCharacters[n]; final CharSequence label = mPopupCharacters[n];
final int row = n / params.mNumColumns; final int row = n / params.mNumColumns;
final Key key = new Key(mRes, keyboard, label, params.getX(n, row), params.getY(row), final Key key = new Key(mRes, keyboard, label, params.getX(n, row), params.getY(row),
params.mKeyWidth, params.getRowFlags(row)); params.mKeyWidth, params.mRowHeight, params.getRowFlags(row));
keys.add(key); keys.add(key);
} }
return keyboard; return keyboard;

View file

@ -41,7 +41,6 @@ public class PointerTracker {
public void showKeyPreview(int keyIndex, PointerTracker tracker); public void showKeyPreview(int keyIndex, PointerTracker tracker);
public void dismissKeyPreview(PointerTracker tracker); public void dismissKeyPreview(PointerTracker tracker);
public boolean hasDistinctMultitouch(); public boolean hasDistinctMultitouch();
public boolean isAccessibilityEnabled();
} }
public final int mPointerId; public final int mPointerId;
@ -70,9 +69,6 @@ public class PointerTracker {
private final PointerTrackerKeyState mKeyState; private final PointerTrackerKeyState mKeyState;
// true if accessibility is enabled in the parent keyboard
private boolean mIsAccessibilityEnabled;
// true if keyboard layout has been changed. // true if keyboard layout has been changed.
private boolean mKeyboardLayoutHasBeenChanged; private boolean mKeyboardLayoutHasBeenChanged;
@ -124,7 +120,6 @@ public class PointerTracker {
mKeyDetector = keyDetector; mKeyDetector = keyDetector;
mKeyboardSwitcher = KeyboardSwitcher.getInstance(); mKeyboardSwitcher = KeyboardSwitcher.getInstance();
mKeyState = new PointerTrackerKeyState(keyDetector); mKeyState = new PointerTrackerKeyState(keyDetector);
mIsAccessibilityEnabled = proxy.isAccessibilityEnabled();
mHasDistinctMultitouch = proxy.hasDistinctMultitouch(); mHasDistinctMultitouch = proxy.hasDistinctMultitouch();
final Resources res = mKeyboardView.getResources(); final Resources res = mKeyboardView.getResources();
mConfigSlidingKeyInputEnabled = res.getBoolean(R.bool.config_sliding_key_input_enabled); mConfigSlidingKeyInputEnabled = res.getBoolean(R.bool.config_sliding_key_input_enabled);
@ -143,10 +138,6 @@ public class PointerTracker {
mListener = listener; mListener = listener;
} }
public void setAccessibilityEnabled(boolean accessibilityEnabled) {
mIsAccessibilityEnabled = accessibilityEnabled;
}
// Returns true if keyboard has been changed by this callback. // Returns true if keyboard has been changed by this callback.
private boolean callListenerOnPressAndCheckKeyboardLayoutChange(Key key, boolean withSliding) { private boolean callListenerOnPressAndCheckKeyboardLayoutChange(Key key, boolean withSliding) {
final boolean ignoreModifierKey = mIgnoreModifierKey && isModifierCode(key.mCode); final boolean ignoreModifierKey = mIgnoreModifierKey && isModifierCode(key.mCode);
@ -342,10 +333,9 @@ public class PointerTracker {
private void onDownEventInternal(int x, int y, long eventTime) { private void onDownEventInternal(int x, int y, long eventTime) {
int keyIndex = mKeyState.onDownKey(x, y, eventTime); int keyIndex = mKeyState.onDownKey(x, y, eventTime);
// Sliding key is allowed when 1) enabled by configuration, 2) this pointer starts sliding // Sliding key is allowed when 1) enabled by configuration, 2) this pointer starts sliding
// from modifier key, 3) this pointer is on mini-keyboard, or 4) accessibility is enabled. // from modifier key, or 3) this pointer is on mini-keyboard.
mIsAllowedSlidingKeyInput = mConfigSlidingKeyInputEnabled || isModifierInternal(keyIndex) mIsAllowedSlidingKeyInput = mConfigSlidingKeyInputEnabled || isModifierInternal(keyIndex)
|| mKeyDetector instanceof MiniKeyboardKeyDetector || mKeyDetector instanceof MiniKeyboardKeyDetector;
|| mIsAccessibilityEnabled;
mKeyboardLayoutHasBeenChanged = false; mKeyboardLayoutHasBeenChanged = false;
mKeyAlreadyProcessed = false; mKeyAlreadyProcessed = false;
mIsRepeatableKey = false; mIsRepeatableKey = false;
@ -575,10 +565,8 @@ public class PointerTracker {
} }
private void startRepeatKey(int keyIndex) { private void startRepeatKey(int keyIndex) {
// Accessibility disables key repeat because users may need to pause on a key to hear
// its spoken description.
final Key key = getKey(keyIndex); final Key key = getKey(keyIndex);
if (key != null && key.mRepeatable && !mIsAccessibilityEnabled) { if (key != null && key.mRepeatable) {
dismissKeyPreview(); dismissKeyPreview();
onRepeatKey(keyIndex); onRepeatKey(keyIndex);
mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this); mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this);
@ -620,14 +608,11 @@ public class PointerTracker {
} }
} }
// The modifier key, such as shift key, should not show its key preview. If accessibility is // The modifier key, such as shift key, should not show its key preview.
// turned on, the modifier key should show its key preview.
private boolean isKeyPreviewNotRequired(int keyIndex) { private boolean isKeyPreviewNotRequired(int keyIndex) {
final Key key = getKey(keyIndex); final Key key = getKey(keyIndex);
if (!key.mEnabled) if (!key.mEnabled)
return true; return true;
if (mIsAccessibilityEnabled)
return false;
// Such as spacebar sliding language switch. // Such as spacebar sliding language switch.
if (mKeyboard.needSpacebarPreview(keyIndex)) if (mKeyboard.needSpacebarPreview(keyIndex))
return false; return false;
@ -647,11 +632,6 @@ public class PointerTracker {
} }
private void startLongPressTimer(int keyIndex) { private void startLongPressTimer(int keyIndex) {
// Accessibility disables long press because users are likely to need to pause on a key
// for an unspecified duration in order to hear the key's spoken description.
if (mIsAccessibilityEnabled) {
return;
}
Key key = getKey(keyIndex); Key key = getKey(keyIndex);
if (!key.mEnabled) if (!key.mEnabled)
return; return;

View file

@ -55,13 +55,14 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel {
R.dimen.mini_keyboard_slide_allowance)); R.dimen.mini_keyboard_slide_allowance));
// Remove gesture detector on mini-keyboard // Remove gesture detector on mini-keyboard
mGestureDetector = null; mGestureDetector = null;
setKeyPreviewEnabled(false); setKeyPreviewPopupEnabled(false, 0);
} }
@Override @Override
public void setKeyPreviewEnabled(boolean previewEnabled) { public void setKeyPreviewPopupEnabled(boolean previewEnabled, int delay) {
// Mini keyboard needs no pop-up key preview displayed. // Mini keyboard needs no pop-up key preview displayed, so we pass always false with a
super.setKeyPreviewEnabled(false); // delay of 0. The delay does not matter actually since the popup is not shown anyway.
super.setKeyPreviewPopupEnabled(false, 0);
} }
@Override @Override
@ -82,8 +83,8 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel {
- (container.getMeasuredHeight() - container.getPaddingBottom()) - (container.getMeasuredHeight() - container.getPaddingBottom())
+ parentKeyboardView.getPaddingTop() + mCoordinates[1]; + parentKeyboardView.getPaddingTop() + mCoordinates[1];
final int x = miniKeyboardX; final int x = miniKeyboardX;
final int y = parentKeyboardView.isKeyPreviewEnabled() && miniKeyboard.isOneRowKeyboard() final int y = parentKeyboardView.isKeyPreviewPopupEnabled() &&
? keyPreviewY : miniKeyboardY; miniKeyboard.isOneRowKeyboard() ? keyPreviewY : miniKeyboardY;
if (miniKeyboard.setShifted(parentKeyboard.isShiftedOrShiftLocked())) { if (miniKeyboard.setShifted(parentKeyboard.isShiftedOrShiftLocked())) {
invalidateAllKeys(); invalidateAllKeys();

View file

@ -1,211 +0,0 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.inputmethod.latin;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardSwitcher;
import java.util.HashMap;
import java.util.Map;
/**
* Utility functions for accessibility support.
*/
public class AccessibilityUtils {
/** Shared singleton instance. */
private static final AccessibilityUtils sInstance = new AccessibilityUtils();
private /* final */ LatinIME mService;
private /* final */ AccessibilityManager mAccessibilityManager;
private /* final */ Map<Integer, CharSequence> mDescriptions;
/**
* Returns a shared instance of AccessibilityUtils.
*
* @return A shared instance of AccessibilityUtils.
*/
public static AccessibilityUtils getInstance() {
return sInstance;
}
/**
* Initializes (or re-initializes) the shared instance of AccessibilityUtils
* with the specified parent service and preferences.
*
* @param service The parent input method service.
* @param prefs The parent preferences.
*/
public static void init(LatinIME service, SharedPreferences prefs) {
sInstance.initialize(service, prefs);
}
private AccessibilityUtils() {
// This class is not publicly instantiable.
}
/**
* Initializes (or re-initializes) with the specified parent service and
* preferences.
*
* @param service The parent input method service.
* @param prefs The parent preferences.
*/
private void initialize(LatinIME service, SharedPreferences prefs) {
mService = service;
mAccessibilityManager = (AccessibilityManager) service.getSystemService(
Context.ACCESSIBILITY_SERVICE);
mDescriptions = null;
}
/**
* Returns true if accessibility is enabled.
*
* @return {@code true} if accessibility is enabled.
*/
public boolean isAccessibilityEnabled() {
return mAccessibilityManager.isEnabled();
}
/**
* Speaks a key's action after it has been released. Does not speak letter
* keys since typed keys are already spoken aloud by TalkBack.
* <p>
* No-op if accessibility is not enabled.
* </p>
*
* @param primaryCode The primary code of the released key.
* @param switcher The input method's {@link KeyboardSwitcher}.
*/
public void onRelease(int primaryCode, KeyboardSwitcher switcher) {
if (!isAccessibilityEnabled()) {
return;
}
int resId = -1;
switch (primaryCode) {
case Keyboard.CODE_SHIFT: {
if (switcher.isShiftedOrShiftLocked()) {
resId = R.string.description_shift_on;
} else {
resId = R.string.description_shift_off;
}
break;
}
case Keyboard.CODE_SWITCH_ALPHA_SYMBOL: {
if (switcher.isAlphabetMode()) {
resId = R.string.description_symbols_off;
} else {
resId = R.string.description_symbols_on;
}
break;
}
}
if (resId >= 0) {
speakDescription(mService.getResources().getText(resId));
}
}
/**
* Speaks a key's description for accessibility. If a key has an explicit
* description defined in keycodes.xml, that will be used. Otherwise, if the
* key is a Unicode character, then its character will be used.
* <p>
* No-op if accessibility is not enabled.
* </p>
*
* @param primaryCode The primary code of the pressed key.
* @param switcher The input method's {@link KeyboardSwitcher}.
*/
public void onPress(int primaryCode, KeyboardSwitcher switcher) {
if (!isAccessibilityEnabled()) {
return;
}
// TODO Use the current keyboard state to read "Switch to symbols"
// instead of just "Symbols" (and similar for shift key).
CharSequence description = describeKey(primaryCode);
if (description == null && Character.isDefined((char) primaryCode)) {
description = Character.toString((char) primaryCode);
}
if (description != null) {
speakDescription(description);
}
}
/**
* Returns a text description for a given key code. If the key does not have
* an explicit description, returns <code>null</code>.
*
* @param keyCode An integer key code.
* @return A {@link CharSequence} describing the key or <code>null</code> if
* no description is available.
*/
private CharSequence describeKey(int keyCode) {
// If not loaded yet, load key descriptions from XML file.
if (mDescriptions == null) {
mDescriptions = loadDescriptions();
}
return mDescriptions.get(keyCode);
}
/**
* Loads key descriptions from resources.
*/
private Map<Integer, CharSequence> loadDescriptions() {
final Map<Integer, CharSequence> descriptions = new HashMap<Integer, CharSequence>();
final TypedArray array = mService.getResources().obtainTypedArray(R.array.key_descriptions);
// Key descriptions are stored as a key code followed by a string.
for (int i = 0; i < array.length() - 1; i += 2) {
int code = array.getInteger(i, 0);
CharSequence desc = array.getText(i + 1);
descriptions.put(code, desc);
}
array.recycle();
return descriptions;
}
/**
* Sends a character sequence to be read aloud.
*
* @param description The {@link CharSequence} to be read aloud.
*/
private void speakDescription(CharSequence description) {
// TODO We need to add an AccessibilityEvent type for IMEs.
final AccessibilityEvent event = AccessibilityEvent.obtain(
AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
event.setPackageName(mService.getPackageName());
event.setClassName(getClass().getName());
event.setAddedCount(description.length());
event.getText().add(description);
mAccessibilityManager.sendAccessibilityEvent(event);
}
}

View file

@ -142,6 +142,25 @@ public class DictionaryFactory {
return hasDictionary; return hasDictionary;
} }
// TODO: Do not use the size of the dictionary as an unique dictionary ID.
public static Long getDictionaryId(Context context, Locale locale) {
final Resources res = context.getResources();
final Locale saveLocale = Utils.setSystemLocale(res, locale);
final int resourceId = Utils.getMainDictionaryResourceId(res);
final AssetFileDescriptor afd = res.openRawResourceFd(resourceId);
final Long size = (afd != null && afd.getLength() > PLACEHOLDER_LENGTH)
? afd.getLength()
: null;
try {
if (null != afd) afd.close();
} catch (java.io.IOException e) {
}
Utils.setSystemLocale(res, saveLocale);
return size;
}
// TODO: Find the Right Way to find out whether the resource is a placeholder or not. // TODO: Find the Right Way to find out whether the resource is a placeholder or not.
// Suggestion : strip the locale, open the placeholder file and store its offset. // Suggestion : strip the locale, open the placeholder file and store its offset.
// Upon opening the file, if it's the same offset, then it's the placeholder. // Upon opening the file, if it's the same offset, then it's the placeholder.

View file

@ -22,9 +22,9 @@ import com.android.inputmethod.compat.InputConnectionCompatUtils;
import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
import com.android.inputmethod.compat.InputMethodServiceCompatWrapper; import com.android.inputmethod.compat.InputMethodServiceCompatWrapper;
import com.android.inputmethod.compat.InputTypeCompatUtils; import com.android.inputmethod.compat.InputTypeCompatUtils;
import com.android.inputmethod.compat.VibratorCompatWrapper;
import com.android.inputmethod.deprecated.LanguageSwitcherProxy; import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
import com.android.inputmethod.deprecated.VoiceProxy; import com.android.inputmethod.deprecated.VoiceProxy;
import com.android.inputmethod.deprecated.recorrection.Recorrection;
import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardActionListener; import com.android.inputmethod.keyboard.KeyboardActionListener;
import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.keyboard.KeyboardSwitcher;
@ -73,7 +73,6 @@ import android.widget.LinearLayout;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
/** /**
@ -135,6 +134,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
SUGGESTION_VISIBILILTY_HIDE_VALUE SUGGESTION_VISIBILILTY_HIDE_VALUE
}; };
private Settings.Values mSettingsValues;
private View mCandidateViewContainer; private View mCandidateViewContainer;
private int mCandidateStripHeight; private int mCandidateStripHeight;
private CandidateView mCandidateView; private CandidateView mCandidateView;
@ -164,8 +165,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private boolean mIsSettingsSuggestionStripOn; private boolean mIsSettingsSuggestionStripOn;
private boolean mApplicationSpecifiedCompletionOn; private boolean mApplicationSpecifiedCompletionOn;
private AccessibilityUtils mAccessibilityUtils;
private final StringBuilder mComposing = new StringBuilder(); private final StringBuilder mComposing = new StringBuilder();
private WordComposer mWord = new WordComposer(); private WordComposer mWord = new WordComposer();
private CharSequence mBestWord; private CharSequence mBestWord;
@ -174,26 +173,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// Magic space: a space that should disappear on space/apostrophe insertion, move after the // Magic space: a space that should disappear on space/apostrophe insertion, move after the
// punctuation on punctuation insertion, and become a real space on alpha char insertion. // punctuation on punctuation insertion, and become a real space on alpha char insertion.
private boolean mJustAddedMagicSpace; // This indicates whether the last char is a magic space. private boolean mJustAddedMagicSpace; // This indicates whether the last char is a magic space.
private boolean mAutoCorrectEnabled;
// Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary
private boolean mBigramSuggestionEnabled;
// Prediction: use bigrams to predict the next word when there is no input for it yet
private boolean mBigramPredictionEnabled;
private boolean mAutoCorrectOn;
private boolean mVibrateOn;
private boolean mSoundOn;
private boolean mPopupOn;
private boolean mAutoCap;
private boolean mQuickFixes;
private boolean mConfigEnableShowSubtypeSettings;
private boolean mConfigSwipeDownDismissKeyboardEnabled;
private int mConfigDelayBeforeFadeoutLanguageOnSpacebar;
private int mConfigDelayUpdateSuggestions;
private int mConfigDelayUpdateOldSuggestions;
private int mConfigDelayUpdateShiftState;
private int mConfigDurationOfFadeoutLanguageOnSpacebar;
private float mConfigFinalFadeoutFactorOfLanguageOnSpacebar;
private long mConfigDoubleSpacesTurnIntoPeriodTimeout;
private int mCorrectionMode; private int mCorrectionMode;
private int mCommittedLength; private int mCommittedLength;
@ -201,7 +180,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// Keep track of the last selection range to decide if we need to show word alternatives // Keep track of the last selection range to decide if we need to show word alternatives
private int mLastSelectionStart; private int mLastSelectionStart;
private int mLastSelectionEnd; private int mLastSelectionEnd;
private SuggestedWords mSuggestPuncList;
// Indicates whether the suggestion strip is to be on in landscape // Indicates whether the suggestion strip is to be on in landscape
private boolean mJustAccepted; private boolean mJustAccepted;
@ -211,12 +189,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private AudioManager mAudioManager; private AudioManager mAudioManager;
// Align sound effect volume on music volume // Align sound effect volume on music volume
private static final float FX_VOLUME = -1.0f; private static final float FX_VOLUME = -1.0f;
private boolean mSilentMode; private boolean mSilentModeOn; // System-wide current configuration
/* package */ String mWordSeparators;
private String mMagicSpaceStrippers;
private String mMagicSpaceSwappers;
private String mSuggestPuncs;
// TODO: Move this flag to VoiceProxy // TODO: Move this flag to VoiceProxy
private boolean mConfigurationChanging; private boolean mConfigurationChanging;
@ -251,7 +225,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
case MSG_UPDATE_OLD_SUGGESTIONS: case MSG_UPDATE_OLD_SUGGESTIONS:
mRecorrection.setRecorrectionSuggestions(mVoiceProxy, mCandidateView, mSuggest, mRecorrection.setRecorrectionSuggestions(mVoiceProxy, mCandidateView, mSuggest,
mKeyboardSwitcher, mWord, mHasUncommittedTypedChars, mLastSelectionStart, mKeyboardSwitcher, mWord, mHasUncommittedTypedChars, mLastSelectionStart,
mLastSelectionEnd, mWordSeparators); mLastSelectionEnd, mSettingsValues.mWordSeparators);
break; break;
case MSG_UPDATE_SHIFT_STATE: case MSG_UPDATE_SHIFT_STATE:
switcher.updateShiftState(); switcher.updateShiftState();
@ -264,17 +238,20 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|| (switcher.isAlphabetMode() && switcher.isShiftedOrShiftLocked())); || (switcher.isAlphabetMode() && switcher.isShiftedOrShiftLocked()));
break; break;
case MSG_FADEOUT_LANGUAGE_ON_SPACEBAR: case MSG_FADEOUT_LANGUAGE_ON_SPACEBAR:
if (inputView != null) if (inputView != null) {
inputView.setSpacebarTextFadeFactor( inputView.setSpacebarTextFadeFactor(
(1.0f + mConfigFinalFadeoutFactorOfLanguageOnSpacebar) / 2, (1.0f + mSettingsValues.mFinalFadeoutFactorOfLanguageOnSpacebar) / 2,
(LatinKeyboard)msg.obj); (LatinKeyboard)msg.obj);
}
sendMessageDelayed(obtainMessage(MSG_DISMISS_LANGUAGE_ON_SPACEBAR, msg.obj), sendMessageDelayed(obtainMessage(MSG_DISMISS_LANGUAGE_ON_SPACEBAR, msg.obj),
mConfigDurationOfFadeoutLanguageOnSpacebar); mSettingsValues.mDurationOfFadeoutLanguageOnSpacebar);
break; break;
case MSG_DISMISS_LANGUAGE_ON_SPACEBAR: case MSG_DISMISS_LANGUAGE_ON_SPACEBAR:
if (inputView != null) if (inputView != null) {
inputView.setSpacebarTextFadeFactor( inputView.setSpacebarTextFadeFactor(
mConfigFinalFadeoutFactorOfLanguageOnSpacebar, (LatinKeyboard)msg.obj); mSettingsValues.mFinalFadeoutFactorOfLanguageOnSpacebar,
(LatinKeyboard)msg.obj);
}
break; break;
} }
} }
@ -282,7 +259,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public void postUpdateSuggestions() { public void postUpdateSuggestions() {
removeMessages(MSG_UPDATE_SUGGESTIONS); removeMessages(MSG_UPDATE_SUGGESTIONS);
sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTIONS), sendMessageDelayed(obtainMessage(MSG_UPDATE_SUGGESTIONS),
mConfigDelayUpdateSuggestions); mSettingsValues.mDelayUpdateSuggestions);
} }
public void cancelUpdateSuggestions() { public void cancelUpdateSuggestions() {
@ -296,7 +273,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public void postUpdateOldSuggestions() { public void postUpdateOldSuggestions() {
removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); removeMessages(MSG_UPDATE_OLD_SUGGESTIONS);
sendMessageDelayed(obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS), sendMessageDelayed(obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS),
mConfigDelayUpdateOldSuggestions); mSettingsValues.mDelayUpdateOldSuggestions);
} }
public void cancelUpdateOldSuggestions() { public void cancelUpdateOldSuggestions() {
@ -305,7 +282,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public void postUpdateShiftKeyState() { public void postUpdateShiftKeyState() {
removeMessages(MSG_UPDATE_SHIFT_STATE); removeMessages(MSG_UPDATE_SHIFT_STATE);
sendMessageDelayed(obtainMessage(MSG_UPDATE_SHIFT_STATE), mConfigDelayUpdateShiftState); sendMessageDelayed(obtainMessage(MSG_UPDATE_SHIFT_STATE),
mSettingsValues.mDelayUpdateShiftState);
} }
public void cancelUpdateShiftState() { public void cancelUpdateShiftState() {
@ -315,7 +293,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public void postUpdateBigramPredictions() { public void postUpdateBigramPredictions() {
removeMessages(MSG_SET_BIGRAM_PREDICTIONS); removeMessages(MSG_SET_BIGRAM_PREDICTIONS);
sendMessageDelayed(obtainMessage(MSG_SET_BIGRAM_PREDICTIONS), sendMessageDelayed(obtainMessage(MSG_SET_BIGRAM_PREDICTIONS),
mConfigDelayUpdateSuggestions); mSettingsValues.mDelayUpdateSuggestions);
} }
public void cancelUpdateBigramPredictions() { public void cancelUpdateBigramPredictions() {
@ -334,15 +312,16 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
final LatinKeyboard keyboard = mKeyboardSwitcher.getLatinKeyboard(); final LatinKeyboard keyboard = mKeyboardSwitcher.getLatinKeyboard();
// The language is always displayed when the delay is negative. // The language is always displayed when the delay is negative.
final boolean needsToDisplayLanguage = localeChanged final boolean needsToDisplayLanguage = localeChanged
|| mConfigDelayBeforeFadeoutLanguageOnSpacebar < 0; || mSettingsValues.mDelayBeforeFadeoutLanguageOnSpacebar < 0;
// The language is never displayed when the delay is zero. // The language is never displayed when the delay is zero.
if (mConfigDelayBeforeFadeoutLanguageOnSpacebar != 0) if (mSettingsValues.mDelayBeforeFadeoutLanguageOnSpacebar != 0) {
inputView.setSpacebarTextFadeFactor(needsToDisplayLanguage ? 1.0f inputView.setSpacebarTextFadeFactor(needsToDisplayLanguage ? 1.0f
: mConfigFinalFadeoutFactorOfLanguageOnSpacebar, keyboard); : mSettingsValues.mFinalFadeoutFactorOfLanguageOnSpacebar, keyboard);
}
// The fadeout animation will start when the delay is positive. // The fadeout animation will start when the delay is positive.
if (localeChanged && mConfigDelayBeforeFadeoutLanguageOnSpacebar > 0) { if (localeChanged && mSettingsValues.mDelayBeforeFadeoutLanguageOnSpacebar > 0) {
sendMessageDelayed(obtainMessage(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR, keyboard), sendMessageDelayed(obtainMessage(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR, keyboard),
mConfigDelayBeforeFadeoutLanguageOnSpacebar); mSettingsValues.mDelayBeforeFadeoutLanguageOnSpacebar);
} }
} }
} }
@ -350,7 +329,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public void startDoubleSpacesTimer() { public void startDoubleSpacesTimer() {
removeMessages(MSG_SPACE_TYPED); removeMessages(MSG_SPACE_TYPED);
sendMessageDelayed(obtainMessage(MSG_SPACE_TYPED), sendMessageDelayed(obtainMessage(MSG_SPACE_TYPED),
mConfigDoubleSpacesTurnIntoPeriodTimeout); mSettingsValues.mDoubleSpacesTurnIntoPeriodTimeout);
} }
public void cancelDoubleSpacesTimer() { public void cancelDoubleSpacesTimer() {
@ -370,7 +349,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
LanguageSwitcherProxy.init(this, prefs); LanguageSwitcherProxy.init(this, prefs);
SubtypeSwitcher.init(this, prefs); SubtypeSwitcher.init(this, prefs);
KeyboardSwitcher.init(this, prefs); KeyboardSwitcher.init(this, prefs);
AccessibilityUtils.init(this, prefs);
Recorrection.init(this, prefs); Recorrection.init(this, prefs);
super.onCreate(); super.onCreate();
@ -379,29 +357,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mInputMethodId = Utils.getInputMethodId(mImm, getPackageName()); mInputMethodId = Utils.getInputMethodId(mImm, getPackageName());
mSubtypeSwitcher = SubtypeSwitcher.getInstance(); mSubtypeSwitcher = SubtypeSwitcher.getInstance();
mKeyboardSwitcher = KeyboardSwitcher.getInstance(); mKeyboardSwitcher = KeyboardSwitcher.getInstance();
mAccessibilityUtils = AccessibilityUtils.getInstance();
mRecorrection = Recorrection.getInstance(); mRecorrection = Recorrection.getInstance();
loadSettings();
final Resources res = getResources(); final Resources res = getResources();
mResources = res; mResources = res;
mConfigEnableShowSubtypeSettings = res.getBoolean(
R.bool.config_enable_show_subtype_settings);
mConfigSwipeDownDismissKeyboardEnabled = res.getBoolean(
R.bool.config_swipe_down_dismiss_keyboard_enabled);
mConfigDelayBeforeFadeoutLanguageOnSpacebar = res.getInteger(
R.integer.config_delay_before_fadeout_language_on_spacebar);
mConfigDelayUpdateSuggestions = res.getInteger(R.integer.config_delay_update_suggestions);
mConfigDelayUpdateOldSuggestions = res.getInteger(
R.integer.config_delay_update_old_suggestions);
mConfigDelayUpdateShiftState = res.getInteger(R.integer.config_delay_update_shift_state);
mConfigDurationOfFadeoutLanguageOnSpacebar = res.getInteger(
R.integer.config_duration_of_fadeout_language_on_spacebar);
mConfigFinalFadeoutFactorOfLanguageOnSpacebar = res.getInteger(
R.integer.config_final_fadeout_percentage_of_language_on_spacebar) / 100.0f;
mConfigDoubleSpacesTurnIntoPeriodTimeout = res.getInteger(
R.integer.config_double_spaces_turn_into_period_timeout);
Utils.GCUtils.getInstance().reset(); Utils.GCUtils.getInstance().reset();
boolean tryGC = true; boolean tryGC = true;
for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { for (int i = 0; i < Utils.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) {
@ -414,7 +376,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
mOrientation = res.getConfiguration().orientation; mOrientation = res.getConfiguration().orientation;
initSuggestPuncList();
// Register to receive ringer mode change and network state change. // Register to receive ringer mode change and network state change.
// Also receive installation and removal of a dictionary pack. // Also receive installation and removal of a dictionary pack.
@ -436,6 +397,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
registerReceiver(mDictionaryPackInstallReceiver, newDictFilter); registerReceiver(mDictionaryPackInstallReceiver, newDictFilter);
} }
// Has to be package-visible for unit tests
/* package */ void loadSettings() {
if (null == mPrefs) mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
if (null == mSubtypeSwitcher) mSubtypeSwitcher = SubtypeSwitcher.getInstance();
mSettingsValues = new Settings.Values(mPrefs, this, mSubtypeSwitcher.getInputLocaleStr());
}
private void initSuggest() { private void initSuggest() {
final String localeStr = mSubtypeSwitcher.getInputLocaleStr(); final String localeStr = mSubtypeSwitcher.getInputLocaleStr();
final Locale keyboardLocale = new Locale(localeStr); final Locale keyboardLocale = new Locale(localeStr);
@ -445,12 +413,12 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
if (mSuggest != null) { if (mSuggest != null) {
mSuggest.close(); mSuggest.close();
} }
final SharedPreferences prefs = mPrefs;
mQuickFixes = isQuickFixesEnabled(prefs);
int mainDicResId = Utils.getMainDictionaryResourceId(res); int mainDicResId = Utils.getMainDictionaryResourceId(res);
mSuggest = new Suggest(this, mainDicResId, keyboardLocale); mSuggest = new Suggest(this, mainDicResId, keyboardLocale);
loadAndSetAutoCorrectionThreshold(prefs); if (mSettingsValues.mAutoCorrectEnabled) {
mSuggest.setAutoCorrectionThreshold(mSettingsValues.mAutoCorrectionThreshold);
}
updateAutoTextEnabled(); updateAutoTextEnabled();
mUserDictionary = new UserDictionary(this, localeStr); mUserDictionary = new UserDictionary(this, localeStr);
@ -466,14 +434,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mSuggest.setUserBigramDictionary(mUserBigramDictionary); mSuggest.setUserBigramDictionary(mUserBigramDictionary);
updateCorrectionMode(); updateCorrectionMode();
mMagicSpaceStrippers = res.getString(R.string.magic_space_stripping_symbols);
mMagicSpaceSwappers = res.getString(R.string.magic_space_swapping_symbols);
String wordSeparators = mMagicSpaceStrippers + mMagicSpaceSwappers
+ res.getString(R.string.magic_space_promoting_symbols);
final String notWordSeparators = res.getString(R.string.non_word_separator_symbols);
for (int i = notWordSeparators.length() - 1; i >= 0; --i)
wordSeparators = wordSeparators.replace(notWordSeparators.substring(i, i + 1), "");
mWordSeparators = wordSeparators;
Utils.setSystemLocale(res, savedLocale); Utils.setSystemLocale(res, savedLocale);
} }
@ -571,7 +531,18 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mDeleteCount = 0; mDeleteCount = 0;
mJustAddedMagicSpace = false; mJustAddedMagicSpace = false;
loadSettings(attribute); loadSettings();
updateCorrectionMode();
updateAutoTextEnabled();
updateSuggestionVisibility(mPrefs, mResources);
if (mSuggest != null && mSettingsValues.mAutoCorrectEnabled) {
mSuggest.setAutoCorrectionThreshold(mSettingsValues.mAutoCorrectionThreshold);
}
mVoiceProxy.loadSettings(attribute, mPrefs);
// This will work only when the subtype is not supported.
LanguageSwitcherProxy.loadSettings();
if (mSubtypeSwitcher.isKeyboardMode()) { if (mSubtypeSwitcher.isKeyboardMode()) {
switcher.loadKeyboard(attribute, switcher.loadKeyboard(attribute,
mSubtypeSwitcher.isShortcutImeEnabled() && voiceIme.isVoiceButtonEnabled(), mSubtypeSwitcher.isShortcutImeEnabled() && voiceIme.isVoiceButtonEnabled(),
@ -585,11 +556,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
updateCorrectionMode(); updateCorrectionMode();
final boolean accessibilityEnabled = mAccessibilityUtils.isAccessibilityEnabled(); inputView.setKeyPreviewPopupEnabled(mSettingsValues.mKeyPreviewPopupOn,
mSettingsValues.mKeyPreviewPopupDismissDelay);
inputView.setKeyPreviewEnabled(mPopupOn);
inputView.setProximityCorrectionEnabled(true); inputView.setProximityCorrectionEnabled(true);
inputView.setAccessibilityEnabled(accessibilityEnabled);
// If we just entered a text field, maybe it has some old text that requires correction // If we just entered a text field, maybe it has some old text that requires correction
mRecorrection.checkRecorrectionOnStart(); mRecorrection.checkRecorrectionOnStart();
inputView.setForeground(true); inputView.setForeground(true);
@ -717,7 +686,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// If the composing span has been cleared, save the typed word in the history for // If the composing span has been cleared, save the typed word in the history for
// recorrection before we reset the candidate strip. Then, we'll be able to show // recorrection before we reset the candidate strip. Then, we'll be able to show
// suggestions for recorrection right away. // suggestions for recorrection right away.
mRecorrection.saveWordInHistory(mWord, mComposing); mRecorrection.saveRecorrectionSuggestion(mWord, mComposing);
} }
mComposing.setLength(0); mComposing.setLength(0);
mHasUncommittedTypedChars = false; mHasUncommittedTypedChars = false;
@ -953,7 +922,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public boolean getCurrentAutoCapsState() { public boolean getCurrentAutoCapsState() {
InputConnection ic = getCurrentInputConnection(); InputConnection ic = getCurrentInputConnection();
EditorInfo ei = getCurrentInputEditorInfo(); EditorInfo ei = getCurrentInputEditorInfo();
if (mAutoCap && ic != null && ei != null && ei.inputType != InputType.TYPE_NULL) { if (mSettingsValues.mAutoCap && ic != null && ei != null
&& ei.inputType != InputType.TYPE_NULL) {
return ic.getCursorCapsMode(ei.inputType) != 0; return ic.getCursorCapsMode(ei.inputType) != 0;
} }
return false; return false;
@ -1038,7 +1008,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private void onSettingsKeyPressed() { private void onSettingsKeyPressed() {
if (!isShowingOptionDialog()) { if (!isShowingOptionDialog()) {
if (!mConfigEnableShowSubtypeSettings) { if (!mSettingsValues.mEnableShowSubtypeSettings) {
showSubtypeSelectorAndSettings(); showSubtypeSelectorAndSettings();
} else if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) { } else if (Utils.hasMultipleEnabledIMEsOrSubtypes(mImm)) {
showOptionsMenu(); showOptionsMenu();
@ -1071,7 +1041,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
mLastKeyTime = when; mLastKeyTime = when;
KeyboardSwitcher switcher = mKeyboardSwitcher; KeyboardSwitcher switcher = mKeyboardSwitcher;
final boolean accessibilityEnabled = switcher.isAccessibilityEnabled();
final boolean distinctMultiTouch = switcher.hasDistinctMultitouch(); final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
switch (primaryCode) { switch (primaryCode) {
case Keyboard.CODE_DELETE: case Keyboard.CODE_DELETE:
@ -1081,12 +1050,12 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
break; break;
case Keyboard.CODE_SHIFT: case Keyboard.CODE_SHIFT:
// Shift key is handled in onPress() when device has distinct multi-touch panel. // Shift key is handled in onPress() when device has distinct multi-touch panel.
if (!distinctMultiTouch || accessibilityEnabled) if (!distinctMultiTouch)
switcher.toggleShift(); switcher.toggleShift();
break; break;
case Keyboard.CODE_SWITCH_ALPHA_SYMBOL: case Keyboard.CODE_SWITCH_ALPHA_SYMBOL:
// Symbol key is handled in onPress() when device has distinct multi-touch panel. // Symbol key is handled in onPress() when device has distinct multi-touch panel.
if (!distinctMultiTouch || accessibilityEnabled) if (!distinctMultiTouch)
switcher.changeKeyboardMode(); switcher.changeKeyboardMode();
break; break;
case Keyboard.CODE_CANCEL: case Keyboard.CODE_CANCEL:
@ -1116,7 +1085,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
handleTab(); handleTab();
break; break;
default: default:
if (isWordSeparator(primaryCode)) { if (mSettingsValues.isWordSeparator(primaryCode)) {
handleSeparator(primaryCode, x, y); handleSeparator(primaryCode, x, y);
} else { } else {
handleCharacter(primaryCode, keyCodes, x, y); handleCharacter(primaryCode, keyCodes, x, y);
@ -1241,7 +1210,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private void handleCharacter(int primaryCode, int[] keyCodes, int x, int y) { private void handleCharacter(int primaryCode, int[] keyCodes, int x, int y) {
mVoiceProxy.handleCharacter(); mVoiceProxy.handleCharacter();
if (mJustAddedMagicSpace && isMagicSpaceStripper(primaryCode)) { if (mJustAddedMagicSpace && mSettingsValues.isMagicSpaceStripper(primaryCode)) {
removeTrailingSpace(); removeTrailingSpace();
} }
@ -1254,7 +1223,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
if (!mHasUncommittedTypedChars) { if (!mHasUncommittedTypedChars) {
mHasUncommittedTypedChars = true; mHasUncommittedTypedChars = true;
mComposing.setLength(0); mComposing.setLength(0);
mRecorrection.saveWordInHistory(mWord, mBestWord); mRecorrection.saveRecorrectionSuggestion(mWord, mBestWord);
mWord.reset(); mWord.reset();
clearSuggestions(); clearSuggestions();
} }
@ -1297,7 +1266,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} else { } else {
sendKeyChar((char)code); sendKeyChar((char)code);
} }
if (mJustAddedMagicSpace && isMagicSpaceSwapper(primaryCode)) { if (mJustAddedMagicSpace && mSettingsValues.isMagicSpaceSwapper(primaryCode)) {
swapSwapperAndSpace(); swapSwapperAndSpace();
} else { } else {
mJustAddedMagicSpace = false; mJustAddedMagicSpace = false;
@ -1305,7 +1274,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
switcher.updateShiftState(); switcher.updateShiftState();
if (LatinIME.PERF_DEBUG) measureCps(); if (LatinIME.PERF_DEBUG) measureCps();
TextEntryState.typedCharacter((char) code, isWordSeparator(code), x, y); TextEntryState.typedCharacter((char) code, mSettingsValues.isWordSeparator(code), x, y);
} }
private void handleSeparator(int primaryCode, int x, int y) { private void handleSeparator(int primaryCode, int x, int y) {
@ -1329,7 +1298,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// not to auto correct, but accept the typed word. For instance, // not to auto correct, but accept the typed word. For instance,
// in Italian dov' should not be expanded to dove' because the elision // in Italian dov' should not be expanded to dove' because the elision
// requires the last vowel to be removed. // requires the last vowel to be removed.
if (mAutoCorrectOn && primaryCode != Keyboard.CODE_SINGLE_QUOTE) { final boolean shouldAutoCorrect =
(mSettingsValues.mAutoCorrectEnabled || mSettingsValues.mQuickFixes)
&& !mInputTypeNoAutoCorrect && mHasDictionary;
if (shouldAutoCorrect && primaryCode != Keyboard.CODE_SINGLE_QUOTE) {
pickedDefault = pickDefaultSuggestion(primaryCode); pickedDefault = pickDefaultSuggestion(primaryCode);
} else { } else {
commitTyped(ic); commitTyped(ic);
@ -1337,11 +1309,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
if (mJustAddedMagicSpace) { if (mJustAddedMagicSpace) {
if (isMagicSpaceSwapper(primaryCode)) { if (mSettingsValues.isMagicSpaceSwapper(primaryCode)) {
sendKeyChar((char)primaryCode); sendKeyChar((char)primaryCode);
swapSwapperAndSpace(); swapSwapperAndSpace();
} else { } else {
if (isMagicSpaceStripper(primaryCode)) removeTrailingSpace(); if (mSettingsValues.isMagicSpaceStripper(primaryCode)) removeTrailingSpace();
sendKeyChar((char)primaryCode); sendKeyChar((char)primaryCode);
mJustAddedMagicSpace = false; mJustAddedMagicSpace = false;
} }
@ -1397,7 +1369,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
public boolean isShowingPunctuationList() { public boolean isShowingPunctuationList() {
return mSuggestPuncList == mCandidateView.getSuggestions(); return mSettingsValues.mSuggestPuncList == mCandidateView.getSuggestions();
} }
public boolean isShowingSuggestionsStrip() { public boolean isShowingSuggestionsStrip() {
@ -1471,7 +1443,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private void showSuggestions(WordComposer word) { private void showSuggestions(WordComposer word) {
// TODO: May need a better way of retrieving previous word // TODO: May need a better way of retrieving previous word
CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(), CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
mWordSeparators); mSettingsValues.mWordSeparators);
SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder( SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
mKeyboardSwitcher.getInputView(), word, prevWord); mKeyboardSwitcher.getInputView(), word, prevWord);
@ -1494,14 +1466,17 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// in most cases, suggestion count is 1 when typed word's length is 1, but we do always // in most cases, suggestion count is 1 when typed word's length is 1, but we do always
// need to clear the previous state when the user starts typing a word (i.e. typed word's // need to clear the previous state when the user starts typing a word (i.e. typed word's
// length == 1). // length == 1).
if (builder.size() > 1 || typedWord.length() == 1 || typedWordValid if (typedWord != null) {
|| mCandidateView.isShowingAddToDictionaryHint()) { if (builder.size() > 1 || typedWord.length() == 1 || typedWordValid
builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion(correctionAvailable); || mCandidateView.isShowingAddToDictionaryHint()) {
} else { builder.setTypedWordValid(typedWordValid).setHasMinimalSuggestion(
final SuggestedWords previousSuggestions = mCandidateView.getSuggestions(); correctionAvailable);
if (previousSuggestions == mSuggestPuncList) } else {
return; final SuggestedWords previousSuggestions = mCandidateView.getSuggestions();
builder.addTypedWordAndPreviousSuggestions(typedWord, previousSuggestions); if (previousSuggestions == mSettingsValues.mSuggestPuncList)
return;
builder.addTypedWordAndPreviousSuggestions(typedWord, previousSuggestions);
}
} }
showSuggestions(builder.build(), typedWord); showSuggestions(builder.build(), typedWord);
} }
@ -1535,14 +1510,14 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// Add the word to the auto dictionary if it's not a known word // Add the word to the auto dictionary if it's not a known word
addToAutoAndUserBigramDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED); addToAutoAndUserBigramDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED);
return true; return true;
} }
return false; return false;
} }
public void pickSuggestionManually(int index, CharSequence suggestion) { public void pickSuggestionManually(int index, CharSequence suggestion) {
SuggestedWords suggestions = mCandidateView.getSuggestions(); SuggestedWords suggestions = mCandidateView.getSuggestions();
mVoiceProxy.flushAndLogAllTextModificationCounters(index, suggestion, mWordSeparators); mVoiceProxy.flushAndLogAllTextModificationCounters(index, suggestion,
mSettingsValues.mWordSeparators);
final boolean recorrecting = TextEntryState.isRecorrecting(); final boolean recorrecting = TextEntryState.isRecorrecting();
InputConnection ic = getCurrentInputConnection(); InputConnection ic = getCurrentInputConnection();
@ -1567,8 +1542,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
// If this is a punctuation, apply it through the normal key press // If this is a punctuation, apply it through the normal key press
if (suggestion.length() == 1 && (isWordSeparator(suggestion.charAt(0)) if (suggestion.length() == 1 && (mSettingsValues.isWordSeparator(suggestion.charAt(0))
|| isSuggestedPunctuation(suggestion.charAt(0)))) { || mSettingsValues.isSuggestedPunctuation(suggestion.charAt(0)))) {
// Word separators are suggested before the user inputs something. // Word separators are suggested before the user inputs something.
// So, LatinImeLogger logs "" as a user's input. // So, LatinImeLogger logs "" as a user's input.
LatinImeLogger.logOnManualSuggestion( LatinImeLogger.logOnManualSuggestion(
@ -1579,11 +1554,12 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// pressed space on purpose of displaying the suggestion strip punctuation. // pressed space on purpose of displaying the suggestion strip punctuation.
final char primaryCode = suggestion.charAt(0); final char primaryCode = suggestion.charAt(0);
final int toLeft = (ic == null) ? 0 : ic.getTextBeforeCursor(1, 0).charAt(0); final int toLeft = (ic == null) ? 0 : ic.getTextBeforeCursor(1, 0).charAt(0);
final boolean oldMagicSpace = mJustAddedMagicSpace;
if (Keyboard.CODE_SPACE == toLeft) mJustAddedMagicSpace = true; if (Keyboard.CODE_SPACE == toLeft) mJustAddedMagicSpace = true;
onCodeInput(primaryCode, new int[] { primaryCode }, onCodeInput(primaryCode, new int[] { primaryCode },
KeyboardActionListener.NOT_A_TOUCH_COORDINATE, KeyboardActionListener.NOT_A_TOUCH_COORDINATE,
KeyboardActionListener.NOT_A_TOUCH_COORDINATE); KeyboardActionListener.NOT_A_TOUCH_COORDINATE);
mJustAddedMagicSpace = false; mJustAddedMagicSpace = oldMagicSpace;
if (ic != null) { if (ic != null) {
ic.endBatchEdit(); ic.endBatchEdit();
} }
@ -1631,8 +1607,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// TextEntryState.State.PICKED_SUGGESTION state. // TextEntryState.State.PICKED_SUGGESTION state.
TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true, TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true,
WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE); WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
// From there on onUpdateSelection() will fire so suggestions will be updated }
} else if (!showingAddToDictionaryHint) { if (!showingAddToDictionaryHint) {
// If we're not showing the "Touch again to save", then show corrections again. // If we're not showing the "Touch again to save", then show corrections again.
// In case the cursor position doesn't change, make sure we show the suggestions again. // In case the cursor position doesn't change, make sure we show the suggestions again.
clearSuggestions(); clearSuggestions();
@ -1658,10 +1634,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
return; return;
InputConnection ic = getCurrentInputConnection(); InputConnection ic = getCurrentInputConnection();
if (ic != null) { if (ic != null) {
mVoiceProxy.rememberReplacedWord(suggestion, mWordSeparators); mVoiceProxy.rememberReplacedWord(suggestion, mSettingsValues.mWordSeparators);
ic.commitText(suggestion, 1); ic.commitText(suggestion, 1);
} }
mRecorrection.saveWordInHistory(mWord, suggestion); mRecorrection.saveRecorrectionSuggestion(mWord, suggestion);
mHasUncommittedTypedChars = false; mHasUncommittedTypedChars = false;
mCommittedLength = suggestion.length(); mCommittedLength = suggestion.length();
} }
@ -1671,13 +1647,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
if (mSuggest == null || !isSuggestionsRequested()) if (mSuggest == null || !isSuggestionsRequested())
return; return;
if (!mBigramPredictionEnabled) { if (!mSettingsValues.mBigramPredictionEnabled) {
setPunctuationSuggestions(); setPunctuationSuggestions();
return; return;
} }
final CharSequence prevWord = EditingUtils.getThisWord(getCurrentInputConnection(), final CharSequence prevWord = EditingUtils.getThisWord(getCurrentInputConnection(),
mWordSeparators); mSettingsValues.mWordSeparators);
SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder( SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
mKeyboardSwitcher.getInputView(), sEmptyWordComposer, prevWord); mKeyboardSwitcher.getInputView(), sEmptyWordComposer, prevWord);
@ -1691,7 +1667,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
public void setPunctuationSuggestions() { public void setPunctuationSuggestions() {
setSuggestions(mSuggestPuncList); setSuggestions(mSettingsValues.mSuggestPuncList);
setCandidatesViewShown(isCandidateStripVisible()); setCandidatesViewShown(isCandidateStripVisible());
} }
@ -1734,7 +1710,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// For example "I will, and you too" : we don't want the pair ("will" "and") to be // For example "I will, and you too" : we don't want the pair ("will" "and") to be
// a bigram. // a bigram.
CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(), CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(),
mWordSeparators); mSettingsValues.mWordSeparators);
if (!TextUtils.isEmpty(prevWord)) { if (!TextUtils.isEmpty(prevWord)) {
mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString()); mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString());
} }
@ -1747,13 +1723,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
CharSequence toLeft = ic.getTextBeforeCursor(1, 0); CharSequence toLeft = ic.getTextBeforeCursor(1, 0);
CharSequence toRight = ic.getTextAfterCursor(1, 0); CharSequence toRight = ic.getTextAfterCursor(1, 0);
if (!TextUtils.isEmpty(toLeft) if (!TextUtils.isEmpty(toLeft)
&& !isWordSeparator(toLeft.charAt(0)) && !mSettingsValues.isWordSeparator(toLeft.charAt(0))
&& !isSuggestedPunctuation(toLeft.charAt(0))) { && !mSettingsValues.isSuggestedPunctuation(toLeft.charAt(0))) {
return true; return true;
} }
if (!TextUtils.isEmpty(toRight) if (!TextUtils.isEmpty(toRight)
&& !isWordSeparator(toRight.charAt(0)) && !mSettingsValues.isWordSeparator(toRight.charAt(0))
&& !isSuggestedPunctuation(toRight.charAt(0))) { && !mSettingsValues.isSuggestedPunctuation(toRight.charAt(0))) {
return true; return true;
} }
return false; return false;
@ -1772,14 +1748,16 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
if (deleteChar) ic.deleteSurroundingText(1, 0); if (deleteChar) ic.deleteSurroundingText(1, 0);
int toDelete = mCommittedLength; int toDelete = mCommittedLength;
final CharSequence toTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0); final CharSequence toTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0);
if (!TextUtils.isEmpty(toTheLeft) && isWordSeparator(toTheLeft.charAt(0))) { if (!TextUtils.isEmpty(toTheLeft)
&& mSettingsValues.isWordSeparator(toTheLeft.charAt(0))) {
toDelete--; toDelete--;
} }
ic.deleteSurroundingText(toDelete, 0); ic.deleteSurroundingText(toDelete, 0);
// Re-insert punctuation only when the deleted character was word separator and the // Re-insert punctuation only when the deleted character was word separator and the
// composing text wasn't equal to the auto-corrected text. // composing text wasn't equal to the auto-corrected text.
if (deleteChar if (deleteChar
&& !TextUtils.isEmpty(punctuation) && isWordSeparator(punctuation.charAt(0)) && !TextUtils.isEmpty(punctuation)
&& mSettingsValues.isWordSeparator(punctuation.charAt(0))
&& !TextUtils.equals(mComposing, toTheLeft)) { && !TextUtils.equals(mComposing, toTheLeft)) {
ic.commitText(mComposing, 1); ic.commitText(mComposing, 1);
TextEntryState.acceptedTyped(mComposing); TextEntryState.acceptedTyped(mComposing);
@ -1800,21 +1778,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
} }
protected String getWordSeparators() {
return mWordSeparators;
}
public boolean isWordSeparator(int code) { public boolean isWordSeparator(int code) {
String separators = getWordSeparators(); return mSettingsValues.isWordSeparator(code);
return separators.contains(String.valueOf((char)code));
}
private boolean isMagicSpaceStripper(int code) {
return mMagicSpaceStrippers.contains(String.valueOf((char)code));
}
private boolean isMagicSpaceSwapper(int code) {
return mMagicSpaceSwappers.contains(String.valueOf((char)code));
} }
private void sendMagicSpace() { private void sendMagicSpace() {
@ -1835,6 +1800,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mSubtypeSwitcher.isShortcutImeEnabled() && mVoiceProxy.isVoiceButtonEnabled(), mSubtypeSwitcher.isShortcutImeEnabled() && mVoiceProxy.isVoiceButtonEnabled(),
mVoiceProxy.isVoiceButtonOnPrimary()); mVoiceProxy.isVoiceButtonOnPrimary());
initSuggest(); initSuggest();
loadSettings();
mKeyboardSwitcher.updateShiftState(); mKeyboardSwitcher.updateShiftState();
} }
@ -1843,12 +1809,14 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()) { if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()) {
mSubtypeSwitcher.toggleLanguage(next); mSubtypeSwitcher.toggleLanguage(next);
} }
onRefreshKeyboard();// no need?? // The following is necessary because on API levels < 10, we don't get notified when
} // subtype changes.
onRefreshKeyboard();
}
@Override @Override
public void onSwipeDown() { public void onSwipeDown() {
if (mConfigSwipeDownDismissKeyboardEnabled) if (mSettingsValues.mSwipeDownDismissKeyboardEnabled)
handleClose(); handleClose();
} }
@ -1867,7 +1835,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} else { } else {
switcher.onOtherKeyPressed(); switcher.onOtherKeyPressed();
} }
mAccessibilityUtils.onPress(primaryCode, switcher);
} }
@Override @Override
@ -1880,7 +1847,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) { } else if (distinctMultiTouch && primaryCode == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) {
switcher.onReleaseSymbol(); switcher.onReleaseSymbol();
} }
mAccessibilityUtils.onRelease(primaryCode, switcher);
} }
@ -1903,7 +1869,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
} }
if (mAudioManager != null) { if (mAudioManager != null) {
mSilentMode = (mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL); mSilentModeOn = (mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL);
} }
} }
@ -1915,7 +1881,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
updateRingerMode(); updateRingerMode();
} }
} }
if (mSoundOn && !mSilentMode) { if (isSoundOn()) {
// FIXME: Volume and enable should come from UI settings // FIXME: Volume and enable should come from UI settings
// FIXME: These should be triggered after auto-repeat logic // FIXME: These should be triggered after auto-repeat logic
int sound = AudioManager.FX_KEYPRESS_STANDARD; int sound = AudioManager.FX_KEYPRESS_STANDARD;
@ -1935,7 +1901,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
public void vibrate() { public void vibrate() {
if (!mVibrateOn) { if (!mSettingsValues.mVibrateOn) {
return; return;
} }
LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
@ -1955,19 +1921,20 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
return mWord; return mWord;
} }
public boolean getPopupOn() { boolean isSoundOn() {
return mPopupOn; return mSettingsValues.mSoundOn && !mSilentModeOn;
} }
private void updateCorrectionMode() { private void updateCorrectionMode() {
// TODO: cleanup messy flags // TODO: cleanup messy flags
mHasDictionary = mSuggest != null ? mSuggest.hasMainDictionary() : false; mHasDictionary = mSuggest != null ? mSuggest.hasMainDictionary() : false;
mAutoCorrectOn = (mAutoCorrectEnabled || mQuickFixes) final boolean shouldAutoCorrect = (mSettingsValues.mAutoCorrectEnabled
&& !mInputTypeNoAutoCorrect && mHasDictionary; || mSettingsValues.mQuickFixes) && !mInputTypeNoAutoCorrect && mHasDictionary;
mCorrectionMode = (mAutoCorrectOn && mAutoCorrectEnabled) mCorrectionMode = (shouldAutoCorrect && mSettingsValues.mAutoCorrectEnabled)
? Suggest.CORRECTION_FULL ? Suggest.CORRECTION_FULL
: (mAutoCorrectOn ? Suggest.CORRECTION_BASIC : Suggest.CORRECTION_NONE); : (shouldAutoCorrect ? Suggest.CORRECTION_BASIC : Suggest.CORRECTION_NONE);
mCorrectionMode = (mBigramSuggestionEnabled && mAutoCorrectOn && mAutoCorrectEnabled) mCorrectionMode = (mSettingsValues.mBigramSuggestionEnabled && shouldAutoCorrect
&& mSettingsValues.mAutoCorrectEnabled)
? Suggest.CORRECTION_FULL_BIGRAM : mCorrectionMode; ? Suggest.CORRECTION_FULL_BIGRAM : mCorrectionMode;
if (mSuggest != null) { if (mSuggest != null) {
mSuggest.setCorrectionMode(mCorrectionMode); mSuggest.setCorrectionMode(mCorrectionMode);
@ -1976,12 +1943,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
private void updateAutoTextEnabled() { private void updateAutoTextEnabled() {
if (mSuggest == null) return; if (mSuggest == null) return;
mSuggest.setQuickFixesEnabled(mQuickFixes mSuggest.setQuickFixesEnabled(mSettingsValues.mQuickFixes
&& SubtypeSwitcher.getInstance().isSystemLanguageSameAsInputLanguage()); && SubtypeSwitcher.getInstance().isSystemLanguageSameAsInputLanguage());
} }
private void updateSuggestionVisibility(SharedPreferences prefs) { private void updateSuggestionVisibility(final SharedPreferences prefs, final Resources res) {
final Resources res = mResources;
final String suggestionVisiblityStr = prefs.getString( final String suggestionVisiblityStr = prefs.getString(
Settings.PREF_SHOW_SUGGESTIONS_SETTING, Settings.PREF_SHOW_SUGGESTIONS_SETTING,
res.getString(R.string.prefs_suggestion_visibility_default_value)); res.getString(R.string.prefs_suggestion_visibility_default_value));
@ -2009,128 +1975,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
startActivity(intent); startActivity(intent);
} }
private void loadSettings(EditorInfo attribute) {
// Get the settings preferences
final SharedPreferences prefs = mPrefs;
final boolean hasVibrator = VibratorCompatWrapper.getInstance(this).hasVibrator();
mVibrateOn = hasVibrator && prefs.getBoolean(Settings.PREF_VIBRATE_ON, false);
mSoundOn = prefs.getBoolean(Settings.PREF_SOUND_ON,
mResources.getBoolean(R.bool.config_default_sound_enabled));
mPopupOn = isPopupEnabled(prefs);
mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, true);
mQuickFixes = isQuickFixesEnabled(prefs);
mAutoCorrectEnabled = isAutoCorrectEnabled(prefs);
mBigramSuggestionEnabled = mAutoCorrectEnabled && isBigramSuggestionEnabled(prefs);
mBigramPredictionEnabled = mBigramSuggestionEnabled && isBigramPredictionEnabled(prefs);
loadAndSetAutoCorrectionThreshold(prefs);
mVoiceProxy.loadSettings(attribute, prefs);
updateCorrectionMode();
updateAutoTextEnabled();
updateSuggestionVisibility(prefs);
// This will work only when the subtype is not supported.
LanguageSwitcherProxy.loadSettings();
}
/**
* Load Auto correction threshold from SharedPreferences, and modify mSuggest's threshold.
*/
private void loadAndSetAutoCorrectionThreshold(SharedPreferences sp) {
// When mSuggest is not initialized, cannnot modify mSuggest's threshold.
if (mSuggest == null) return;
// When auto correction setting is turned off, the threshold is ignored.
if (!isAutoCorrectEnabled(sp)) return;
final String currentAutoCorrectionSetting = sp.getString(
Settings.PREF_AUTO_CORRECTION_THRESHOLD,
mResources.getString(R.string.auto_correction_threshold_mode_index_modest));
final String[] autoCorrectionThresholdValues = mResources.getStringArray(
R.array.auto_correction_threshold_values);
// When autoCrrectionThreshold is greater than 1.0, auto correction is virtually turned off.
double autoCorrectionThreshold = Double.MAX_VALUE;
try {
final int arrayIndex = Integer.valueOf(currentAutoCorrectionSetting);
if (arrayIndex >= 0 && arrayIndex < autoCorrectionThresholdValues.length) {
autoCorrectionThreshold = Double.parseDouble(
autoCorrectionThresholdValues[arrayIndex]);
}
} catch (NumberFormatException e) {
// Whenever the threshold settings are correct, never come here.
autoCorrectionThreshold = Double.MAX_VALUE;
Log.w(TAG, "Cannot load auto correction threshold setting."
+ " currentAutoCorrectionSetting: " + currentAutoCorrectionSetting
+ ", autoCorrectionThresholdValues: "
+ Arrays.toString(autoCorrectionThresholdValues));
}
// TODO: This should be refactored :
// setAutoCorrectionThreshold should be called outside of this method.
mSuggest.setAutoCorrectionThreshold(autoCorrectionThreshold);
}
private boolean isPopupEnabled(SharedPreferences sp) {
final boolean showPopupOption = getResources().getBoolean(
R.bool.config_enable_show_popup_on_keypress_option);
if (!showPopupOption) return mResources.getBoolean(R.bool.config_default_popup_preview);
return sp.getBoolean(Settings.PREF_POPUP_ON,
mResources.getBoolean(R.bool.config_default_popup_preview));
}
private boolean isQuickFixesEnabled(SharedPreferences sp) {
final boolean showQuickFixesOption = mResources.getBoolean(
R.bool.config_enable_quick_fixes_option);
if (!showQuickFixesOption) {
return isAutoCorrectEnabled(sp);
}
return sp.getBoolean(Settings.PREF_QUICK_FIXES, mResources.getBoolean(
R.bool.config_default_quick_fixes));
}
private boolean isAutoCorrectEnabled(SharedPreferences sp) {
final String currentAutoCorrectionSetting = sp.getString(
Settings.PREF_AUTO_CORRECTION_THRESHOLD,
mResources.getString(R.string.auto_correction_threshold_mode_index_modest));
final String autoCorrectionOff = mResources.getString(
R.string.auto_correction_threshold_mode_index_off);
return !currentAutoCorrectionSetting.equals(autoCorrectionOff);
}
private boolean isBigramSuggestionEnabled(SharedPreferences sp) {
final boolean showBigramSuggestionsOption = mResources.getBoolean(
R.bool.config_enable_bigram_suggestions_option);
if (!showBigramSuggestionsOption) {
return isAutoCorrectEnabled(sp);
}
return sp.getBoolean(Settings.PREF_BIGRAM_SUGGESTIONS, mResources.getBoolean(
R.bool.config_default_bigram_suggestions));
}
private boolean isBigramPredictionEnabled(SharedPreferences sp) {
return sp.getBoolean(Settings.PREF_BIGRAM_PREDICTIONS, mResources.getBoolean(
R.bool.config_default_bigram_prediction));
}
private void initSuggestPuncList() {
if (mSuggestPuncs != null || mSuggestPuncList != null)
return;
SuggestedWords.Builder builder = new SuggestedWords.Builder();
String puncs = mResources.getString(R.string.suggested_punctuations);
if (puncs != null) {
for (int i = 0; i < puncs.length(); i++) {
builder.addWord(puncs.subSequence(i, i + 1));
}
}
mSuggestPuncList = builder.build();
mSuggestPuncs = puncs;
}
private boolean isSuggestedPunctuation(int code) {
return mSuggestPuncs.contains(String.valueOf((char)code));
}
private void showSubtypeSelectorAndSettings() { private void showSubtypeSelectorAndSettings() {
final CharSequence title = getString(R.string.english_ime_input_options); final CharSequence title = getString(R.string.english_ime_input_options);
final CharSequence[] items = new CharSequence[] { final CharSequence[] items = new CharSequence[] {
@ -2214,13 +2058,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
p.println(" mIsSuggestionsRequested=" + mIsSettingsSuggestionStripOn); p.println(" mIsSuggestionsRequested=" + mIsSettingsSuggestionStripOn);
p.println(" mCorrectionMode=" + mCorrectionMode); p.println(" mCorrectionMode=" + mCorrectionMode);
p.println(" mHasUncommittedTypedChars=" + mHasUncommittedTypedChars); p.println(" mHasUncommittedTypedChars=" + mHasUncommittedTypedChars);
p.println(" mAutoCorrectOn=" + mAutoCorrectOn); p.println(" mAutoCorrectEnabled=" + mSettingsValues.mAutoCorrectEnabled);
p.println(" mShouldInsertMagicSpace=" + mShouldInsertMagicSpace); p.println(" mShouldInsertMagicSpace=" + mShouldInsertMagicSpace);
p.println(" mApplicationSpecifiedCompletionOn=" + mApplicationSpecifiedCompletionOn); p.println(" mApplicationSpecifiedCompletionOn=" + mApplicationSpecifiedCompletionOn);
p.println(" TextEntryState.state=" + TextEntryState.getState()); p.println(" TextEntryState.state=" + TextEntryState.getState());
p.println(" mSoundOn=" + mSoundOn); p.println(" mSoundOn=" + mSettingsValues.mSoundOn);
p.println(" mVibrateOn=" + mVibrateOn); p.println(" mVibrateOn=" + mSettingsValues.mVibrateOn);
p.println(" mPopupOn=" + mPopupOn); p.println(" mKeyPreviewPopupOn=" + mSettingsValues.mKeyPreviewPopupOn);
} }
// Characters per second measurement // Characters per second measurement

View file

@ -25,9 +25,11 @@ import com.android.inputmethod.compat.VibratorCompatWrapper;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.app.backup.BackupManager; import android.app.backup.BackupManager;
import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
import android.preference.ListPreference; import android.preference.ListPreference;
@ -43,6 +45,7 @@ import android.text.method.LinkMovementMethod;
import android.util.Log; import android.util.Log;
import android.widget.TextView; import android.widget.TextView;
import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
public class Settings extends PreferenceActivity public class Settings extends PreferenceActivity
@ -53,7 +56,7 @@ public class Settings extends PreferenceActivity
public static final String PREF_GENERAL_SETTINGS_KEY = "general_settings"; public static final String PREF_GENERAL_SETTINGS_KEY = "general_settings";
public static final String PREF_VIBRATE_ON = "vibrate_on"; public static final String PREF_VIBRATE_ON = "vibrate_on";
public static final String PREF_SOUND_ON = "sound_on"; public static final String PREF_SOUND_ON = "sound_on";
public static final String PREF_POPUP_ON = "popup_on"; public static final String PREF_KEY_PREVIEW_POPUP_ON = "popup_on";
public static final String PREF_RECORRECTION_ENABLED = "recorrection_enabled"; public static final String PREF_RECORRECTION_ENABLED = "recorrection_enabled";
public static final String PREF_AUTO_CAP = "auto_cap"; public static final String PREF_AUTO_CAP = "auto_cap";
public static final String PREF_SETTINGS_KEY = "settings_key"; public static final String PREF_SETTINGS_KEY = "settings_key";
@ -74,17 +77,224 @@ public class Settings extends PreferenceActivity
public static final String PREF_MISC_SETTINGS_KEY = "misc_settings"; public static final String PREF_MISC_SETTINGS_KEY = "misc_settings";
public static final String PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY =
"pref_key_preview_popup_dismiss_delay";
public static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode"; public static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode";
// Dialog ids // Dialog ids
private static final int VOICE_INPUT_CONFIRM_DIALOG = 0; private static final int VOICE_INPUT_CONFIRM_DIALOG = 0;
public static class Values {
// From resources:
public final boolean mEnableShowSubtypeSettings;
public final boolean mSwipeDownDismissKeyboardEnabled;
public final int mDelayBeforeFadeoutLanguageOnSpacebar;
public final int mDelayUpdateSuggestions;
public final int mDelayUpdateOldSuggestions;
public final int mDelayUpdateShiftState;
public final int mDurationOfFadeoutLanguageOnSpacebar;
public final float mFinalFadeoutFactorOfLanguageOnSpacebar;
public final long mDoubleSpacesTurnIntoPeriodTimeout;
public final String mWordSeparators;
public final String mMagicSpaceStrippers;
public final String mMagicSpaceSwappers;
public final String mSuggestPuncs;
public final SuggestedWords mSuggestPuncList;
// From preferences:
public final boolean mSoundOn; // Sound setting private to Latin IME (see mSilentModeOn)
public final boolean mVibrateOn;
public final boolean mKeyPreviewPopupOn;
public final int mKeyPreviewPopupDismissDelay;
public final boolean mAutoCap;
public final boolean mQuickFixes;
public final boolean mAutoCorrectEnabled;
public final double mAutoCorrectionThreshold;
// Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary
public final boolean mBigramSuggestionEnabled;
// Prediction: use bigrams to predict the next word when there is no input for it yet
public final boolean mBigramPredictionEnabled;
public Values(final SharedPreferences prefs, final Context context,
final String localeStr) {
final Resources res = context.getResources();
final Locale savedLocale;
if (null != localeStr) {
final Locale keyboardLocale = new Locale(localeStr);
savedLocale = Utils.setSystemLocale(res, keyboardLocale);
} else {
savedLocale = null;
}
// Get the resources
mEnableShowSubtypeSettings = res.getBoolean(
R.bool.config_enable_show_subtype_settings);
mSwipeDownDismissKeyboardEnabled = res.getBoolean(
R.bool.config_swipe_down_dismiss_keyboard_enabled);
mDelayBeforeFadeoutLanguageOnSpacebar = res.getInteger(
R.integer.config_delay_before_fadeout_language_on_spacebar);
mDelayUpdateSuggestions =
res.getInteger(R.integer.config_delay_update_suggestions);
mDelayUpdateOldSuggestions = res.getInteger(
R.integer.config_delay_update_old_suggestions);
mDelayUpdateShiftState =
res.getInteger(R.integer.config_delay_update_shift_state);
mDurationOfFadeoutLanguageOnSpacebar = res.getInteger(
R.integer.config_duration_of_fadeout_language_on_spacebar);
mFinalFadeoutFactorOfLanguageOnSpacebar = res.getInteger(
R.integer.config_final_fadeout_percentage_of_language_on_spacebar) / 100.0f;
mDoubleSpacesTurnIntoPeriodTimeout = res.getInteger(
R.integer.config_double_spaces_turn_into_period_timeout);
mMagicSpaceStrippers = res.getString(R.string.magic_space_stripping_symbols);
mMagicSpaceSwappers = res.getString(R.string.magic_space_swapping_symbols);
String wordSeparators = mMagicSpaceStrippers + mMagicSpaceSwappers
+ res.getString(R.string.magic_space_promoting_symbols);
final String notWordSeparators = res.getString(R.string.non_word_separator_symbols);
for (int i = notWordSeparators.length() - 1; i >= 0; --i) {
wordSeparators = wordSeparators.replace(notWordSeparators.substring(i, i + 1), "");
}
mWordSeparators = wordSeparators;
mSuggestPuncs = res.getString(R.string.suggested_punctuations);
// TODO: it would be nice not to recreate this each time we change the configuration
mSuggestPuncList = createSuggestPuncList(mSuggestPuncs);
// Get the settings preferences
final boolean hasVibrator = VibratorCompatWrapper.getInstance(context).hasVibrator();
mVibrateOn = hasVibrator && prefs.getBoolean(Settings.PREF_VIBRATE_ON, false);
mSoundOn = prefs.getBoolean(Settings.PREF_SOUND_ON,
res.getBoolean(R.bool.config_default_sound_enabled));
mKeyPreviewPopupOn = isKeyPreviewPopupEnabled(prefs, res);
mKeyPreviewPopupDismissDelay = getKeyPreviewPopupDismissDelay(prefs, res);
mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, true);
mQuickFixes = isQuickFixesEnabled(prefs, res);
mAutoCorrectEnabled = isAutoCorrectEnabled(prefs, res);
mBigramSuggestionEnabled = mAutoCorrectEnabled
&& isBigramSuggestionEnabled(prefs, res, mAutoCorrectEnabled);
mBigramPredictionEnabled = mBigramSuggestionEnabled
&& isBigramPredictionEnabled(prefs, res);
mAutoCorrectionThreshold = getAutoCorrectionThreshold(prefs, res);
Utils.setSystemLocale(res, savedLocale);
}
public boolean isSuggestedPunctuation(int code) {
return mSuggestPuncs.contains(String.valueOf((char)code));
}
public boolean isWordSeparator(int code) {
return mWordSeparators.contains(String.valueOf((char)code));
}
public boolean isMagicSpaceStripper(int code) {
return mMagicSpaceStrippers.contains(String.valueOf((char)code));
}
public boolean isMagicSpaceSwapper(int code) {
return mMagicSpaceSwappers.contains(String.valueOf((char)code));
}
// Helper methods
private static boolean isQuickFixesEnabled(SharedPreferences sp, Resources resources) {
final boolean showQuickFixesOption = resources.getBoolean(
R.bool.config_enable_quick_fixes_option);
if (!showQuickFixesOption) {
return isAutoCorrectEnabled(sp, resources);
}
return sp.getBoolean(Settings.PREF_QUICK_FIXES, resources.getBoolean(
R.bool.config_default_quick_fixes));
}
private static boolean isAutoCorrectEnabled(SharedPreferences sp, Resources resources) {
final String currentAutoCorrectionSetting = sp.getString(
Settings.PREF_AUTO_CORRECTION_THRESHOLD,
resources.getString(R.string.auto_correction_threshold_mode_index_modest));
final String autoCorrectionOff = resources.getString(
R.string.auto_correction_threshold_mode_index_off);
return !currentAutoCorrectionSetting.equals(autoCorrectionOff);
}
// Public to access from KeyboardSwitcher. Should it have access to some
// process-global instance instead?
public static boolean isKeyPreviewPopupEnabled(SharedPreferences sp, Resources resources) {
final boolean showPopupOption = resources.getBoolean(
R.bool.config_enable_show_popup_on_keypress_option);
if (!showPopupOption) return resources.getBoolean(R.bool.config_default_popup_preview);
return sp.getBoolean(Settings.PREF_KEY_PREVIEW_POPUP_ON,
resources.getBoolean(R.bool.config_default_popup_preview));
}
// Likewise
public static int getKeyPreviewPopupDismissDelay(SharedPreferences sp,
Resources resources) {
return Integer.parseInt(sp.getString(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY,
Integer.toString(resources.getInteger(R.integer.config_delay_after_preview))));
}
private static boolean isBigramSuggestionEnabled(SharedPreferences sp, Resources resources,
boolean autoCorrectEnabled) {
final boolean showBigramSuggestionsOption = resources.getBoolean(
R.bool.config_enable_bigram_suggestions_option);
if (!showBigramSuggestionsOption) {
return autoCorrectEnabled;
}
return sp.getBoolean(Settings.PREF_BIGRAM_SUGGESTIONS, resources.getBoolean(
R.bool.config_default_bigram_suggestions));
}
private static boolean isBigramPredictionEnabled(SharedPreferences sp,
Resources resources) {
return sp.getBoolean(Settings.PREF_BIGRAM_PREDICTIONS, resources.getBoolean(
R.bool.config_default_bigram_prediction));
}
private static double getAutoCorrectionThreshold(SharedPreferences sp,
Resources resources) {
final String currentAutoCorrectionSetting = sp.getString(
Settings.PREF_AUTO_CORRECTION_THRESHOLD,
resources.getString(R.string.auto_correction_threshold_mode_index_modest));
final String[] autoCorrectionThresholdValues = resources.getStringArray(
R.array.auto_correction_threshold_values);
// When autoCorrectionThreshold is greater than 1.0, it's like auto correction is off.
double autoCorrectionThreshold = Double.MAX_VALUE;
try {
final int arrayIndex = Integer.valueOf(currentAutoCorrectionSetting);
if (arrayIndex >= 0 && arrayIndex < autoCorrectionThresholdValues.length) {
autoCorrectionThreshold = Double.parseDouble(
autoCorrectionThresholdValues[arrayIndex]);
}
} catch (NumberFormatException e) {
// Whenever the threshold settings are correct, never come here.
autoCorrectionThreshold = Double.MAX_VALUE;
Log.w(TAG, "Cannot load auto correction threshold setting."
+ " currentAutoCorrectionSetting: " + currentAutoCorrectionSetting
+ ", autoCorrectionThresholdValues: "
+ Arrays.toString(autoCorrectionThresholdValues));
}
return autoCorrectionThreshold;
}
private static SuggestedWords createSuggestPuncList(final String puncs) {
SuggestedWords.Builder builder = new SuggestedWords.Builder();
if (puncs != null) {
for (int i = 0; i < puncs.length(); i++) {
builder.addWord(puncs.subSequence(i, i + 1));
}
}
return builder.build();
}
}
private PreferenceScreen mInputLanguageSelection; private PreferenceScreen mInputLanguageSelection;
private CheckBoxPreference mQuickFixes; private CheckBoxPreference mQuickFixes;
private ListPreference mVoicePreference; private ListPreference mVoicePreference;
private ListPreference mSettingsKeyPreference; private ListPreference mSettingsKeyPreference;
private ListPreference mShowCorrectionSuggestionsPreference; private ListPreference mShowCorrectionSuggestionsPreference;
private ListPreference mAutoCorrectionThreshold; private ListPreference mAutoCorrectionThreshold;
private ListPreference mKeyPreviewPopupDismissDelay;
// Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary // Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary
private CheckBoxPreference mBigramSuggestion; private CheckBoxPreference mBigramSuggestion;
// Prediction: use bigrams to predict the next word when there is no input for it yet // Prediction: use bigrams to predict the next word when there is no input for it yet
@ -110,6 +320,8 @@ public class Settings extends PreferenceActivity
@Override @Override
protected void onCreate(Bundle icicle) { protected void onCreate(Bundle icicle) {
super.onCreate(icicle); super.onCreate(icicle);
final Resources res = getResources();
addPreferencesFromResource(R.xml.prefs); addPreferencesFromResource(R.xml.prefs);
mInputLanguageSelection = (PreferenceScreen) findPreference(PREF_SUBTYPES); mInputLanguageSelection = (PreferenceScreen) findPreference(PREF_SUBTYPES);
mInputLanguageSelection.setOnPreferenceClickListener(this); mInputLanguageSelection.setOnPreferenceClickListener(this);
@ -145,13 +357,13 @@ public class Settings extends PreferenceActivity
final PreferenceGroup bigramGroup = final PreferenceGroup bigramGroup =
(PreferenceGroup) findPreference(PREF_NGRAM_SETTINGS_KEY); (PreferenceGroup) findPreference(PREF_NGRAM_SETTINGS_KEY);
final boolean showSettingsKeyOption = getResources().getBoolean( final boolean showSettingsKeyOption = res.getBoolean(
R.bool.config_enable_show_settings_key_option); R.bool.config_enable_show_settings_key_option);
if (!showSettingsKeyOption) { if (!showSettingsKeyOption) {
generalSettings.removePreference(mSettingsKeyPreference); generalSettings.removePreference(mSettingsKeyPreference);
} }
final boolean showVoiceKeyOption = getResources().getBoolean( final boolean showVoiceKeyOption = res.getBoolean(
R.bool.config_enable_show_voice_key_option); R.bool.config_enable_show_voice_key_option);
if (!showVoiceKeyOption) { if (!showVoiceKeyOption) {
generalSettings.removePreference(mVoicePreference); generalSettings.removePreference(mVoicePreference);
@ -161,43 +373,60 @@ public class Settings extends PreferenceActivity
generalSettings.removePreference(findPreference(PREF_VIBRATE_ON)); generalSettings.removePreference(findPreference(PREF_VIBRATE_ON));
} }
final boolean showSubtypeSettings = getResources().getBoolean( final boolean showSubtypeSettings = res.getBoolean(
R.bool.config_enable_show_subtype_settings); R.bool.config_enable_show_subtype_settings);
if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED if (InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED
&& !showSubtypeSettings) { && !showSubtypeSettings) {
generalSettings.removePreference(findPreference(PREF_SUBTYPES)); generalSettings.removePreference(findPreference(PREF_SUBTYPES));
} }
final boolean showPopupOption = getResources().getBoolean( final boolean showPopupOption = res.getBoolean(
R.bool.config_enable_show_popup_on_keypress_option); R.bool.config_enable_show_popup_on_keypress_option);
if (!showPopupOption) { if (!showPopupOption) {
generalSettings.removePreference(findPreference(PREF_POPUP_ON)); generalSettings.removePreference(findPreference(PREF_KEY_PREVIEW_POPUP_ON));
} }
final boolean showRecorrectionOption = getResources().getBoolean( final boolean showRecorrectionOption = res.getBoolean(
R.bool.config_enable_show_recorrection_option); R.bool.config_enable_show_recorrection_option);
if (!showRecorrectionOption) { if (!showRecorrectionOption) {
generalSettings.removePreference(findPreference(PREF_RECORRECTION_ENABLED)); generalSettings.removePreference(findPreference(PREF_RECORRECTION_ENABLED));
} }
final boolean showQuickFixesOption = getResources().getBoolean( final boolean showQuickFixesOption = res.getBoolean(
R.bool.config_enable_quick_fixes_option); R.bool.config_enable_quick_fixes_option);
if (!showQuickFixesOption) { if (!showQuickFixesOption) {
textCorrectionGroup.removePreference(findPreference(PREF_QUICK_FIXES)); textCorrectionGroup.removePreference(findPreference(PREF_QUICK_FIXES));
} }
final boolean showBigramSuggestionsOption = getResources().getBoolean( final boolean showBigramSuggestionsOption = res.getBoolean(
R.bool.config_enable_bigram_suggestions_option); R.bool.config_enable_bigram_suggestions_option);
if (!showBigramSuggestionsOption) { if (!showBigramSuggestionsOption) {
textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_SUGGESTIONS)); textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_SUGGESTIONS));
textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_PREDICTIONS)); textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_PREDICTIONS));
} }
final boolean showUsabilityModeStudyOption = getResources().getBoolean( final boolean showUsabilityModeStudyOption = res.getBoolean(
R.bool.config_enable_usability_study_mode_option); R.bool.config_enable_usability_study_mode_option);
if (!showUsabilityModeStudyOption) { if (!showUsabilityModeStudyOption) {
getPreferenceScreen().removePreference(findPreference(PREF_USABILITY_STUDY_MODE)); getPreferenceScreen().removePreference(findPreference(PREF_USABILITY_STUDY_MODE));
} }
mKeyPreviewPopupDismissDelay =
(ListPreference)findPreference(PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
final String[] entries = new String[] {
res.getString(R.string.key_preview_popup_dismiss_no_delay),
res.getString(R.string.key_preview_popup_dismiss_default_delay),
};
final String popupDismissDelayDefaultValue = Integer.toString(res.getInteger(
R.integer.config_delay_after_preview));
mKeyPreviewPopupDismissDelay.setEntries(entries);
mKeyPreviewPopupDismissDelay.setEntryValues(
new String[] { "0", popupDismissDelayDefaultValue });
if (null == mKeyPreviewPopupDismissDelay.getValue()) {
mKeyPreviewPopupDismissDelay.setValue(popupDismissDelayDefaultValue);
}
mKeyPreviewPopupDismissDelay.setEnabled(
Settings.Values.isKeyPreviewPopupEnabled(prefs, res));
} }
@Override @Override
@ -216,6 +445,7 @@ public class Settings extends PreferenceActivity
} }
updateSettingsKeySummary(); updateSettingsKeySummary();
updateShowCorrectionSuggestionsSummary(); updateShowCorrectionSuggestionsSummary();
updateKeyPreviewPopupDelaySummary();
} }
@Override @Override
@ -234,6 +464,12 @@ public class Settings extends PreferenceActivity
.equals(mVoiceModeOff)) { .equals(mVoiceModeOff)) {
showVoiceConfirmation(); showVoiceConfirmation();
} }
} else if (key.equals(PREF_KEY_PREVIEW_POPUP_ON)) {
final ListPreference popupDismissDelay =
(ListPreference)findPreference(PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
if (null != popupDismissDelay) {
popupDismissDelay.setEnabled(prefs.getBoolean(PREF_KEY_PREVIEW_POPUP_ON, true));
}
} }
ensureConsistencyOfAutoCorrectionSettings(); ensureConsistencyOfAutoCorrectionSettings();
mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff) mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff)
@ -241,6 +477,7 @@ public class Settings extends PreferenceActivity
updateVoiceModeSummary(); updateVoiceModeSummary();
updateSettingsKeySummary(); updateSettingsKeySummary();
updateShowCorrectionSuggestionsSummary(); updateShowCorrectionSuggestionsSummary();
updateKeyPreviewPopupDelaySummary();
} }
@Override @Override
@ -262,11 +499,17 @@ public class Settings extends PreferenceActivity
} }
private void updateSettingsKeySummary() { private void updateSettingsKeySummary() {
final ListPreference lp = mSettingsKeyPreference;
mSettingsKeyPreference.setSummary( mSettingsKeyPreference.setSummary(
getResources().getStringArray(R.array.settings_key_modes) getResources().getStringArray(R.array.settings_key_modes)
[mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]); [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]);
} }
private void updateKeyPreviewPopupDelaySummary() {
final ListPreference lp = mKeyPreviewPopupDismissDelay;
lp.setSummary(lp.getEntries()[lp.findIndexOfValue(lp.getValue())]);
}
private void showVoiceConfirmation() { private void showVoiceConfirmation() {
mOkClicked = false; mOkClicked = false;
showDialog(VOICE_INPUT_CONFIRM_DIALOG); showDialog(VOICE_INPUT_CONFIRM_DIALOG);

View file

@ -62,7 +62,7 @@ public class WordComposer {
mYCoordinates = new int[N]; mYCoordinates = new int[N];
} }
WordComposer(WordComposer source) { public WordComposer(WordComposer source) {
init(source); init(source);
} }