aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/res/layout/suggestions_strip.xml15
-rw-r--r--java/res/values-af/strings.xml2
-rw-r--r--java/res/values-am/strings.xml6
-rw-r--r--java/res/values-az-rAZ/strings-action-keys.xml25
-rw-r--r--java/res/values-az-rAZ/strings.xml12
-rw-r--r--java/res/values-bg/strings.xml6
-rw-r--r--java/res/values-ca/strings.xml6
-rw-r--r--java/res/values-da/strings.xml6
-rw-r--r--java/res/values-es/strings.xml4
-rw-r--r--java/res/values-et-rEE/strings.xml6
-rw-r--r--java/res/values-fa/strings.xml2
-rw-r--r--java/res/values-fi/strings.xml6
-rw-r--r--java/res/values-fr-rCA/strings.xml6
-rw-r--r--java/res/values-fr/strings.xml6
-rw-r--r--java/res/values-hi/strings.xml6
-rw-r--r--java/res/values-hr/strings.xml6
-rw-r--r--java/res/values-in/strings.xml6
-rw-r--r--java/res/values-ja/strings.xml6
-rw-r--r--java/res/values-ka-rGE/strings.xml6
-rw-r--r--java/res/values-km-rKH/strings.xml6
-rw-r--r--java/res/values-ko/strings.xml6
-rw-r--r--java/res/values-lo-rLA/strings.xml6
-rw-r--r--java/res/values-lt/strings.xml6
-rw-r--r--java/res/values-lv/strings.xml6
-rw-r--r--java/res/values-ms-rMY/strings.xml6
-rw-r--r--java/res/values-nb/strings.xml6
-rw-r--r--java/res/values-ne-rNP/strings-action-keys.xml8
-rw-r--r--java/res/values-ne-rNP/strings.xml12
-rw-r--r--java/res/values-pt-rPT/strings.xml6
-rw-r--r--java/res/values-pt/strings.xml10
-rw-r--r--java/res/values-ro/strings.xml6
-rw-r--r--java/res/values-ru/strings.xml6
-rw-r--r--java/res/values-sk/strings.xml6
-rw-r--r--java/res/values-sr/strings.xml6
-rw-r--r--java/res/values-sv/strings.xml6
-rw-r--r--java/res/values-th/strings.xml6
-rw-r--r--java/res/values-tl/strings.xml6
-rw-r--r--java/res/values-tr/strings.xml6
-rw-r--r--java/res/values-uk/strings.xml2
-rw-r--r--java/res/values-vi/strings.xml6
-rw-r--r--java/res/values-zh-rCN/strings.xml6
-rw-r--r--java/res/values-zh-rTW/strings.xml6
-rw-r--r--java/res/values-zu/strings.xml6
-rw-r--r--java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java2
-rw-r--r--java/src/com/android/inputmethod/compat/ViewCompatUtils.java3
-rw-r--r--java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java148
-rw-r--r--java/src/com/android/inputmethod/keyboard/Keyboard.java17
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java172
-rw-r--r--java/src/com/android/inputmethod/latin/RichInputConnection.java11
-rw-r--r--java/src/com/android/inputmethod/latin/WordComposer.java21
-rw-r--r--java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java118
-rw-r--r--java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java14
-rw-r--r--java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java56
-rw-r--r--java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java71
-rw-r--r--java/src/com/android/inputmethod/latin/utils/CoordinateUtils.java13
-rw-r--r--java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java6
-rw-r--r--java/src/com/android/inputmethod/latin/utils/StringUtils.java44
-rw-r--r--java/src/com/android/inputmethod/research/ResearchLogger.java5
58 files changed, 529 insertions, 462 deletions
diff --git a/java/res/layout/suggestions_strip.xml b/java/res/layout/suggestions_strip.xml
index 908e30522..2ffac179c 100644
--- a/java/res/layout/suggestions_strip.xml
+++ b/java/res/layout/suggestions_strip.xml
@@ -25,4 +25,19 @@
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent" />
+ <LinearLayout
+ android:id="@+id/add_to_dictionary_strip"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="invisible">
+ <include
+ layout="@layout/suggestion_word"
+ android:id="@+id/word_to_save" />
+ <include
+ layout="@layout/suggestion_divider" />
+ <include
+ layout="@layout/hint_add_to_dictionary"
+ android:id="@+id/hint_add_to_dictionary" />
+ </LinearLayout>
</merge>
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 6a555631f..e19ddb6be 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -76,7 +76,7 @@
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamiese sweefvoorskou"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Sien die voorgestelde woord tydens gebare"</string>
<string name="gesture_space_aware" msgid="2078291600664682496">"Frasegebaar"</string>
- <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Voer spasies tydens gebare in deur na die spasiesleutel te sweef"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Voer spasies tydens gebare in deur na die spasiesleutel te gly"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Gestoor"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Koppel \'n kopstuk om te hoor hoe wagwoordsleutels hardop gesê word."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Huidige teks is %s"</string>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
index 3027f0fbe..7f73f894f 100644
--- a/java/res/values-am/strings.xml
+++ b/java/res/values-am/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"ምልክት የሚሄድበት መንገድ አሳይ"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"ተለዋዋጭ ተንሳፋፊ ቅድመ-እይታ"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ምልክት እየሰጡ ሳሉ በአስተያየት የተጠቆመው ቃል ይመልከቱ"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"የሐረግ ምልክት"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ምልክት በሚሰጡበት ጊዜ ወደ ክፍተት ቁልፉ በማንሸራተት ክፍተቶችን ያስገቡ"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ተቀምጧል"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"የይለፍቃል ቁልፎች ጮክ በለው ሲነገሩ ለመስማት የጆሮ ማዳመጫ ሰካ::"</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"የአሁኑ ፅሁፍ %s ነው"</string>
diff --git a/java/res/values-az-rAZ/strings-action-keys.xml b/java/res/values-az-rAZ/strings-action-keys.xml
index 4ade3d5c7..513712c40 100644
--- a/java/res/values-az-rAZ/strings-action-keys.xml
+++ b/java/res/values-az-rAZ/strings-action-keys.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
/*
**
-** Copyright 2014, The Android Open Source Project
+** Copyright 2013, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -16,14 +16,15 @@
** See the License for the specific language governing permissions and
** limitations under the License.
*/
--->
+ -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="label_go_key" msgid="1635148082137219148">"Get"</string>
- <string name="label_next_key" msgid="362972844525672568">"Növbəti"</string>
- <string name="label_previous_key" msgid="1211868118071386787">"Əvvəlki"</string>
- <string name="label_done_key" msgid="2441578748772529288">"Hazırdır"</string>
- <string name="label_send_key" msgid="2815056534433717444">"Göndər"</string>
- <string name="label_pause_key" msgid="181098308428035340">"Pauza"</string>
- <string name="label_wait_key" msgid="6402152600878093134">"Gözlə"</string>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="label_go_key" msgid="4033615332628671065">"Keç"</string>
+ <string name="label_next_key" msgid="5586407279258592635">"Növbəti"</string>
+ <string name="label_previous_key" msgid="1421141755779895275">"Öncəki"</string>
+ <string name="label_done_key" msgid="7564866296502630852">"Hazırdır"</string>
+ <string name="label_send_key" msgid="482252074224462163">"Göndər"</string>
+ <string name="label_pause_key" msgid="2225922926459730642">"Pauza"</string>
+ <string name="label_wait_key" msgid="5891247853595466039">"Gözlə"</string>
</resources>
diff --git a/java/res/values-az-rAZ/strings.xml b/java/res/values-az-rAZ/strings.xml
index 8b0602601..b3c93e0d1 100644
--- a/java/res/values-az-rAZ/strings.xml
+++ b/java/res/values-az-rAZ/strings.xml
@@ -46,6 +46,8 @@
<string name="settings_system_default" msgid="6268225104743331821">"Sistem defoltu"</string>
<string name="use_contacts_dict" msgid="4435317977804180815">"Kontakt adları təklif edin"</string>
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"Təklif və korreksiya üçün Kontaktlardakı adlardan istifadə edin"</string>
+ <string name="use_personalized_dicts" msgid="5167396352105467626">"Fərdiləşmiş təkliflər"</string>
+ <string name="use_personalized_dicts_summary" msgid="4331467814162666438">"Təklifləri inkişaf etdirmək üçün rabitənizdən və yazılmış datadan məlumat əldə edin"</string>
<string name="use_double_space_period" msgid="8781529969425082860">"İkili boşluq periodu"</string>
<string name="use_double_space_period_summary" msgid="6532892187247952799">"Boşluqdakı iki klik boşluqdan sonra pauza daxil edir"</string>
<string name="auto_cap" msgid="1719746674854628252">"Avtomatik böyük hərfləşmə"</string>
@@ -73,12 +75,14 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Jest izini göstər"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamik üzmə önizləməsi"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Jest zamanı təklif edilmiş sözə baxın"</string>
- <string name="gesture_space_aware" msgid="8244483979855138643">"Fraza jesti"</string>
- <string name="gesture_space_aware_summary" msgid="3226298212755100667">"Boşluq düyməsinə basmaqla jestlər üzrə boşluqlar qoyun"</string>
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Jest bildirin"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Jest zamanı boşluq düyməsinə toxunmaqla boşluq daxil edin"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Saxlanmış"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Parolu səsli eşitmək üçün qulaqcığı taxın"</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Cari mətn %s\'dir"</string>
<string name="spoken_no_text_entered" msgid="7479685225597344496">"Mətn daxil edilməyib"</string>
+ <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> açarı <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> originalını <xliff:g id="CORRECTED">%3$s</xliff:g> tərəfə düzəliş edir"</string>
+ <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> açarı avtomatik düzəliş edir"</string>
<string name="spoken_description_unknown" msgid="3197434010402179157">"%d açar kodu"</string>
<string name="spoken_description_shift" msgid="244197883292549308">"Sürüşdürmə"</string>
<string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Sürüşdürmə aktivdir (deaktiv etmək üçün klikləyin)"</string>
@@ -117,6 +121,7 @@
<string name="keyboard_mode_time" msgid="4381856885582143277">"vaxt"</string>
<string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
<string name="voice_input" msgid="3583258583521397548">"Səs daxiletmə klavişi"</string>
+ <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Heç bir səs daxiletmə metodu aktiv deyil. Dil və daxiletmə ayarlarını yoxlayın."</string>
<string name="configure_input_method" msgid="373356270290742459">"Daxiletmə üsullarını sazla"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Daxiletmə dilləri"</string>
<string name="send_feedback" msgid="1780431884109392046">"Cavab rəyi göndərin"</string>
@@ -141,6 +146,9 @@
<string name="subtype_no_language_colemak" msgid="5837418400010302623">"Əlifba (Colemak)"</string>
<string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Əlifba (PC)"</string>
<string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string>
+ <string name="keyboard_color_scheme" msgid="9192934113872818070">"Rəng sxemi"</string>
+ <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Ağ"</string>
+ <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Mavi"</string>
<string name="custom_input_styles_title" msgid="8429952441821251512">"Xüsusi daxiletmə üslubları"</string>
<string name="add_style" msgid="6163126614514489951">"Stil əlavə et"</string>
<string name="add" msgid="8299699805688017798">"Əlavə et"</string>
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index ac146ad52..c23c8efbd 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Следа на жестовете: Показване"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамична плаваща визуализация"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Преглед на предложената дума при използване на жестове"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Жест за фрази"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"При жестове въвеждaйте интервали чрез плъзгане през съотв. клавиш"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Запазено"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Включете слушалки, за да чуете клавишите за паролата на висок глас."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Текущият текст е %s"</string>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index a8aa06a91..79382fd00 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Mostra el recorregut del gest"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Visualitz. prèvia dinàmica flotant"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Consulta la paraula suggerida mentre fas el gest"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Formula el gest"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Per afegir espais als gestos, apropa el dit a la tecla d\'espai."</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: desada"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Connecta un auricular per escoltar les claus de la contrasenya en veu alta."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"El text actual és %s"</string>
diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml
index c8225fe65..81f91d395 100644
--- a/java/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Vis glidende trykspor"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamiske ordeksempler"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Se ordforslag ved glidende indtastning"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Bevægelse for udtryk"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Tilføj mellemrum ved at glide til mellemrumstasten"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Gemt"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Tilslut et headset for at høre indtastningen blive læst højt ved angivelse af adgangskode."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Nuværende tekst er %s"</string>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index dbe2d2071..c94e5e730 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -75,8 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar recorrido del gesto"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Vista previa dinámica flotante"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ver palabra sugerida al hacer gestos"</string>
- <string name="gesture_space_aware" msgid="2078291600664682496">"Formular gesto"</string>
- <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Desliza dedo a espacio para introducir espacios durante gestos"</string>
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Gestos con tecla Espacio"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Desliza el dedo a Espacio para introducir espacios durante gestos"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Conecta un auricular para escuchar las contraseñas en voz alta."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"El texto actual es %s."</string>
diff --git a/java/res/values-et-rEE/strings.xml b/java/res/values-et-rEE/strings.xml
index 9a76ddc41..65baeb22f 100644
--- a/java/res/values-et-rEE/strings.xml
+++ b/java/res/values-et-rEE/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Näita liigutuse jälge"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dünaamiline ujuv eelvaade"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Soovitatud sõna vaatamine joonistusega sisestamise ajal"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Fraasi liigutus"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Sisestage liigutuste kasutamisel tühikuid, libistades tühikuklahvile"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : salvestatud"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Ühendage peakomplekt, et kuulata paroole."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Praegune tekst on %s"</string>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index c7251d600..7f747c307 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -76,7 +76,7 @@
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"پیش‌نمایش متحرک پویا"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"مشاهده کلمه پیشنهادی در حین انجام حرکات"</string>
<string name="gesture_space_aware" msgid="2078291600664682496">"‫ورود عبارت با حرکت اشاره‌ای"</string>
- <string name="gesture_space_aware_summary" msgid="4371385818348528538">"در هنگام انجام حرکات اشاره‌ای، برای وارد کردن فاصله از کلید فاصله استفاده کنید"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"با سراندن انگشت به کلید فاصله در زمان اشاره‌ها، فاصله را وارد کنید"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ذخیره شد"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"برای شنیدن کلیدهای گذرواژه که با صدای بلند خوانده می‌شوند، از هدست استفاده کنید."</string>
<!-- String.format failed for translation -->
diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml
index 3ccb67555..bb09eb1d8 100644
--- a/java/res/values-fi/strings.xml
+++ b/java/res/values-fi/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Näytä eleen jälki"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynaaminen kelluva esikatselu"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Näytä ehdotettu sana piirron aikana"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Ilmausele"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Lisää välilyöntejä eleiden aikana liukumalla välilyöntinäppäim."</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: tallennettu"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Liitä kuulokkeet, niin kuulet mitä näppäimiä painat kirjoittaessasi salasanaa."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Nykyinen teksti on %s"</string>
diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml
index 9ed49d9c7..d0649004b 100644
--- a/java/res/values-fr-rCA/strings.xml
+++ b/java/res/values-fr-rCA/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Afficher le tracé du geste"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Aperçu flottant dynamique"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Afficher le mot suggéré lors des gestes"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Geste multiterme"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Insérer une espace avec barre d\'espace lors de l\'entrée gestuelle"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : enregistré"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Branchez des écouteurs pour entendre l\'énoncé à haute voix des touches lors de la saisie du mot de passe."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Le texte actuel est %s"</string>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index 41a2ed7a0..84fb4f8bf 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Afficher le tracé du geste"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Aperçu flottant dynamique"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Afficher le mot suggéré lors des gestes"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Geste multiterme"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Insérer un espace avec barre d\'espace lors de la saisie gestuelle"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : enregistré"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Branchez des écouteurs pour entendre l\'énoncé à haute voix des touches lors de la saisie du mot de passe."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Le texte actuel est %s"</string>
diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml
index 1cea3e1d3..487e65d46 100644
--- a/java/res/values-hi/strings.xml
+++ b/java/res/values-hi/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"जेस्चर ट्रेल दिखाएं"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"गतिशील फ़्लोटिंग पूर्वावलोकन"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"जेस्‍चर बनाते समय सुझाया गया शब्द देखें"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"वाक्यांश जेस्चर"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"स्पेस कुंजी तक ग्लाइड करके जेस्चर के दौरान रिक्तियां इनपुट करें"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: सहेजा गया"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"ज़ोर से बोली गई पासवर्ड कुंजियां सुनने के लिए हेडसेट प्‍लग इन करें."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"वर्तमान पाठ %s है"</string>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index 3dc828302..8f3f86312 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Prikaži trag pokreta"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamički plutajući pregled"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Vidi predloženu riječ tijekom pokreta"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Pokret fraze"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Umećite razmake tijekom izvođenja pokreta klizeći do razmaknice"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Spremljeno"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Priključite slušalice da biste čuli tipke zaporke izgovorene naglas."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Trenutačni tekst je %s"</string>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 927242841..4f69df96f 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Tampilkan jalur isyarat"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Pratinjau mengambang dinamis"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Lihat kata yang disarankan saat melakukan isyarat"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Isyarat frasa"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Masukkan spasi dalam isyarat dengan meluncur ke tombol spasi"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Telah disimpan"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Pasang headset untuk mendengar tombol sandi yang diucapkan dengan keras."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Teks saat ini adalah %s"</string>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index b3df1de2d..6617a275c 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"ジェスチャートレイルを表示"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"動的フローティングプレビュー"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ジェスチャーで入力候補を表示できます"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"フレーズジェスチャー"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Spaceキーに指を滑らせると、ジェスチャー中にスペースを入力できます"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:保存しました"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"パスワードのキーが音声出力されるのでヘッドセットを接続してください。"</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"現在のテキスト:%s"</string>
diff --git a/java/res/values-ka-rGE/strings.xml b/java/res/values-ka-rGE/strings.xml
index f5c678715..18c9a4035 100644
--- a/java/res/values-ka-rGE/strings.xml
+++ b/java/res/values-ka-rGE/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"ჟესტიკულაციის კუდის ჩვენება"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"დინამიურად მოლივლივე გადახედვა"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ჟესტიკულაციისას შეთავაზებული სიტყვის ნახვა"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"ფრაზის ჟესტი"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"შეიყვანეთ შორისები ჟესტიკულაციისას შორისის კლავიშზე გასრიალებით"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : შეინახა"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"შეაერთეთ ყურსაცვამი, რათა მოისმინოთ აკრეფილი პაროლის კლავიშების სახელები."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"მიმდინარე ტექსტი არის %s"</string>
diff --git a/java/res/values-km-rKH/strings.xml b/java/res/values-km-rKH/strings.xml
index 4fe3fd596..498240645 100644
--- a/java/res/values-km-rKH/strings.xml
+++ b/java/res/values-km-rKH/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"បង្ហាញ​ដាន​កាយវិការ"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"មើល​ការ​​អណ្ដែត​ដែល​មាន​ចលនា​ជា​មុន"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"​មើល​ពាក្យ​​​ដែល​បាន​ស្នើ​​​ខណៈ​ពេល​កំពុង​ធ្វើ​កាយ​វិការ"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"កាយវិការ​​ឃ្លា"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"បញ្ចូល​​ដកឃ្លា​​​អំឡុង​​​កាយវិការ​ ដោយ​រំកិល​ទៅ​គ្រាប់​ចុច​ដកឃ្លា"</string>
<string name="added_word" msgid="8993883354622484372">"បាន​រក្សាទុក <xliff:g id="WORD">%s</xliff:g> ៖"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"ដោត​កាស ដើម្បី​ស្ដាប់​ពាក្យ​សម្ងាត់។"</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"អត្ថបទ​បច្ចុប្បន្ន​គឺ %s"</string>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index d353ca9c3..2639bf745 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"제스처 흔적 표시"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"동적 플로팅 미리보기"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"제스처에 따라 추천 단어 보기"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"구문 동작"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"동작 중에 스페이스바 쪽으로 움직여 공백 입력"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: 저장됨"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"비밀번호 키를 음성으로 들으려면 헤드셋을 연결하세요."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"입력한 텍스트: %s"</string>
diff --git a/java/res/values-lo-rLA/strings.xml b/java/res/values-lo-rLA/strings.xml
index d0051aed9..e8e413640 100644
--- a/java/res/values-lo-rLA/strings.xml
+++ b/java/res/values-lo-rLA/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"ສະແດງຫາງຂອງ Gesture"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"ມີຄຳຕົວຢ່າງລອຍຂຶ້ນມາ"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ເບິ່ງຄຳທີ່ຖືກແນະນຳໃນເວລາທີ່ກຳລັງຊີ້"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"ການສະແດງທ່າທາງດ້ວຍປະໂຫຍກ"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ໃສ່ຍະຫວ່າງເຂົ້າໄປໃນຂະນະທີ່ສະແດງທ່າທາງ ໂດຍການເລື່ອນໄປທີ່ປຸ່ມຍະຫວ່າງ"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ບັນທຶກແລ້ວ"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"ສຽບສາຍຫູຟັງເພື່ອຟັງລະຫັດຜ່ານ."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"ຂໍ້ຄວາມປະຈຸບັນແມ່ນ %s"</string>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index 1b2332921..8d35e46fe 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Rodyti gestų kelią"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinaminė slankioji peržiūra"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Gestikuliuojant peržiūrėti siūlomą žodį"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Frazės gestas"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Atlikdami gestus įveskite tarpus perbraukę tarpo klavišą"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: išsaugota"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Prijunkite ausines, kad išgirstumėte sakomus slaptažodžio klavišus."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Dabartinis tekstas yra %s"</string>
diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml
index b5f0c47b0..d764e2c6e 100644
--- a/java/res/values-lv/strings.xml
+++ b/java/res/values-lv/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Rādīt žesta pēdas"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamisk. peldošais priekšsk."</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Skatiet ieteikto vārdu, veicot žestu."</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Frāzes žests"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Lai ievietotu atstarpi, velciet uz atstarpes taustiņu."</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: saglabāts"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Pievienojiet austiņas, lai dzirdētu paroles rakstzīmes."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Pašreizējais teksts ir %s"</string>
diff --git a/java/res/values-ms-rMY/strings.xml b/java/res/values-ms-rMY/strings.xml
index dca3eeb46..364cfcab4 100644
--- a/java/res/values-ms-rMY/strings.xml
+++ b/java/res/values-ms-rMY/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Tunjukkan jejak gerak isyarat"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Pratonton terapung dinamik"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Lihat perkataan yang dicadangkan semasa membuat gerak isyarat"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Gerak isyarat frasa"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Luncur ke kekunci ruang untuk masukkan ruang semasa gerak isyarat"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Disimpan"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Pasangkan set kepala untuk mendengar kekunci kata laluan disebut dengan kuat."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Teks semasa adalah %s"</string>
diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
index 5ddb30ee0..91d4c54e5 100644
--- a/java/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Vis bevegelsesspor"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamisk flytende forhåndsvsn."</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Se det foreslåtte ordet mens du utfører bevegelser"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Frasebevegelse"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Sett inn mellomrom ved å dra fingeren til mellomromstasten"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Lagret"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Koble til hodetelefoner for å høre opplesing av bokstavene i passordet."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Gjeldende tekst er %s"</string>
diff --git a/java/res/values-ne-rNP/strings-action-keys.xml b/java/res/values-ne-rNP/strings-action-keys.xml
index e32ded842..34b0a14a7 100644
--- a/java/res/values-ne-rNP/strings-action-keys.xml
+++ b/java/res/values-ne-rNP/strings-action-keys.xml
@@ -2,7 +2,7 @@
<!--
/*
**
-** Copyright 2014, The Android Open Source Project
+** Copyright 2013, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -20,11 +20,11 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="label_go_key" msgid="4033615332628671065">"जानुहोस्"</string>
+ <string name="label_go_key" msgid="4033615332628671065">"जानु"</string>
<string name="label_next_key" msgid="5586407279258592635">"अर्को"</string>
- <string name="label_previous_key" msgid="1421141755779895275">"अघिल्लो"</string>
+ <string name="label_previous_key" msgid="1421141755779895275">"पहिलो"</string>
<string name="label_done_key" msgid="7564866296502630852">"भयो"</string>
<string name="label_send_key" msgid="482252074224462163">"पठाउनुहोस्"</string>
<string name="label_pause_key" msgid="2225922926459730642">"रोक्नुहोस्"</string>
- <string name="label_wait_key" msgid="5891247853595466039">"प्रतीक्षा गर्नुहोस्"</string>
+ <string name="label_wait_key" msgid="5891247853595466039">"पर्खनुहोस्"</string>
</resources>
diff --git a/java/res/values-ne-rNP/strings.xml b/java/res/values-ne-rNP/strings.xml
index 21b3b45ca..c4792dc5a 100644
--- a/java/res/values-ne-rNP/strings.xml
+++ b/java/res/values-ne-rNP/strings.xml
@@ -46,6 +46,8 @@
<string name="settings_system_default" msgid="6268225104743331821">"प्रणाली पूर्वनिर्धारित"</string>
<string name="use_contacts_dict" msgid="4435317977804180815">"सम्पर्क नामहरू सुझाव गर्नुहोस्"</string>
<string name="use_contacts_dict_summary" msgid="6599983334507879959">"सुझाव र सुधारका लागि सम्पर्कबाट नामहरू प्रयोग गर्नुहोस्"</string>
+ <string name="use_personalized_dicts" msgid="5167396352105467626">"निजीकृत सुझावहरू"</string>
+ <string name="use_personalized_dicts_summary" msgid="4331467814162666438">"सुझावहरू सुधार गर्न तपाईँको सञ्‍चारहरू र टाइप गरिएको डेटाबाट जान्नुहोस्"</string>
<string name="use_double_space_period" msgid="8781529969425082860">"डबल-स्पेस पूर्णविराम"</string>
<string name="use_double_space_period_summary" msgid="6532892187247952799">"स्पेसबारमा डबल ट्याप गर्नाले पूर्णविरामपछि स्पेस राख्दछ"</string>
<string name="auto_cap" msgid="1719746674854628252">"स्वतः पूँजिकरण"</string>
@@ -73,10 +75,14 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"इशारा ट्रेल देखाउनुहोस्"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"गतिशील फ्लोटिङ पूर्वावलोकन"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"इशारा गर्दा सुझाव दिइएको शब्द हेर्नुहोस्"</string>
+ <string name="gesture_space_aware" msgid="2078291600664682496">"वाक्यांश इशारा"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"इशारा सत्र दैरान space दिखिल गर्न space key मा ग्लाइडि गर्नुहोस्"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : बचत गरियो"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"हेडसेट प्लग इन गर्नुहोस्"</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"वर्तमान पाठ %s हो"</string>
<string name="spoken_no_text_entered" msgid="7479685225597344496">"कुनै पाठ प्रविष्टि गरिएको छैन"</string>
+ <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> लाई <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> मा <xliff:g id="CORRECTED">%3$s</xliff:g> ले सच्याईयो"</string>
+ <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> स्वतः सुधार गर्छ"</string>
<string name="spoken_description_unknown" msgid="3197434010402179157">"कुञ्जी कोड %d"</string>
<string name="spoken_description_shift" msgid="244197883292549308">"सिफ्ट"</string>
<string name="spoken_description_shift_shifted" msgid="1681877323344195035">"सिप्ट सक्रिय (असक्षम पार्न ट्याप गर्नुहोस्)"</string>
@@ -115,6 +121,7 @@
<string name="keyboard_mode_time" msgid="4381856885582143277">"समय"</string>
<string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
<string name="voice_input" msgid="3583258583521397548">"आवाज इनपुट कुञ्जी"</string>
+ <string name="voice_input_disabled_summary" msgid="8141750303464726129">"कुनै आवाज इनपुट विधिहरू सक्षम गरिएका छैनन्। भाषा र इनपुट सेटिङहरूको जाँच गर्नुहोस्।"</string>
<string name="configure_input_method" msgid="373356270290742459">"इनपुट विधिहरू कन्फिगर गर्नुहोस्"</string>
<string name="language_selection_title" msgid="1651299598555326750">"इनपुट भाषाहरू"</string>
<string name="send_feedback" msgid="1780431884109392046">"प्रतिक्रिया पठाउनुहोस्"</string>
@@ -139,6 +146,9 @@
<string name="subtype_no_language_colemak" msgid="5837418400010302623">"वर्णमाला (Colemak)"</string>
<string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"वर्णमाला (PC)"</string>
<string name="subtype_emoji" msgid="7483586578074549196">"इमोजी"</string>
+ <string name="keyboard_color_scheme" msgid="9192934113872818070">"रङ योजना"</string>
+ <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"सेतो"</string>
+ <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"नीलो"</string>
<string name="custom_input_styles_title" msgid="8429952441821251512">"अनुकूलन इनपुट शैली"</string>
<string name="add_style" msgid="6163126614514489951">"शैली थप्नुहोस्"</string>
<string name="add" msgid="8299699805688017798">"थप्नुहोस्"</string>
@@ -202,7 +212,7 @@
<string name="install_dict" msgid="180852772562189365">"स्थापना गर्नुहोस्"</string>
<string name="cancel_download_dict" msgid="7843340278507019303">"रद्द गर्नुहोस्"</string>
<string name="delete_dict" msgid="756853268088330054">"मेट्नुहोस्"</string>
- <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"तपाईँको मोबाइल उपकरणमा चयन गरिएको भाषामा शब्दकोश उपलब्ध छ। हामी सिफारिश गर्छौं <xliff:g id="LANGUAGE">%1$s</xliff:g> शब्दकोश डाउनलोड गर्नका लागि तपाईँको टाइपिङ अनुभव सुधार्न। यस डाउनलोड 3G मा एक वा दुई मिनेट लाग्छ। शुल्कहरू लाग्न सक्छ यदि तपाईँसँग असीमित डेटा योजना छैन भने। यदि आफूसँग कुन डेटा योजना छ तपाईँ यकिन हुनुहुन्न भने हामी स्वचालित रूपमा डाउनलोड सुरु गर्न वाइ-फाइ जडान खोज्न सिफारिस गर्छौं। सल्लाह: तपाईँको मोबाइल उपकरणको भाषा र इनपुट सेटिङ मेनुमा गई तपाईँ शब्दकोशलाई डाउनलोड वा हटाउन सक्नुहुन्छ।"</string>
+ <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"तपाईँको मोबाइल उपकरणमा चयन गरिएको भाषामा शब्दकोश उपलब्ध छ। हामी सिफारिश गर्छौं <xliff:g id="LANGUAGE">%1$s</xliff:g> शब्दकोश डाउनलोड गर्नका लागि तपाईँको टाइपिङ अनुभव सुधार्न। यस डाउनलोड 3G मा एक वा दुई मिनेट लाग्छ। शुल्कहरू लाग्न सक्छ यदि तपाईँसँग असीमित डेटा योजना छैन भने। यदि आफूसँग कुन डेटा योजना छ तपाईँ यकिन हुनुहुन्न भने हामी स्वचालित रूपमा डाउनलोड सुरु गर्न वाइफाइ जडान खोज्न सिफारिस गर्छौं। सल्लाह: तपाईँको मोबाइल उपकरणको भाषा र इनपुट सेटिङ मेनुमा गई तपाईँ शब्दकोशलाई डाउनलोड वा हटाउन सक्नुहुन्छ।"</string>
<string name="download_over_metered" msgid="1643065851159409546">"(अब डाउनलोड गर्नुहोस्<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string>
<string name="do_not_download_over_metered" msgid="2176209579313941583">"वाइ-फाइको माध्ययमद्वार डाउनलोड गर्नुहोस्"</string>
<string name="dict_available_notification_title" msgid="6514288591959117288">"एक शब्दकोश <xliff:g id="LANGUAGE">%1$s</xliff:g> का लागि उपलब्ध छ"</string>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 7681914f6..844c4189e 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar percurso do gesto"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Pré-visual. flutuante dinâmica"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ver palavra sugerida enquanto toca"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Toque de expressão"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Deslize p/ a tecla de espaço p/ introduzir espaços durante toques"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Ligar auscultadores com microfone integrado para ouvir as teclas da palavra-passe."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"O texto atual é %s"</string>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index 990e2de28..27e5e0faf 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -68,17 +68,15 @@
<string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderado"</string>
<string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Agressivo"</string>
<string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Muito agressivo"</string>
- <string name="bigram_prediction" msgid="1084449187723948550">"Sugestões para a palavra seguinte"</string>
+ <string name="bigram_prediction" msgid="1084449187723948550">"Sugerir palavra seguinte"</string>
<string name="bigram_prediction_summary" msgid="3896362682751109677">"Usar a palavra anterior ao fazer sugestões"</string>
<string name="gesture_input" msgid="826951152254563827">"Ativar a escrita com gestos"</string>
<string name="gesture_input_summary" msgid="9180350639305731231">"Inserir uma palavra deslizando os dedos pelas letras"</string>
<string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar percurso do gesto"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Previsão dinâmica flutuante"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ver a palavra sugerida ao usar gestos"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Gesto de frase"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Inserir espaços durante gestos deslizando até a tecla de espaço"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Salvo"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Conecte um fone de ouvido para ouvir as chaves de senha em voz alta."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"O texto atual é %s"</string>
@@ -122,7 +120,7 @@
<string name="keyboard_mode_text" msgid="6479436687899701619">"texto"</string>
<string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string>
<string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
- <string name="voice_input" msgid="3583258583521397548">"Chave de entrada de texto por voz"</string>
+ <string name="voice_input" msgid="3583258583521397548">"Tecla p/ inserir texto por voz"</string>
<string name="voice_input_disabled_summary" msgid="8141750303464726129">"Nenhum método de entrada de texto por voz ativado. Verifique as configurações \"Idioma e entrada\"."</string>
<string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string>
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index 3d68e06da..e9a26ff75 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Se afişează urma gestului"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Sugestie flotantă dinamică"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Afişaţi cuvântul sugerat când utilizaţi gesturi"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Gest expresie"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Introduceți spații în timpul gesturilor, glisând pe tasta spațiu"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: salvat"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Conectaţi un set căşti-microfon pentru a auzi tastele apăsate când introduceţi parola."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Textul curent este %s"</string>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index c7e8f72d2..526e297e5 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Рисовать линию"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Показывать подсказки"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Показывать подсказки при вводе текста"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Непрерывный ввод фраз"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Проводите по клавише пробела после каждого слова"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: сохранено"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Подключите гарнитуру, чтобы услышать пароль."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Введенный текст: %s."</string>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index 927f03700..309e08001 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Zobrazovať stopu gesta"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamická plávajúca ukážka"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Zobrazenie navrhovaného slova pri písaní gestami"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Frázové gesto"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Medzery medzi gestá vložíte prejdením po klávese medzerníka"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Uložené"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Ak si chcete pri zadávaní hesla vypočuť nahlas vyslovené klávesy, pripojte náhlavnú súpravu."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Aktuálny text je %s"</string>
diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml
index 9dd59c5a2..4f5b254f2 100644
--- a/java/res/values-sr/strings.xml
+++ b/java/res/values-sr/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Прикажи траг покрета"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамички плутајући преглед"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Приказује предложену реч при уносу покретом"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Покрет за фразе"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Уносите размаке током покрета преласком до тастера за размак"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Сачувано"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Укључите слушалице да бисте чули наглас изговорене тастере за лозинку."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Тренутни текст је %s"</string>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index 0163afa62..c02884749 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Visa spår efter rörelse"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Visa ordförslag vid svepskrivning"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ordförslaget visas i rörelsen medan du skriver"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Frasrörelse"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Infoga blanksteg genom att dra fingret över blankstegstangenten"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: sparat"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Anslut hörlurar om du vill att lösenordet ska läsas upp."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Nuvarande text är %s"</string>
diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml
index 10448ca7b..0ba43ed9b 100644
--- a/java/res/values-th/strings.xml
+++ b/java/res/values-th/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"แสดงรอยทางเดินของท่าทางสัมผัส"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"ดูตัวอย่างลอยแบบไดนามิก"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ดูคำแนะนำในขณะที่ใช้ท่าทางสัมผัส"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"ท่าทางสัมผัสสำหรับวลี"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ใส่ช่องว่างระหว่างท่าทางสัมผัสโดยเลื่อนไปยังแป้นเคาะวรรค"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : บันทึกแล้ว"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"เสียบชุดหูฟังเพื่อฟังเสียงเมื่อพิมพ์รหัสผ่าน"</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"ข้อความปัจจุบันคือ %s"</string>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index 1e7467297..bec32e875 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Ipakita ang trail ng galaw"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamic na floating preview"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Tingnan ang iminungkahing salita habang gumagalaw"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Phrase gesture"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Maglagay ng espasyo sa pamamagitan ng pag-glide sa space key"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Na-save"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Mag-plug in ng headset upang marinig ang mga password key na binabanggit nang malakas."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Ang kasalukuyang teksto ay %s"</string>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index 161f155c3..32d5f91cd 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Hareket izini göster"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamik kayan önizleme"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Hareket sırasında önerilen kelimeyi göster"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Kelime öbeği hareketi"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Hareketle girişte boşlukları, boşluk tuşuna kaydırarak girin"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kaydedildi"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Şifre tuşlarının sesli okunmasını dinlemek için mikrofonlu kulaklık takın."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Mevcut metin: %s"</string>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 5d342ce36..7eb3ca6f5 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -75,7 +75,7 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Показувати слід жестів"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамічний спливаючий перегляд"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Показувати пропоноване слово під час введення тексту жестами"</string>
- <string name="gesture_space_aware" msgid="2078291600664682496">"Ввід фраз жестами"</string>
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Безперервний ввід фраз"</string>
<string name="gesture_space_aware_summary" msgid="4371385818348528538">"Вставляйте пробіли, проводячи пальцем по клавіші пробілу"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : збережено"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Підключіть гарнітуру, щоб прослухати відтворені вголос символи пароля."</string>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index 2403a595e..f71e83e04 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Hiển thị vệt cử chỉ"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Xem trước nổi động"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Xem từ được đề xuất trong khi dùng cử chỉ"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Cử chỉ nhập cụm từ"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Nhập dấu cách khi thực hiện cử chỉ bằng cách trượt tới phím cách"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Đã lưu"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Cắm tai nghe để nghe mật khẩu."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Ký tự hiện tại là %s"</string>
diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
index 4e5a12489..367f85a60 100644
--- a/java/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"显示滑行输入轨迹"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"动态漂浮预览"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"在滑行输入过程中显示建议字词"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"词组滑行输入"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"滑行输入时,滑过空格键即可输入空格"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已保存"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"需要插入耳机才能听到密码的按键声。"</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"当前文本为%s"</string>
diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
index 064e23584..4af6c2299 100644
--- a/java/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"顯示手勢軌跡"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"動態浮動預覽"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"使用滑行輸入時顯示建議字詞"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"詞組手勢"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"手勢輸入時,滑過空格鍵即可輸入空格"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已儲存"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"連接耳機即可聽取系統朗讀密碼按鍵。"</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"目前文字為 %s"</string>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index 03a690cb5..561a65a6f 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -75,10 +75,8 @@
<string name="gesture_preview_trail" msgid="3802333369335722221">"Bonisa i-trail yokuthinta"</string>
<string name="gesture_floating_preview_text" msgid="4443240334739381053">"Ukuhlola kuqala okuntantayo okunamandla"</string>
<string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Bona igama eliphakanyisiwe ngenkathi uthinta"</string>
- <!-- no translation found for gesture_space_aware (2078291600664682496) -->
- <skip />
- <!-- no translation found for gesture_space_aware_summary (4371385818348528538) -->
- <skip />
+ <string name="gesture_space_aware" msgid="2078291600664682496">"Igama lokuthinta"</string>
+ <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Faka izikhala ngesikhathi sokuthinta ngokushelelela kukhiye wesikhala"</string>
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kulondoloziwe"</string>
<string name="spoken_use_headphones" msgid="896961781287283493">"Plaka ku-headset ukuze uzwe okhiye bephasiwedi ezindlebeni zakho bezwakala kakhulu."</string>
<string name="spoken_current_text_is" msgid="2485723011272583845">"Umbhalo wamanje ngu %s"</string>
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
index 10fb9fef4..216a825e0 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java
@@ -158,7 +158,7 @@ public final class AccessibilityUtils {
* @param typedWord the currently typed word
*/
public void setAutoCorrection(final SuggestedWords suggestedWords, final String typedWord) {
- if (suggestedWords != null && suggestedWords.mWillAutoCorrect) {
+ if (suggestedWords.mWillAutoCorrect) {
mAutoCorrectionWord = suggestedWords.getWord(SuggestedWords.INDEX_OF_AUTO_CORRECTION);
mTypedWord = typedWord;
} else {
diff --git a/java/src/com/android/inputmethod/compat/ViewCompatUtils.java b/java/src/com/android/inputmethod/compat/ViewCompatUtils.java
index a8fab8855..dec739d39 100644
--- a/java/src/com/android/inputmethod/compat/ViewCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/ViewCompatUtils.java
@@ -20,6 +20,9 @@ import android.view.View;
import java.lang.reflect.Method;
+// TODO: Use {@link android.support.v4.view.ViewCompat} instead of this utility class.
+// Currently {@link #getPaddingEnd(View)} and {@link #setPaddingRelative(View,int,int,int,int)}
+// are missing from android-support-v4 static library in KitKat SDK.
public final class ViewCompatUtils {
// Note that View.LAYOUT_DIRECTION_LTR and View.LAYOUT_DIRECTION_RTL have been introduced in
// API level 17 (Build.VERSION_CODE.JELLY_BEAN_MR1).
diff --git a/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java b/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
index 8dea908e8..5bde668e1 100644
--- a/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
+++ b/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
@@ -23,12 +23,13 @@ import android.content.SharedPreferences;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
+import android.graphics.Color;
import android.graphics.Rect;
import android.os.Build;
+import android.os.CountDownTimer;
import android.preference.PreferenceManager;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
-import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Pair;
@@ -58,6 +59,7 @@ import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
/**
* View class to implement Emoji palettes.
@@ -752,9 +754,8 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange
}
}
- // TODO: Do the same things done in PointerTracker
private static class DeleteKeyOnTouchListener implements OnTouchListener {
- private static final long MAX_REPEAT_COUNT_TIME = 30 * DateUtils.SECOND_IN_MILLIS;
+ private static final long MAX_REPEAT_COUNT_TIME = TimeUnit.SECONDS.toMillis(30);
private final int mDeleteKeyPressedBackgroundColor;
private final long mKeyRepeatStartTimeout;
private final long mKeyRepeatInterval;
@@ -765,80 +766,117 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange
res.getColor(R.color.emoji_key_pressed_background_color);
mKeyRepeatStartTimeout = res.getInteger(R.integer.config_key_repeat_start_timeout);
mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval);
+ mTimer = new CountDownTimer(MAX_REPEAT_COUNT_TIME, mKeyRepeatInterval) {
+ @Override
+ public void onTick(long millisUntilFinished) {
+ final long elapsed = MAX_REPEAT_COUNT_TIME - millisUntilFinished;
+ if (elapsed < mKeyRepeatStartTimeout) {
+ return;
+ }
+ onKeyRepeat();
+ }
+ @Override
+ public void onFinish() {
+ onKeyRepeat();
+ }
+ };
}
+ /** Key-repeat state. */
+ private static final int KEY_REPEAT_STATE_INITIALIZED = 0;
+ // The key is touched but auto key-repeat is not started yet.
+ private static final int KEY_REPEAT_STATE_KEY_DOWN = 1;
+ // At least one key-repeat event has already been triggered and the key is not released.
+ private static final int KEY_REPEAT_STATE_KEY_REPEAT = 2;
+
private KeyboardActionListener mKeyboardActionListener =
KeyboardActionListener.EMPTY_LISTENER;
- private DummyRepeatKeyRepeatTimer mTimer;
- private synchronized void startRepeat() {
- if (mTimer != null) {
- abortRepeat();
- }
- mTimer = new DummyRepeatKeyRepeatTimer();
- mTimer.start();
- }
+ // TODO: Do the same things done in PointerTracker
+ private final CountDownTimer mTimer;
+ private int mState = KEY_REPEAT_STATE_INITIALIZED;
+ private int mRepeatCount = 0;
- private synchronized void abortRepeat() {
- mTimer.abort();
- mTimer = null;
+ public void setKeyboardActionListener(final KeyboardActionListener listener) {
+ mKeyboardActionListener = listener;
}
- // TODO: Remove
- // This function is mimicking the repeat code in PointerTracker.
- // Specifically referring to PointerTracker#startRepeatKey and PointerTracker#onKeyRepeat.
- private class DummyRepeatKeyRepeatTimer extends Thread {
- public boolean mAborted = false;
-
- @Override
- public void run() {
- int repeatCount = 1;
- int timeCount = 0;
- while (timeCount < MAX_REPEAT_COUNT_TIME && !mAborted) {
- if (timeCount > mKeyRepeatStartTimeout) {
- pressDelete(repeatCount);
- }
- timeCount += mKeyRepeatInterval;
- ++repeatCount;
- try {
- Thread.sleep(mKeyRepeatInterval);
- } catch (InterruptedException e) {
- }
+ @Override
+ public boolean onTouch(final View v, final MotionEvent event) {
+ switch (event.getActionMasked()) {
+ case MotionEvent.ACTION_DOWN:
+ onTouchDown(v);
+ return true;
+ case MotionEvent.ACTION_MOVE:
+ final float x = event.getX();
+ final float y = event.getY();
+ if (x < 0.0f || v.getWidth() < x || y < 0.0f || v.getHeight() < y) {
+ // Stop generating key events once the finger moves away from the view area.
+ onTouchCanceled(v);
}
+ return true;
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ onTouchUp(v);
+ return true;
}
-
- public void abort() {
- mAborted = true;
- }
+ return false;
}
- public void pressDelete(final int repeatCount) {
+ private void handleKeyDown() {
mKeyboardActionListener.onPressKey(
- Constants.CODE_DELETE, repeatCount, true /* isSinglePointer */);
+ Constants.CODE_DELETE, mRepeatCount, true /* isSinglePointer */);
+ }
+
+ private void handleKeyUp() {
mKeyboardActionListener.onCodeInput(
Constants.CODE_DELETE, NOT_A_COORDINATE, NOT_A_COORDINATE);
mKeyboardActionListener.onReleaseKey(
Constants.CODE_DELETE, false /* withSliding */);
+ ++mRepeatCount;
}
- public void setKeyboardActionListener(final KeyboardActionListener listener) {
- mKeyboardActionListener = listener;
+ private void onTouchDown(final View v) {
+ mTimer.cancel();
+ mRepeatCount = 0;
+ handleKeyDown();
+ v.setBackgroundColor(mDeleteKeyPressedBackgroundColor);
+ mState = KEY_REPEAT_STATE_KEY_DOWN;
+ mTimer.start();
}
- @Override
- public boolean onTouch(final View v, final MotionEvent event) {
- switch(event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- v.setBackgroundColor(mDeleteKeyPressedBackgroundColor);
- pressDelete(0 /* repeatCount */);
- startRepeat();
- return true;
- case MotionEvent.ACTION_UP:
- v.setBackgroundColor(0);
- abortRepeat();
- return true;
+ private void onTouchUp(final View v) {
+ mTimer.cancel();
+ if (mState == KEY_REPEAT_STATE_KEY_DOWN) {
+ handleKeyUp();
+ }
+ v.setBackgroundColor(Color.TRANSPARENT);
+ mState = KEY_REPEAT_STATE_INITIALIZED;
+ }
+
+ private void onTouchCanceled(final View v) {
+ mTimer.cancel();
+ v.setBackgroundColor(Color.TRANSPARENT);
+ mState = KEY_REPEAT_STATE_INITIALIZED;
+ }
+
+ // Called by {@link #mTimer} in the UI thread as an auto key-repeat signal.
+ private void onKeyRepeat() {
+ switch (mState) {
+ case KEY_REPEAT_STATE_INITIALIZED:
+ // Basically this should not happen.
+ break;
+ case KEY_REPEAT_STATE_KEY_DOWN:
+ // Do not call {@link #handleKeyDown} here because it has already been called
+ // in {@link #onTouchDown}.
+ handleKeyUp();
+ mState = KEY_REPEAT_STATE_KEY_REPEAT;
+ break;
+ case KEY_REPEAT_STATE_KEY_REPEAT:
+ handleKeyDown();
+ handleKeyUp();
+ break;
}
- return false;
}
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index bc1383aff..4fd3bac2f 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -23,6 +23,7 @@ import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
import com.android.inputmethod.keyboard.internal.KeyboardParams;
import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.utils.CoordinateUtils;
/**
* Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard
@@ -217,4 +218,20 @@ public class Keyboard {
final int adjustedY = Math.max(0, Math.min(y, mOccupiedHeight - 1));
return mProximityInfo.getNearestKeys(adjustedX, adjustedY);
}
+
+ public int[] getCoordinates(final int[] codePoints) {
+ final int length = codePoints.length;
+ final int[] coordinates = CoordinateUtils.newCoordinateArray(length);
+ for (int i = 0; i < length; ++i) {
+ final Key key = getKey(codePoints[i]);
+ if (null != key) {
+ CoordinateUtils.setXYInArray(coordinates, i,
+ key.getX() + key.getWidth() / 2, key.getY() + key.getHeight() / 2);
+ } else {
+ CoordinateUtils.setXYInArray(coordinates, i,
+ Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
+ }
+ }
+ return coordinates;
+ }
}
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index a4253bb3b..ba7503dae 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -59,7 +59,6 @@ import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.compat.InputMethodServiceCompatUtils;
import com.android.inputmethod.dictionarypack.DictionaryPackConstants;
-import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardActionListener;
import com.android.inputmethod.keyboard.KeyboardId;
@@ -790,7 +789,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
if (mSuggestionStripView != null) {
// This will set the punctuation suggestions if next word suggestion is off;
// otherwise it will clear the suggestion strip.
- setPunctuationSuggestions();
+ setNeutralSuggestionStrip();
}
// Sometimes, while rotating, for some reason the framework tells the app we are not
@@ -889,10 +888,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
mInputLogic.finishInput();
// Notify ResearchLogger
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
- ResearchLogger.latinIME_onFinishInputViewInternal(finishingInput,
- // TODO[IL]: mInputLogic.mConnection should be private
- mInputLogic.mConnection.getExpectedSelectionStart(),
- mInputLogic.mConnection.getExpectedSelectionEnd(), getCurrentInputConnection());
+ ResearchLogger.latinIME_onFinishInputViewInternal(finishingInput);
}
}
@@ -916,63 +912,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
composingSpanEnd, mInputLogic.mConnection);
}
- final boolean selectionChanged = oldSelStart != newSelStart || oldSelEnd != newSelEnd;
-
- // if composingSpanStart and composingSpanEnd are -1, it means there is no composing
- // span in the view - we can use that to narrow down whether the cursor was moved
- // by us or not. If we are composing a word but there is no composing span, then
- // we know for sure the cursor moved while we were composing and we should reset
- // the state. TODO: rescind this policy: the framework never removes the composing
- // span on its own accord while editing. This test is useless.
- final boolean noComposingSpan = composingSpanStart == -1 && composingSpanEnd == -1;
-
// If the keyboard is not visible, we don't need to do all the housekeeping work, as it
// will be reset when the keyboard shows up anyway.
// TODO: revisit this when LatinIME supports hardware keyboards.
// NOTE: the test harness subclasses LatinIME and overrides isInputViewShown().
// TODO: find a better way to simulate actual execution.
- if (isInputViewShown() && !mInputLogic.mConnection.isBelatedExpectedUpdate(oldSelStart,
- newSelStart, oldSelEnd, newSelEnd)) {
- // TODO: the following is probably better done in resetEntireInputState().
- // it should only happen when the cursor moved, and the very purpose of the
- // test below is to narrow down whether this happened or not. Likewise with
- // the call to updateShiftState.
- // We set this to NONE because after a cursor move, we don't want the space
- // state-related special processing to kick in.
- mInputLogic.mSpaceState = SpaceState.NONE;
-
- // TODO: is it still necessary to test for composingSpan related stuff?
- final boolean selectionChangedOrSafeToReset = selectionChanged
- || (!mInputLogic.mWordComposer.isComposingWord()) || noComposingSpan;
- final boolean hasOrHadSelection = (oldSelStart != oldSelEnd
- || newSelStart != newSelEnd);
- final int moveAmount = newSelStart - oldSelStart;
- if (selectionChangedOrSafeToReset && (hasOrHadSelection
- || !mInputLogic.mWordComposer.moveCursorByAndReturnIfInsideComposingWord(
- moveAmount))) {
- // If we are composing a word and moving the cursor, we would want to set a
- // suggestion span for recorrection to work correctly. Unfortunately, that
- // would involve the keyboard committing some new text, which would move the
- // cursor back to where it was. Latin IME could then fix the position of the cursor
- // again, but the asynchronous nature of the calls results in this wreaking havoc
- // with selection on double tap and the like.
- // Another option would be to send suggestions each time we set the composing
- // text, but that is probably too expensive to do, so we decided to leave things
- // as is.
- mInputLogic.resetEntireInputState(mSettings.getCurrent(), newSelStart, newSelEnd);
- } else {
- // resetEntireInputState calls resetCachesUponCursorMove, but forcing the
- // composition to end. But in all cases where we don't reset the entire input
- // state, we still want to tell the rich input connection about the new cursor
- // position so that it can update its caches.
- mInputLogic.mConnection.resetCachesUponCursorMoveAndReturnSuccess(
- newSelStart, newSelEnd, false /* shouldFinishComposition */);
- }
-
- // We moved the cursor. If we are touching a word, we need to resume suggestion.
- mHandler.postResumeSuggestions();
- // Reset the last recapitalization.
- mInputLogic.mRecapitalizeStatus.deactivate();
+ if (isInputViewShown() &&
+ mInputLogic.onUpdateSelection(mSettings.getCurrent(), oldSelStart, oldSelEnd,
+ newSelStart, newSelEnd, composingSpanStart, composingSpanEnd)) {
mKeyboardSwitcher.updateShiftState();
}
@@ -1043,7 +990,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
if (!mSettings.getCurrent().isApplicationSpecifiedCompletionsOn()) return;
if (applicationSpecifiedCompletions == null) {
- clearSuggestionStrip();
+ setNeutralSuggestionStrip();
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
ResearchLogger.latinIME_onDisplayCompletions(null);
}
@@ -1058,7 +1005,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
final SuggestedWords suggestedWords = new SuggestedWords(
applicationSuggestedWords,
false /* typedWordValid */,
- false /* hasAutoCorrectionCandidate */,
+ false /* willAutoCorrect */,
false /* isPunctuationSuggestions */,
false /* isObsoleteSuggestions */,
false /* isPrediction */);
@@ -1187,7 +1134,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// the right layout.
// TODO[IL]: Remove this, pass the input logic to the keyboard switcher instead?
public int getCurrentAutoCapsState() {
- return mInputLogic.getCurrentAutoCapsState(null /* optionalSettingsValues */);
+ return mInputLogic.getCurrentAutoCapsState(mSettings.getCurrent());
}
// Called from the KeyboardSwitcher which needs to know recaps state to display
@@ -1206,23 +1153,13 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
* @return x,y coordinates for this keyboard, as a flattened array.
*/
public int[] getCoordinatesForCurrentKeyboard(final int[] codePoints) {
- return getCoordinatesForKeyboard(codePoints, mKeyboardSwitcher.getKeyboard());
- }
-
- public static int[] getCoordinatesForKeyboard(final int[] codePoints, final Keyboard keyboard) {
- final int length = codePoints.length;
- final int[] coordinates = CoordinateUtils.newCoordinateArray(length);
- Key key;
- for (int i = 0; i < length; ++i) {
- if (keyboard != null && (key = keyboard.getKey(codePoints[i])) != null) {
- CoordinateUtils.setXYInArray(coordinates, i,
- key.getX() + key.getWidth() / 2, key.getY() + key.getHeight() / 2);
- } else {
- CoordinateUtils.setXYInArray(coordinates, i,
- Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
- }
+ final Keyboard keyboard = mKeyboardSwitcher.getKeyboard();
+ if (null == keyboard) {
+ return CoordinateUtils.newCoordinateArray(codePoints.length,
+ Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
+ } else {
+ return keyboard.getCoordinates(codePoints);
}
- return coordinates;
}
// Callback for the {@link SuggestionStripView}, to call when the "add to dictionary" hint is
@@ -1299,8 +1236,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
} else {
codeToSend = codePoint;
}
- mInputLogic.onCodeInput(codeToSend, keyX, keyY, mHandler, mKeyboardSwitcher,
- mSubtypeSwitcher);
+ if (Constants.CODE_SHORTCUT == codePoint) {
+ mSubtypeSwitcher.switchToShortcutIME(this);
+ // Still call the *#onCodeInput methods for readability.
+ }
+ mInputLogic.onCodeInput(codeToSend, keyX, keyY, mSettings.getCurrent(),
+ mHandler, mKeyboardSwitcher);
mKeyboardSwitcher.onCodeInput(codePoint);
}
@@ -1389,12 +1330,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
// TODO[IL]: Define a clear interface for this
- public void clearSuggestionStrip() {
- setSuggestedWords(SuggestedWords.EMPTY);
- setAutoCorrectionIndicator(false);
- }
-
- // TODO[IL]: Define a clear interface for this
public void setSuggestedWords(final SuggestedWords words) {
mInputLogic.mSuggestedWords = words;
if (mSuggestionStripView != null) {
@@ -1477,10 +1412,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
final SuggestedWords punctuationList =
mSettings.getCurrent().mSpacingAndPunctuations.mSuggestPuncList;
final SuggestedWords oldSuggestedWords = previousSuggestedWords == punctuationList
- ? SuggestedWords.EMPTY : previousSuggestedWords;
- if (TextUtils.isEmpty(typedWord)) {
- return oldSuggestedWords;
- }
+ ? SuggestedWords.EMPTY : previousSuggestedWords;
final ArrayList<SuggestedWords.SuggestedWordInfo> typedWordAndPreviousSuggestions =
SuggestedWords.getTypedWordAndPreviousSuggestions(typedWord, oldSuggestedWords);
return new SuggestedWords(typedWordAndPreviousSuggestions,
@@ -1492,39 +1424,39 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
}
- private void showSuggestionStripWithTypedWord(final SuggestedWords suggestedWords,
+ private void showSuggestionStripWithTypedWord(final SuggestedWords sourceSuggestedWords,
final String typedWord) {
- if (suggestedWords.isEmpty()) {
- // No auto-correction is available, clear the cached values.
- AccessibilityUtils.getInstance().setAutoCorrection(null, null);
- clearSuggestionStrip();
- return;
- }
- final String autoCorrection;
- if (suggestedWords.mWillAutoCorrect) {
- autoCorrection = suggestedWords.getWord(SuggestedWords.INDEX_OF_AUTO_CORRECTION);
- } else {
- // We can't use suggestedWords.getWord(SuggestedWords.INDEX_OF_TYPED_WORD)
- // because it may differ from mWordComposer.mTypedWord.
- autoCorrection = typedWord;
- }
- mInputLogic.mWordComposer.setAutoCorrection(autoCorrection);
- setSuggestedWords(suggestedWords);
- setAutoCorrectionIndicator(suggestedWords.mWillAutoCorrect);
- setSuggestionStripShown(isSuggestionsStripVisible());
- // An auto-correction is available, cache it in accessibility code so
- // we can be speak it if the user touches a key that will insert it.
- AccessibilityUtils.getInstance().setAutoCorrection(suggestedWords, typedWord);
+ // TODO: refactor this
+ final SuggestedWords suggestedWords =
+ sourceSuggestedWords.isEmpty() ? SuggestedWords.EMPTY : sourceSuggestedWords;
+ if (suggestedWords.isEmpty()) {
+ // No auto-correction is available, clear the cached values.
+ AccessibilityUtils.getInstance().setAutoCorrection(suggestedWords, typedWord);
+ setSuggestedWords(suggestedWords);
+ setAutoCorrectionIndicator(false);
+ return;
+ }
+ final String autoCorrection;
+ if (suggestedWords.mWillAutoCorrect) {
+ autoCorrection = suggestedWords.getWord(SuggestedWords.INDEX_OF_AUTO_CORRECTION);
+ } else {
+ // We can't use suggestedWords.getWord(SuggestedWords.INDEX_OF_TYPED_WORD)
+ // because it may differ from mWordComposer.mTypedWord.
+ autoCorrection = typedWord;
+ }
+ mInputLogic.mWordComposer.setAutoCorrection(autoCorrection);
+ setSuggestedWords(suggestedWords);
+ setAutoCorrectionIndicator(suggestedWords.mWillAutoCorrect);
+ setSuggestionStripShown(isSuggestionsStripVisible());
+ // An auto-correction is available, cache it in accessibility code so
+ // we can be speak it if the user touches a key that will insert it.
+ AccessibilityUtils.getInstance().setAutoCorrection(suggestedWords, typedWord);
}
// TODO[IL]: Define a clean interface for this
public void showSuggestionStrip(final SuggestedWords suggestedWords) {
- if (suggestedWords.isEmpty()) {
- clearSuggestionStrip();
- return;
- }
- showSuggestionStripWithTypedWord(suggestedWords,
- suggestedWords.getWord(SuggestedWords.INDEX_OF_TYPED_WORD));
+ showSuggestionStripWithTypedWord(suggestedWords, suggestedWords.isEmpty() ? null
+ : suggestedWords.getWord(SuggestedWords.INDEX_OF_TYPED_WORD));
}
// Called from {@link SuggestionStripView} through the {@link SuggestionStripView#Listener}
@@ -1623,10 +1555,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
// TODO[IL]: Define a clean interface for this
- public void setPunctuationSuggestions() {
+ // This will show either an empty suggestion strip (if prediction is enabled) or
+ // punctuation suggestions (if it's disabled).
+ public void setNeutralSuggestionStrip() {
final SettingsValues currentSettings = mSettings.getCurrent();
if (currentSettings.mBigramPredictionEnabled) {
- clearSuggestionStrip();
+ setSuggestedWords(SuggestedWords.EMPTY);
} else {
setSuggestedWords(currentSettings.mSpacingAndPunctuations.mSuggestPuncList);
}
diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index 325a0d981..0d0b7a160 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -815,6 +815,17 @@ public final class RichInputConnection {
}
/**
+ * Looks at the text just before the cursor to find out if we are inside a double quote.
+ *
+ * As with #textBeforeCursorLooksLikeURL, this is dependent on how much text we have cached.
+ * However this won't be a concrete problem in most situations, as the cache is almost always
+ * long enough for this use.
+ */
+ public boolean isInsideDoubleQuoteOrAfterDigit() {
+ return StringUtils.isInsideDoubleQuoteOrAfterDigit(mCommittedTextBeforeComposingText);
+ }
+
+ /**
* Try to get the text from the editor to expose lies the framework may have been
* telling us. Concretely, when the device rotates, the frameworks tells us about where the
* cursor used to be initially in the editor at the time it first received the focus; this
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index 6cd84016e..125976932 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -16,9 +16,6 @@
package com.android.inputmethod.latin;
-import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.keyboard.Key;
-import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.utils.CoordinateUtils;
import com.android.inputmethod.latin.utils.StringUtils;
@@ -276,24 +273,6 @@ public final class WordComposer {
}
/**
- * Add a dummy key by retrieving reasonable coordinates
- */
- // TODO: make this private or remove it entirely. Right now it's used in the tests
- @UsedForTesting
- public void addKeyInfo(final int codePoint, final Keyboard keyboard) {
- final int x, y;
- final Key key;
- if (keyboard != null && (key = keyboard.getKey(codePoint)) != null) {
- x = key.getX() + key.getWidth() / 2;
- y = key.getY() + key.getHeight() / 2;
- } else {
- x = Constants.NOT_A_COORDINATE;
- y = Constants.NOT_A_COORDINATE;
- }
- add(codePoint, x, y);
- }
-
- /**
* Set the currently composing word to the one passed as an argument.
* This will register NOT_A_COORDINATE for X and Ys, and use the passed keyboard for proximity.
* @param codePoints the code points to set as the composing word.
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index 6e9bdc34a..43d75330d 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -36,14 +36,12 @@ import com.android.inputmethod.latin.LastComposedWord;
import com.android.inputmethod.latin.LatinIME;
import com.android.inputmethod.latin.LatinImeLogger;
import com.android.inputmethod.latin.RichInputConnection;
-import com.android.inputmethod.latin.SubtypeSwitcher;
import com.android.inputmethod.latin.Suggest;
import com.android.inputmethod.latin.Suggest.OnGetSuggestedWordsCallback;
import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.WordComposer;
import com.android.inputmethod.latin.define.ProductionFlag;
-import com.android.inputmethod.latin.settings.Settings;
import com.android.inputmethod.latin.settings.SettingsValues;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
import com.android.inputmethod.latin.utils.AsyncResultHolder;
@@ -181,6 +179,67 @@ public final class InputLogic {
}
/**
+ * Consider an update to the cursor position. Evaluate whether this update has happened as
+ * part of normal typing or whether it was an explicit cursor move by the user. In any case,
+ * do the necessary adjustments.
+ * @param settingsValues the current settings
+ * @param oldSelStart old selection start
+ * @param oldSelEnd old selection end
+ * @param newSelStart new selection start
+ * @param newSelEnd new selection end
+ * @param composingSpanStart composing span start
+ * @param composingSpanEnd composing span end
+ * @return whether the cursor has moved as a result of user interaction.
+ */
+ public boolean onUpdateSelection(final SettingsValues settingsValues,
+ final int oldSelStart, final int oldSelEnd,
+ final int newSelStart, final int newSelEnd,
+ final int composingSpanStart, final int composingSpanEnd) {
+ if (mConnection.isBelatedExpectedUpdate(oldSelStart, newSelStart, oldSelEnd, newSelEnd)) {
+ return false;
+ }
+ // TODO: the following is probably better done in resetEntireInputState().
+ // it should only happen when the cursor moved, and the very purpose of the
+ // test below is to narrow down whether this happened or not. Likewise with
+ // the call to updateShiftState.
+ // We set this to NONE because after a cursor move, we don't want the space
+ // state-related special processing to kick in.
+ mSpaceState = SpaceState.NONE;
+
+ final boolean selectionChangedOrSafeToReset =
+ oldSelStart != newSelStart || oldSelEnd != newSelEnd // selection changed
+ || !mWordComposer.isComposingWord(); // safe to reset
+ final boolean hasOrHadSelection = (oldSelStart != oldSelEnd || newSelStart != newSelEnd);
+ final int moveAmount = newSelStart - oldSelStart;
+ if (selectionChangedOrSafeToReset && (hasOrHadSelection
+ || !mWordComposer.moveCursorByAndReturnIfInsideComposingWord(moveAmount))) {
+ // If we are composing a word and moving the cursor, we would want to set a
+ // suggestion span for recorrection to work correctly. Unfortunately, that
+ // would involve the keyboard committing some new text, which would move the
+ // cursor back to where it was. Latin IME could then fix the position of the cursor
+ // again, but the asynchronous nature of the calls results in this wreaking havoc
+ // with selection on double tap and the like.
+ // Another option would be to send suggestions each time we set the composing
+ // text, but that is probably too expensive to do, so we decided to leave things
+ // as is.
+ resetEntireInputState(settingsValues, newSelStart, newSelEnd);
+ } else {
+ // resetEntireInputState calls resetCachesUponCursorMove, but forcing the
+ // composition to end. But in all cases where we don't reset the entire input
+ // state, we still want to tell the rich input connection about the new cursor
+ // position so that it can update its caches.
+ mConnection.resetCachesUponCursorMoveAndReturnSuccess(
+ newSelStart, newSelEnd, false /* shouldFinishComposition */);
+ }
+
+ // We moved the cursor. If we are touching a word, we need to resume suggestion.
+ mLatinIME.mHandler.postResumeSuggestions();
+ // Reset the last recapitalization.
+ mRecapitalizeStatus.deactivate();
+ return true;
+ }
+
+ /**
* React to a code input. It may be a code point to insert, or a symbolic value that influences
* the keyboard behavior.
*
@@ -192,13 +251,12 @@ public final class InputLogic {
* @param y the y-coordinate where the user pressed the key, or NOT_A_COORDINATE.
*/
public void onCodeInput(final int code, final int x, final int y,
- // TODO: remove these three arguments
- final LatinIME.UIHandler handler,
- final KeyboardSwitcher keyboardSwitcher, final SubtypeSwitcher subtypeSwitcher) {
+ final SettingsValues settingsValues,
+ // TODO: remove these two arguments
+ final LatinIME.UIHandler handler, final KeyboardSwitcher keyboardSwitcher) {
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
ResearchLogger.latinIME_onCodeInput(code, x, y);
}
- final SettingsValues settingsValues = Settings.getInstance().getCurrent();
final long when = SystemClock.uptimeMillis();
if (code != Constants.CODE_DELETE
|| when > mLastKeyTime + Constants.LONG_PRESS_MILLISECONDS) {
@@ -247,7 +305,8 @@ public final class InputLogic {
onSettingsKeyPressed();
break;
case Constants.CODE_SHORTCUT:
- subtypeSwitcher.switchToShortcutIME(mLatinIME);
+ // We need to switch to the shortcut IME. This is handled by LatinIME since the
+ // input logic has no business with IME switching.
break;
case Constants.CODE_ACTION_NEXT:
performEditorAction(EditorInfo.IME_ACTION_NEXT);
@@ -602,8 +661,21 @@ public final class InputLogic {
final boolean swapWeakSpace = maybeStripSpace(settingsValues, codePoint, spaceState,
isFromSuggestionStrip);
- if (SpaceState.PHANTOM == spaceState &&
- settingsValues.isUsuallyPrecededBySpace(codePoint)) {
+ final boolean isInsideDoubleQuoteOrAfterDigit = Constants.CODE_DOUBLE_QUOTE == codePoint
+ && mConnection.isInsideDoubleQuoteOrAfterDigit();
+
+ final boolean needsPrecedingSpace;
+ if (SpaceState.PHANTOM != spaceState) {
+ needsPrecedingSpace = false;
+ } else if (Constants.CODE_DOUBLE_QUOTE == codePoint) {
+ // Double quotes behave like they are usually preceded by space iff we are
+ // not inside a double quote or after a digit.
+ needsPrecedingSpace = !isInsideDoubleQuoteOrAfterDigit;
+ } else {
+ needsPrecedingSpace = settingsValues.isUsuallyPrecededBySpace(codePoint);
+ }
+
+ if (needsPrecedingSpace) {
promotePhantomSpace(settingsValues);
}
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
@@ -630,14 +702,17 @@ public final class InputLogic {
if (swapWeakSpace) {
swapSwapperAndSpace(keyboardSwitcher);
mSpaceState = SpaceState.SWAP_PUNCTUATION;
- } else if (SpaceState.PHANTOM == spaceState
- && settingsValues.isUsuallyFollowedBySpace(codePoint)) {
+ } else if ((SpaceState.PHANTOM == spaceState
+ && settingsValues.isUsuallyFollowedBySpace(codePoint))
+ || (Constants.CODE_DOUBLE_QUOTE == codePoint
+ && isInsideDoubleQuoteOrAfterDigit)) {
// If we are in phantom space state, and the user presses a separator, we want to
// stay in phantom space state so that the next keypress has a chance to add the
// space. For example, if I type "Good dat", pick "day" from the suggestion strip
// then insert a comma and go on to typing the next word, I want the space to be
// inserted automatically before the next word, the same way it is when I don't
- // input the comma.
+ // input the comma. A double quote behaves like it's usually followed by space if
+ // we're inside a double quote.
// The case is a little different if the separator is a space stripper. Such a
// separator does not normally need a space on the right (that's the difference
// between swappers and strippers), so we should not stay in phantom space state if
@@ -647,7 +722,7 @@ public final class InputLogic {
// Set punctuation right away. onUpdateSelection will fire but tests whether it is
// already displayed or not, so it's okay.
- mLatinIME.setPunctuationSuggestions();
+ mLatinIME.setNeutralSuggestionStrip();
}
keyboardSwitcher.updateShiftState();
@@ -1000,7 +1075,7 @@ public final class InputLogic {
}
if (!mWordComposer.isComposingWord() && !settingsValues.mBigramPredictionEnabled) {
- mLatinIME.setPunctuationSuggestions();
+ mLatinIME.setNeutralSuggestionStrip();
return;
}
@@ -1256,15 +1331,10 @@ public final class InputLogic {
* This is called from the KeyboardSwitcher (through a trampoline in LatinIME) because it
* needs to know auto caps state to display the right layout.
*
- * @param optionalSettingsValues settings values, or null if we should just get the current ones
- * from the singleton.
+ * @param settingsValues the relevant settings values
* @return a caps mode from TextUtils.CAP_MODE_* or Constants.TextUtils.CAP_MODE_OFF.
*/
- public int getCurrentAutoCapsState(final SettingsValues optionalSettingsValues) {
- // If we are in a batch edit, we need to use the same settings values as the outside
- // code, that will pass it to us. Otherwise, we can just take the current values.
- final SettingsValues settingsValues = null != optionalSettingsValues
- ? optionalSettingsValues : Settings.getInstance().getCurrent();
+ public int getCurrentAutoCapsState(final SettingsValues settingsValues) {
if (!settingsValues.mAutoCap) return Constants.TextUtils.CAP_MODE_OFF;
final EditorInfo ei = getCurrentInputEditorInfo();
@@ -1390,11 +1460,7 @@ public final class InputLogic {
final int newSelStart, final int newSelEnd) {
final boolean shouldFinishComposition = mWordComposer.isComposingWord();
resetComposingState(true /* alsoResetLastComposedWord */);
- if (settingsValues.mBigramPredictionEnabled) {
- mLatinIME.clearSuggestionStrip();
- } else {
- mLatinIME.setSuggestedWords(settingsValues.mSpacingAndPunctuations.mSuggestPuncList);
- }
+ mLatinIME.setNeutralSuggestionStrip();
mConnection.resetCachesUponCursorMoveAndReturnSuccess(newSelStart, newSelEnd,
shouldFinishComposition);
}
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
index 826e36d86..3947019ca 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
@@ -28,12 +28,13 @@ import android.view.textservice.SuggestionsInfo;
import android.view.textservice.TextInfo;
import com.android.inputmethod.compat.SuggestionsInfoCompatUtils;
+import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.Dictionary;
-import com.android.inputmethod.latin.LatinIME;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.WordComposer;
import com.android.inputmethod.latin.spellcheck.AndroidSpellCheckerService.SuggestionsGatherer;
+import com.android.inputmethod.latin.utils.CoordinateUtils;
import com.android.inputmethod.latin.utils.LocaleUtils;
import com.android.inputmethod.latin.utils.StringUtils;
@@ -314,9 +315,14 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session {
}
final WordComposer composer = new WordComposer();
final int[] codePoints = StringUtils.toCodePointArray(text);
- composer.setComposingWord(codePoints,
- LatinIME.getCoordinatesForKeyboard(codePoints, dictInfo.mKeyboard),
- null /* previousWord */);
+ final int[] coordinates;
+ if (null == dictInfo.mKeyboard) {
+ coordinates = CoordinateUtils.newCoordinateArray(codePoints.length,
+ Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE);
+ } else {
+ coordinates = dictInfo.mKeyboard.getCoordinates(codePoints);
+ }
+ composer.setComposingWord(codePoints, coordinates, null /* previousWord */);
// TODO: make a spell checker option to block offensive words or not
final ArrayList<SuggestedWordInfo> suggestions =
dictInfo.mDictionary.getSuggestions(composer, prevWord,
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
index f836e61cb..af04de435 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
@@ -38,7 +38,6 @@ import android.text.style.StyleSpan;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
import android.view.Gravity;
-import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
@@ -100,10 +99,6 @@ final class SuggestionStripLayoutHelper {
private static final int AUTO_CORRECT_UNDERLINE = 0x02;
private static final int VALID_TYPED_WORD_BOLD = 0x04;
- private final TextView mWordToSaveView;
- private final TextView mLeftwardsArrowView;
- private final TextView mHintToSaveView;
-
public SuggestionStripLayoutHelper(final Context context, final AttributeSet attrs,
final int defStyle, final ArrayList<TextView> wordViews,
final ArrayList<View> dividerViews, final ArrayList<TextView> debugInfoViews) {
@@ -157,11 +152,6 @@ final class SuggestionStripLayoutHelper {
R.dimen.config_more_suggestions_bottom_gap);
mMoreSuggestionsRowHeight = res.getDimensionPixelSize(
R.dimen.config_more_suggestions_row_height);
-
- final LayoutInflater inflater = LayoutInflater.from(context);
- mWordToSaveView = (TextView)inflater.inflate(R.layout.suggestion_word, null);
- mLeftwardsArrowView = (TextView)inflater.inflate(R.layout.hint_add_to_dictionary, null);
- mHintToSaveView = (TextView)inflater.inflate(R.layout.hint_add_to_dictionary, null);
}
public int getMaxMoreSuggestionsRow() {
@@ -466,54 +456,30 @@ final class SuggestionStripLayoutHelper {
mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
}
- public void layoutAddToDictionaryHint(final String word, final ViewGroup stripView,
- final int stripWidth, final CharSequence hintText, final OnClickListener listener) {
+ public void layoutAddToDictionaryHint(final String word, final ViewGroup addToDictionaryStrip,
+ final int stripWidth, final CharSequence hintText) {
final int width = stripWidth - mDividerWidth - mPadding * 2;
- final TextView wordView = mWordToSaveView;
+ final TextView wordView = (TextView)addToDictionaryStrip.findViewById(R.id.word_to_save);
wordView.setTextColor(mColorTypedWord);
final int wordWidth = (int)(width * mCenterSuggestionWeight);
- final CharSequence text = getEllipsizedText(word, wordWidth, wordView.getPaint());
+ final CharSequence wordToSave = getEllipsizedText(word, wordWidth, wordView.getPaint());
final float wordScaleX = wordView.getTextScaleX();
- // {@link TextView#setTag()} is used to hold the word to be added to dictionary. The word
- // will be extracted at {@link #getAddToDictionaryWord()}.
- wordView.setTag(word);
- wordView.setText(text);
+ wordView.setText(wordToSave);
wordView.setTextScaleX(wordScaleX);
- stripView.addView(wordView);
setLayoutWeight(wordView, mCenterSuggestionWeight, ViewGroup.LayoutParams.MATCH_PARENT);
- stripView.addView(mDividerViews.get(0));
-
- final TextView leftArrowView = mLeftwardsArrowView;
- leftArrowView.setTextColor(mColorAutoCorrect);
- leftArrowView.setText(LEFTWARDS_ARROW);
- stripView.addView(leftArrowView);
-
- final TextView hintView = mHintToSaveView;
+ final TextView hintView = (TextView)addToDictionaryStrip.findViewById(
+ R.id.hint_add_to_dictionary);
hintView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
hintView.setTextColor(mColorAutoCorrect);
- final int hintWidth = width - wordWidth - leftArrowView.getWidth();
- final float hintScaleX = getTextScaleX(hintText, hintWidth, hintView.getPaint());
- hintView.setText(hintText);
+ final int hintWidth = width - wordWidth;
+ final String hintWithArrow = LEFTWARDS_ARROW + hintText;
+ final float hintScaleX = getTextScaleX(hintWithArrow, hintWidth, hintView.getPaint());
+ hintView.setText(hintWithArrow);
hintView.setTextScaleX(hintScaleX);
- stripView.addView(hintView);
setLayoutWeight(
hintView, 1.0f - mCenterSuggestionWeight, ViewGroup.LayoutParams.MATCH_PARENT);
-
- wordView.setOnClickListener(listener);
- leftArrowView.setOnClickListener(listener);
- hintView.setOnClickListener(listener);
- }
-
- public String getAddToDictionaryWord() {
- // String tag is set at
- // {@link #layoutAddToDictionaryHint(String,ViewGroup,int,CharSequence,OnClickListener}.
- return (String)mWordToSaveView.getTag();
- }
-
- public boolean isAddToDictionaryShowing(final View v) {
- return v == mWordToSaveView || v == mHintToSaveView || v == mLeftwardsArrowView;
}
private static void setLayoutWeight(final View v, final float weight, final int height) {
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index 88b57f93b..32552ebe7 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -56,6 +56,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
static final boolean DBG = LatinImeLogger.sDBG;
private final ViewGroup mSuggestionsStrip;
+ private final ViewGroup mAddToDictionaryStrip;
MainKeyboardView mMainKeyboardView;
private final View mMoreSuggestionsContainer;
@@ -70,6 +71,32 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
private SuggestedWords mSuggestedWords = SuggestedWords.EMPTY;
private final SuggestionStripLayoutHelper mLayoutHelper;
+ private final StripVisibilityGroup mStripVisibilityGroup;
+
+ private static class StripVisibilityGroup {
+ private final View mSuggestionsStrip;
+ private final View mAddToDictionaryStrip;
+
+ public StripVisibilityGroup(final View suggestionsStrip, final View addToDictionaryStrip) {
+ mSuggestionsStrip = suggestionsStrip;
+ mAddToDictionaryStrip = addToDictionaryStrip;
+ showSuggestionsStrip();
+ }
+
+ public void showSuggestionsStrip() {
+ mSuggestionsStrip.setVisibility(VISIBLE);
+ mAddToDictionaryStrip.setVisibility(INVISIBLE);
+ }
+
+ public void showAddToDictionaryStrip() {
+ mSuggestionsStrip.setVisibility(INVISIBLE);
+ mAddToDictionaryStrip.setVisibility(VISIBLE);
+ }
+
+ public boolean isShowingAddToDictionaryStrip() {
+ return mAddToDictionaryStrip.getVisibility() == VISIBLE;
+ }
+ }
/**
* Construct a {@link SuggestionStripView} for showing suggestions to be picked by the user.
@@ -88,6 +115,9 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
inflater.inflate(R.layout.suggestions_strip, this);
mSuggestionsStrip = (ViewGroup)findViewById(R.id.suggestions_strip);
+ mAddToDictionaryStrip = (ViewGroup)findViewById(R.id.add_to_dictionary_strip);
+ mStripVisibilityGroup = new StripVisibilityGroup(mSuggestionsStrip, mAddToDictionaryStrip);
+
for (int pos = 0; pos < SuggestedWords.MAX_SUGGESTIONS; pos++) {
final TextView word = (TextView)inflater.inflate(R.layout.suggestion_word, null);
word.setOnClickListener(this);
@@ -137,14 +167,16 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
}
public boolean isShowingAddToDictionaryHint() {
- return mSuggestionsStrip.getChildCount() > 0
- && mLayoutHelper.isAddToDictionaryShowing(mSuggestionsStrip.getChildAt(0));
+ return mStripVisibilityGroup.isShowingAddToDictionaryStrip();
}
public void showAddToDictionaryHint(final String word, final CharSequence hintText) {
- clear();
- mLayoutHelper.layoutAddToDictionaryHint(
- word, mSuggestionsStrip, getWidth(), hintText, this);
+ mLayoutHelper.layoutAddToDictionaryHint(word, mAddToDictionaryStrip, getWidth(), hintText);
+ // {@link TextView#setTag()} is used to hold the word to be added to dictionary. The word
+ // will be extracted at {@link #onClick(View)}.
+ mAddToDictionaryStrip.setTag(word);
+ mAddToDictionaryStrip.setOnClickListener(this);
+ mStripVisibilityGroup.showAddToDictionaryStrip();
}
public boolean dismissAddToDictionaryHint() {
@@ -157,8 +189,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
public void clear() {
mSuggestionsStrip.removeAllViews();
- removeAllViews();
- addView(mSuggestionsStrip);
+ mStripVisibilityGroup.showSuggestionsStrip();
dismissMoreSuggestionsPanel();
}
@@ -302,26 +333,26 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
@Override
public void onClick(final View view) {
- if (mLayoutHelper.isAddToDictionaryShowing(view)) {
- mListener.addWordToUserDictionary(mLayoutHelper.getAddToDictionaryWord());
+ final Object tag = view.getTag();
+ // {@link String} tag is set at {@link #showAddToDictionaryHint(String,CharSequence)}.
+ if (tag instanceof String) {
+ final String wordToSave = (String)tag;
+ mListener.addWordToUserDictionary(wordToSave);
clear();
return;
}
- final Object tag = view.getTag();
- // Integer tag is set at
+ // {@link Integer} tag is set at
// {@link SuggestionStripLayoutHelper#setupWordViewsTextAndColor(SuggestedWords,int)} and
// {@link SuggestionStripLayoutHelper#layoutPunctuationSuggestions(SuggestedWords,ViewGroup}
- if (!(tag instanceof Integer)) {
- return;
- }
- final int index = (Integer) tag;
- if (index >= mSuggestedWords.size()) {
- return;
+ if (tag instanceof Integer) {
+ final int index = (Integer) tag;
+ if (index >= mSuggestedWords.size()) {
+ return;
+ }
+ final SuggestedWordInfo wordInfo = mSuggestedWords.getInfo(index);
+ mListener.pickSuggestionManually(index, wordInfo);
}
-
- final SuggestedWordInfo wordInfo = mSuggestedWords.getInfo(index);
- mListener.pickSuggestionManually(index, wordInfo);
}
@Override
diff --git a/java/src/com/android/inputmethod/latin/utils/CoordinateUtils.java b/java/src/com/android/inputmethod/latin/utils/CoordinateUtils.java
index 91a63501a..87df013a6 100644
--- a/java/src/com/android/inputmethod/latin/utils/CoordinateUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/CoordinateUtils.java
@@ -53,6 +53,15 @@ public final class CoordinateUtils {
return new int[ELEMENT_SIZE * arraySize];
}
+ public static int[] newCoordinateArray(final int arraySize,
+ final int defaultX, final int defaultY) {
+ final int[] result = new int[ELEMENT_SIZE * arraySize];
+ for (int i = 0; i < arraySize; ++i) {
+ setXYInArray(result, i, defaultX, defaultY);
+ }
+ return result;
+ }
+
public static int xFromArray(final int[] coordsArray, final int index) {
return coordsArray[ELEMENT_SIZE * index + INDEX_X];
}
@@ -79,8 +88,4 @@ public final class CoordinateUtils {
coordsArray[baseIndex + INDEX_X] = coords[INDEX_X];
coordsArray[baseIndex + INDEX_Y] = coords[INDEX_Y];
}
-
- public static void copyArray(final int[] destination, final int[] source) {
- System.arraycopy(source, 0, destination, 0, source.length);
- }
}
diff --git a/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java b/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java
index b3c787e44..306735779 100644
--- a/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java
@@ -26,6 +26,7 @@ import android.util.Log;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.AssetFileAddress;
import com.android.inputmethod.latin.BinaryDictionaryGetter;
+import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.makedict.BinaryDictIOUtils;
import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader;
@@ -368,11 +369,14 @@ public class DictionaryInfoUtils {
return dictList;
}
- @UsedForTesting
public static boolean looksValidForDictionaryInsertion(final CharSequence text,
final SpacingAndPunctuations spacingAndPunctuations) {
if (TextUtils.isEmpty(text)) return false;
final int length = text.length();
+ // TODO: Make this test "length > Constants.DICTIONARY_MAX_WORD_LENGTH".
+ if (length >= Constants.DICTIONARY_MAX_WORD_LENGTH) {
+ return false;
+ }
int i = 0;
int digitCount = 0;
while (i < length) {
diff --git a/java/src/com/android/inputmethod/latin/utils/StringUtils.java b/java/src/com/android/inputmethod/latin/utils/StringUtils.java
index 6f15b11bf..b154623ae 100644
--- a/java/src/com/android/inputmethod/latin/utils/StringUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/StringUtils.java
@@ -348,7 +348,7 @@ public final class StringUtils {
boolean hasPeriod = false;
int codePoint = 0;
while (i > 0) {
- codePoint = Character.codePointBefore(text, i);
+ codePoint = Character.codePointBefore(text, i);
if (codePoint < Constants.CODE_PERIOD || codePoint > 'z') {
// Handwavy heuristic to see if that's a URL character. Anything between period
// and z. This includes all lower- and upper-case ascii letters, period,
@@ -387,6 +387,48 @@ public final class StringUtils {
return false;
}
+ /**
+ * Examines the string and returns whether we're inside a double quote.
+ *
+ * This is used to decide whether we should put an automatic space before or after a double
+ * quote character. If we're inside a quotation, then we want to close it, so we want a space
+ * after and not before. Otherwise, we want to open the quotation, so we want a space before
+ * and not after. Exception: after a digit, we never want a space because the "inch" or
+ * "minutes" use cases is dominant after digits.
+ * In the practice, we determine whether we are in a quotation or not by finding the previous
+ * double quote character, and looking at whether it's followed by whitespace. If so, that
+ * was a closing quotation mark, so we're not inside a double quote. If it's not followed
+ * by whitespace, then it was an opening quotation mark, and we're inside a quotation.
+ *
+ * @param text the text to examine.
+ * @return whether we're inside a double quote.
+ */
+ public static boolean isInsideDoubleQuoteOrAfterDigit(final CharSequence text) {
+ int i = text.length();
+ if (0 == i) return false;
+ int codePoint = Character.codePointBefore(text, i);
+ if (Character.isDigit(codePoint)) return true;
+ int prevCodePoint = 0;
+ while (i > 0) {
+ codePoint = Character.codePointBefore(text, i);
+ if (Constants.CODE_DOUBLE_QUOTE == codePoint) {
+ // If we see a double quote followed by whitespace, then that
+ // was a closing quote.
+ if (Character.isWhitespace(prevCodePoint)) return false;
+ }
+ if (Character.isWhitespace(codePoint) && Constants.CODE_DOUBLE_QUOTE == prevCodePoint) {
+ // If we see a double quote preceded by whitespace, then that
+ // was an opening quote. No need to continue seeking.
+ return true;
+ }
+ i -= Character.charCount(codePoint);
+ prevCodePoint = codePoint;
+ }
+ // We reached the start of text. If the first char is a double quote, then we're inside
+ // a double quote. Otherwise we're not.
+ return Constants.CODE_DOUBLE_QUOTE == codePoint;
+ }
+
public static boolean isEmptyStringOrWhiteSpaces(final String s) {
final int N = codePointCount(s);
for (int i = 0; i < N; ++i) {
diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java
index 2a8148d02..b1f54c0b4 100644
--- a/java/src/com/android/inputmethod/research/ResearchLogger.java
+++ b/java/src/com/android/inputmethod/research/ResearchLogger.java
@@ -1117,14 +1117,13 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
private static final LogStatement LOGSTATEMENT_LATINIME_ONFINISHINPUTVIEWINTERNAL =
new LogStatement("LatinIMEOnFinishInputViewInternal", false, false, "isTextTruncated",
"text");
- public static void latinIME_onFinishInputViewInternal(final boolean finishingInput,
- final int savedSelectionStart, final int savedSelectionEnd, final InputConnection ic) {
+ public static void latinIME_onFinishInputViewInternal(final boolean finishingInput) {
// The finishingInput flag is set in InputMethodService. It is true if called from
// doFinishInput(), which can be called as part of doStartInput(). This can happen at times
// when the IME is not closing, such as when powering up. The finishinInput flag is false
// if called from finishViews(), which is called from hideWindow() and onDestroy(). These
// are the situations in which we want to finish up the researchLog.
- if (ic != null && !finishingInput) {
+ if (!finishingInput) {
final ResearchLogger researchLogger = getInstance();
// Assume that OUTPUT_ENTIRE_BUFFER is only true when we don't care about privacy (e.g.
// during a live user test), so the normal isPotentiallyPrivate and