aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--java/res/values-be/donottranslate-more-keys.xml4
-rw-r--r--java/res/values-ky/donottranslate-more-keys.xml6
-rw-r--r--java/res/values-mk/donottranslate-more-keys.xml48
-rw-r--r--java/res/values-ru/donottranslate-more-keys.xml2
-rw-r--r--java/res/values-uk/donottranslate-more-keys.xml4
-rw-r--r--java/res/values/donottranslate-more-keys.xml31
-rw-r--r--java/res/values/donottranslate.xml4
-rw-r--r--java/res/xml-mk/keyboard_set.xml42
-rw-r--r--java/res/xml-sw600dp/rows_number_normal.xml42
-rw-r--r--java/res/xml-sw600dp/rows_serbian.xml18
-rw-r--r--java/res/xml-sw600dp/rows_slavic.xml16
-rw-r--r--java/res/xml-sw768dp/rows_number_normal.xml42
-rw-r--r--java/res/xml-sw768dp/rows_serbian.xml17
-rw-r--r--java/res/xml-sw768dp/rows_slavic.xml16
-rw-r--r--java/res/xml/key_styles_number.xml16
-rw-r--r--java/res/xml/method.xml9
-rw-r--r--java/res/xml/rows_number_normal.xml66
-rw-r--r--java/res/xml/rows_serbian.xml18
-rw-r--r--java/res/xml/rows_slavic.xml20
-rw-r--r--java/src/com/android/inputmethod/deprecated/VoiceProxy.java38
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyDetector.java2
-rw-r--r--java/src/com/android/inputmethod/keyboard/Keyboard.java17
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardId.java31
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardSet.java3
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardView.java2
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java7
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java35
-rw-r--r--java/src/com/android/inputmethod/latin/Utils.java10
-rw-r--r--native/src/correction.h10
-rw-r--r--tests/res/raw/test.dictbin1528 -> 0 bytes
-rw-r--r--tests/src/com/android/inputmethod/latin/InputLogicTests.java119
-rw-r--r--tests/src/com/android/inputmethod/latin/SuggestHelper.java150
-rw-r--r--tests/src/com/android/inputmethod/latin/SuggestTests.java190
-rw-r--r--tests/src/com/android/inputmethod/latin/SuggestTestsBase.java106
-rw-r--r--tests/src/com/android/inputmethod/latin/UserBigramSuggestHelper.java102
-rw-r--r--tests/src/com/android/inputmethod/latin/UserBigramSuggestTests.java115
36 files changed, 495 insertions, 863 deletions
diff --git a/java/res/values-be/donottranslate-more-keys.xml b/java/res/values-be/donottranslate-more-keys.xml
index 0917f11ec..1550ddb17 100644
--- a/java/res/values-be/donottranslate-more-keys.xml
+++ b/java/res/values-be/donottranslate-more-keys.xml
@@ -19,7 +19,7 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- U+045E: "ў" CYRILLIC SMALL LETTER SHORT U -->
- <string name="keylabel_for_slavic_shcha">&#x045E;</string>
+ <string name="keylabel_for_cyrillic_shcha">&#x045E;</string>
<!-- U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -->
- <string name="keylabel_for_slavic_i">&#x0456;</string>
+ <string name="keylabel_for_cyrillic_i">&#x0456;</string>
</resources>
diff --git a/java/res/values-ky/donottranslate-more-keys.xml b/java/res/values-ky/donottranslate-more-keys.xml
index 824620987..b67a9f15d 100644
--- a/java/res/values-ky/donottranslate-more-keys.xml
+++ b/java/res/values-ky/donottranslate-more-keys.xml
@@ -19,9 +19,9 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U -->
- <string name="more_keys_for_slavic_u">&#x04AF;</string>
+ <string name="more_keys_for_cyrillic_u">&#x04AF;</string>
<!-- U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER -->
- <string name="more_keys_for_slavic_en">&#x04A3;</string>
+ <string name="more_keys_for_cyrillic_en">&#x04A3;</string>
<!-- U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O -->
- <string name="more_keys_for_slavic_o">&#x04E9;</string>
+ <string name="more_keys_for_cyrillic_o">&#x04E9;</string>
</resources>
diff --git a/java/res/values-mk/donottranslate-more-keys.xml b/java/res/values-mk/donottranslate-more-keys.xml
new file mode 100644
index 000000000..e96a306b6
--- /dev/null
+++ b/java/res/values-mk/donottranslate-more-keys.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- NOTE: Macedonian layouts are based on Serbian ones with the following key replacements. -->
+ <!-- U+0455: "ѕ" CYRILLIC SMALL LETTER DZE -->
+ <string name="keylabel_for_cyrillic_ze">&#x0455;</string>
+ <!-- U+045C: "ќ" CYRILLIC SMALL LETTER KJE -->
+ <string name="keylabel_for_cyrillic_tshe">&#x045C;</string>
+ <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
+ <string name="keylabel_for_cyrillic_dze">&#x0437;</string>
+ <!-- U+0453: "ѓ" CYRILLIC SMALL LETTER GJE -->
+ <string name="keylabel_for_cyrillic_dje">&#x0453;</string>
+ <!-- U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE -->
+ <string name="more_keys_for_cyrillic_ie">&#x0450;</string>
+ <!-- U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE -->
+ <string name="more_keys_for_cyrillic_i">&#x045D;</string>
+ <!-- U+2018: "‘" LEFT SINGLE QUOTATION MARK
+ U+2019: "’" RIGHT SINGLE QUOTATION MARK
+ U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+ U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
+ U+201C: "“" LEFT DOUBLE QUOTATION MARK
+ U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+ U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+ U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+ <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
+ <!-- <string name="more_keys_for_double_quote">!fixedColumnOrder!6,&#x201E;,&#x201C;,&#x201D;,&#x201F;,&#x00AB;,&#x00BB;</string> -->
+ <string name="more_keys_for_double_quote">!fixedColumnOrder!5,&#x201E;,&#x201C;,&#x201D;,&#x00AB;,&#x00BB;</string>
+ <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
+ <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string> -->
+ <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!5,&#x201E;,&#x201C;,&#x201D;,&#x00AB;,&#x00BB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
+</resources>
diff --git a/java/res/values-ru/donottranslate-more-keys.xml b/java/res/values-ru/donottranslate-more-keys.xml
index 45c4551a1..a1a22e5aa 100644
--- a/java/res/values-ru/donottranslate-more-keys.xml
+++ b/java/res/values-ru/donottranslate-more-keys.xml
@@ -19,5 +19,5 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- U+0451: "ё" CYRILLIC SMALL LETTER IO -->
- <string name="more_keys_for_slavic_ye">&#x0451;</string>
+ <string name="more_keys_for_cyrillic_ye">&#x0451;</string>
</resources>
diff --git a/java/res/values-uk/donottranslate-more-keys.xml b/java/res/values-uk/donottranslate-more-keys.xml
index 3208a6649..323eaafbb 100644
--- a/java/res/values-uk/donottranslate-more-keys.xml
+++ b/java/res/values-uk/donottranslate-more-keys.xml
@@ -19,7 +19,7 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -->
- <string name="keylabel_for_slavic_yery">&#x0456;</string>
+ <string name="keylabel_for_cyrillic_yery">&#x0456;</string>
<!-- U+0457: "ї" CYRILLIC SMALL LETTER YI -->
- <string name="more_keys_for_slavic_yery">&#x0457;</string>
+ <string name="more_keys_for_cyrillic_yery">&#x0457;</string>
</resources>
diff --git a/java/res/values/donottranslate-more-keys.xml b/java/res/values/donottranslate-more-keys.xml
index 40d81177f..6577acdb9 100644
--- a/java/res/values/donottranslate-more-keys.xml
+++ b/java/res/values/donottranslate-more-keys.xml
@@ -41,20 +41,30 @@
<string name="more_keys_for_scandinavia_row2_10"></string>
<string name="more_keys_for_scandinavia_row2_11"></string>
<!-- U+0449: "щ" CYRILLIC SMALL LETTER SHCHA -->
- <string name="keylabel_for_slavic_shcha">&#x0449;</string>
+ <string name="keylabel_for_cyrillic_shcha">&#x0449;</string>
<!-- U+044B: "ы" CYRILLIC SMALL LETTER YERU -->
- <string name="keylabel_for_slavic_yery">&#x044B;</string>
+ <string name="keylabel_for_cyrillic_yery">&#x044B;</string>
<!-- U+0438: "и" CYRILLIC SMALL LETTER I -->
- <string name="keylabel_for_slavic_i">&#x0438;</string>
- <string name="more_keys_for_slavic_u"></string>
- <string name="more_keys_for_slavic_ye"></string>
- <string name="more_keys_for_slavic_en"></string>
+ <string name="keylabel_for_cyrillic_i">&#x0438;</string>
+ <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
+ <string name="keylabel_for_cyrillic_ze">&#x0437;</string>
+ <!-- U+045B: "ћ" CYRILLIC SMALL LETTER TSHE -->
+ <string name="keylabel_for_cyrillic_tshe">&#x045B;</string>
+ <!-- U+0455: "ѕ" CYRILLIC SMALL LETTER DZE -->
+ <string name="keylabel_for_cyrillic_dze">&#x0455;</string>
+ <!-- U+0452: "ђ" CYRILLIC SMALL LETTER DJE -->
+ <string name="keylabel_for_cyrillic_dje">&#x0452;</string>
+ <string name="more_keys_for_cyrillic_u"></string>
+ <string name="more_keys_for_cyrillic_ye"></string>
+ <string name="more_keys_for_cyrillic_en"></string>
<!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN -->
- <string name="more_keys_for_slavic_ha">&#x044A;</string>
- <string name="more_keys_for_slavic_yery"></string>
- <string name="more_keys_for_slavic_o"></string>
+ <string name="more_keys_for_cyrillic_ha">&#x044A;</string>
+ <string name="more_keys_for_cyrillic_yery"></string>
+ <string name="more_keys_for_cyrillic_o"></string>
<!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN -->
- <string name="more_keys_for_slavic_soft_sign">&#x044A;</string>
+ <string name="more_keys_for_cyrillic_soft_sign">&#x044A;</string>
+ <string name="more_keys_for_cyrillic_ie"></string>
+ <string name="more_keys_for_cyrillic_i"></string>
<!-- U+00A2: "¢" CENT SIGN
U+00A3: "£" POUND SIGN
U+20AC: "€" EURO SIGN
@@ -115,6 +125,7 @@
<!-- U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
U+2205: "∅" EMPTY SET -->
<string name="more_keys_for_symbols_0">&#x207F;,&#x2205;</string>
+ <string name="more_keys_for_am_pm">!fixedColumnOrder!2,!hasLabels!,\@string/label_time_am,\@string/label_time_pm</string>
<string name="settings_as_more_key">\@icon/settingsKey|\@integer/key_settings</string>
<string name="keylabel_for_comma">,</string>
<string name="more_keys_for_comma"></string>
diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index 94da9462f..d6a15deb0 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -58,6 +58,10 @@
<!-- U+FF0A: "*" FULLWIDTH ASTERISK
U+FF03: "#" FULLWIDTH NUMBER SIGN -->
<string name="label_to_phone_symbols_key">&#xFF0A;&#xFF03;</string>
+ <!-- Key label for "ante meridiem" -->
+ <string name="label_time_am">"AM"</string>
+ <!-- Key label for "post meridiem" -->
+ <string name="label_time_pm">"PM"</string>
<!-- Always show the suggestion strip -->
<string name="prefs_suggestion_visibility_show_value">0</string>
diff --git a/java/res/xml-mk/keyboard_set.xml b/java/res/xml-mk/keyboard_set.xml
new file mode 100644
index 000000000..31199cb0a
--- /dev/null
+++ b/java/res/xml-mk/keyboard_set.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<KeyboardSet
+ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+ latin:keyboardLocale="mk">
+ <Element
+ latin:elementName="alphabet"
+ latin:elementKeyboard="@xml/kbd_serbian" />
+ <Element
+ latin:elementName="symbols"
+ latin:elementKeyboard="@xml/kbd_symbols" />
+ <Element
+ latin:elementName="symbolsShifted"
+ latin:elementKeyboard="@xml/kbd_symbols_shift" />
+ <Element
+ latin:elementName="phone"
+ latin:elementKeyboard="@xml/kbd_phone" />
+ <Element
+ latin:elementName="phoneSymbols"
+ latin:elementKeyboard="@xml/kbd_phone_symbols" />
+ <Element
+ latin:elementName="number"
+ latin:elementKeyboard="@xml/kbd_number" />
+</KeyboardSet>
diff --git a/java/res/xml-sw600dp/rows_number_normal.xml b/java/res/xml-sw600dp/rows_number_normal.xml
index 1c38a6265..3704c5284 100644
--- a/java/res/xml-sw600dp/rows_number_normal.xml
+++ b/java/res/xml-sw600dp/rows_number_normal.xml
@@ -63,10 +63,24 @@
latin:keyLabel="/"
latin:keyStyle="numKeyStyle"
latin:keyWidth="9.25%p" />
- <Key
- latin:keyLabel=","
- latin:keyStyle="numKeyStyle"
- latin:keyWidth="9.25%p" />
+ <switch>
+ <case
+ latin:mode="time|datetime"
+ >
+ <Key
+ latin:keyLabel=","
+ latin:keyLabelFlags="hasPopupHint"
+ latin:moreKeys="@string/more_keys_for_am_pm"
+ latin:keyStyle="numKeyStyle"
+ latin:keyWidth="9.25%p" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:keyStyle="numKeyStyle"
+ latin:keyWidth="9.25%p" />
+ </default>
+ </switch>
<Key
latin:keyLabel="4"
latin:keyStyle="numKeyStyle"
@@ -94,10 +108,22 @@
latin:keyLabel=")"
latin:keyStyle="numKeyStyle"
latin:keyWidth="9.25%p" />
- <Key
- latin:keyLabel="="
- latin:keyStyle="numKeyStyle"
- latin:keyWidth="9.25%p" />
+ <switch>
+ <case
+ latin:mode="time|datetime"
+ >
+ <Key
+ latin:keyLabel=":"
+ latin:keyStyle="numKeyStyle"
+ latin:keyWidth="9.25%p" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel="="
+ latin:keyStyle="numKeyStyle"
+ latin:keyWidth="9.25%p" />
+ </default>
+ </switch>
<Key
latin:keyLabel="7"
latin:keyStyle="numKeyStyle"
diff --git a/java/res/xml-sw600dp/rows_serbian.xml b/java/res/xml-sw600dp/rows_serbian.xml
index 5730aa050..989fa488c 100644
--- a/java/res/xml-sw600dp/rows_serbian.xml
+++ b/java/res/xml-sw600dp/rows_serbian.xml
@@ -35,22 +35,23 @@
latin:keyLabel="&#x045A;" />
<!-- U+0435: "е" CYRILLIC SMALL LETTER IE -->
<Key
- latin:keyLabel="&#x0435;" />
+ latin:keyLabel="&#x0435;"
+ latin:moreKeys="@string/more_keys_for_cyrillic_ie" />
<!-- U+0440: "р" CYRILLIC SMALL LETTER ER -->
<Key
latin:keyLabel="&#x0440;" />
<!-- U+0442: "т" CYRILLIC SMALL LETTER TE -->
<Key
latin:keyLabel="&#x0442;" />
- <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
<Key
- latin:keyLabel="&#x0437;" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_ze" />
<!-- U+0443: "у" CYRILLIC SMALL LETTER U -->
<Key
latin:keyLabel="&#x0443;" />
<!-- U+0438: "и" CYRILLIC SMALL LETTER I -->
<Key
- latin:keyLabel="&#x0438;" />
+ latin:keyLabel="&#x0438;"
+ latin:moreKeys="@string/more_keys_for_cyrillic_i" />
<!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
<Key
latin:keyLabel="&#x043E;" />
@@ -98,9 +99,8 @@
<!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE -->
<Key
latin:keyLabel="&#x0447;" />
- <!-- U+045B: "ћ" CYRILLIC SMALL LETTER TSHE -->
<Key
- latin:keyLabel="&#x045B;" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_tshe" />
<Key
latin:keyStyle="enterKeyStyle"
latin:keyXPos="-14.6%p"
@@ -112,9 +112,8 @@
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyWidth="8.0%p" />
- <!-- U+0455: "ѕ" CYRILLIC SMALL LETTER DZE -->
<Key
- latin:keyLabel="&#x0455;" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_dze" />
<!-- U+045F: "џ" CYRILLIC SMALL LETTER DZHE -->
<Key
latin:keyLabel="&#x045F;" />
@@ -133,9 +132,8 @@
<!-- U+043C: "м" CYRILLIC SMALL LETTER EM -->
<Key
latin:keyLabel="&#x043C;" />
- <!-- U+0452: "ђ" CYRILLIC SMALL LETTER DJE -->
<Key
- latin:keyLabel="&#x0452;" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_dje" />
<!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE -->
<Key
latin:keyLabel="&#x0436;" />
diff --git a/java/res/xml-sw600dp/rows_slavic.xml b/java/res/xml-sw600dp/rows_slavic.xml
index 58f0b3900..7ff63bc0e 100644
--- a/java/res/xml-sw600dp/rows_slavic.xml
+++ b/java/res/xml-sw600dp/rows_slavic.xml
@@ -35,18 +35,18 @@
<!-- U+0443: "у" CYRILLIC SMALL LETTER U -->
<Key
latin:keyLabel="&#x0443;"
- latin:moreKeys="@string/more_keys_for_slavic_u" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_u" />
<!-- U+043A: "к" CYRILLIC SMALL LETTER KA -->
<Key
latin:keyLabel="&#x043A;" />
<!-- U+0435: "е" CYRILLIC SMALL LETTER IE -->
<Key
latin:keyLabel="&#x0435;"
- latin:moreKeys="@string/more_keys_for_slavic_ye" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_ye" />
<!-- U+043D: "н" CYRILLIC SMALL LETTER EN -->
<Key
latin:keyLabel="&#x043D;"
- latin:moreKeys="@string/more_keys_for_slavic_en" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_en" />
<!-- U+0433: "г" CYRILLIC SMALL LETTER GHE -->
<Key
latin:keyLabel="&#x0433;" />
@@ -54,7 +54,7 @@
<Key
latin:keyLabel="&#x0448;" />
<Key
- latin:keyLabel="@string/keylabel_for_slavic_shcha" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_shcha" />
<!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
<Key
latin:keyLabel="&#x0437;" />
@@ -77,8 +77,8 @@
latin:keyLabel="&#x0444;"
latin:keyXPos="2.25%p" />
<Key
- latin:keyLabel="@string/keylabel_for_slavic_yery"
- latin:moreKeys="@string/more_keys_for_slavic_yery" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_yery"
+ latin:moreKeys="@string/more_keys_for_cyrillic_yery" />
<!-- U+0432: "в" CYRILLIC SMALL LETTER VE -->
<Key
latin:keyLabel="&#x0432;" />
@@ -94,7 +94,7 @@
<!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
<Key
latin:keyLabel="&#x043E;"
- latin:moreKeys="@string/more_keys_for_slavic_o" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_o" />
<!-- U+043B: "л" CYRILLIC SMALL LETTER EL -->
<Key
latin:keyLabel="&#x043B;" />
@@ -130,7 +130,7 @@
<Key
latin:keyLabel="&#x043C;" />
<Key
- latin:keyLabel="@string/keylabel_for_slavic_i" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_i" />
<!-- U+0442: "т" CYRILLIC SMALL LETTER TE -->
<Key
latin:keyLabel="&#x0442;" />
diff --git a/java/res/xml-sw768dp/rows_number_normal.xml b/java/res/xml-sw768dp/rows_number_normal.xml
index 60674cd17..8bf1a173f 100644
--- a/java/res/xml-sw768dp/rows_number_normal.xml
+++ b/java/res/xml-sw768dp/rows_number_normal.xml
@@ -65,10 +65,24 @@
latin:keyLabel="/"
latin:keyStyle="numKeyStyle"
latin:keyWidth="8.047%p" />
- <Key
- latin:keyLabel=","
- latin:keyStyle="numKeyStyle"
- latin:keyWidth="8.047%p" />
+ <switch>
+ <case
+ latin:mode="time|datetime"
+ >
+ <Key
+ latin:keyLabel=","
+ latin:keyLabelFlags="hasPopupHint"
+ latin:moreKeys="@string/more_keys_for_am_pm"
+ latin:keyStyle="numKeyStyle"
+ latin:keyWidth="8.047%p" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:keyStyle="numKeyStyle"
+ latin:keyWidth="8.047%p" />
+ </default>
+ </switch>
<Key
latin:keyLabel="4"
latin:keyStyle="numKeyStyle"
@@ -96,10 +110,22 @@
latin:keyLabel=")"
latin:keyStyle="numKeyStyle"
latin:keyWidth="8.047%p" />
- <Key
- latin:keyLabel="="
- latin:keyStyle="numKeyStyle"
- latin:keyWidth="8.047%p" />
+ <switch>
+ <case
+ latin:mode="time|datetime"
+ >
+ <Key
+ latin:keyLabel=":"
+ latin:keyStyle="numKeyStyle"
+ latin:keyWidth="8.047%p" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel="="
+ latin:keyStyle="numKeyStyle"
+ latin:keyWidth="8.047%p" />
+ </default>
+ </switch>
<Key
latin:keyLabel="7"
latin:keyStyle="numKeyStyle"
diff --git a/java/res/xml-sw768dp/rows_serbian.xml b/java/res/xml-sw768dp/rows_serbian.xml
index 39907c867..62668e5cc 100644
--- a/java/res/xml-sw768dp/rows_serbian.xml
+++ b/java/res/xml-sw768dp/rows_serbian.xml
@@ -37,22 +37,23 @@
latin:keyLabel="&#x045A;" />
<!-- U+0435: "е" CYRILLIC SMALL LETTER IE -->
<Key
- latin:keyLabel="&#x0435;" />
+ latin:keyLabel="&#x0435;"
+ latin:moreKeys="@string/more_keys_for_cyrillic_ie" />
<!-- U+0440: "р" CYRILLIC SMALL LETTER ER -->
<Key
latin:keyLabel="&#x0440;" />
<!-- U+0442: "т" CYRILLIC SMALL LETTER TE -->
<Key
latin:keyLabel="&#x0442;" />
- <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
<Key
- latin:keyLabel="&#x0437;" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_ze" />
<!-- U+0443: "у" CYRILLIC SMALL LETTER U -->
<Key
latin:keyLabel="&#x0443;" />
<!-- U+0438: "и" CYRILLIC SMALL LETTER I -->
<Key
- latin:keyLabel="&#x0438;" />
+ latin:keyLabel="&#x0438;"
+ latin:moreKeys="@string/more_keys_for_cyrillic_i" />
<!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
<Key
latin:keyLabel="&#x043E;" />
@@ -107,9 +108,8 @@
<!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE -->
<Key
latin:keyLabel="&#x0447;" />
- <!-- U+045B: "ћ" CYRILLIC SMALL LETTER TSHE -->
<Key
- latin:keyLabel="&#x045B;" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_tshe" />
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyXPos="-9.219%p"
@@ -121,9 +121,8 @@
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyWidth="13.829%p" />
- <!-- U+0455: "ѕ" CYRILLIC SMALL LETTER DZE -->
<Key
- latin:keyLabel="&#x0455;" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_dze" />
<!-- U+045F: "џ" CYRILLIC SMALL LETTER DZHE -->
<Key
latin:keyLabel="&#x045F;" />
@@ -142,6 +141,8 @@
<!-- U+043C: "м" CYRILLIC SMALL LETTER EM -->
<Key
latin:keyLabel="&#x043C;" />
+ <Key
+ latin:keyLabel="@string/keylabel_for_cyrillic_dje" />
<include
latin:keyboardLayout="@xml/keys_comma_period" />
<Key
diff --git a/java/res/xml-sw768dp/rows_slavic.xml b/java/res/xml-sw768dp/rows_slavic.xml
index 26857aebc..3611ef6b3 100644
--- a/java/res/xml-sw768dp/rows_slavic.xml
+++ b/java/res/xml-sw768dp/rows_slavic.xml
@@ -38,18 +38,18 @@
<!-- U+0443: "у" CYRILLIC SMALL LETTER U -->
<Key
latin:keyLabel="&#x0443;"
- latin:moreKeys="@string/more_keys_for_slavic_u" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_u" />
<!-- U+043A: "к" CYRILLIC SMALL LETTER KA -->
<Key
latin:keyLabel="&#x043A;" />
<!-- U+0435: "е" CYRILLIC SMALL LETTER IE -->
<Key
latin:keyLabel="&#x0435;"
- latin:moreKeys="@string/more_keys_for_slavic_ye" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_ye" />
<!-- U+043D: "н" CYRILLIC SMALL LETTER EN -->
<Key
latin:keyLabel="&#x043D;"
- latin:moreKeys="@string/more_keys_for_slavic_en" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_en" />
<!-- U+0433: "г" CYRILLIC SMALL LETTER GHE -->
<Key
latin:keyLabel="&#x0433;" />
@@ -57,7 +57,7 @@
<Key
latin:keyLabel="&#x0448;" />
<Key
- latin:keyLabel="@string/keylabel_for_slavic_shcha" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_shcha" />
<!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
<Key
latin:keyLabel="&#x0437;" />
@@ -82,8 +82,8 @@
<Key
latin:keyLabel="&#x0444;" />
<Key
- latin:keyLabel="@string/keylabel_for_slavic_yery"
- latin:moreKeys="@string/more_keys_for_slavic_yery" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_yery"
+ latin:moreKeys="@string/more_keys_for_cyrillic_yery" />
<!-- U+0432: "в" CYRILLIC SMALL LETTER VE -->
<Key
latin:keyLabel="&#x0432;" />
@@ -99,7 +99,7 @@
<!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
<Key
latin:keyLabel="&#x043E;"
- latin:moreKeys="@string/more_keys_for_slavic_o" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_o" />
<!-- U+043B: "л" CYRILLIC SMALL LETTER EL -->
<Key
latin:keyLabel="&#x043B;" />
@@ -136,7 +136,7 @@
<Key
latin:keyLabel="&#x043C;" />
<Key
- latin:keyLabel="@string/keylabel_for_slavic_i" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_i" />
<!-- U+0442: "т" CYRILLIC SMALL LETTER TE -->
<Key
latin:keyLabel="&#x0442;" />
diff --git a/java/res/xml/key_styles_number.xml b/java/res/xml/key_styles_number.xml
index 01f7aee59..3627836b9 100644
--- a/java/res/xml/key_styles_number.xml
+++ b/java/res/xml/key_styles_number.xml
@@ -41,9 +41,12 @@
latin:styleName="numberKeyStyle"
latin:keyLabelFlags="alignLeftOfCenter|hasHintLabel"
latin:parentStyle="numKeyStyle" />
+ <!-- U+0030: "0" DIGIT ZERO
+ U+002B: "+" PLUS SIGN -->
<key-style
latin:styleName="num0KeyStyle"
- latin:code="48"
+ latin:code="0x0030"
+ latin:altCode="0x002B"
latin:keyLabel="0 +"
latin:keyActionFlags="enableLongPress"
latin:parentStyle="numberKeyStyle" />
@@ -91,10 +94,11 @@
latin:keyLabel="9"
latin:keyHintLabel="WXYZ"
latin:parentStyle="numberKeyStyle" />
- <!-- U+FF0A: "*" FULLWIDTH ASTERISK -->
+ <!-- U+002A: "*" ASTERISK
+ U+FF0A: "*" FULLWIDTH ASTERISK -->
<key-style
latin:styleName="numStarKeyStyle"
- latin:code="42"
+ latin:code="0x002A"
latin:keyLabel="&#xFF0A;"
latin:parentStyle="numKeyStyle" />
<!-- Only for non-tablet device -->
@@ -108,15 +112,17 @@
latin:code="@integer/key_switch_alpha_symbol"
latin:keyLabel="@string/label_to_phone_numeric_key"
latin:parentStyle="numModeKeyStyle" />
+ <!-- U+002C: "," COMMA -->
<key-style
latin:styleName="numPauseKeyStyle"
- latin:code="44"
+ latin:code="0x002C"
latin:keyLabel="@string/label_pause_key"
latin:keyLabelFlags="followKeyHintLabelRatio|autoXScale"
latin:parentStyle="numKeyBaseStyle" />
+ <!-- U+003B: ";" SEMICOLON -->
<key-style
latin:styleName="numWaitKeyStyle"
- latin:code="59"
+ latin:code="0x003B"
latin:keyLabel="@string/label_wait_key"
latin:keyLabelFlags="followKeyHintLabelRatio|autoXScale"
latin:parentStyle="numKeyBaseStyle" />
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index 98dc7667e..e29cc0d6a 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -21,7 +21,8 @@
<!-- for the Input Method Manager. -->
<!-- Keyboard: en_US, en_GB, ar, be, bg, cs, da, de, de(QWERTY), es, es_US, et, fi, fr, fr_CA,
- fr_CH, hr, hu, it, iw, ka, ky, lt, lv, nb, nl, pl, pt, ro, ru, sk, sl, sr, sv, tr, uk, vi -->
+ fr_CH, hr, hu, it, iw, ka, ky, lt, lv, mk, nb, nl, pl, pt, ro, ru, sk, sl, sr, sv, tr, uk,
+ vi -->
<!-- TODO: use <lang>_keyboard icon instead of a common keyboard icon. -->
<!-- If IME doesn't have an applicable subtype, the first subtype will be used as a default
subtype.-->
@@ -169,6 +170,12 @@
/>
<subtype android:icon="@drawable/ic_subtype_keyboard"
android:label="@string/subtype_generic"
+ android:imeSubtypeLocale="mk"
+ android:imeSubtypeMode="keyboard"
+ android:imeSubtypeExtraValue="SupportTouchPositionCorrection"
+ />
+ <subtype android:icon="@drawable/ic_subtype_keyboard"
+ android:label="@string/subtype_generic"
android:imeSubtypeLocale="nb"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection"
diff --git a/java/res/xml/rows_number_normal.xml b/java/res/xml/rows_number_normal.xml
index b581fb5cd..91b1fe989 100644
--- a/java/res/xml/rows_number_normal.xml
+++ b/java/res/xml/rows_number_normal.xml
@@ -46,10 +46,32 @@
<Key
latin:keyLabel="6"
latin:keyStyle="numKeyStyle" />
- <Key
- latin:keyLabel=","
- latin:keyStyle="numFunctionalKeyStyle"
- latin:keyWidth="fillRight" />
+ <switch>
+ <case
+ latin:mode="date"
+ >
+ <Key
+ latin:keyLabel="."
+ latin:keyStyle="numFunctionalKeyStyle"
+ latin:keyWidth="fillRight" />
+ </case>
+ <case
+ latin:mode="time|datetime"
+ >
+ <Key
+ latin:keyLabel="."
+ latin:keyLabelFlags="hasPopupHint"
+ latin:moreKeys="@string/more_keys_for_am_pm"
+ latin:keyStyle="numFunctionalKeyStyle"
+ latin:keyWidth="fillRight" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel=","
+ latin:keyStyle="numFunctionalKeyStyle"
+ latin:keyWidth="fillRight" />
+ </default>
+ </switch>
</Row>
<Row>
<Key
@@ -71,9 +93,39 @@
<Key
latin:keyLabel="0"
latin:keyStyle="numKeyStyle" />
- <Key
- latin:keyLabel="."
- latin:keyStyle="numKeyStyle" />
+ <switch>
+ <case
+ latin:mode="date"
+ >
+ <Key
+ latin:keyLabel="/"
+ latin:keyStyle="numKeyStyle" />
+ </case>
+ <case
+ latin:mode="time"
+ >
+ <Key
+ latin:keyLabel=":"
+ latin:keyStyle="numKeyStyle" />
+ </case>
+ <case
+ latin:mode="datetime"
+ >
+ <!-- U+002F: "/" SOLIDUS
+ U+003A: ":" COLON -->
+ <Key
+ latin:code="0x002F"
+ latin:altCode="0x003A"
+ latin:keyLabel="/ :"
+ latin:keyActionFlags="enableLongPress"
+ latin:keyStyle="numKeyStyle" />
+ </case>
+ <default>
+ <Key
+ latin:keyLabel="."
+ latin:keyStyle="numKeyStyle" />
+ </default>
+ </switch>
<Key
latin:keyStyle="enterKeyStyle"
latin:keyWidth="fillRight" />
diff --git a/java/res/xml/rows_serbian.xml b/java/res/xml/rows_serbian.xml
index cf52fe0cc..ed33dc751 100644
--- a/java/res/xml/rows_serbian.xml
+++ b/java/res/xml/rows_serbian.xml
@@ -40,7 +40,8 @@
<Key
latin:keyLabel="&#x0435;"
latin:keyHintLabel="3"
- latin:additionalMoreKeys="3" />
+ latin:additionalMoreKeys="3"
+ latin:moreKeys="@string/more_keys_for_cyrillic_ie" />
<!-- U+0440: "р" CYRILLIC SMALL LETTER ER -->
<Key
latin:keyLabel="&#x0440;"
@@ -51,9 +52,8 @@
latin:keyLabel="&#x0442;"
latin:keyHintLabel="5"
latin:additionalMoreKeys="5" />
- <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
<Key
- latin:keyLabel="&#x0437;"
+ latin:keyLabel="@string/keylabel_for_cyrillic_ze"
latin:keyHintLabel="6"
latin:additionalMoreKeys="6" />
<!-- U+0443: "у" CYRILLIC SMALL LETTER U -->
@@ -65,7 +65,8 @@
<Key
latin:keyLabel="&#x0438;"
latin:keyHintLabel="8"
- latin:additionalMoreKeys="8" />
+ latin:additionalMoreKeys="8"
+ latin:moreKeys="@string/more_keys_for_cyrillic_i" />
<!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
<Key
latin:keyLabel="&#x043E;"
@@ -114,9 +115,8 @@
<!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE -->
<Key
latin:keyLabel="&#x0447;" />
- <!-- U+045B: "ћ" CYRILLIC SMALL LETTER TSHE -->
<Key
- latin:keyLabel="&#x045B;"
+ latin:keyLabel="@string/keylabel_for_cyrillic_tshe"
latin:keyWidth="fillRight" />
</Row>
<Row
@@ -125,9 +125,8 @@
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyWidth="11.75%p" />
- <!-- U+0455: "ѕ" CYRILLIC SMALL LETTER DZE -->
<Key
- latin:keyLabel="&#x0455;" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_dze" />
<!-- U+045F: "џ" CYRILLIC SMALL LETTER DZHE -->
<Key
latin:keyLabel="&#x045F;" />
@@ -146,9 +145,8 @@
<!-- U+043C: "м" CYRILLIC SMALL LETTER EM -->
<Key
latin:keyLabel="&#x043C;" />
- <!-- U+0452: "ђ" CYRILLIC SMALL LETTER DJE -->
<Key
- latin:keyLabel="&#x0452;" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_dje" />
<!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE -->
<Key
latin:keyLabel="&#x0436;" />
diff --git a/java/res/xml/rows_slavic.xml b/java/res/xml/rows_slavic.xml
index 4099edd3f..d75f2091a 100644
--- a/java/res/xml/rows_slavic.xml
+++ b/java/res/xml/rows_slavic.xml
@@ -41,7 +41,7 @@
latin:keyLabel="&#x0443;"
latin:keyHintLabel="3"
latin:additionalMoreKeys="3"
- latin:moreKeys="@string/more_keys_for_slavic_u" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_u" />
<!-- U+043A: "к" CYRILLIC SMALL LETTER KA -->
<Key
latin:keyLabel="&#x043A;"
@@ -52,13 +52,13 @@
latin:keyLabel="&#x0435;"
latin:keyHintLabel="5"
latin:additionalMoreKeys="5"
- latin:moreKeys="@string/more_keys_for_slavic_ye" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_ye" />
<!-- U+043D: "н" CYRILLIC SMALL LETTER EN -->
<Key
latin:keyLabel="&#x043D;"
latin:keyHintLabel="6"
latin:additionalMoreKeys="6"
- latin:moreKeys="@string/more_keys_for_slavic_en" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_en" />
<!-- U+0433: "г" CYRILLIC SMALL LETTER GHE -->
<Key
latin:keyLabel="&#x0433;"
@@ -70,7 +70,7 @@
latin:keyHintLabel="8"
latin:additionalMoreKeys="8" />
<Key
- latin:keyLabel="@string/keylabel_for_slavic_shcha"
+ latin:keyLabel="@string/keylabel_for_cyrillic_shcha"
latin:keyHintLabel="9"
latin:additionalMoreKeys="9" />
<!-- U+0437: "з" CYRILLIC SMALL LETTER ZE -->
@@ -81,7 +81,7 @@
<!-- U+0445: "х" CYRILLIC SMALL LETTER HA -->
<Key
latin:keyLabel="&#x0445;"
- latin:moreKeys="@string/more_keys_for_slavic_ha"
+ latin:moreKeys="@string/more_keys_for_cyrillic_ha"
latin:keyWidth="fillRight" />
</Row>
<Row
@@ -91,8 +91,8 @@
<Key
latin:keyLabel="&#x0444;" />
<Key
- latin:keyLabel="@string/keylabel_for_slavic_yery"
- latin:moreKeys="@string/more_keys_for_slavic_yery" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_yery"
+ latin:moreKeys="@string/more_keys_for_cyrillic_yery" />
<!-- U+0432: "в" CYRILLIC SMALL LETTER VE -->
<Key
latin:keyLabel="&#x0432;" />
@@ -108,7 +108,7 @@
<!-- U+043E: "о" CYRILLIC SMALL LETTER O -->
<Key
latin:keyLabel="&#x043E;"
- latin:moreKeys="@string/more_keys_for_slavic_o" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_o" />
<!-- U+043B: "л" CYRILLIC SMALL LETTER EL -->
<Key
latin:keyLabel="&#x043B;" />
@@ -142,14 +142,14 @@
<Key
latin:keyLabel="&#x043C;" />
<Key
- latin:keyLabel="@string/keylabel_for_slavic_i" />
+ latin:keyLabel="@string/keylabel_for_cyrillic_i" />
<!-- U+0442: "т" CYRILLIC SMALL LETTER TE -->
<Key
latin:keyLabel="&#x0442;" />
<!-- U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN -->
<Key
latin:keyLabel="&#x044C;"
- latin:moreKeys="@string/more_keys_for_slavic_soft_sign" />
+ latin:moreKeys="@string/more_keys_for_cyrillic_soft_sign" />
<!-- U+0431: "б" CYRILLIC SMALL LETTER BE -->
<Key
latin:keyLabel="&#x0431;" />
diff --git a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java
index 5c4e9af68..700709d50 100644
--- a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java
+++ b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java
@@ -435,44 +435,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
}
}
- /**
- * Tries to apply any voice alternatives for the word if this was a spoken word and
- * there are voice alternatives.
- * @param touching The word that the cursor is touching, with position information
- * @return true if an alternative was found, false otherwise.
- */
- public boolean applyVoiceAlternatives(EditingUtils.SelectedWord touching) {
- if (!VOICE_INSTALLED) {
- return false;
- }
- // Search for result in spoken word alternatives
- String selectedWord = touching.mWord.toString().trim();
- if (!mWordToSuggestions.containsKey(selectedWord)) {
- selectedWord = selectedWord.toLowerCase();
- }
- if (mWordToSuggestions.containsKey(selectedWord)) {
- mShowingVoiceSuggestions = true;
- List<CharSequence> suggestions = mWordToSuggestions.get(selectedWord);
- SuggestedWords.Builder builder = new SuggestedWords.Builder();
- // If the first letter of touching is capitalized, make all the suggestions
- // start with a capital letter.
- if (Character.isUpperCase(touching.mWord.charAt(0))) {
- for (CharSequence word : suggestions) {
- String str = word.toString();
- word = Character.toUpperCase(str.charAt(0)) + str.substring(1);
- builder.addWord(word);
- }
- } else {
- builder.addWords(suggestions, null);
- }
- builder.setTypedWordValid(true).setHasMinimalSuggestion(true);
- mService.setSuggestions(builder.build());
-// mService.setCandidatesViewShown(true);
- return true;
- }
- return false;
- }
-
public void handleBackspace() {
if (!VOICE_INSTALLED) {
return;
diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
index 0ce98d2f1..10cf1d1f4 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -267,7 +267,7 @@ public class KeyDetector {
addDelimiter = false;
} else {
if (addDelimiter) sb.append(", ");
- sb.append(code);
+ sb.append(Keyboard.printableCode(code));
addDelimiter = true;
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 30ed59e18..c6cdf7986 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -85,8 +85,6 @@ public class Keyboard {
public static final int CODE_CLOSING_SQUARE_BRACKET = ']';
public static final int CODE_CLOSING_CURLY_BRACKET = '}';
public static final int CODE_CLOSING_ANGLE_BRACKET = '>';
- public static final int CODE_DIGIT0 = '0';
- public static final int CODE_PLUS = '+';
private static final int MINIMUM_LETTER_CODE = CODE_TAB;
/** Special keys code. Must be negative.
@@ -185,18 +183,11 @@ public class Keyboard {
}
// TODO: Remove this method.
- public boolean isShiftLocked() {
- return mId.isAlphabetShiftLockedKeyboard();
- }
-
- // TODO: Remove this method.
public boolean isShiftedOrShiftLocked() {
- return mId.isAlphabetShiftedOrShiftLockedKeyboard();
- }
-
- // TODO: Remove this method.
- public boolean isManualShifted() {
- return mId.isAlphabetManualShiftedKeyboard();
+ // Alphabet mode have unshifted, manual shifted, automatic shifted, shift locked, and
+ // shift lock shifted element. So that unshifed element is the only one that is NOT in
+ // shifted or shift locked state.
+ return mId.isAlphabetKeyboard() && mId.mElementId != KeyboardId.ELEMENT_ALPHABET;
}
public static boolean isLetterCode(int code) {
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
index ed4a89e0f..f5752962e 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -36,6 +36,9 @@ public class KeyboardId {
public static final int MODE_IM = 3;
public static final int MODE_PHONE = 4;
public static final int MODE_NUMBER = 5;
+ public static final int MODE_DATE = 6;
+ public static final int MODE_TIME = 7;
+ public static final int MODE_DATETIME = 8;
public static final int ELEMENT_ALPHABET = 0;
public static final int ELEMENT_ALPHABET_MANUAL_SHIFTED = 1;
@@ -123,31 +126,6 @@ public class KeyboardId {
return mElementId < ELEMENT_SYMBOLS;
}
- public boolean isAlphabetShiftLockedKeyboard() {
- return mElementId == ELEMENT_ALPHABET_SHIFT_LOCKED
- || mElementId == ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED;
- }
-
- public boolean isAlphabetShiftedOrShiftLockedKeyboard() {
- return isAlphabetKeyboard() && mElementId != ELEMENT_ALPHABET;
- }
-
- public boolean isAlphabetManualShiftedKeyboard() {
- return mElementId == ELEMENT_ALPHABET_MANUAL_SHIFTED;
- }
-
- public boolean isSymbolsKeyboard() {
- return mElementId == ELEMENT_SYMBOLS || mElementId == ELEMENT_SYMBOLS_SHIFTED;
- }
-
- public boolean isPhoneKeyboard() {
- return mElementId == ELEMENT_PHONE || mElementId == ELEMENT_PHONE_SYMBOLS;
- }
-
- public boolean isPhoneShiftKeyboard() {
- return mElementId == ELEMENT_PHONE_SYMBOLS;
- }
-
public boolean navigateNext() {
return EditorInfoCompatUtils.hasFlagNavigateNext(mEditorInfo.imeOptions);
}
@@ -242,6 +220,9 @@ public class KeyboardId {
case MODE_IM: return "im";
case MODE_PHONE: return "phone";
case MODE_NUMBER: return "number";
+ case MODE_DATE: return "date";
+ case MODE_TIME: return "time";
+ case MODE_DATETIME: return "datetime";
default: return null;
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSet.java b/java/src/com/android/inputmethod/keyboard/KeyboardSet.java
index 6e62f743b..ee882edc0 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSet.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSet.java
@@ -131,6 +131,9 @@ public class KeyboardSet {
}
break;
case KeyboardId.MODE_NUMBER:
+ case KeyboardId.MODE_DATE:
+ case KeyboardId.MODE_TIME:
+ case KeyboardId.MODE_DATETIME:
keyboardSetElementId = KeyboardId.ELEMENT_NUMBER;
break;
default:
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index d65253ede..78e0ee230 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -849,7 +849,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
final KeyPreviewDrawParams params = mKeyPreviewDrawParams;
final int keyDrawX = key.mX + key.mVisualInsetsLeft;
final int keyDrawWidth = key.mWidth - key.mVisualInsetsLeft - key.mVisualInsetsRight;
- // What we show as preview should match what we show on key top in onBufferDraw().
+ // What we show as preview should match what we show on a key top in onBufferDraw().
if (key.mLabel != null) {
// TODO Should take care of temporaryShiftLabel here.
previewText.setCompoundDrawables(null, null, null, null);
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index 432959508..89dad7be5 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -481,11 +481,10 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
*/
protected boolean onLongPress(Key parentKey, PointerTracker tracker) {
final int primaryCode = parentKey.mCode;
- final Keyboard keyboard = getKeyboard();
- if (primaryCode == Keyboard.CODE_DIGIT0 && keyboard.mId.isPhoneKeyboard()) {
+ if (parentKey.mAltCode != Keyboard.CODE_UNSPECIFIED) {
+ // Long press on a key that has altCode defined.
tracker.onLongPressed();
- // Long pressing on 0 in phone number keypad gives you a '+'.
- invokeCodeInput(Keyboard.CODE_PLUS);
+ invokeCodeInput(parentKey.mAltCode);
invokeReleaseKey(primaryCode);
KeyboardSwitcher.getInstance().hapticAndAudioFeedback(primaryCode);
return true;
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 953d87beb..211b69a44 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -979,7 +979,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
.setTypedWordValid(false)
.setHasMinimalSuggestion(false);
// When in fullscreen mode, show completions generated by the application
- setSuggestions(builder.build());
+ final SuggestedWords words = builder.build();
+ setSuggestions(words);
+ setAutoCorrectionIndicator(Utils.willAutoCorrect(words));
// TODO: is this the right thing to do? What should we auto-correct to in
// this case? This says to keep whatever the user typed.
mWordComposer.setAutoCorrection(mWordComposer.getTypedWord());
@@ -1713,21 +1715,23 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public void clearSuggestions() {
setSuggestions(SuggestedWords.EMPTY);
+ setAutoCorrectionIndicator(false);
}
- public void setSuggestions(SuggestedWords words) {
+ public void setSuggestions(final SuggestedWords words) {
if (mSuggestionsView != null) {
mSuggestionsView.setSuggestions(words);
mKeyboardSwitcher.onAutoCorrectionStateChanged(
words.hasWordAboveAutoCorrectionScoreThreshold());
}
+ }
+ private void setAutoCorrectionIndicator(final boolean newAutoCorrectionIndicator) {
// Put a blue underline to a word in TextView which will be auto-corrected.
final InputConnection ic = getCurrentInputConnection();
if (ic != null) {
final boolean oldAutoCorrectionIndicator =
mComposingStateManager.isAutoCorrectionIndicatorOn();
- final boolean newAutoCorrectionIndicator = Utils.willAutoCorrect(words);
if (oldAutoCorrectionIndicator != newAutoCorrectionIndicator) {
mComposingStateManager.setAutoCorrectionIndicatorOn(newAutoCorrectionIndicator);
if (DEBUG) {
@@ -1738,9 +1742,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
throw new RuntimeException("Couldn't flip the indicator!");
}
}
- final CharSequence textWithUnderline =
- getTextWithUnderline(mWordComposer.getTypedWord());
- if (!TextUtils.isEmpty(textWithUnderline)) {
+ if (mWordComposer.isComposingWord()) {
+ final CharSequence textWithUnderline =
+ getTextWithUnderline(mWordComposer.getTypedWord());
ic.setComposingText(textWithUnderline, 1);
}
}
@@ -1830,25 +1834,25 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
showSuggestions(builder.build(), typedWord);
}
- public void showSuggestions(SuggestedWords suggestedWords, CharSequence typedWord) {
+ public void showSuggestions(final SuggestedWords suggestedWords, final CharSequence typedWord) {
final boolean shouldBlockAutoCorrectionBySafetyNet =
Utils.shouldBlockAutoCorrectionBySafetyNet(suggestedWords, mSuggest);
if (shouldBlockAutoCorrectionBySafetyNet) {
suggestedWords.setShouldBlockAutoCorrection();
}
- setSuggestions(suggestedWords);
+ final CharSequence autoCorrection;
if (suggestedWords.size() > 0) {
- if (shouldBlockAutoCorrectionBySafetyNet) {
- mWordComposer.setAutoCorrection(typedWord);
- } else if (suggestedWords.hasAutoCorrectionWord()) {
- mWordComposer.setAutoCorrection(suggestedWords.getWord(1));
+ if (!shouldBlockAutoCorrectionBySafetyNet && suggestedWords.hasAutoCorrectionWord()) {
+ autoCorrection = suggestedWords.getWord(1);
} else {
- mWordComposer.setAutoCorrection(typedWord);
+ autoCorrection = typedWord;
}
} else {
- // TODO: replace with mWordComposer.deleteAutoCorrection()?
- mWordComposer.setAutoCorrection(null);
+ autoCorrection = null;
}
+ mWordComposer.setAutoCorrection(autoCorrection);
+ setSuggestions(suggestedWords);
+ setAutoCorrectionIndicator(Utils.willAutoCorrect(suggestedWords));
setSuggestionStripShown(isSuggestionsStripVisible());
}
@@ -2022,6 +2026,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
public void setPunctuationSuggestions() {
setSuggestions(mSettingsValues.mSuggestPuncList);
+ setAutoCorrectionIndicator(false);
setSuggestionStripShown(isSuggestionsStripVisible());
}
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index 6d63e95f6..47ea9ee8a 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -563,8 +563,16 @@ public class Utils {
switch (inputType & InputType.TYPE_MASK_CLASS) {
case InputType.TYPE_CLASS_NUMBER:
- case InputType.TYPE_CLASS_DATETIME:
return KeyboardId.MODE_NUMBER;
+ case InputType.TYPE_CLASS_DATETIME:
+ switch (variation) {
+ case InputType.TYPE_DATETIME_VARIATION_DATE:
+ return KeyboardId.MODE_DATE;
+ case InputType.TYPE_DATETIME_VARIATION_TIME:
+ return KeyboardId.MODE_TIME;
+ default: // InputType.TYPE_DATETIME_VARIATION_NORMAL
+ return KeyboardId.MODE_DATETIME;
+ }
case InputType.TYPE_CLASS_PHONE:
return KeyboardId.MODE_PHONE;
case InputType.TYPE_CLASS_TEXT:
diff --git a/native/src/correction.h b/native/src/correction.h
index 2114eff4b..ee55c9604 100644
--- a/native/src/correction.h
+++ b/native/src/correction.h
@@ -17,6 +17,7 @@
#ifndef LATINIME_CORRECTION_H
#define LATINIME_CORRECTION_H
+#include <assert.h>
#include <stdint.h>
#include "correction_state.h"
@@ -50,7 +51,14 @@ class Correction {
const int temp = *base;
if (temp != S_INT_MAX) {
// Branch if multiplier == 2 for the optimization
- if (multiplier == 2) {
+ if (multiplier < 0) {
+ if (DEBUG_DICT) {
+ assert(false);
+ }
+ AKLOGI("--- Invalid multiplier: %d", multiplier);
+ } else if (multiplier == 0) {
+ *base = 0;
+ } else if (multiplier == 2) {
*base = TWO_31ST_DIV_2 >= temp ? temp << 1 : S_INT_MAX;
} else {
// TODO: This overflow check gives a wrong answer when, for example,
diff --git a/tests/res/raw/test.dict b/tests/res/raw/test.dict
deleted file mode 100644
index 453fc9fce..000000000
--- a/tests/res/raw/test.dict
+++ /dev/null
Binary files differ
diff --git a/tests/src/com/android/inputmethod/latin/InputLogicTests.java b/tests/src/com/android/inputmethod/latin/InputLogicTests.java
index 628601924..9d53b63f1 100644
--- a/tests/src/com/android/inputmethod/latin/InputLogicTests.java
+++ b/tests/src/com/android/inputmethod/latin/InputLogicTests.java
@@ -24,6 +24,8 @@ import android.os.MessageQueue;
import android.preference.PreferenceManager;
import android.test.ServiceTestCase;
import android.text.InputType;
+import android.text.SpannableStringBuilder;
+import android.text.style.SuggestionSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.ViewGroup;
@@ -199,6 +201,13 @@ public class InputLogicTests extends ServiceTestCase<LatinIME> {
}
}
+ // Helper to avoid writing the try{}catch block each time
+ private static void sleep(final int milliseconds) {
+ try {
+ Thread.sleep(milliseconds);
+ } catch (InterruptedException e) {}
+ }
+
public void testTypeWord() {
final String WORD_TO_TYPE = "abcd";
type(WORD_TO_TYPE);
@@ -493,5 +502,115 @@ public class InputLogicTests extends ServiceTestCase<LatinIME> {
EXPECTED_RESULT, mTextView.getText().toString());
}
+ // A helper class to ease span tests
+ private static class Span {
+ final SpannableStringBuilder mInputText;
+ final SuggestionSpan mSpan;
+ final int mStart;
+ final int mEnd;
+ // The supplied CharSequence should be an instance of SpannableStringBuilder,
+ // and it should contain exactly zero or one SuggestionSpan. Otherwise, an exception
+ // is thrown.
+ public Span(final CharSequence inputText) {
+ mInputText = (SpannableStringBuilder)inputText;
+ final SuggestionSpan[] spans =
+ mInputText.getSpans(0, mInputText.length(), SuggestionSpan.class);
+ if (0 == spans.length) {
+ mSpan = null;
+ mStart = -1;
+ mEnd = -1;
+ } else if (1 == spans.length) {
+ mSpan = spans[0];
+ mStart = mInputText.getSpanStart(mSpan);
+ mEnd = mInputText.getSpanEnd(mSpan);
+ } else {
+ throw new RuntimeException("Expected one SuggestionSpan, found " + spans.length);
+ }
+ }
+ public boolean isAutoCorrectionIndicator() {
+ return 0 != (SuggestionSpan.FLAG_AUTO_CORRECTION & mSpan.getFlags());
+ }
+ }
+
+ static final int DELAY_TO_WAIT_FOR_UNDERLINE = 200; // The message is posted with a 100 ms delay
+ public void testBlueUnderline() {
+ final String STRING_TO_TYPE = "tgis";
+ final int EXPECTED_SPAN_START = 0;
+ final int EXPECTED_SPAN_END = 4;
+ type(STRING_TO_TYPE);
+ sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
+ runMessages();
+ final Span span = new Span(mTextView.getText());
+ assertEquals("show blue underline, span start", EXPECTED_SPAN_START, span.mStart);
+ assertEquals("show blue underline, span end", EXPECTED_SPAN_END, span.mEnd);
+ assertEquals("show blue underline, span color", true, span.isAutoCorrectionIndicator());
+ }
+
+ public void testBlueUnderlineDisappears() {
+ final String STRING_1_TO_TYPE = "tgis";
+ final String STRING_2_TO_TYPE = "q";
+ final int EXPECTED_SPAN_START = 0;
+ final int EXPECTED_SPAN_END = 5;
+ type(STRING_1_TO_TYPE);
+ sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
+ runMessages();
+ type(STRING_2_TO_TYPE);
+ // We haven't have time to look into the dictionary yet, so the line should still be
+ // blue to avoid any flicker.
+ final Span spanBefore = new Span(mTextView.getText());
+ assertEquals("extend blue underline, span start", EXPECTED_SPAN_START, spanBefore.mStart);
+ assertEquals("extend blue underline, span end", EXPECTED_SPAN_END, spanBefore.mEnd);
+ assertEquals("extend blue underline, span color", true,
+ spanBefore.isAutoCorrectionIndicator());
+ sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
+ runMessages();
+ // Now we have been able to re-evaluate the word, there shouldn't be an auto-correction span
+ final Span spanAfter = new Span(mTextView.getText());
+ assertNull("hide blue underline", spanAfter.mSpan);
+ }
+
+ public void testBlueUnderlineOnBackspace() {
+ final String STRING_TO_TYPE = "tgis";
+ final int EXPECTED_SPAN_START = 0;
+ final int EXPECTED_SPAN_END = 4;
+ type(STRING_TO_TYPE);
+ sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
+ runMessages();
+ type(Keyboard.CODE_SPACE);
+ sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
+ runMessages();
+ type(Keyboard.CODE_DELETE);
+ sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
+ runMessages();
+ type(Keyboard.CODE_DELETE);
+ sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
+ runMessages();
+ final Span span = new Span(mTextView.getText());
+ assertEquals("show blue underline after backspace, span start",
+ EXPECTED_SPAN_START, span.mStart);
+ assertEquals("show blue underline after backspace, span end",
+ EXPECTED_SPAN_END, span.mEnd);
+ assertEquals("show blue underline after backspace, span color", true,
+ span.isAutoCorrectionIndicator());
+ }
+
+ public void testBlueUnderlineDisappearsWhenCursorMoved() {
+ final String STRING_TO_TYPE = "tgis";
+ final int NEW_CURSOR_POSITION = 0;
+ type(STRING_TO_TYPE);
+ sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
+ // Simulate the onUpdateSelection() event
+ mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
+ runMessages();
+ // Here the blue underline has been set. testBlueUnderline() is testing for this already,
+ // so let's not test it here again.
+ // Now simulate the user moving the cursor.
+ mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION);
+ mLatinIME.onUpdateSelection(0, 0, NEW_CURSOR_POSITION, NEW_CURSOR_POSITION, -1, -1);
+ sleep(DELAY_TO_WAIT_FOR_UNDERLINE);
+ runMessages();
+ final Span span = new Span(mTextView.getText());
+ assertNull("blue underline removed when cursor is moved", span.mSpan);
+ }
// TODO: Add some tests for non-BMP characters
}
diff --git a/tests/src/com/android/inputmethod/latin/SuggestHelper.java b/tests/src/com/android/inputmethod/latin/SuggestHelper.java
deleted file mode 100644
index 0c023bd78..000000000
--- a/tests/src/com/android/inputmethod/latin/SuggestHelper.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.Context;
-import android.text.TextUtils;
-
-import com.android.inputmethod.keyboard.KeyDetector;
-import com.android.inputmethod.keyboard.Keyboard;
-import com.android.inputmethod.keyboard.KeyboardId;
-import com.android.inputmethod.keyboard.KeyboardSet;
-
-import java.io.File;
-import java.util.Locale;
-
-public class SuggestHelper {
- protected final Suggest mSuggest;
- protected int mCorrectionMode;
- protected final Keyboard mKeyboard;
- private final KeyDetector mKeyDetector;
-
- public SuggestHelper(Context context, int dictionaryId, KeyboardSet keyboardSet) {
- // Use null as the locale for Suggest so as to force it to use the internal dictionary
- // (and not try to find a dictionary provider for a specified locale)
- this(new Suggest(context, dictionaryId, null), keyboardSet);
- }
-
- protected SuggestHelper(final Context context, final File dictionaryPath,
- final long startOffset, final long length, final KeyboardSet keyboardSet,
- final Locale locale) {
- this(new Suggest(context, dictionaryPath, startOffset, length, null, locale), keyboardSet);
- }
-
- private SuggestHelper(final Suggest suggest, final KeyboardSet keyboardSet) {
- mSuggest = suggest;
- mKeyboard = keyboardSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET);
- mKeyDetector = new KeyDetector(0);
-
- setCorrectionMode(Suggest.CORRECTION_FULL);
- mKeyDetector.setKeyboard(mKeyboard, 0, 0);
- mKeyDetector.setProximityCorrectionEnabled(true);
- mKeyDetector.setProximityThreshold(mKeyboard.mMostCommonKeyWidth);
- }
-
- public void setCorrectionMode(int correctionMode) {
- mCorrectionMode = correctionMode;
- }
-
- public boolean hasMainDictionary() {
- return mSuggest.hasMainDictionary();
- }
-
- protected WordComposer createWordComposer(CharSequence s) {
- WordComposer word = new WordComposer();
- word.setComposingWord(s, mKeyboard, mKeyDetector);
- return word;
- }
-
- public boolean isValidWord(CharSequence typed) {
- return AutoCorrection.isValidWord(mSuggest.getUnigramDictionaries(),
- typed, false);
- }
-
- // TODO: This may be slow, but is OK for test so far.
- public SuggestedWords getSuggestions(CharSequence typed) {
- return mSuggest.getSuggestions(createWordComposer(typed), null,
- mKeyboard.getProximityInfo(), mCorrectionMode);
- }
-
- public CharSequence getFirstSuggestion(CharSequence typed) {
- WordComposer word = createWordComposer(typed);
- SuggestedWords suggestions = mSuggest.getSuggestions(word, null,
- mKeyboard.getProximityInfo(), mCorrectionMode);
- // Note that suggestions.getWord(0) is the word user typed.
- return suggestions.size() > 1 ? suggestions.getWord(1) : null;
- }
-
- public CharSequence getAutoCorrection(CharSequence typed) {
- WordComposer word = createWordComposer(typed);
- SuggestedWords suggestions = mSuggest.getSuggestions(word, null,
- mKeyboard.getProximityInfo(), mCorrectionMode);
- // Note that suggestions.getWord(0) is the word user typed.
- return (suggestions.size() > 1 && mSuggest.hasAutoCorrection())
- ? suggestions.getWord(1) : null;
- }
-
- public int getSuggestIndex(CharSequence typed, CharSequence expected) {
- WordComposer word = createWordComposer(typed);
- SuggestedWords suggestions = mSuggest.getSuggestions(word, null,
- mKeyboard.getProximityInfo(), mCorrectionMode);
- // Note that suggestions.getWord(0) is the word user typed.
- for (int i = 1; i < suggestions.size(); i++) {
- if (TextUtils.equals(suggestions.getWord(i), expected))
- return i;
- }
- return -1;
- }
-
- private void getBigramSuggestions(CharSequence previous, CharSequence typed) {
- if (!TextUtils.isEmpty(previous) && (typed.length() > 1)) {
- WordComposer firstChar = createWordComposer(Character.toString(typed.charAt(0)));
- mSuggest.getSuggestions(firstChar, previous, mKeyboard.getProximityInfo(),
- mCorrectionMode);
- }
- }
-
- public CharSequence getBigramFirstSuggestion(CharSequence previous, CharSequence typed) {
- WordComposer word = createWordComposer(typed);
- getBigramSuggestions(previous, typed);
- SuggestedWords suggestions = mSuggest.getSuggestions(word, previous,
- mKeyboard.getProximityInfo(), mCorrectionMode);
- return suggestions.size() > 1 ? suggestions.getWord(1) : null;
- }
-
- public CharSequence getBigramAutoCorrection(CharSequence previous, CharSequence typed) {
- WordComposer word = createWordComposer(typed);
- getBigramSuggestions(previous, typed);
- SuggestedWords suggestions = mSuggest.getSuggestions(word, previous,
- mKeyboard.getProximityInfo(), mCorrectionMode);
- return (suggestions.size() > 1 && mSuggest.hasAutoCorrection())
- ? suggestions.getWord(1) : null;
- }
-
- public int searchBigramSuggestion(CharSequence previous, CharSequence typed,
- CharSequence expected) {
- WordComposer word = createWordComposer(typed);
- getBigramSuggestions(previous, typed);
- SuggestedWords suggestions = mSuggest.getSuggestions(word, previous,
- mKeyboard.getProximityInfo(), mCorrectionMode);
- for (int i = 1; i < suggestions.size(); i++) {
- if (TextUtils.equals(suggestions.getWord(i), expected))
- return i;
- }
- return -1;
- }
-}
diff --git a/tests/src/com/android/inputmethod/latin/SuggestTests.java b/tests/src/com/android/inputmethod/latin/SuggestTests.java
deleted file mode 100644
index e12ae58c4..000000000
--- a/tests/src/com/android/inputmethod/latin/SuggestTests.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2010,2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import com.android.inputmethod.latin.tests.R;
-
-import android.content.res.AssetFileDescriptor;
-import android.content.res.Configuration;
-
-import java.util.Locale;
-
-public class SuggestTests extends SuggestTestsBase {
- private SuggestHelper mHelper;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- final AssetFileDescriptor dict = openTestRawResourceFd(R.raw.test);
- final Locale locale = Locale.US;
- mHelper = new SuggestHelper(
- getContext(), mTestPackageFile, dict.getStartOffset(), dict.getLength(),
- createKeyboardSet(locale, Configuration.ORIENTATION_PORTRAIT), locale);
- mHelper.setCorrectionMode(Suggest.CORRECTION_FULL_BIGRAM);
- }
-
- /************************** Tests ************************/
-
- /**
- * Tests for simple completions of one character.
- */
- public void testCompletion1char() {
- suggested("people", mHelper.getFirstSuggestion("peopl"));
- suggested("about", mHelper.getFirstSuggestion("abou"));
- suggested("their", mHelper.getFirstSuggestion("thei"));
- }
-
- /**
- * Tests for simple completions of two characters.
- */
- public void testCompletion2char() {
- suggested("people", mHelper.getFirstSuggestion("peop"));
- suggested("calling", mHelper.getFirstSuggestion("calli"));
- suggested("business", mHelper.getFirstSuggestion("busine"));
- }
-
- /**
- * Tests for proximity errors.
- */
- public void testProximityPositive() {
- suggested("typed peiple", "people", mHelper.getFirstSuggestion("peiple"));
- suggested("typed peoole", "people", mHelper.getFirstSuggestion("peoole"));
- suggested("typed pwpple", "people", mHelper.getFirstSuggestion("pwpple"));
- }
-
- /**
- * Tests for proximity errors - negative, when the error key is not close.
- */
- public void testProximityNegative() {
- notSuggested("about", mHelper.getFirstSuggestion("arout"));
- notSuggested("are", mHelper.getFirstSuggestion("ire"));
- }
-
- /**
- * Tests for checking if apostrophes are added automatically.
- */
- public void testApostropheInsertion() {
- suggested("I'm", mHelper.getFirstSuggestion("im"));
- suggested("don't", mHelper.getFirstSuggestion("dont"));
- }
-
- /**
- * Test to make sure apostrophed word is not suggested for an apostrophed word.
- */
- public void testApostrophe() {
- notSuggested("don't", mHelper.getFirstSuggestion("don't"));
- }
-
- /**
- * Tests for suggestion of capitalized version of a word.
- */
- public void testCapitalization() {
- suggested("I'm", mHelper.getFirstSuggestion("i'm"));
- suggested("Sunday", mHelper.getFirstSuggestion("sunday"));
- suggested("Sunday", mHelper.getFirstSuggestion("sundat"));
- }
-
- /**
- * Tests to see if more than one completion is provided for certain prefixes.
- */
- public void testMultipleCompletions() {
- isInSuggestions("com: come", mHelper.getSuggestIndex("com", "come"));
- isInSuggestions("com: company", mHelper.getSuggestIndex("com", "company"));
- isInSuggestions("th: the", mHelper.getSuggestIndex("th", "the"));
- isInSuggestions("th: that", mHelper.getSuggestIndex("th", "that"));
- isInSuggestions("th: this", mHelper.getSuggestIndex("th", "this"));
- isInSuggestions("th: they", mHelper.getSuggestIndex("th", "they"));
- }
-
- /**
- * Does the suggestion engine recognize zero frequency words as valid words.
- */
- public void testZeroFrequencyAccepted() {
- assertTrue("valid word yikes", mHelper.isValidWord("yikes"));
- assertFalse("non valid word yike", mHelper.isValidWord("yike"));
- }
-
- /**
- * Tests to make sure that zero frequency words are not suggested as completions.
- */
- public void testZeroFrequencySuggestionsNegative() {
- assertTrue(mHelper.getSuggestIndex("yike", "yikes") < 0);
- assertTrue(mHelper.getSuggestIndex("what", "whatcha") < 0);
- }
-
- /**
- * Tests to ensure that words with large edit distances are not suggested, in some cases.
- * Also such word is not considered auto correction, in some cases.
- */
- public void testTooLargeEditDistance() {
- assertTrue(mHelper.getSuggestIndex("sniyr", "about") < 0);
- // TODO: The following test fails.
- // notSuggested("the", mHelper.getAutoCorrection("rjw"));
- }
-
- /**
- * Make sure mHelper.isValidWord is case-sensitive.
- */
- public void testValidityCaseSensitivity() {
- assertTrue("valid word Sunday", mHelper.isValidWord("Sunday"));
- assertFalse("non valid word sunday", mHelper.isValidWord("sunday"));
- }
-
- /**
- * Are accented forms of words suggested as corrections?
- */
- public void testAccents() {
- // ni<LATIN SMALL LETTER N WITH TILDE>o
- suggested("ni\u00F1o", mHelper.getAutoCorrection("nino"));
- // ni<LATIN SMALL LETTER N WITH TILDE>o
- suggested("ni\u00F1o", mHelper.getAutoCorrection("nimo"));
- // Mar<LATIN SMALL LETTER I WITH ACUTE>a
- suggested("Mar\u00EDa", mHelper.getAutoCorrection("maria"));
- }
-
- /**
- * Make sure bigrams are showing when first character is typed
- * and don't show any when there aren't any
- */
- public void testBigramsAtFirstChar() {
- suggested("bigram: about p[art]",
- "part", mHelper.getBigramFirstSuggestion("about", "p"));
- suggested("bigram: I'm a[bout]",
- "about", mHelper.getBigramFirstSuggestion("I'm", "a"));
- suggested("bigram: about b[usiness]",
- "business", mHelper.getBigramFirstSuggestion("about", "b"));
- isInSuggestions("bigram: about b[eing]",
- mHelper.searchBigramSuggestion("about", "b", "being"));
- notSuggested("bigram: about p",
- "business", mHelper.getBigramFirstSuggestion("about", "p"));
- }
-
- /**
- * Make sure bigrams score affects the original score
- */
- public void testBigramsScoreEffect() {
- suggested("single: page",
- "page", mHelper.getAutoCorrection("pa"));
- suggested("bigram: about pa[rt]",
- "part", mHelper.getBigramAutoCorrection("about", "pa"));
- // TODO: The following test fails.
- // suggested("single: said", "said", mHelper.getAutoCorrection("sa"));
- // TODO: The following test fails due to "transpose correction".
- // suggested("bigram: from sa[me]",
- // "same", mHelper.getBigramAutoCorrection("from", "sa"));
- }
-}
diff --git a/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java b/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java
deleted file mode 100644
index 73e34ba6f..000000000
--- a/tests/src/com/android/inputmethod/latin/SuggestTestsBase.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.res.AssetFileDescriptor;
-import android.content.res.Configuration;
-import android.test.AndroidTestCase;
-import android.text.InputType;
-import android.text.TextUtils;
-import android.util.DisplayMetrics;
-import android.view.inputmethod.EditorInfo;
-
-import com.android.inputmethod.keyboard.KeyboardSet;
-
-import java.io.File;
-import java.io.InputStream;
-import java.util.Locale;
-
-public class SuggestTestsBase extends AndroidTestCase {
- protected File mTestPackageFile;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mTestPackageFile = new File(getTestContext().getApplicationInfo().sourceDir);
- }
-
- protected KeyboardSet createKeyboardSet(Locale locale, int orientation) {
- return createKeyboardSet(locale, orientation, false);
- }
-
- protected KeyboardSet createKeyboardSet(Locale locale, int orientation,
- boolean touchPositionCorrectionEnabled) {
- final DisplayMetrics dm = getContext().getResources().getDisplayMetrics();
- final int width;
- if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
- width = Math.max(dm.widthPixels, dm.heightPixels);
- } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
- width = Math.min(dm.widthPixels, dm.heightPixels);
- } else {
- fail("Orientation should be ORIENTATION_LANDSCAPE or ORIENTATION_PORTRAIT: "
- + "orientation=" + orientation);
- return null;
- }
- final EditorInfo editorInfo = new EditorInfo();
- editorInfo.inputType = InputType.TYPE_CLASS_TEXT;
- final KeyboardSet.Builder builder = new KeyboardSet.Builder(getContext(), editorInfo);
- builder.setScreenGeometry(orientation, width);
- builder.setSubtype(locale, true, touchPositionCorrectionEnabled);
- return builder.build();
- }
-
- protected InputStream openTestRawResource(int resIdInTest) {
- return getTestContext().getResources().openRawResource(resIdInTest);
- }
-
- protected AssetFileDescriptor openTestRawResourceFd(int resIdInTest) {
- return getTestContext().getResources().openRawResourceFd(resIdInTest);
- }
-
- private static String format(String message, Object expected, Object actual) {
- return message + " expected:<" + expected + "> but was:<" + actual + ">";
- }
-
- protected static void suggested(CharSequence expected, CharSequence actual) {
- if (!TextUtils.equals(expected, actual))
- fail(format("assertEquals", expected, actual));
- }
-
- protected static void suggested(String message, CharSequence expected, CharSequence actual) {
- if (!TextUtils.equals(expected, actual))
- fail(format(message, expected, actual));
- }
-
- protected static void notSuggested(CharSequence expected, CharSequence actual) {
- if (TextUtils.equals(expected, actual))
- fail(format("assertNotEquals", expected, actual));
- }
-
- protected static void notSuggested(String message, CharSequence expected, CharSequence actual) {
- if (TextUtils.equals(expected, actual))
- fail(format(message, expected, actual));
- }
-
- protected static void isInSuggestions(String message, int position) {
- assertTrue(message, position >= 0);
- }
-
- protected static void isNotInSuggestions(String message, int position) {
- assertTrue(message, position < 0);
- }
-}
diff --git a/tests/src/com/android/inputmethod/latin/UserBigramSuggestHelper.java b/tests/src/com/android/inputmethod/latin/UserBigramSuggestHelper.java
deleted file mode 100644
index 74fadf76b..000000000
--- a/tests/src/com/android/inputmethod/latin/UserBigramSuggestHelper.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.Context;
-import android.text.TextUtils;
-
-import com.android.inputmethod.keyboard.KeyboardSet;
-
-import java.io.File;
-import java.util.Locale;
-import java.util.StringTokenizer;
-
-public class UserBigramSuggestHelper extends SuggestHelper {
- private final Context mContext;
- private UserBigramDictionary mUserBigram;
-
- public UserBigramSuggestHelper(final Context context, final File dictionaryPath,
- final long startOffset, final long length, final int userBigramMax,
- final int userBigramDelete, final KeyboardSet keyboardSet, final Locale locale) {
- super(context, dictionaryPath, startOffset, length, keyboardSet, locale);
- mContext = context;
- mUserBigram = new UserBigramDictionary(context, null, locale.toString(),
- Suggest.DIC_USER);
- mUserBigram.setDatabaseMax(userBigramMax);
- mUserBigram.setDatabaseDelete(userBigramDelete);
- setCorrectionMode(Suggest.CORRECTION_FULL_BIGRAM);
- mSuggest.setUserBigramDictionary(mUserBigram);
- }
-
- public void changeUserBigramLocale(Locale locale) {
- if (mUserBigram != null) {
- flushUserBigrams();
- mUserBigram.close();
- mUserBigram = new UserBigramDictionary(mContext, null, locale.toString(),
- Suggest.DIC_USER);
- mSuggest.setUserBigramDictionary(mUserBigram);
- }
- }
-
- public int searchUserBigramSuggestion(CharSequence previous, char typed,
- CharSequence expected) {
- if (mUserBigram == null) return -1;
-
- flushUserBigrams();
- if (!TextUtils.isEmpty(previous) && !TextUtils.isEmpty(Character.toString(typed))) {
- WordComposer firstChar = createWordComposer(Character.toString(typed));
- mSuggest.getSuggestions(firstChar, previous, mKeyboard.getProximityInfo(),
- mCorrectionMode);
- boolean reloading = mUserBigram.reloadDictionaryIfRequired();
- if (reloading) mUserBigram.waitForDictionaryLoading();
- mUserBigram.getBigrams(firstChar, previous, mSuggest);
- }
-
- for (int i = 0; i < mSuggest.mBigramSuggestions.size(); i++) {
- final CharSequence word = mSuggest.mBigramSuggestions.get(i);
- if (TextUtils.equals(word, expected))
- return i;
- }
-
- return -1;
- }
-
- public void addToUserBigram(String sentence) {
- StringTokenizer st = new StringTokenizer(sentence);
- String previous = null;
- while (st.hasMoreTokens()) {
- String current = st.nextToken();
- if (previous != null) {
- addToUserBigram(new String[] {previous, current});
- }
- previous = current;
- }
- }
-
- public void addToUserBigram(String[] pair) {
- if (mUserBigram != null && pair.length == 2) {
- mUserBigram.addBigrams(pair[0], pair[1]);
- }
- }
-
- public void flushUserBigrams() {
- if (mUserBigram != null) {
- mUserBigram.flushPendingWrites();
- mUserBigram.waitUntilUpdateDBDone();
- }
- }
-}
diff --git a/tests/src/com/android/inputmethod/latin/UserBigramSuggestTests.java b/tests/src/com/android/inputmethod/latin/UserBigramSuggestTests.java
deleted file mode 100644
index 2b88a7ca6..000000000
--- a/tests/src/com/android/inputmethod/latin/UserBigramSuggestTests.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2010,2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.latin;
-import android.content.res.AssetFileDescriptor;
-import android.content.res.Configuration;
-
-import com.android.inputmethod.latin.tests.R;
-
-import java.util.Locale;
-
-public class UserBigramSuggestTests extends SuggestTestsBase {
- private static final int SUGGESTION_STARTS = 1;
- private static final int MAX_DATA = 20;
- private static final int DELETE_DATA = 10;
-
- private UserBigramSuggestHelper mHelper;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- final AssetFileDescriptor dict = openTestRawResourceFd(R.raw.test);
- final Locale locale = Locale.US;
- mHelper = new UserBigramSuggestHelper(
- getContext(), mTestPackageFile, dict.getStartOffset(), dict.getLength(),
- MAX_DATA, DELETE_DATA,
- createKeyboardSet(locale, Configuration.ORIENTATION_PORTRAIT), locale);
- }
-
- /************************** Tests ************************/
-
- /**
- * Test suggestion started at right time
- */
- public void testUserBigram() {
- for (int i = 0; i < SUGGESTION_STARTS; i++) mHelper.addToUserBigram(pair1);
- for (int i = 0; i < (SUGGESTION_STARTS - 1); i++) mHelper.addToUserBigram(pair2);
-
- isInSuggestions("bigram", mHelper.searchUserBigramSuggestion("user", 'b', "bigram"));
- isNotInSuggestions("platform",
- mHelper.searchUserBigramSuggestion("android", 'p', "platform"));
- }
-
- /**
- * Test loading correct (locale) bigrams
- */
- public void testOpenAndClose() {
- for (int i = 0; i < SUGGESTION_STARTS; i++) mHelper.addToUserBigram(pair1);
- isInSuggestions("bigram in default locale",
- mHelper.searchUserBigramSuggestion("user", 'b', "bigram"));
-
- // change to fr_FR
- mHelper.changeUserBigramLocale(Locale.FRANCE);
- for (int i = 0; i < SUGGESTION_STARTS; i++) mHelper.addToUserBigram(pair3);
- isInSuggestions("france in fr_FR",
- mHelper.searchUserBigramSuggestion("locale", 'f', "france"));
- isNotInSuggestions("bigram in fr_FR",
- mHelper.searchUserBigramSuggestion("user", 'b', "bigram"));
-
- // change back to en_US
- mHelper.changeUserBigramLocale(Locale.US);
- isNotInSuggestions("france in en_US",
- mHelper.searchUserBigramSuggestion("locale", 'f', "france"));
- isInSuggestions("bigram in en_US",
- mHelper.searchUserBigramSuggestion("user", 'b', "bigram"));
- }
-
- /**
- * Test data gets pruned when it is over maximum
- */
- public void testPruningData() {
- for (int i = 0; i < SUGGESTION_STARTS; i++) mHelper.addToUserBigram(sentence0);
- mHelper.flushUserBigrams();
- isInSuggestions("world after several sentence 0",
- mHelper.searchUserBigramSuggestion("Hello", 'w', "world"));
-
- mHelper.addToUserBigram(sentence1);
- mHelper.addToUserBigram(sentence2);
- isInSuggestions("world after sentence 1 and 2",
- mHelper.searchUserBigramSuggestion("Hello", 'w', "world"));
-
- // pruning should happen
- mHelper.addToUserBigram(sentence3);
- mHelper.addToUserBigram(sentence4);
-
- // trying to reopen database to check pruning happened in database
- mHelper.changeUserBigramLocale(Locale.US);
- isNotInSuggestions("world after sentence 3 and 4",
- mHelper.searchUserBigramSuggestion("Hello", 'w', "world"));
- }
-
- private static final String[] pair1 = {"user", "bigram"};
- private static final String[] pair2 = {"android","platform"};
- private static final String[] pair3 = {"locale", "france"};
- private static final String sentence0 = "Hello world";
- private static final String sentence1 = "This is a test for user input based bigram";
- private static final String sentence2 = "It learns phrases that contain both dictionary and "
- + "nondictionary words";
- private static final String sentence3 = "This should give better suggestions than the previous "
- + "version";
- private static final String sentence4 = "Android stock keyboard is improving";
-}