aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--java/res/values-iw-sw600dp/config-spacing-and-punctuations.xml25
-rw-r--r--java/res/values-iw/config-spacing-and-punctuations.xml25
-rw-r--r--java/res/values-sw600dp/config-spacing-and-punctuations.xml2
-rw-r--r--java/res/values/config-spacing-and-punctuations.xml2
-rw-r--r--java/res/values/strings.xml24
-rw-r--r--java/res/xml-sw600dp/keys_pcqwerty2_right3.xml2
-rw-r--r--java/res/xml-sw600dp/keys_pcqwerty3_right2.xml2
-rw-r--r--java/res/xml-sw600dp/keys_pcqwerty4_right3.xml2
-rw-r--r--java/res/xml-sw600dp/rowkeys_pcqwerty1.xml177
-rw-r--r--java/res/xml-sw600dp/rows_pcqwerty.xml15
-rw-r--r--java/res/xml/key_f1.xml3
-rw-r--r--java/res/xml/keys_comma_period_symbols.xml3
-rw-r--r--java/res/xml/keys_pcqwerty2_right3.xml2
-rw-r--r--java/res/xml/keys_pcqwerty3_right2.xml2
-rw-r--r--java/res/xml/keys_pcqwerty4_right3.xml2
-rw-r--r--java/res/xml/rowkeys_pcqwerty1.xml125
-rw-r--r--java/res/xml/rows_pcqwerty.xml15
-rw-r--r--java/src/com/android/inputmethod/event/Combiner.java14
-rw-r--r--java/src/com/android/inputmethod/event/CombinerChain.java69
-rw-r--r--java/src/com/android/inputmethod/event/DeadKeyCombiner.java5
-rw-r--r--java/src/com/android/inputmethod/event/Event.java45
-rw-r--r--java/src/com/android/inputmethod/event/EventInterpreter.java58
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java2
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java15
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java31
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java341
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java8
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java23
-rw-r--r--java/src/com/android/inputmethod/latin/WordComposer.java6
-rw-r--r--java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java45
-rw-r--r--java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java5
-rw-r--r--java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java5
-rw-r--r--java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java5
-rw-r--r--java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java13
-rw-r--r--native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp6
-rw-r--r--native/jni/src/suggest/core/dicnode/dic_node.h34
-rw-r--r--native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp33
-rw-r--r--native/jni/src/suggest/core/dicnode/dic_nodes_cache.h2
-rw-r--r--native/jni/src/suggest/core/dicnode/internal/dic_node_state_input.h5
-rw-r--r--native/jni/src/suggest/core/dicnode/internal/dic_node_state_prevword.h24
-rw-r--r--native/jni/src/suggest/core/dicnode/internal/dic_node_state_scoring.h12
-rw-r--r--native/jni/src/suggest/core/dictionary/dictionary.cpp6
-rw-r--r--native/jni/src/suggest/core/dictionary/dictionary.h2
-rw-r--r--native/jni/src/suggest/core/dictionary/error_type_utils.h4
-rw-r--r--native/jni/src/suggest/core/suggest.cpp22
-rw-r--r--native/jni/src/suggest/core/suggest.h6
-rw-r--r--native/jni/src/suggest/core/suggest_interface.h4
-rw-r--r--tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java4
-rw-r--r--tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java15
-rw-r--r--tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java15
-rw-r--r--tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java15
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Arabic.java6
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java208
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Farsi.java6
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/Hebrew.java8
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java9
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/PcQwerty.java227
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java7
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/tests/SpanishCustomizer.java4
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArmenianAMPhonetic.java38
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCatalan.java8
-rw-r--r--tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguagePcQwerty.java52
-rw-r--r--tools/dicttool/Android.mk1
-rw-r--r--tools/dicttool/compat/com/android/inputmethod/event/CombinerChain.java (renamed from java/src/com/android/inputmethod/event/EventDecoderSpec.java)16
-rw-r--r--tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml2
-rw-r--r--tools/make-keyboard-text/res/values-ca/donottranslate-more-keys.xml4
-rw-r--r--tools/make-keyboard-text/res/values-es/donottranslate-more-keys.xml4
-rw-r--r--tools/make-keyboard-text/res/values-fa/donottranslate-more-keys.xml5
-rw-r--r--tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml28
-rw-r--r--tools/make-keyboard-text/res/values/donottranslate-more-keys.xml5
70 files changed, 1235 insertions, 730 deletions
diff --git a/java/res/values-iw-sw600dp/config-spacing-and-punctuations.xml b/java/res/values-iw-sw600dp/config-spacing-and-punctuations.xml
new file mode 100644
index 000000000..b562b18db
--- /dev/null
+++ b/java/res/values-iw-sw600dp/config-spacing-and-punctuations.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, 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">
+ <!-- The all letters need to be mirrored are found at
+ http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
+ <!-- Symbols that are suggested between words -->
+ <string name="suggested_punctuations" translatable="false">:,;,\",(|),)|(,\',-,/,@,_</string>
+</resources>
diff --git a/java/res/values-iw/config-spacing-and-punctuations.xml b/java/res/values-iw/config-spacing-and-punctuations.xml
new file mode 100644
index 000000000..9a9e6ee7a
--- /dev/null
+++ b/java/res/values-iw/config-spacing-and-punctuations.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, 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">
+ <!-- The all letters need to be mirrored are found at
+ http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
+ <!-- Symbols that are suggested between words -->
+ <string name="suggested_punctuations" translatable="false">!,?,\\,,:,;,\",(|),)|(,\',-,/,@,_</string>
+</resources>
diff --git a/java/res/values-sw600dp/config-spacing-and-punctuations.xml b/java/res/values-sw600dp/config-spacing-and-punctuations.xml
index 9c12cf49a..4d19412a3 100644
--- a/java/res/values-sw600dp/config-spacing-and-punctuations.xml
+++ b/java/res/values-sw600dp/config-spacing-and-punctuations.xml
@@ -19,5 +19,5 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Symbols that are suggested between words -->
- <string name="suggested_punctuations" translatable="false">:,;,\",!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,\',-,/,@,_</string>
+ <string name="suggested_punctuations" translatable="false">:,;,\",(,),\',-,/,@,_</string>
</resources>
diff --git a/java/res/values/config-spacing-and-punctuations.xml b/java/res/values/config-spacing-and-punctuations.xml
index 1dd2e1f6b..ad5663d9b 100644
--- a/java/res/values/config-spacing-and-punctuations.xml
+++ b/java/res/values/config-spacing-and-punctuations.xml
@@ -21,7 +21,7 @@
<!-- TODO: these settings depend on the language. They should be put either in the dictionary
header, or in the subtype maybe? -->
<!-- Symbols that are suggested between words -->
- <string name="suggested_punctuations" translatable="false">!,?,\\,,:,;,\",!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,\',-,/,@,_</string>
+ <string name="suggested_punctuations" translatable="false">!,?,\\,,:,;,\",(,),\',-,/,@,_</string>
<!-- Symbols that are normally preceded by a space (used to add an auto-space before these) -->
<string name="symbols_preceded_by_space" translatable="false">([{&amp;</string>
<!-- Symbols that are normally followed by a space (used to add an auto-space after these) -->
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 5efa73362..bd18e5544 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -337,29 +337,39 @@
<!-- Title of the item to change the keyboard theme [CHAR LIMIT=20]-->
<string name="keyboard_layout">Keyboard theme</string>
- <!-- Description for English (United Kingdom) keyboard subtype [CHAR LIMIT=25] -->
+ <!-- Description for English (UK) keyboard subtype [CHAR LIMIT=25]
+ (UK) should be an abbreviation of United Kingdom to fit in the CHAR LIMIT. -->
<string name="subtype_en_GB">English (UK)</string>
- <!-- Description for English (United States) keyboard subtype [CHAR LIMIT=25] -->
+ <!-- Description for English (US) keyboard subtype [CHAR LIMIT=25]
+ (US) should be an abbreviation of United States to fit in the CHAR LIMIT. -->
<string name="subtype_en_US">English (US)</string>
- <!-- Description for Spanish (United States) keyboard subtype [CHAR LIMIT=25] -->
+ <!-- Description for Spanish (US) keyboard subtype [CHAR LIMIT=25]
+ (US) should be an abbreviation of United States to fit in the CHAR LIMIT. -->
<string name="subtype_es_US">Spanish (US)</string>
- <!-- Description for English (United Kingdom) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
+ <!-- Description for English (UK) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
+ (UK) should be an abbreviation of United Kingdom to fit in the CHAR LIMIT.
This should be identical to subtype_en_GB aside from the trailing (%s). -->
<string name="subtype_with_layout_en_GB">English (UK) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string>
- <!-- Description for English (United States) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
+ <!-- Description for English (US) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
+ (US) should be an abbreviation of United States to fit in the CHAR LIMIT.
This should be identical to subtype_en_US aside from the trailing (%s). -->
<string name="subtype_with_layout_en_US">English (US) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string>
- <!-- Description for Spanish (United States) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
+ <!-- Description for Spanish (US) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
+ (US) should be an abbreviation of United Statesn to fit in the CHAR LIMIT.
This should be identical to subtype_es_US aside from the trailing (%s). -->
<string name="subtype_with_layout_es_US">Spanish (US) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string>
- <!-- Description for Nepali (Traditional) keyboard subtype [CHAR LIMIT=25] -->
+ <!-- Description for Nepali (Traditional) keyboard subtype [CHAR LIMIT=25]
+ (Traditional) can be an abbreviation to fit in the CHAR LIMIT. -->
<string name="subtype_nepali_traditional"><xliff:g id="LANGUAGE_NAME" example="Nepali">%s</xliff:g> (Traditional)</string>
<!-- TODO: Uncomment once we can handle IETF language tag with script name specified.
Description for Serbian Cyrillic keyboard subtype [CHAR LIMIT=25]
+ (Cyrillic) can be an abbreviation to fit in the CHAR LIMIT.
<string name="subtype_serbian_cyrillic">Serbian (Cyrillic)</string>
Description for Serbian Latin keyboard subtype [CHAR LIMIT=25]
+ (Latin) can be an abbreviation to fit in the CHAR LIMIT.
<string name="subtype_serbian_latin">Serbian (Latin)</string>
Description for Serbian Latin keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
+ (Latin) can be an abbreviation to fit in the CHAR LIMIT.
This should be identical to subtype_serbian_latin aside from the trailing (%s).
<string name="subtype_with_layout_sr-Latn">Serbian (Latin) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string>
-->
diff --git a/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml b/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml
index ab99ec574..76ac6bbdd 100644
--- a/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml
+++ b/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml
@@ -23,7 +23,7 @@
>
<switch>
<case
- latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
+ latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked"
>
<Key
latin:keySpec="["
diff --git a/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml b/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml
index 54433964f..f18fb507c 100644
--- a/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml
+++ b/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml
@@ -23,7 +23,7 @@
>
<switch>
<case
- latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
+ latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked"
>
<Key
latin:keySpec=";"
diff --git a/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml b/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml
index c95ca2ee7..ff1a2c85c 100644
--- a/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml
+++ b/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml
@@ -23,7 +23,7 @@
>
<switch>
<case
- latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
+ latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked"
>
<Key
latin:keySpec=","
diff --git a/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml b/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml
index 5389e2201..5c7506ea6 100644
--- a/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml
+++ b/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml
@@ -21,87 +21,98 @@
<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
- <Key
- latin:keySpec="`"
- latin:keyHintLabel="~"
- latin:additionalMoreKeys="~"
- latin:keyStyle="hasShiftedLetterHintStyle" />
- <Key
- latin:keySpec="1"
- latin:keyHintLabel="!"
- latin:additionalMoreKeys="!"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="!text/more_keys_for_exclamation,!text/more_keys_for_symbols_1" />
- <Key
- latin:keySpec="2"
- latin:keyHintLabel="\@"
- latin:additionalMoreKeys="\@"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="!text/more_keys_for_symbols_2" />
- <Key
- latin:keySpec="3"
- latin:keyHintLabel="\#"
- latin:additionalMoreKeys="\#"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="!text/more_keys_for_symbols_3" />
- <Key
- latin:keySpec="4"
- latin:keyHintLabel="$"
- latin:additionalMoreKeys="$"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="!text/more_keys_for_symbols_4" />
- <Key
- latin:keySpec="5"
- latin:keyHintLabel="%"
- latin:additionalMoreKeys="\\%"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="!text/more_keys_for_symbols_5" />
- <Key
- latin:keySpec="6"
- latin:keyHintLabel="^"
- latin:additionalMoreKeys="^"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="!text/more_keys_for_symbols_6" />
- <Key
- latin:keySpec="7"
- latin:keyHintLabel="&amp;"
- latin:additionalMoreKeys="&amp;"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="!text/more_keys_for_symbols_7" />
- <Key
- latin:keySpec="8"
- latin:keyHintLabel="*"
- latin:additionalMoreKeys="*"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="!text/more_keys_for_symbols_8" />
- <Key
- latin:keySpec="9"
- latin:keyHintLabel="("
- latin:additionalMoreKeys="("
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="!text/more_keys_for_symbols_9" />
- <Key
- latin:keySpec="0"
- latin:keyHintLabel=")"
- latin:additionalMoreKeys=")"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="!text/more_keys_for_symbols_0" />
- <!-- U+2013: "–" EN DASH
- U+2014: "—" EM DASH
- U+00B7: "·" MIDDLE DOT -->
- <Key
- latin:keySpec="-"
- latin:keyHintLabel="_"
- latin:additionalMoreKeys="_"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="&#x2013;,&#x2014;,&#x00B7;" />
- <!-- U+221E: "∞" INFINITY
- U+2260: "≠" NOT EQUAL TO
- U+2248: "≈" ALMOST EQUAL TO -->
- <Key
- latin:keySpec="="
- latin:keyHintLabel="+"
- latin:additionalMoreKeys="+"
- latin:keyStyle="hasShiftedLetterHintStyle"
- latin:moreKeys="&#x221E;,&#x2260;,&#x2248;" />
+ <switch>
+ <case
+ latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked"
+ >
+ <Key
+ latin:keySpec="`"
+ latin:keyHintLabel="~"
+ latin:additionalMoreKeys="~"
+ latin:keyStyle="hasShiftedLetterHintStyle" />
+ <Key
+ latin:keySpec="1"
+ latin:keyHintLabel="!"
+ latin:additionalMoreKeys="!"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="!text/more_keys_for_exclamation,!text/more_keys_for_symbols_1" />
+ <Key
+ latin:keySpec="2"
+ latin:keyHintLabel="\@"
+ latin:additionalMoreKeys="\@"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="!text/more_keys_for_symbols_2" />
+ <Key
+ latin:keySpec="3"
+ latin:keyHintLabel="\#"
+ latin:additionalMoreKeys="\#"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="!text/more_keys_for_symbols_3" />
+ <Key
+ latin:keySpec="4"
+ latin:keyHintLabel="$"
+ latin:additionalMoreKeys="$"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="!text/more_keys_for_symbols_4" />
+ <Key
+ latin:keySpec="5"
+ latin:keyHintLabel="%"
+ latin:additionalMoreKeys="\\%"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="!text/more_keys_for_symbols_5" />
+ <Key
+ latin:keySpec="6"
+ latin:keyHintLabel="^"
+ latin:additionalMoreKeys="^"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="!text/more_keys_for_symbols_6" />
+ <Key
+ latin:keySpec="7"
+ latin:keyHintLabel="&amp;"
+ latin:additionalMoreKeys="&amp;"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="!text/more_keys_for_symbols_7" />
+ <Key
+ latin:keySpec="8"
+ latin:keyHintLabel="*"
+ latin:additionalMoreKeys="*"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="!text/more_keys_for_symbols_8" />
+ <Key
+ latin:keySpec="9"
+ latin:keyHintLabel="("
+ latin:additionalMoreKeys="("
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="!text/more_keys_for_symbols_9" />
+ <Key
+ latin:keySpec="0"
+ latin:keyHintLabel=")"
+ latin:additionalMoreKeys=")"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="!text/more_keys_for_symbols_0" />
+ <!-- U+2013: "–" EN DASH
+ U+2014: "—" EM DASH
+ U+00B7: "·" MIDDLE DOT -->
+ <Key
+ latin:keySpec="-"
+ latin:keyHintLabel="_"
+ latin:additionalMoreKeys="_"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="&#x2013;,&#x2014;,&#x00B7;" />
+ <!-- U+221E: "∞" INFINITY
+ U+2260: "≠" NOT EQUAL TO
+ U+2248: "≈" ALMOST EQUAL TO -->
+ <Key
+ latin:keySpec="="
+ latin:keyHintLabel="+"
+ latin:additionalMoreKeys="+"
+ latin:keyStyle="hasShiftedLetterHintStyle"
+ latin:moreKeys="&#x221E;,&#x2260;,&#x2248;" />
+ </case>
+ <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" -->
+ <default>
+ <include
+ latin:keyboardLayout="@xml/rowkeys_pcqwerty1_shift" />
+ </default>
+ </switch>
</merge>
diff --git a/java/res/xml-sw600dp/rows_pcqwerty.xml b/java/res/xml-sw600dp/rows_pcqwerty.xml
index b503d839d..73b7e473e 100644
--- a/java/res/xml-sw600dp/rows_pcqwerty.xml
+++ b/java/res/xml-sw600dp/rows_pcqwerty.xml
@@ -26,19 +26,8 @@
<Row
latin:keyWidth="7.0%p"
>
- <switch>
- <case
- latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
- >
- <include
- latin:keyboardLayout="@xml/rowkeys_pcqwerty1" />
- </case>
- <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" -->
- <default>
- <include
- latin:keyboardLayout="@xml/rowkeys_pcqwerty1_shift" />
- </default>
- </switch>
+ <include
+ latin:keyboardLayout="@xml/rowkeys_pcqwerty1" />
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyWidth="fillRight" />
diff --git a/java/res/xml/key_f1.xml b/java/res/xml/key_f1.xml
index d3a753948..0a89fe3fb 100644
--- a/java/res/xml/key_f1.xml
+++ b/java/res/xml/key_f1.xml
@@ -42,7 +42,6 @@
<Key
latin:keySpec="!text/keylabel_for_comma"
latin:keyLabelFlags="hasPopupHint"
- latin:additionalMoreKeys="!text/more_keys_for_comma"
latin:keyStyle="f1MoreKeysStyle" />
</case>
<!-- latin:supportsSwitchingToShortcutIme="true" -->
@@ -57,7 +56,7 @@
<Key
latin:keySpec="!text/keylabel_for_comma"
latin:keyLabelFlags="hasPopupHint"
- latin:additionalMoreKeys="!text/more_keys_for_comma,!text/shortcut_as_more_key"
+ latin:additionalMoreKeys="!text/shortcut_as_more_key"
latin:keyStyle="f1MoreKeysStyle" />
</default>
</switch>
diff --git a/java/res/xml/keys_comma_period_symbols.xml b/java/res/xml/keys_comma_period_symbols.xml
index 5221d34e3..53c3343da 100644
--- a/java/res/xml/keys_comma_period_symbols.xml
+++ b/java/res/xml/keys_comma_period_symbols.xml
@@ -22,8 +22,7 @@
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
<Key
- latin:keySpec="!text/keylabel_for_comma"
- latin:moreKeys="!text/more_keys_for_comma" />
+ latin:keySpec="!text/keylabel_for_comma" />
<!-- U+2026: "…" HORIZONTAL ELLIPSIS -->
<Key
latin:keySpec="."
diff --git a/java/res/xml/keys_pcqwerty2_right3.xml b/java/res/xml/keys_pcqwerty2_right3.xml
index 9e62b09c2..b188cffab 100644
--- a/java/res/xml/keys_pcqwerty2_right3.xml
+++ b/java/res/xml/keys_pcqwerty2_right3.xml
@@ -23,7 +23,7 @@
>
<switch>
<case
- latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
+ latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked"
>
<Key
latin:keySpec="["
diff --git a/java/res/xml/keys_pcqwerty3_right2.xml b/java/res/xml/keys_pcqwerty3_right2.xml
index d889216c0..8a1f60fae 100644
--- a/java/res/xml/keys_pcqwerty3_right2.xml
+++ b/java/res/xml/keys_pcqwerty3_right2.xml
@@ -23,7 +23,7 @@
>
<switch>
<case
- latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
+ latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked"
>
<Key
latin:keySpec=";"
diff --git a/java/res/xml/keys_pcqwerty4_right3.xml b/java/res/xml/keys_pcqwerty4_right3.xml
index f32d80908..6beba2041 100644
--- a/java/res/xml/keys_pcqwerty4_right3.xml
+++ b/java/res/xml/keys_pcqwerty4_right3.xml
@@ -23,7 +23,7 @@
>
<switch>
<case
- latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
+ latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked"
>
<Key
latin:keySpec=","
diff --git a/java/res/xml/rowkeys_pcqwerty1.xml b/java/res/xml/rowkeys_pcqwerty1.xml
index fdb50729b..36957335e 100644
--- a/java/res/xml/rowkeys_pcqwerty1.xml
+++ b/java/res/xml/rowkeys_pcqwerty1.xml
@@ -21,61 +21,72 @@
<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
- <Key
- latin:keySpec="`"
- latin:additionalMoreKeys="~" />
- <Key
- latin:keySpec="1"
- latin:additionalMoreKeys="!,!text/more_keys_for_exclamation"
- latin:moreKeys="!text/more_keys_for_symbols_1" />
- <Key
- latin:keySpec="2"
- latin:additionalMoreKeys="\@"
- latin:moreKeys="!text/more_keys_for_symbols_2" />
- <Key
- latin:keySpec="3"
- latin:additionalMoreKeys="\#"
- latin:moreKeys="!text/more_keys_for_symbols_3" />
- <Key
- latin:keySpec="4"
- latin:additionalMoreKeys="$"
- latin:moreKeys="!text/more_keys_for_symbols_4" />
- <Key
- latin:keySpec="5"
- latin:additionalMoreKeys="\\%"
- latin:moreKeys="!text/more_keys_for_symbols_5" />
- <Key
- latin:keySpec="6"
- latin:additionalMoreKeys="^"
- latin:moreKeys="!text/more_keys_for_symbols_6" />
- <Key
- latin:keySpec="7"
- latin:additionalMoreKeys="&amp;"
- latin:moreKeys="!text/more_keys_for_symbols_7" />
- <Key
- latin:keySpec="8"
- latin:additionalMoreKeys="*"
- latin:moreKeys="!text/more_keys_for_symbols_8" />
- <Key
- latin:keySpec="9"
- latin:additionalMoreKeys="("
- latin:moreKeys="!text/more_keys_for_symbols_9" />
- <Key
- latin:keySpec="0"
- latin:additionalMoreKeys=")"
- latin:moreKeys="!text/more_keys_for_symbols_0" />
- <!-- U+2013: "–" EN DASH
- U+2014: "—" EM DASH
- U+00B7: "·" MIDDLE DOT -->
- <Key
- latin:keySpec="-"
- latin:additionalMoreKeys="_"
- latin:moreKeys="&#x2013;,&#x2014;,&#x00B7;" />
- <!-- U+221E: "∞" INFINITY
- U+2260: "≠" NOT EQUAL TO
- U+2248: "≈" ALMOST EQUAL TO -->
- <Key
- latin:keySpec="="
- latin:additionalMoreKeys="+"
- latin:moreKeys="!fixedColumnOrder!4,&#x221E;,&#x2260;,&#x2248;,%" />
+ <switch>
+ <case
+ latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked"
+ >
+ <Key
+ latin:keySpec="`"
+ latin:additionalMoreKeys="~" />
+ <Key
+ latin:keySpec="1"
+ latin:additionalMoreKeys="!,!text/more_keys_for_exclamation"
+ latin:moreKeys="!text/more_keys_for_symbols_1" />
+ <Key
+ latin:keySpec="2"
+ latin:additionalMoreKeys="\@"
+ latin:moreKeys="!text/more_keys_for_symbols_2" />
+ <Key
+ latin:keySpec="3"
+ latin:additionalMoreKeys="\#"
+ latin:moreKeys="!text/more_keys_for_symbols_3" />
+ <Key
+ latin:keySpec="4"
+ latin:additionalMoreKeys="$"
+ latin:moreKeys="!text/more_keys_for_symbols_4" />
+ <Key
+ latin:keySpec="5"
+ latin:additionalMoreKeys="\\%"
+ latin:moreKeys="!text/more_keys_for_symbols_5" />
+ <Key
+ latin:keySpec="6"
+ latin:additionalMoreKeys="^"
+ latin:moreKeys="!text/more_keys_for_symbols_6" />
+ <Key
+ latin:keySpec="7"
+ latin:additionalMoreKeys="&amp;"
+ latin:moreKeys="!text/more_keys_for_symbols_7" />
+ <Key
+ latin:keySpec="8"
+ latin:additionalMoreKeys="*"
+ latin:moreKeys="!text/more_keys_for_symbols_8" />
+ <Key
+ latin:keySpec="9"
+ latin:additionalMoreKeys="("
+ latin:moreKeys="!text/more_keys_for_symbols_9" />
+ <Key
+ latin:keySpec="0"
+ latin:additionalMoreKeys=")"
+ latin:moreKeys="!text/more_keys_for_symbols_0" />
+ <!-- U+2013: "–" EN DASH
+ U+2014: "—" EM DASH
+ U+00B7: "·" MIDDLE DOT -->
+ <Key
+ latin:keySpec="-"
+ latin:additionalMoreKeys="_"
+ latin:moreKeys="&#x2013;,&#x2014;,&#x00B7;" />
+ <!-- U+221E: "∞" INFINITY
+ U+2260: "≠" NOT EQUAL TO
+ U+2248: "≈" ALMOST EQUAL TO -->
+ <Key
+ latin:keySpec="="
+ latin:additionalMoreKeys="+"
+ latin:moreKeys="!fixedColumnOrder!4,&#x221E;,&#x2260;,&#x2248;,%" />
+ </case>
+ <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" -->
+ <default>
+ <include
+ latin:keyboardLayout="@xml/rowkeys_pcqwerty1_shift" />
+ </default>
+ </switch>
</merge>
diff --git a/java/res/xml/rows_pcqwerty.xml b/java/res/xml/rows_pcqwerty.xml
index 884698963..a5ed74518 100644
--- a/java/res/xml/rows_pcqwerty.xml
+++ b/java/res/xml/rows_pcqwerty.xml
@@ -26,19 +26,8 @@
<Row
latin:keyWidth="7.692%p"
>
- <switch>
- <case
- latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted"
- >
- <include
- latin:keyboardLayout="@xml/rowkeys_pcqwerty1" />
- </case>
- <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" -->
- <default>
- <include
- latin:keyboardLayout="@xml/rowkeys_pcqwerty1_shift" />
- </default>
- </switch>
+ <include
+ latin:keyboardLayout="@xml/rowkeys_pcqwerty1" />
</Row>
<Row
latin:keyWidth="7.692%p"
diff --git a/java/src/com/android/inputmethod/event/Combiner.java b/java/src/com/android/inputmethod/event/Combiner.java
index ab6b70c04..c3869a299 100644
--- a/java/src/com/android/inputmethod/event/Combiner.java
+++ b/java/src/com/android/inputmethod/event/Combiner.java
@@ -16,14 +16,22 @@
package com.android.inputmethod.event;
+import java.util.ArrayList;
+
/**
- * A generic interface for combiners.
+ * A generic interface for combiners. Combiners are objects that transform chains of input events
+ * into committable strings and manage feedback to show to the user on the combining state.
*/
public interface Combiner {
/**
- * Combine an event with the existing state and return the new event.
+ * Process an event, possibly combining it with the existing state and return the new event.
+ *
+ * If this event does not result in any new event getting passed down the chain, this method
+ * returns null. It may also modify the previous event list if appropriate.
+ *
+ * @param previousEvents the previous events in this composition.
* @param event the event to combine with the existing state.
* @return the resulting event.
*/
- Event combine(Event event);
+ Event processEvent(ArrayList<Event> previousEvents, Event event);
}
diff --git a/java/src/com/android/inputmethod/event/CombinerChain.java b/java/src/com/android/inputmethod/event/CombinerChain.java
new file mode 100644
index 000000000..0e01c819a
--- /dev/null
+++ b/java/src/com/android/inputmethod/event/CombinerChain.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2014 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.event;
+
+import com.android.inputmethod.latin.utils.CollectionUtils;
+
+import java.util.ArrayList;
+
+/**
+ * This class implements the logic chain between receiving events and generating code points.
+ *
+ * Event sources are multiple. It may be a hardware keyboard, a D-PAD, a software keyboard,
+ * or any exotic input source.
+ * This class will orchestrate the composing chain that starts with an event as its input. Each
+ * composer will be given turns one after the other.
+ * The output is composed of two sequences of code points: the first, representing the already
+ * finished combining part, will be shown normally as the composing string, while the second is
+ * feedback on the composing state and will typically be shown with different styling such as
+ * a colored background.
+ */
+public class CombinerChain {
+ // TODO: Create an object type to represent input material + visual feedback + decoding state
+
+ private final ArrayList<Combiner> mCombiners;
+
+ /**
+ * Create an combiner chain.
+ *
+ * The combiner chain takes events as inputs and outputs code points and combining state.
+ * For example, if the input language is Japanese, the combining chain will typically perform
+ * kana conversion.
+ *
+ * @param combinerList A list of combiners to be applied in order.
+ */
+ public CombinerChain(final Combiner... combinerList) {
+ mCombiners = CollectionUtils.newArrayList();
+ // The dead key combiner is always active, and always first
+ mCombiners.add(new DeadKeyCombiner());
+ }
+
+ // Pass a new event through the whole chain.
+ public void processEvent(final ArrayList<Event> previousEvents, final Event newEvent) {
+ final ArrayList<Event> modifiablePreviousEvents = new ArrayList<Event>(previousEvents);
+ Event event = newEvent;
+ for (final Combiner combiner : mCombiners) {
+ // A combiner can never return more than one event; it can return several
+ // code points, but they should be encapsulated within one event.
+ event = combiner.processEvent(modifiablePreviousEvents, event);
+ if (null == event) {
+ // Combiners return null if they eat the event.
+ return;
+ }
+ }
+ }
+}
diff --git a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java
index ae8639713..f77ce6347 100644
--- a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java
+++ b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java
@@ -21,14 +21,17 @@ import android.view.KeyCharacterMap;
import com.android.inputmethod.latin.Constants;
+import java.util.ArrayList;
+
/**
* A combiner that handles dead keys.
*/
public class DeadKeyCombiner implements Combiner {
+ // TODO: make this a list of events instead
final StringBuilder mDeadSequence = new StringBuilder();
@Override
- public Event combine(final Event event) {
+ public Event processEvent(final ArrayList<Event> previousEvents, final Event event) {
if (null == event) return null; // Just in case some combiner is broken
if (TextUtils.isEmpty(mDeadSequence)) {
if (event.isDead()) {
diff --git a/java/src/com/android/inputmethod/event/Event.java b/java/src/com/android/inputmethod/event/Event.java
index bd4143d25..db4023436 100644
--- a/java/src/com/android/inputmethod/event/Event.java
+++ b/java/src/com/android/inputmethod/event/Event.java
@@ -52,6 +52,8 @@ public class Event {
final public static int EVENT_GESTURE = 4;
// An event corresponding to the manual pick of a suggestion.
final public static int EVENT_SUGGESTION_PICKED = 5;
+ // An event corresponding to a string generated by some software process.
+ final public static int EVENT_SOFTWARE_GENERATED_STRING = 6;
// 0 is a valid code point, so we use -1 here.
final public static int NOT_A_CODE_POINT = -1;
@@ -71,6 +73,9 @@ public class Event {
// it's not relevant.
final public int mCodePoint;
+ // If applicable, this contains the string that should be input.
+ final public CharSequence mText;
+
// The key code associated with the event, if relevant. This is relevant whenever this event
// has been triggered by a key press, but not for a gesture for example. This has conceptually
// no link to the code point, although keys that enter a straight code point may often set
@@ -96,9 +101,11 @@ public class Event {
final public Event mNextEvent;
// This method is private - to create a new event, use one of the create* utility methods.
- private Event(final int type, final int codePoint, final int keyCode, final int x, final int y,
- final SuggestedWordInfo suggestedWordInfo, final int flags, final Event next) {
+ private Event(final int type, final CharSequence text, final int codePoint, final int keyCode,
+ final int x, final int y, final SuggestedWordInfo suggestedWordInfo, final int flags,
+ final Event next) {
mType = type;
+ mText = text;
mCodePoint = codePoint;
mKeyCode = keyCode;
mX = x;
@@ -123,13 +130,13 @@ public class Event {
public static Event createSoftwareKeypressEvent(final int codePoint, final int keyCode,
final int x, final int y) {
- return new Event(EVENT_INPUT_KEYPRESS, codePoint, keyCode, x, y,
+ return new Event(EVENT_INPUT_KEYPRESS, null /* text */, codePoint, keyCode, x, y,
null /* suggestedWordInfo */, FLAG_NONE, null);
}
public static Event createHardwareKeypressEvent(final int codePoint, final int keyCode,
final Event next) {
- return new Event(EVENT_INPUT_KEYPRESS, codePoint, keyCode,
+ return new Event(EVENT_INPUT_KEYPRESS, null /* text */, codePoint, keyCode,
Constants.EXTERNAL_KEYBOARD_COORDINATE, Constants.EXTERNAL_KEYBOARD_COORDINATE,
null /* suggestedWordInfo */, FLAG_NONE, next);
}
@@ -137,7 +144,7 @@ public class Event {
// This creates an input event for a dead character. @see {@link #FLAG_DEAD}
public static Event createDeadEvent(final int codePoint, final int keyCode, final Event next) {
// TODO: add an argument or something if we ever create a software layout with dead keys.
- return new Event(EVENT_INPUT_KEYPRESS, codePoint, keyCode,
+ return new Event(EVENT_INPUT_KEYPRESS, null /* text */, codePoint, keyCode,
Constants.EXTERNAL_KEYBOARD_COORDINATE, Constants.EXTERNAL_KEYBOARD_COORDINATE,
null /* suggestedWordInfo */, FLAG_DEAD, next);
}
@@ -151,7 +158,7 @@ public class Event {
*/
public static Event createEventForCodePointFromUnknownSource(final int codePoint) {
// TODO: should we have a different type of event for this? After all, it's not a key press.
- return new Event(EVENT_INPUT_KEYPRESS, codePoint, NOT_A_KEY_CODE,
+ return new Event(EVENT_INPUT_KEYPRESS, null /* text */, codePoint, NOT_A_KEY_CODE,
Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE,
null /* suggestedWordInfo */, FLAG_NONE, null /* next */);
}
@@ -167,7 +174,7 @@ public class Event {
public static Event createEventForCodePointFromAlreadyTypedText(final int codePoint,
final int x, final int y) {
// TODO: should we have a different type of event for this? After all, it's not a key press.
- return new Event(EVENT_INPUT_KEYPRESS, codePoint, NOT_A_KEY_CODE, x, y,
+ return new Event(EVENT_INPUT_KEYPRESS, null /* text */, codePoint, NOT_A_KEY_CODE, x, y,
null /* suggestedWordInfo */, FLAG_NONE, null /* next */);
}
@@ -176,13 +183,28 @@ public class Event {
* @return an event for this suggestion pick.
*/
public static Event createSuggestionPickedEvent(final SuggestedWordInfo suggestedWordInfo) {
- return new Event(EVENT_SUGGESTION_PICKED, NOT_A_CODE_POINT, NOT_A_KEY_CODE,
+ return new Event(EVENT_SUGGESTION_PICKED, suggestedWordInfo.mWord,
+ NOT_A_CODE_POINT, NOT_A_KEY_CODE,
Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE,
suggestedWordInfo, FLAG_NONE, null);
}
+ /**
+ * Creates an input event with a CharSequence. This is used by some software processes whose
+ * output is a string, possibly with styling. Examples include press on a multi-character key,
+ * or combination that outputs a string.
+ * @param text the CharSequence associated with this event.
+ * @param keyCode the key code, or NOT_A_KEYCODE if not applicable.
+ * @return an event for this text.
+ */
+ public static Event createSoftwareTextEvent(final CharSequence text, final int keyCode) {
+ return new Event(EVENT_SOFTWARE_GENERATED_STRING, text, NOT_A_CODE_POINT, keyCode,
+ Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE,
+ null /* suggestedWordInfo */, FLAG_NONE, null /* next */);
+ }
+
public static Event createNotHandledEvent() {
- return new Event(EVENT_NOT_HANDLED, NOT_A_CODE_POINT, NOT_A_KEY_CODE,
+ return new Event(EVENT_NOT_HANDLED, null /* text */, NOT_A_CODE_POINT, NOT_A_KEY_CODE,
Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE,
null /* suggestedWordInfo */, FLAG_NONE, null);
}
@@ -198,11 +220,6 @@ public class Event {
return EVENT_INPUT_KEYPRESS == mType && Constants.SUGGESTION_STRIP_COORDINATE == mX;
}
- // TODO: remove this method - we should not have to test this
- public boolean isCommittable() {
- return EVENT_INPUT_KEYPRESS == mType || EVENT_MODE_KEY == mType || EVENT_TOGGLE == mType;
- }
-
public boolean isHandled() {
return EVENT_NOT_HANDLED != mType;
}
diff --git a/java/src/com/android/inputmethod/event/EventInterpreter.java b/java/src/com/android/inputmethod/event/EventInterpreter.java
deleted file mode 100644
index bcf10fc58..000000000
--- a/java/src/com/android/inputmethod/event/EventInterpreter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.event;
-
-import com.android.inputmethod.latin.utils.CollectionUtils;
-
-import java.util.ArrayList;
-
-/**
- * This class implements the logic between receiving events and generating code points.
- *
- * Event sources are multiple. It may be a hardware keyboard, a D-PAD, a software keyboard,
- * or any exotic input source.
- * This class will orchestrate the decoding chain that starts with an event and ends up with
- * a stream of code points + decoding state.
- */
-public class EventInterpreter {
- // TODO: Implement an object pool for events, as we'll create a lot of them
- // TODO: Create a combiner
- // TODO: Create an object type to represent input material + visual feedback + decoding state
-
- private final EventDecoderSpec mDecoderSpec;
- private final ArrayList<Combiner> mCombiners;
-
- /**
- * Create an event interpreter according to a specification.
- *
- * The specification contains information about what to do with events. Typically, it will
- * contain information about the type of keyboards - for example, if hardware keyboard(s) is/are
- * attached, their type will be included here so that the decoder knows what to do with each
- * keypress (a 10-key keyboard is not handled like a qwerty-ish keyboard).
- * It also contains information for combining characters. For example, if the input language
- * is Japanese, the specification will typically request kana conversion.
- * Also note that the specification can be null. This means that we need to create a default
- * interpreter that does no specific combining, and assumes the most common cases.
- *
- * @param specification the specification for event interpretation. null for default.
- */
- public EventInterpreter(final EventDecoderSpec specification) {
- mDecoderSpec = null != specification ? specification : new EventDecoderSpec();
- mCombiners = CollectionUtils.newArrayList();
- mCombiners.add(new DeadKeyCombiner());
- }
-}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index 66cb9e35d..2dfde9434 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -163,7 +163,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
mCurrentSettingsValues = settingsValues;
try {
mState.onLoadKeyboard();
- mKeyboardTextsSet.setLocale(mSubtypeSwitcher.getCurrentSubtypeLocale());
+ mKeyboardTextsSet.setLocale(mSubtypeSwitcher.getCurrentSubtypeLocale(), mThemeContext);
} catch (KeyboardLayoutSetException e) {
Log.w(TAG, "loading keyboard failed: " + e.mKeyboardId, e.getCause());
LatinImeLogger.logOnException(e.mKeyboardId.toString(), e.getCause());
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
index 81a8e7196..dfe0df04c 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
@@ -34,7 +34,6 @@ import com.android.inputmethod.keyboard.KeyboardId;
import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.utils.ResourceUtils;
-import com.android.inputmethod.latin.utils.RunInLocale;
import com.android.inputmethod.latin.utils.StringUtils;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import com.android.inputmethod.latin.utils.XmlParseUtils;
@@ -45,7 +44,6 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.Arrays;
-import java.util.Locale;
/**
* Keyboard Building helper.
@@ -278,18 +276,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> {
params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0);
params.mIconsSet.loadIcons(keyboardAttr);
- final Locale locale = params.mId.mLocale;
- params.mTextsSet.setLocale(locale);
- final RunInLocale<Void> job = new RunInLocale<Void>() {
- @Override
- protected Void job(final Resources res) {
- params.mTextsSet.loadStringResources(mContext);
- return null;
- }
- };
- // Null means the current system locale.
- job.runInLocale(mResources,
- SubtypeLocaleUtils.isNoLanguage(params.mId.mSubtype) ? null : locale);
+ params.mTextsSet.setLocale(params.mId.mLocale, mContext);
final int resourceId = keyboardAttr.getResourceId(
R.styleable.Keyboard_touchPositionCorrectionData, 0);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
index 976038c10..044cd119e 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
@@ -23,6 +23,8 @@ import android.text.TextUtils;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.utils.RunInLocale;
+import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import java.util.HashMap;
import java.util.Locale;
@@ -38,23 +40,29 @@ public final class KeyboardTextsSet {
// Resource name to text map.
private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap();
- public void setLocale(final Locale locale) {
+ public void setLocale(final Locale locale, final Context context) {
final String language = locale.getLanguage();
mTextsTable = KeyboardTextsTable.getTextsTable(language);
- }
-
- public void loadStringResources(final Context context) {
+ final Resources res = context.getResources();
final int referenceId = context.getApplicationInfo().labelRes;
- loadStringResourcesInternal(context, RESOURCE_NAMES, referenceId);
+ final String resourcePackageName = res.getResourcePackageName(referenceId);
+ final RunInLocale<Void> job = new RunInLocale<Void>() {
+ @Override
+ protected Void job(final Resources resource) {
+ loadStringResourcesInternal(res, RESOURCE_NAMES, resourcePackageName);
+ return null;
+ }
+ };
+ // Null means the current system locale.
+ job.runInLocale(res,
+ SubtypeLocaleUtils.NO_LANGUAGE.equals(locale.toString()) ? null : locale);
}
@UsedForTesting
- void loadStringResourcesInternal(final Context context, final String[] resourceNames,
- final int referenceId) {
- final Resources res = context.getResources();
- final String packageName = res.getResourcePackageName(referenceId);
+ void loadStringResourcesInternal(final Resources res, final String[] resourceNames,
+ final String resourcePackageName) {
for (final String resName : resourceNames) {
- final int resId = res.getIdentifier(resName, "string", packageName);
+ final int resId = res.getIdentifier(resName, "string", resourcePackageName);
mResourceNameToTextsMap.put(resName, res.getString(resId));
}
}
@@ -77,6 +85,7 @@ public final class KeyboardTextsSet {
return size;
}
+ // TODO: Resolve text reference when creating {@link KeyboardTextsTable} class.
public String resolveTextReference(final String rawText) {
if (TextUtils.isEmpty(rawText)) {
return null;
@@ -127,7 +136,7 @@ public final class KeyboardTextsSet {
// These texts' name should be aligned with the @string/<name> in
// values*/strings-action-keys.xml.
- private static final String[] RESOURCE_NAMES = {
+ static final String[] RESOURCE_NAMES = {
// Labels for action.
"label_go_key",
"label_send_key",
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
index 2ac51de32..1d9ee90fb 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -111,30 +111,30 @@ public final class KeyboardTextsTable {
/* 29: 5 */ "keylabel_for_east_slavic_row2_11",
/* 30: 5 */ "keylabel_for_east_slavic_row3_5",
/* 31: 5 */ "more_keys_for_cyrillic_soft_sign",
- /* 32: 5 */ "more_keys_for_punctuation",
- /* 33: 4 */ "more_keys_for_nordic_row2_11",
- /* 34: 4 */ "keylabel_for_symbols_1",
- /* 35: 4 */ "keylabel_for_symbols_2",
- /* 36: 4 */ "keylabel_for_symbols_3",
- /* 37: 4 */ "keylabel_for_symbols_4",
- /* 38: 4 */ "keylabel_for_symbols_5",
- /* 39: 4 */ "keylabel_for_symbols_6",
- /* 40: 4 */ "keylabel_for_symbols_7",
- /* 41: 4 */ "keylabel_for_symbols_8",
- /* 42: 4 */ "keylabel_for_symbols_9",
- /* 43: 4 */ "keylabel_for_symbols_0",
- /* 44: 4 */ "label_to_symbol_key",
- /* 45: 4 */ "label_to_symbol_with_microphone_key",
- /* 46: 4 */ "additional_more_keys_for_symbols_1",
- /* 47: 4 */ "additional_more_keys_for_symbols_2",
- /* 48: 4 */ "additional_more_keys_for_symbols_3",
- /* 49: 4 */ "additional_more_keys_for_symbols_4",
- /* 50: 4 */ "additional_more_keys_for_symbols_5",
- /* 51: 4 */ "additional_more_keys_for_symbols_6",
- /* 52: 4 */ "additional_more_keys_for_symbols_7",
- /* 53: 4 */ "additional_more_keys_for_symbols_8",
- /* 54: 4 */ "additional_more_keys_for_symbols_9",
- /* 55: 4 */ "additional_more_keys_for_symbols_0",
+ /* 32: 4 */ "more_keys_for_nordic_row2_11",
+ /* 33: 4 */ "keylabel_for_symbols_1",
+ /* 34: 4 */ "keylabel_for_symbols_2",
+ /* 35: 4 */ "keylabel_for_symbols_3",
+ /* 36: 4 */ "keylabel_for_symbols_4",
+ /* 37: 4 */ "keylabel_for_symbols_5",
+ /* 38: 4 */ "keylabel_for_symbols_6",
+ /* 39: 4 */ "keylabel_for_symbols_7",
+ /* 40: 4 */ "keylabel_for_symbols_8",
+ /* 41: 4 */ "keylabel_for_symbols_9",
+ /* 42: 4 */ "keylabel_for_symbols_0",
+ /* 43: 4 */ "label_to_symbol_key",
+ /* 44: 4 */ "label_to_symbol_with_microphone_key",
+ /* 45: 4 */ "additional_more_keys_for_symbols_1",
+ /* 46: 4 */ "additional_more_keys_for_symbols_2",
+ /* 47: 4 */ "additional_more_keys_for_symbols_3",
+ /* 48: 4 */ "additional_more_keys_for_symbols_4",
+ /* 49: 4 */ "additional_more_keys_for_symbols_5",
+ /* 50: 4 */ "additional_more_keys_for_symbols_6",
+ /* 51: 4 */ "additional_more_keys_for_symbols_7",
+ /* 52: 4 */ "additional_more_keys_for_symbols_8",
+ /* 53: 4 */ "additional_more_keys_for_symbols_9",
+ /* 54: 4 */ "additional_more_keys_for_symbols_0",
+ /* 55: 3 */ "more_keys_for_punctuation",
/* 56: 3 */ "more_keys_for_star",
/* 57: 3 */ "keyspec_left_parenthesis",
/* 58: 3 */ "keyspec_right_parenthesis",
@@ -177,78 +177,77 @@ public final class KeyboardTextsTable {
/* 95: 2 */ "more_keys_for_right_parenthesis",
/* 96: 2 */ "more_keys_for_arabic_diacritics",
/* 97: 2 */ "keylabel_for_comma",
- /* 98: 2 */ "more_keys_for_comma",
- /* 99: 2 */ "keyhintlabel_for_tablet_comma",
- /* 100: 2 */ "more_keys_for_tablet_comma",
- /* 101: 2 */ "keyhintlabel_for_period",
- /* 102: 2 */ "more_keys_for_period",
- /* 103: 2 */ "keyhintlabel_for_tablet_period",
- /* 104: 2 */ "keylabel_for_symbols_question",
- /* 105: 2 */ "keylabel_for_symbols_semicolon",
- /* 106: 2 */ "keylabel_for_symbols_percent",
- /* 107: 2 */ "more_keys_for_symbols_semicolon",
- /* 108: 2 */ "more_keys_for_symbols_percent",
- /* 109: 1 */ "more_keys_for_v",
- /* 110: 1 */ "more_keys_for_j",
- /* 111: 1 */ "more_keys_for_cyrillic_ka",
- /* 112: 1 */ "more_keys_for_cyrillic_a",
- /* 113: 1 */ "more_keys_for_east_slavic_row2_11",
- /* 114: 1 */ "more_keys_for_currency_dollar",
- /* 115: 1 */ "more_keys_for_tablet_punctuation",
- /* 116: 1 */ "more_keys_for_plus",
- /* 117: 1 */ "more_keys_for_less_than",
- /* 118: 1 */ "more_keys_for_greater_than",
- /* 119: 1 */ "keylabel_for_period",
- /* 120: 1 */ "keylabel_for_tablet_period",
- /* 121: 1 */ "more_keys_for_exclamation",
- /* 122: 1 */ "more_keys_for_q",
- /* 123: 1 */ "more_keys_for_x",
- /* 124: 1 */ "keylabel_for_q",
- /* 125: 1 */ "keylabel_for_w",
- /* 126: 1 */ "keylabel_for_y",
- /* 127: 1 */ "keylabel_for_x",
- /* 128: 0 */ "more_keys_for_currency",
- /* 129: 0 */ "more_keys_for_symbols_1",
- /* 130: 0 */ "more_keys_for_symbols_2",
- /* 131: 0 */ "more_keys_for_symbols_3",
- /* 132: 0 */ "more_keys_for_symbols_4",
- /* 133: 0 */ "more_keys_for_symbols_5",
- /* 134: 0 */ "more_keys_for_symbols_6",
- /* 135: 0 */ "more_keys_for_symbols_7",
- /* 136: 0 */ "more_keys_for_symbols_8",
- /* 137: 0 */ "more_keys_for_symbols_9",
- /* 138: 0 */ "more_keys_for_symbols_0",
- /* 139: 0 */ "more_keys_for_am_pm",
- /* 140: 0 */ "settings_as_more_key",
- /* 141: 0 */ "shortcut_as_more_key",
- /* 142: 0 */ "action_next_as_more_key",
- /* 143: 0 */ "action_previous_as_more_key",
- /* 144: 0 */ "label_to_more_symbol_key",
- /* 145: 0 */ "label_to_more_symbol_for_tablet_key",
- /* 146: 0 */ "label_to_phone_numeric_key",
- /* 147: 0 */ "label_to_phone_symbols_key",
- /* 148: 0 */ "label_time_am",
- /* 149: 0 */ "label_time_pm",
- /* 150: 0 */ "keylabel_for_popular_domain",
- /* 151: 0 */ "more_keys_for_popular_domain",
- /* 152: 0 */ "keyspecs_for_left_parenthesis_more_keys",
- /* 153: 0 */ "keyspecs_for_right_parenthesis_more_keys",
- /* 154: 0 */ "single_laqm_raqm",
- /* 155: 0 */ "single_raqm_laqm",
- /* 156: 0 */ "double_laqm_raqm",
- /* 157: 0 */ "double_raqm_laqm",
- /* 158: 0 */ "single_lqm_rqm",
- /* 159: 0 */ "single_9qm_lqm",
- /* 160: 0 */ "single_9qm_rqm",
- /* 161: 0 */ "single_rqm_9qm",
- /* 162: 0 */ "double_lqm_rqm",
- /* 163: 0 */ "double_9qm_lqm",
- /* 164: 0 */ "double_9qm_rqm",
- /* 165: 0 */ "double_rqm_9qm",
- /* 166: 0 */ "more_keys_for_single_quote",
- /* 167: 0 */ "more_keys_for_double_quote",
- /* 168: 0 */ "more_keys_for_tablet_double_quote",
- /* 169: 0 */ "emoji_key_as_more_key",
+ /* 98: 2 */ "keyhintlabel_for_tablet_comma",
+ /* 99: 2 */ "more_keys_for_tablet_comma",
+ /* 100: 2 */ "keyhintlabel_for_period",
+ /* 101: 2 */ "more_keys_for_period",
+ /* 102: 2 */ "keyhintlabel_for_tablet_period",
+ /* 103: 2 */ "keylabel_for_symbols_question",
+ /* 104: 2 */ "keylabel_for_symbols_semicolon",
+ /* 105: 2 */ "keylabel_for_symbols_percent",
+ /* 106: 2 */ "more_keys_for_symbols_semicolon",
+ /* 107: 2 */ "more_keys_for_symbols_percent",
+ /* 108: 1 */ "more_keys_for_v",
+ /* 109: 1 */ "more_keys_for_j",
+ /* 110: 1 */ "more_keys_for_cyrillic_ka",
+ /* 111: 1 */ "more_keys_for_cyrillic_a",
+ /* 112: 1 */ "more_keys_for_east_slavic_row2_11",
+ /* 113: 1 */ "more_keys_for_currency_dollar",
+ /* 114: 1 */ "more_keys_for_tablet_punctuation",
+ /* 115: 1 */ "more_keys_for_plus",
+ /* 116: 1 */ "more_keys_for_less_than",
+ /* 117: 1 */ "more_keys_for_greater_than",
+ /* 118: 1 */ "keylabel_for_period",
+ /* 119: 1 */ "keylabel_for_tablet_period",
+ /* 120: 1 */ "more_keys_for_exclamation",
+ /* 121: 1 */ "more_keys_for_q",
+ /* 122: 1 */ "more_keys_for_x",
+ /* 123: 1 */ "keylabel_for_q",
+ /* 124: 1 */ "keylabel_for_w",
+ /* 125: 1 */ "keylabel_for_y",
+ /* 126: 1 */ "keylabel_for_x",
+ /* 127: 0 */ "more_keys_for_currency",
+ /* 128: 0 */ "more_keys_for_symbols_1",
+ /* 129: 0 */ "more_keys_for_symbols_2",
+ /* 130: 0 */ "more_keys_for_symbols_3",
+ /* 131: 0 */ "more_keys_for_symbols_4",
+ /* 132: 0 */ "more_keys_for_symbols_5",
+ /* 133: 0 */ "more_keys_for_symbols_6",
+ /* 134: 0 */ "more_keys_for_symbols_7",
+ /* 135: 0 */ "more_keys_for_symbols_8",
+ /* 136: 0 */ "more_keys_for_symbols_9",
+ /* 137: 0 */ "more_keys_for_symbols_0",
+ /* 138: 0 */ "more_keys_for_am_pm",
+ /* 139: 0 */ "settings_as_more_key",
+ /* 140: 0 */ "shortcut_as_more_key",
+ /* 141: 0 */ "action_next_as_more_key",
+ /* 142: 0 */ "action_previous_as_more_key",
+ /* 143: 0 */ "label_to_more_symbol_key",
+ /* 144: 0 */ "label_to_more_symbol_for_tablet_key",
+ /* 145: 0 */ "label_to_phone_numeric_key",
+ /* 146: 0 */ "label_to_phone_symbols_key",
+ /* 147: 0 */ "label_time_am",
+ /* 148: 0 */ "label_time_pm",
+ /* 149: 0 */ "keylabel_for_popular_domain",
+ /* 150: 0 */ "more_keys_for_popular_domain",
+ /* 151: 0 */ "keyspecs_for_left_parenthesis_more_keys",
+ /* 152: 0 */ "keyspecs_for_right_parenthesis_more_keys",
+ /* 153: 0 */ "single_laqm_raqm",
+ /* 154: 0 */ "single_raqm_laqm",
+ /* 155: 0 */ "double_laqm_raqm",
+ /* 156: 0 */ "double_raqm_laqm",
+ /* 157: 0 */ "single_lqm_rqm",
+ /* 158: 0 */ "single_9qm_lqm",
+ /* 159: 0 */ "single_9qm_rqm",
+ /* 160: 0 */ "single_rqm_9qm",
+ /* 161: 0 */ "double_lqm_rqm",
+ /* 162: 0 */ "double_9qm_lqm",
+ /* 163: 0 */ "double_9qm_rqm",
+ /* 164: 0 */ "double_rqm_9qm",
+ /* 165: 0 */ "more_keys_for_single_quote",
+ /* 166: 0 */ "more_keys_for_double_quote",
+ /* 167: 0 */ "more_keys_for_tablet_double_quote",
+ /* 168: 0 */ "emoji_key_as_more_key",
};
private static final String EMPTY = "";
@@ -270,10 +269,8 @@ public final class KeyboardTextsTable {
/* double_angle_quotes */ "!text/double_laqm_raqm",
/* keylabel_for_currency */ "$",
/* more_keys_for_r ~ */
- EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
- /* ~ more_keys_for_cyrillic_soft_sign */
- /* more_keys_for_punctuation */ "!fixedColumnOrder!8,;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,#,!,\\,,?,&,\\%,+,\",-,:,',@",
- /* more_keys_for_nordic_row2_11 */ EMPTY,
+ EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+ /* ~ more_keys_for_nordic_row2_11 */
/* keylabel_for_symbols_1 */ "1",
/* keylabel_for_symbols_2 */ "2",
/* keylabel_for_symbols_3 */ "3",
@@ -292,6 +289,7 @@ public final class KeyboardTextsTable {
/* additional_more_keys_for_symbols_1 ~ */
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
/* ~ additional_more_keys_for_symbols_0 */
+ /* more_keys_for_punctuation */ "!autoColumnOrder!8,\\,,?,!,#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,',@,:,-,\",+,\\%,&",
// U+2020: "†" DAGGER
// U+2021: "‡" DOUBLE DAGGER
// U+2605: "★" BLACK STAR
@@ -339,8 +337,8 @@ public final class KeyboardTextsTable {
/* more_keys_for_arabic_diacritics */ EMPTY,
// Comma key
/* keylabel_for_comma */ ",",
- /* more_keys_for_comma ~ */
- EMPTY, EMPTY, EMPTY, EMPTY,
+ /* keyhintlabel_for_tablet_comma ~ */
+ EMPTY, EMPTY, EMPTY,
/* ~ keyhintlabel_for_period */
/* more_keys_for_period */ "!text/more_keys_for_punctuation",
/* keyhintlabel_for_tablet_period */ EMPTY,
@@ -359,7 +357,7 @@ public final class KeyboardTextsTable {
// U+00A5: "¥" YEN SIGN
// U+20B1: "₱" PESO SIGN
/* more_keys_for_currency_dollar */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
- /* more_keys_for_tablet_punctuation */ "!fixedColumnOrder!7,;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,#,',\\,,&,\\%,+,\",-,:,@",
+ /* more_keys_for_tablet_punctuation */ "!autoColumnOrder!7,\\,,',#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,@,:,-,\",+,\\%,&",
// U+00B1: "±" PLUS-MINUS SIGN
/* more_keys_for_plus */ "\u00B1",
/* more_keys_for_less_than */ "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_left_double_angle_quote",
@@ -531,10 +529,8 @@ public final class KeyboardTextsTable {
/* label_to_alpha_key */ "\u0623\u200C\u0628\u200C\u062C",
/* more_keys_for_s ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null,
- /* ~ more_keys_for_cyrillic_soft_sign */
- /* more_keys_for_punctuation */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(",
- /* more_keys_for_nordic_row2_11 */ null,
+ null, null, null, null, null, null, null, null,
+ /* ~ more_keys_for_nordic_row2_11 */
// U+0661: "١" ARABIC-INDIC DIGIT ONE
/* keylabel_for_symbols_1 */ "\u0661",
// U+0662: "٢" ARABIC-INDIC DIGIT TWO
@@ -573,6 +569,7 @@ public final class KeyboardTextsTable {
// U+066B: "٫" ARABIC DECIMAL SEPARATOR
// U+066C: "٬" ARABIC THOUSANDS SEPARATOR
/* additional_more_keys_for_symbols_0 */ "0,\u066B,\u066C",
+ /* more_keys_for_punctuation */ null,
// U+2605: "★" BLACK STAR
// U+066D: "٭" ARABIC FIVE POINTED STAR
/* more_keys_for_star */ "\u2605,\u066D",
@@ -634,7 +631,6 @@ public final class KeyboardTextsTable {
/* more_keys_for_arabic_diacritics */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
// U+060C: "،" ARABIC COMMA
/* keylabel_for_comma */ "\u060C",
- /* more_keys_for_comma */ "\\,",
/* keyhintlabel_for_tablet_comma */ "\u061F",
/* more_keys_for_tablet_comma */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\",\'",
// U+0651: "ّ" ARABIC SHADDA
@@ -807,23 +803,23 @@ public final class KeyboardTextsTable {
/* more_keys_for_l */ "l\u00B7l,\u0142",
/* more_keys_for_g ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null,
- /* ~ more_keys_for_cyrillic_soft_sign */
- // U+00B7: "·" MIDDLE DOT
- /* more_keys_for_punctuation */ "!fixedColumnOrder!9,;,/,(,),#,\u00B7,!,\\,,?,&,\\%,+,\",-,:,',@",
- /* more_keys_for_nordic_row2_11 ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null,
+ /* ~ additional_more_keys_for_symbols_0 */
+ // U+00B7: "·" MIDDLE DOT
+ /* more_keys_for_punctuation */ "!autoColumnOrder!9,\\,,?,!,\u00B7,#,),(,/,;,',@,:,-,\",+,\\%,&",
+ /* more_keys_for_star ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null,
/* ~ more_keys_for_swiss_row2_11 */
// U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
/* keylabel_for_spanish_row2_10 */ "\u00E7",
/* more_keys_for_bullet ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null,
+ null, null, null, null, null, null,
/* ~ more_keys_for_currency_dollar */
- /* more_keys_for_tablet_punctuation */ "!fixedColumnOrder!8,;,/,(,),#,\u00B7,',\\,,&,\\%,+,\",-,:,@",
+ /* more_keys_for_tablet_punctuation */ "!autoColumnOrder!8,\\,,',\u00B7,#,),(,/,;,@,:,-,\",+,\\%,&",
};
/* Language cs: Czech */
@@ -967,8 +963,8 @@ public final class KeyboardTextsTable {
// U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
/* more_keys_for_nordic_row2_10 */ "\u00E4",
/* keylabel_for_east_slavic_row1_9 ~ */
- null, null, null, null, null, null,
- /* ~ more_keys_for_punctuation */
+ null, null, null, null, null,
+ /* ~ more_keys_for_cyrillic_soft_sign */
// U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
/* more_keys_for_nordic_row2_11 */ "\u00F6",
};
@@ -1237,7 +1233,6 @@ public final class KeyboardTextsTable {
/* keylabel_for_spanish_row2_10 */ "\u0135",
/* more_keys_for_bullet ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null,
/* ~ more_keys_for_symbols_percent */
// U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
/* more_keys_for_v */ "w,\u0175",
@@ -1310,11 +1305,13 @@ public final class KeyboardTextsTable {
/* more_keys_for_n */ "\u00F1,\u0144",
/* single_quotes ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null,
- /* ~ more_keys_for_cyrillic_soft_sign */
+ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null,
+ /* ~ additional_more_keys_for_symbols_0 */
// U+00A1: "¡" INVERTED EXCLAMATION MARK
// U+00BF: "¿" INVERTED QUESTION MARK
- /* more_keys_for_punctuation */ "!fixedColumnOrder!9,\u00A1,;,/,(,),#,!,\\,,?,\u00BF,&,\\%,+,\",-,:,',@",
+ /* more_keys_for_punctuation */ "!autoColumnOrder!9,\\,,?,!,#,),(,/,;,\u00A1,',@,:,-,\",+,\\%,&,\u00BF",
};
/* Language et_EE: Estonian (Estonia) */
@@ -1491,13 +1488,8 @@ public final class KeyboardTextsTable {
// U+FDFC: "﷼" RIAL SIGN
/* keylabel_for_currency */ "\uFDFC",
/* more_keys_for_r ~ */
- null, null, null, null, null, null, null, null, null, null, null, null,
- /* ~ more_keys_for_cyrillic_soft_sign */
- // U+061F: "؟" ARABIC QUESTION MARK
- // U+060C: "،" ARABIC COMMA
- // U+061B: "؛" ARABIC SEMICOLON
- /* more_keys_for_punctuation */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis",
- /* more_keys_for_nordic_row2_11 */ null,
+ null, null, null, null, null, null, null, null, null, null, null, null, null,
+ /* ~ more_keys_for_nordic_row2_11 */
// U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE
/* keylabel_for_symbols_1 */ "\u06F1",
// U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO
@@ -1536,6 +1528,7 @@ public final class KeyboardTextsTable {
// U+066B: "٫" ARABIC DECIMAL SEPARATOR
// U+066C: "٬" ARABIC THOUSANDS SEPARATOR
/* additional_more_keys_for_symbols_0 */ "0,\u066B,\u066C",
+ /* more_keys_for_punctuation */ null,
// U+2605: "★" BLACK STAR
// U+066D: "٭" ARABIC FIVE POINTED STAR
/* more_keys_for_star */ "\u2605,\u066D",
@@ -1593,7 +1586,6 @@ public final class KeyboardTextsTable {
/* more_keys_for_arabic_diacritics */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
// U+060C: "،" ARABIC COMMA
/* keylabel_for_comma */ "\u060C",
- /* more_keys_for_comma */ "\\,",
/* keyhintlabel_for_tablet_comma */ "\u061F",
/* more_keys_for_tablet_comma */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote",
// U+064B: "ً" ARABIC FATHATAN
@@ -1664,8 +1656,8 @@ public final class KeyboardTextsTable {
// U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
/* more_keys_for_nordic_row2_10 */ "\u00F8",
/* keylabel_for_east_slavic_row1_9 ~ */
- null, null, null, null, null, null,
- /* ~ more_keys_for_punctuation */
+ null, null, null, null, null,
+ /* ~ more_keys_for_cyrillic_soft_sign */
// U+00E6: "æ" LATIN SMALL LETTER AE
/* more_keys_for_nordic_row2_11 */ "\u00E6",
};
@@ -1813,7 +1805,7 @@ public final class KeyboardTextsTable {
// U+20B9: "₹" INDIAN RUPEE SIGN
/* keylabel_for_currency */ "\u20B9",
/* more_keys_for_r ~ */
- null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null, null,
/* ~ more_keys_for_nordic_row2_11 */
// U+0967: "१" DEVANAGARI DIGIT ONE
/* keylabel_for_symbols_1 */ "\u0967",
@@ -1951,21 +1943,22 @@ public final class KeyboardTextsTable {
/* label_to_alpha_key */ "\u0531\u0532\u0533",
/* more_keys_for_s ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null,
- /* ~ more_keys_for_cyrillic_soft_sign */
- // U+058A: "֊" ARMENIAN HYPHEN
- // U+055C: "՜" ARMENIAN EXCLAMATION MARK
- // U+055D: "՝" ARMENIAN COMMA
+ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ /* ~ additional_more_keys_for_symbols_0 */
// U+055E: "՞" ARMENIAN QUESTION MARK
- // U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING
+ // U+055C: "՜" ARMENIAN EXCLAMATION MARK
// U+055A: "՚" ARMENIAN APOSTROPHE
+ // U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING
+ // U+055D: "՝" ARMENIAN COMMA
// U+055B: "՛" ARMENIAN EMPHASIS MARK
+ // U+058A: "֊" ARMENIAN HYPHEN
+ // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
// U+055F: "՟" ARMENIAN ABBREVIATION MARK
- /* more_keys_for_punctuation */ "!fixedColumnOrder!8,!,?,\u0559,\u055A,.,\u055C,\\,,\u055E,:,;,\u055F,\u00AB,\u00BB,\u058A,\u055D,\u055B",
- /* more_keys_for_nordic_row2_11 ~ */
- null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ /* more_keys_for_punctuation */ "!autoColumnOrder!8,\\,,\u055E,\u055C,.,\u055A,\u0559,?,!,\u055D,\u055B,\u058A,\u00BB,\u00AB,\u055F,;,:",
+ /* more_keys_for_star ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null,
/* ~ keyspec_right_single_angle_quote */
// U+058F: "֏" ARMENIAN DRAM SIGN
// TODO: Enable this when we have glyph for the following letter
@@ -1980,7 +1973,7 @@ public final class KeyboardTextsTable {
/* more_keys_for_h ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null, null, null,
/* ~ more_keys_for_greater_than */
// U+0589: "։" ARMENIAN FULL STOP
/* keylabel_for_period */ "\u0589",
@@ -2114,7 +2107,7 @@ public final class KeyboardTextsTable {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null,
- /* ~ additional_more_keys_for_symbols_0 */
+ /* ~ more_keys_for_punctuation */
// U+2605: "★" BLACK STAR
/* more_keys_for_star */ "\u2605",
// The all letters need to be mirrored are found at
@@ -2142,7 +2135,7 @@ public final class KeyboardTextsTable {
/* keylabel_for_tablet_comma ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null, null, null,
/* ~ more_keys_for_tablet_punctuation */
// U+00B1: "±" PLUS-MINUS SIGN
// U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
@@ -2192,7 +2185,7 @@ public final class KeyboardTextsTable {
/* keylabel_for_east_slavic_row3_5 */ "\u0438",
// U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
/* more_keys_for_cyrillic_soft_sign */ "\u044A",
- /* more_keys_for_punctuation ~ */
+ /* more_keys_for_nordic_row2_11 ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@@ -2210,7 +2203,7 @@ public final class KeyboardTextsTable {
/* more_keys_for_cyrillic_o */ "\u04E9",
/* keylabel_for_south_slavic_row1_6 ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null, null, null,
/* ~ more_keys_for_j */
// U+049B: "қ" CYRILLIC SMALL LETTER KA WITH DESCENDER
/* more_keys_for_cyrillic_ka */ "\u049B",
@@ -2237,7 +2230,7 @@ public final class KeyboardTextsTable {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null, null,
/* ~ more_keys_for_east_slavic_row2_11 */
// U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
/* more_keys_for_currency_dollar */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
@@ -2271,7 +2264,7 @@ public final class KeyboardTextsTable {
/* keylabel_for_east_slavic_row3_5 */ "\u0438",
// U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
/* more_keys_for_cyrillic_soft_sign */ "\u044A",
- /* more_keys_for_punctuation ~ */
+ /* more_keys_for_nordic_row2_11 ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@@ -2605,8 +2598,8 @@ public final class KeyboardTextsTable {
// U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
/* more_keys_for_nordic_row2_10 */ "\u00F6",
/* keylabel_for_east_slavic_row1_9 ~ */
- null, null, null, null, null, null,
- /* ~ more_keys_for_punctuation */
+ null, null, null, null, null,
+ /* ~ more_keys_for_cyrillic_soft_sign */
// U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
/* more_keys_for_nordic_row2_11 */ "\u00E4",
};
@@ -2627,7 +2620,7 @@ public final class KeyboardTextsTable {
// U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
/* keylabel_for_currency */ "\u0930\u0941.",
/* more_keys_for_r ~ */
- null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null, null,
/* ~ more_keys_for_nordic_row2_11 */
// U+0967: "१" DEVANAGARI DIGIT ONE
/* keylabel_for_symbols_1 */ "\u0967",
@@ -3170,8 +3163,8 @@ public final class KeyboardTextsTable {
// U+0153: "œ" LATIN SMALL LIGATURE OE
/* more_keys_for_nordic_row2_10 */ "\u00F8,\u0153",
/* keylabel_for_east_slavic_row1_9 ~ */
- null, null, null, null, null, null,
- /* ~ more_keys_for_punctuation */
+ null, null, null, null, null,
+ /* ~ more_keys_for_cyrillic_soft_sign */
// U+00E6: "æ" LATIN SMALL LETTER AE
/* more_keys_for_nordic_row2_11 */ "\u00E6",
};
@@ -3379,7 +3372,7 @@ public final class KeyboardTextsTable {
/* keylabel_for_east_slavic_row3_5 */ "\u0438",
// U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
/* more_keys_for_cyrillic_soft_sign */ "\u044A",
- /* more_keys_for_punctuation ~ */
+ /* more_keys_for_nordic_row2_11 ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@@ -3660,7 +3653,7 @@ public final class KeyboardTextsTable {
/* more_keys_for_cyrillic_u ~ */
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null,
+ null, null, null,
/* ~ more_keys_for_v */
// U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
/* more_keys_for_j */ "\u0135",
@@ -3670,36 +3663,36 @@ public final class KeyboardTextsTable {
// Currently we are dropping the region from the key.
private static final Object[] LANGUAGES_AND_TEXTS = {
// "locale", TEXT_ARRAY, /* numberOfNonNullText/lengthOf_TEXT_ARRAY localeName */
- "DEFAULT", LANGUAGE_DEFAULT, /* 170/170 default */
+ "DEFAULT", LANGUAGE_DEFAULT, /* 169/169 default */
"af", LANGUAGE_af, /* 7/ 12 Afrikaans */
- "ar", LANGUAGE_ar, /* 58/109 Arabic */
+ "ar", LANGUAGE_ar, /* 56/108 Arabic */
"az", LANGUAGE_az_AZ, /* 8/ 17 Azerbaijani (Azerbaijan) */
"be", LANGUAGE_be_BY, /* 9/ 32 Belarusian (Belarus) */
"bg", LANGUAGE_bg, /* 2/ 10 Bulgarian */
- "ca", LANGUAGE_ca, /* 11/116 Catalan */
+ "ca", LANGUAGE_ca, /* 11/115 Catalan */
"cs", LANGUAGE_cs, /* 17/ 21 Czech */
- "da", LANGUAGE_da, /* 19/ 34 Danish */
+ "da", LANGUAGE_da, /* 19/ 33 Danish */
"de", LANGUAGE_de, /* 16/ 92 German */
"el", LANGUAGE_el, /* 1/ 10 Greek */
"en", LANGUAGE_en, /* 8/ 11 English */
- "eo", LANGUAGE_eo, /* 26/128 Esperanto */
- "es", LANGUAGE_es, /* 8/ 33 Spanish */
+ "eo", LANGUAGE_eo, /* 26/127 Esperanto */
+ "es", LANGUAGE_es, /* 8/ 56 Spanish */
"et", LANGUAGE_et_EE, /* 22/ 27 Estonian (Estonia) */
"eu", LANGUAGE_eu_ES, /* 7/ 8 Basque (Spain) */
- "fa", LANGUAGE_fa, /* 61/119 Persian */
- "fi", LANGUAGE_fi, /* 10/ 34 Finnish */
+ "fa", LANGUAGE_fa, /* 59/118 Persian */
+ "fi", LANGUAGE_fi, /* 10/ 33 Finnish */
"fr", LANGUAGE_fr, /* 13/ 92 French */
"gl", LANGUAGE_gl_ES, /* 7/ 8 Gallegan (Spain) */
- "hi", LANGUAGE_hi, /* 24/ 56 Hindi */
+ "hi", LANGUAGE_hi, /* 24/ 55 Hindi */
"hr", LANGUAGE_hr, /* 9/ 19 Croatian */
"hu", LANGUAGE_hu, /* 9/ 19 Hungarian */
- "hy", LANGUAGE_hy_AM, /* 8/122 Armenian (Armenia) */
+ "hy", LANGUAGE_hy_AM, /* 8/121 Armenian (Armenia) */
"is", LANGUAGE_is, /* 10/ 15 Icelandic */
"it", LANGUAGE_it, /* 5/ 5 Italian */
- "iw", LANGUAGE_iw, /* 20/117 Hebrew */
+ "iw", LANGUAGE_iw, /* 20/116 Hebrew */
"ka", LANGUAGE_ka_GE, /* 3/ 10 Georgian (Georgia) */
- "kk", LANGUAGE_kk, /* 15/114 Kazakh */
- "km", LANGUAGE_km_KH, /* 2/115 Khmer (Cambodia) */
+ "kk", LANGUAGE_kk, /* 15/113 Kazakh */
+ "km", LANGUAGE_km_KH, /* 2/114 Khmer (Cambodia) */
"ky", LANGUAGE_ky, /* 10/ 81 Kirghiz */
"lo", LANGUAGE_lo_LA, /* 2/ 20 Lao (Laos) */
"lt", LANGUAGE_lt, /* 18/ 22 Lithuanian */
@@ -3707,8 +3700,8 @@ public final class KeyboardTextsTable {
"mk", LANGUAGE_mk, /* 9/ 86 Macedonian */
"mn", LANGUAGE_mn_MN, /* 2/ 20 Mongolian (Mongolia) */
"my", LANGUAGE_my_MM, /* 1/ 10 Burmese (Myanmar) */
- "nb", LANGUAGE_nb, /* 11/ 34 Norwegian Bokmål */
- "ne", LANGUAGE_ne_NP, /* 24/ 56 Nepali (Nepal) */
+ "nb", LANGUAGE_nb, /* 11/ 33 Norwegian Bokmål */
+ "ne", LANGUAGE_ne_NP, /* 24/ 55 Nepali (Nepal) */
"nl", LANGUAGE_nl, /* 9/ 12 Dutch */
"pl", LANGUAGE_pl, /* 10/ 16 Polish */
"pt", LANGUAGE_pt, /* 6/ 6 Portuguese */
@@ -3718,7 +3711,7 @@ public final class KeyboardTextsTable {
"sk", LANGUAGE_sk, /* 20/ 22 Slovak */
"sl", LANGUAGE_sl, /* 8/ 19 Slovenian */
"sr", LANGUAGE_sr, /* 11/ 86 Serbian */
- "sv", LANGUAGE_sv, /* 21/ 34 Swedish */
+ "sv", LANGUAGE_sv, /* 21/ 33 Swedish */
"sw", LANGUAGE_sw, /* 9/ 17 Swahili */
"th", LANGUAGE_th, /* 2/ 20 Thai */
"tl", LANGUAGE_tl, /* 7/ 8 Tagalog */
@@ -3726,7 +3719,7 @@ public final class KeyboardTextsTable {
"uk", LANGUAGE_uk, /* 11/ 80 Ukrainian */
"vi", LANGUAGE_vi, /* 8/ 20 Vietnamese */
"zu", LANGUAGE_zu, /* 8/ 11 Zulu */
- "zz", LANGUAGE_zz, /* 19/111 Alphabet */
+ "zz", LANGUAGE_zz, /* 19/110 Alphabet */
};
static {
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 544fd0319..0aa34e82e 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -161,9 +161,9 @@ public final class BinaryDictionary extends Dictionary {
private static native int getNextWordNative(long dict, int token, int[] outCodePoints);
private static native void getSuggestionsNative(long dict, long proximityInfo,
long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times,
- int[] pointerIds, int[] inputCodePoints, int inputSize, int commitPoint,
- int[] suggestOptions, int[] prevWordCodePointArray, int[] outputSuggestionCount,
- int[] outputCodePoints, int[] outputScores, int[] outputIndices, int[] outputTypes,
+ int[] pointerIds, int[] inputCodePoints, int inputSize, int[] suggestOptions,
+ int[] prevWordCodePointArray, int[] outputSuggestionCount, int[] outputCodePoints,
+ int[] outputScores, int[] outputIndices, int[] outputTypes,
int[] outputAutoCommitFirstWordConfidence);
private static native void addUnigramWordNative(long dict, int[] word, int probability,
int[] shortcutTarget, int shortcutProbability, boolean isNotAWord,
@@ -262,7 +262,7 @@ public final class BinaryDictionary extends Dictionary {
getSuggestionsNative(mNativeDict, proximityInfo.getNativeProximityInfo(),
getTraverseSession(sessionId).getSession(), ips.getXCoordinates(),
ips.getYCoordinates(), ips.getTimes(), ips.getPointerIds(), mInputCodePoints,
- inputSize, 0 /* commitPoint */, mNativeSuggestOptions.getOptions(),
+ inputSize, mNativeSuggestOptions.getOptions(),
prevWordCodePointArray, mOutputSuggestionCount, mOutputCodePoints, mOutputScores,
mSpaceIndices, mOutputTypes, mOutputAutoCommitFirstWordConfidence);
final int count = mOutputSuggestionCount[0];
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index fc5c7f7ec..38e386493 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -169,7 +169,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private int mDelayUpdateSuggestions;
private int mDelayUpdateShiftState;
- private long mDoubleSpacePeriodTimerStart;
public UIHandler(final LatinIME ownerInstance) {
super(ownerInstance);
@@ -283,10 +282,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
sendMessageDelayed(obtainMessage(MSG_UPDATE_SHIFT_STATE), mDelayUpdateShiftState);
}
- public void cancelUpdateShiftState() {
- removeMessages(MSG_UPDATE_SHIFT_STATE);
- }
-
@UsedForTesting
public void removeAllMessages() {
for (int i = 0; i <= MSG_LAST; ++i) {
@@ -314,19 +309,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
obtainMessage(MSG_ON_END_BATCH_INPUT, suggestedWords).sendToTarget();
}
- public void startDoubleSpacePeriodTimer() {
- mDoubleSpacePeriodTimerStart = SystemClock.uptimeMillis();
- }
-
- public void cancelDoubleSpacePeriodTimer() {
- mDoubleSpacePeriodTimerStart = 0;
- }
-
- public boolean isAcceptingDoubleSpacePeriod() {
- return SystemClock.uptimeMillis() - mDoubleSpacePeriodTimerStart
- < getOwnerInstance().mSettings.getCurrent().mDoubleSpacePeriodTimeout;
- }
-
// Working variables for the following methods.
private boolean mIsOrientationChanging;
private boolean mPendingSuccessiveImsCallback;
@@ -882,7 +864,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
setNeutralSuggestionStrip();
mHandler.cancelUpdateSuggestionStrip();
- mHandler.cancelDoubleSpacePeriodTimer();
mainKeyboardView.setMainDictionaryAvailability(null != suggest
? suggest.mDictionaryFacilitator.hasMainDictionary() : false);
@@ -1296,7 +1277,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// Called from PointerTracker through the KeyboardActionListener interface
@Override
public void onTextInput(final String rawText) {
- mInputLogic.onTextInput(mSettings.getCurrent(), rawText, mHandler);
+ // TODO: have the keyboard pass the correct key code when we need it.
+ final Event event = Event.createSoftwareTextEvent(rawText, Event.NOT_A_KEY_CODE);
+ mInputLogic.onTextInput(mSettings.getCurrent(), event, mHandler);
mKeyboardSwitcher.updateShiftState();
mKeyboardSwitcher.onCodeInput(Constants.CODE_OUTPUT_TEXT);
}
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index 2ac11aa29..29382fea4 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -16,6 +16,7 @@
package com.android.inputmethod.latin;
+import com.android.inputmethod.event.CombinerChain;
import com.android.inputmethod.event.Event;
import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.CoordinateUtils;
@@ -40,6 +41,8 @@ public final class WordComposer {
public static final int CAPS_MODE_AUTO_SHIFTED = 0x5;
public static final int CAPS_MODE_AUTO_SHIFT_LOCKED = 0x7;
+ private CombinerChain mCombinerChain;
+
// An array of code points representing the characters typed so far.
// The array is limited to MAX_WORD_LENGTH code points, but mTypedWord extends past that
// and mCodePointSize can go past that. If mCodePointSize is greater than MAX_WORD_LENGTH,
@@ -87,6 +90,7 @@ public final class WordComposer {
private boolean mIsFirstCharCapitalized;
public WordComposer() {
+ mCombinerChain = new CombinerChain();
mPrimaryKeyCodes = new int[MAX_WORD_LENGTH];
mEvents = CollectionUtils.newArrayList();
mTypedWord = new StringBuilder(MAX_WORD_LENGTH);
@@ -101,6 +105,7 @@ public final class WordComposer {
}
public WordComposer(final WordComposer source) {
+ mCombinerChain = source.mCombinerChain;
mPrimaryKeyCodes = Arrays.copyOf(source.mPrimaryKeyCodes, source.mPrimaryKeyCodes.length);
mEvents = new ArrayList<Event>(source.mEvents);
mTypedWord = new StringBuilder(source.mTypedWord);
@@ -187,6 +192,7 @@ public final class WordComposer {
final int keyX = event.mX;
final int keyY = event.mY;
final int newIndex = size();
+ mCombinerChain.processEvent(mEvents, event);
mTypedWord.appendCodePoint(primaryCode);
mEvents.add(event);
refreshSize();
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index 1eff42762..36b30eabe 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -28,7 +28,6 @@ import android.view.inputmethod.EditorInfo;
import com.android.inputmethod.compat.SuggestionSpanUtils;
import com.android.inputmethod.event.Event;
-import com.android.inputmethod.event.EventInterpreter;
import com.android.inputmethod.event.InputTransaction;
import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.latin.Constants;
@@ -96,6 +95,7 @@ public final class InputLogic {
// TODO: This boolean is persistent state and causes large side effects at unexpected times.
// Find a way to remove it for readability.
private boolean mIsAutoCorrectionIndicatorOn;
+ private long mDoubleSpacePeriodCountdownStart;
public InputLogic(final LatinIME latinIME,
final SuggestionStripViewAccessor suggestionStripViewAccessor) {
@@ -138,6 +138,7 @@ public final class InputLogic {
// In some cases (namely, after rotation of the device) editorInfo.initialSelStart is lying
// so we try using some heuristics to find out about these and fix them.
mConnection.tryFixLyingCursorPosition();
+ cancelDoubleSpacePeriodCountdown();
mInputLogicHandler = new InputLogicHandler(mLatinIME, this);
}
@@ -160,11 +161,12 @@ public final class InputLogic {
* some additional keys for example.
*
* @param settingsValues the current values of the settings.
- * @param rawText the text to input.
+ * @param event the input event containing the data.
*/
- public void onTextInput(final SettingsValues settingsValues, final String rawText,
+ public void onTextInput(final SettingsValues settingsValues, final Event event,
// TODO: remove this argument
final LatinIME.UIHandler handler) {
+ final String rawText = event.mText.toString();
mConnection.beginBatchEdit();
if (mWordComposer.isComposingWord()) {
commitCurrentAutoCorrection(settingsValues, rawText, handler);
@@ -406,7 +408,7 @@ public final class InputLogic {
// TODO: Consolidate the double-space period timer, mLastKeyTime, and the space state.
if (event.mCodePoint != Constants.CODE_SPACE) {
- handler.cancelDoubleSpacePeriodTimer();
+ cancelDoubleSpacePeriodCountdown();
}
boolean didAutoCorrect = false;
@@ -847,7 +849,7 @@ public final class InputLogic {
if (Constants.CODE_SPACE == codePoint) {
if (inputTransaction.mSettingsValues.isSuggestionsRequested()) {
- if (maybeDoubleSpacePeriod(inputTransaction.mSettingsValues, handler)) {
+ if (maybeDoubleSpacePeriod(inputTransaction)) {
inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW);
mSpaceState = SpaceState.DOUBLE;
} else if (!mSuggestedWords.isPunctuationSuggestions()) {
@@ -855,7 +857,7 @@ public final class InputLogic {
}
}
- handler.startDoubleSpacePeriodTimer();
+ startDoubleSpacePeriodCountdown(inputTransaction);
handler.postUpdateSuggestionStrip();
} else {
if (swapWeakSpace) {
@@ -952,7 +954,7 @@ public final class InputLogic {
return;
}
if (SpaceState.DOUBLE == inputTransaction.mSpaceState) {
- handler.cancelDoubleSpacePeriodTimer();
+ cancelDoubleSpacePeriodCountdown();
if (mConnection.revertDoubleSpacePeriod()) {
// No need to reset mSpaceState, it has already be done (that's why we
// receive it as a parameter)
@@ -1100,6 +1102,19 @@ public final class InputLogic {
return false;
}
+ public void startDoubleSpacePeriodCountdown(final InputTransaction inputTransaction) {
+ mDoubleSpacePeriodCountdownStart = inputTransaction.mTimestamp;
+ }
+
+ public void cancelDoubleSpacePeriodCountdown() {
+ mDoubleSpacePeriodCountdownStart = 0;
+ }
+
+ public boolean isDoubleSpacePeriodCountdownActive(final InputTransaction inputTransaction) {
+ return inputTransaction.mTimestamp - mDoubleSpacePeriodCountdownStart
+ < inputTransaction.mSettingsValues.mDoubleSpacePeriodTimeout;
+ }
+
/**
* Apply the double-space-to-period transformation if applicable.
*
@@ -1112,14 +1127,12 @@ public final class InputLogic {
* method applies the transformation and returns true. Otherwise, it does nothing and
* returns false.
*
- * @param settingsValues the current values of the settings.
+ * @param inputTransaction The transaction in progress.
* @return true if we applied the double-space-to-period transformation, false otherwise.
*/
- private boolean maybeDoubleSpacePeriod(final SettingsValues settingsValues,
- // TODO: remove this argument
- final LatinIME.UIHandler handler) {
- if (!settingsValues.mUseDoubleSpacePeriod) return false;
- if (!handler.isAcceptingDoubleSpacePeriod()) return false;
+ private boolean maybeDoubleSpacePeriod(final InputTransaction inputTransaction) {
+ if (!inputTransaction.mSettingsValues.mUseDoubleSpacePeriod) return false;
+ if (!isDoubleSpacePeriodCountdownActive(inputTransaction)) return false;
// We only do this when we see two spaces and an accepted code point before the cursor.
// The code point may be a surrogate pair but the two spaces may not, so we need 4 chars.
final CharSequence lastThree = mConnection.getTextBeforeCursor(4, 0);
@@ -1135,10 +1148,10 @@ public final class InputLogic {
Character.isSurrogatePair(lastThree.charAt(0), lastThree.charAt(1)) ?
Character.codePointAt(lastThree, 0) : lastThree.charAt(length - 3);
if (canBeFollowedByDoubleSpacePeriod(firstCodePoint)) {
- handler.cancelDoubleSpacePeriodTimer();
+ cancelDoubleSpacePeriodCountdown();
mConnection.deleteSurroundingText(2, 0);
- final String textToInsert =
- settingsValues.mSpacingAndPunctuations.mSentenceSeparatorAndSpace;
+ final String textToInsert = inputTransaction.mSettingsValues.mSpacingAndPunctuations
+ .mSentenceSeparatorAndSpace;
mConnection.commitText(textToInsert, 1);
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
ResearchLogger.latinIME_maybeDoubleSpacePeriod(textToInsert,
diff --git a/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java b/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java
index 5954758aa..796921f71 100644
--- a/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java
+++ b/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java
@@ -18,7 +18,6 @@ package com.android.inputmethod.latin.settings;
import android.content.res.Resources;
-import com.android.inputmethod.keyboard.internal.KeyboardTextsSet;
import com.android.inputmethod.keyboard.internal.MoreKeySpec;
import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.PunctuationSuggestions;
@@ -61,10 +60,8 @@ public final class SpacingAndPunctuations {
// English variants. German rules (not "German typography") also have small gotchas.
mUsesAmericanTypography = Locale.ENGLISH.getLanguage().equals(locale.getLanguage());
mUsesGermanRules = Locale.GERMAN.getLanguage().equals(locale.getLanguage());
- final KeyboardTextsSet textsSet = new KeyboardTextsSet();
- textsSet.setLocale(locale);
final String[] suggestPuncsSpec = MoreKeySpec.splitKeySpecs(
- textsSet.resolveTextReference(res.getString(R.string.suggested_punctuations)));
+ res.getString(R.string.suggested_punctuations));
mSuggestPuncList = PunctuationSuggestions.newPunctuationSuggestions(suggestPuncsSpec);
}
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
index c26e223c9..1d84bb59f 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
@@ -507,7 +507,7 @@ final class SuggestionStripLayoutHelper {
hintView, 1.0f - mCenterSuggestionWeight, ViewGroup.LayoutParams.MATCH_PARENT);
}
- public void layoutImportantNotice(final View importantNoticeStrip, final int stripWidth,
+ public void layoutImportantNotice(final View importantNoticeStrip,
final String importantNoticeTitle) {
final TextView titleView = (TextView)importantNoticeStrip.findViewById(
R.id.important_notice_title);
@@ -516,8 +516,7 @@ final class SuggestionStripLayoutHelper {
titleView.setTextColor(mColorAutoCorrect);
titleView.setText(importantNoticeTitle);
titleView.setTextScaleX(1.0f); // Reset textScaleX.
- final float titleScaleX = getTextScaleX(
- importantNoticeTitle, width, titleView.getPaint());
+ final float titleScaleX = getTextScaleX(importantNoticeTitle, width, titleView.getPaint());
titleView.setTextScaleX(titleScaleX);
}
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index 43cb11b14..3cdd07361 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -232,8 +232,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
if (!ImportantNoticeUtils.shouldShowImportantNotice(getContext(), inputAttributes)) {
return false;
}
- final int width = getWidth();
- if (width <= 0) {
+ if (getWidth() <= 0) {
return false;
}
final String importantNoticeTitle = ImportantNoticeUtils.getNextImportantNoticeTitle(
@@ -241,7 +240,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
if (TextUtils.isEmpty(importantNoticeTitle)) {
return false;
}
- mLayoutHelper.layoutImportantNotice(mImportantNoticeStrip, width, importantNoticeTitle);
+ mLayoutHelper.layoutImportantNotice(mImportantNoticeStrip, importantNoticeTitle);
mStripVisibilityGroup.showImportantNoticeStrip();
mImportantNoticeStrip.setOnClickListener(this);
return true;
diff --git a/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java b/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java
index ca8bef397..7d937a9d2 100644
--- a/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
+import android.text.TextUtils;
import android.util.Log;
import com.android.inputmethod.latin.InputAttributes;
@@ -82,7 +83,17 @@ public final class ImportantNoticeUtils {
if (inputAttributes == null || inputAttributes.mIsPasswordField) {
return false;
}
- return hasNewImportantNotice(context) && !isInSystemSetupWizard(context);
+ if (isInSystemSetupWizard(context)) {
+ return false;
+ }
+ if (!hasNewImportantNotice(context)) {
+ return false;
+ }
+ final String importantNoticeTitle = getNextImportantNoticeTitle(context);
+ if (TextUtils.isEmpty(importantNoticeTitle)) {
+ return false;
+ }
+ return true;
}
public static void updateLastImportantNoticeVersion(final Context context) {
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index eec354abc..ac0b4ab15 100644
--- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -143,7 +143,7 @@ static int latinime_BinaryDictionary_getFormatVersion(JNIEnv *env, jclass clazz,
static void latinime_BinaryDictionary_getSuggestions(JNIEnv *env, jclass clazz, jlong dict,
jlong proximityInfo, jlong dicTraverseSession, jintArray xCoordinatesArray,
jintArray yCoordinatesArray, jintArray timesArray, jintArray pointerIdsArray,
- jintArray inputCodePointsArray, jint inputSize, jint commitPoint, jintArray suggestOptions,
+ jintArray inputCodePointsArray, jint inputSize, jintArray suggestOptions,
jintArray prevWordCodePointsForBigrams, jintArray outSuggestionCount,
jintArray outCodePointsArray, jintArray outScoresArray, jintArray outSpaceIndicesArray,
jintArray outTypesArray, jintArray outAutoCommitFirstWordConfidenceArray) {
@@ -220,7 +220,7 @@ static void latinime_BinaryDictionary_getSuggestions(JNIEnv *env, jclass clazz,
// TODO: Use SuggestionResults to return suggestions.
count = dictionary->getSuggestions(pInfo, traverseSession, xCoordinates, yCoordinates,
times, pointerIds, inputCodePoints, inputSize, prevWordCodePoints,
- prevWordCodePointsLength, commitPoint, &givenSuggestOptions, outputCodePoints,
+ prevWordCodePointsLength, &givenSuggestOptions, outputCodePoints,
scores, spaceIndices, outputTypes, outputAutoCommitFirstWordConfidence);
} else {
SuggestionResults suggestionResults(MAX_RESULTS);
@@ -506,7 +506,7 @@ static const JNINativeMethod sMethods[] = {
},
{
const_cast<char *>("getSuggestionsNative"),
- const_cast<char *>("(JJJ[I[I[I[I[III[I[I[I[I[I[I[I[I)V"),
+ const_cast<char *>("(JJJ[I[I[I[I[II[I[I[I[I[I[I[I[I)V"),
reinterpret_cast<void *>(latinime_BinaryDictionary_getSuggestions)
},
{
diff --git a/native/jni/src/suggest/core/dicnode/dic_node.h b/native/jni/src/suggest/core/dicnode/dic_node.h
index 65dad5677..ae228fb98 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node.h
+++ b/native/jni/src/suggest/core/dicnode/dic_node.h
@@ -270,9 +270,10 @@ class DicNode {
bool hasMatchedOrProximityCodePoints() const {
// This DicNode does not have matched or proximity code points when all code points have
- // been handled as edit corrections so far.
- return mDicNodeState.mDicNodeStateScoring.getEditCorrectionCount()
- < getNodeCodePointCount();
+ // been handled as edit corrections or completion so far.
+ const int editCorrectionCount = mDicNodeState.mDicNodeStateScoring.getEditCorrectionCount();
+ const int completionCount = mDicNodeState.mDicNodeStateScoring.getCompletionCount();
+ return (editCorrectionCount + completionCount) < getNodeCodePointCount();
}
bool isTotalInputSizeExceedingLimit() const {
@@ -283,33 +284,6 @@ class DicNode {
return prevWordsLen + currentWordDepth > MAX_WORD_LENGTH - 3;
}
- // TODO: This may be defective. Needs to be revised.
- bool truncateNode(const DicNode *const topNode, const int inputCommitPoint) {
- const int prevWordLenOfTop = mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength();
- int newPrevWordStartIndex = inputCommitPoint;
- int charCount = 0;
- // Find new word start index
- for (int i = 0; i < prevWordLenOfTop; ++i) {
- const int c = mDicNodeState.mDicNodeStatePrevWord.getPrevWordCodePointAt(i);
- // TODO: Check other separators.
- if (c != KEYCODE_SPACE && c != KEYCODE_SINGLE_QUOTE) {
- if (charCount == inputCommitPoint) {
- newPrevWordStartIndex = i;
- break;
- }
- ++charCount;
- }
- }
- if (!mDicNodeState.mDicNodeStatePrevWord.startsWith(
- &topNode->mDicNodeState.mDicNodeStatePrevWord, newPrevWordStartIndex - 1)) {
- // Node mismatch.
- return false;
- }
- mDicNodeState.mDicNodeStateInput.truncate(inputCommitPoint);
- mDicNodeState.mDicNodeStatePrevWord.truncate(newPrevWordStartIndex);
- return true;
- }
-
void outputResult(int *dest) const {
const uint16_t prevWordLength = mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength();
const uint16_t currentDepth = getNodeCodePointCount();
diff --git a/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp
index b6be47e90..ef4a6b5d8 100644
--- a/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp
+++ b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp
@@ -28,37 +28,4 @@ const int DicNodesCache::LARGE_PRIORITY_QUEUE_CAPACITY = 310;
// Capacity for reducing memory footprint.
const int DicNodesCache::SMALL_PRIORITY_QUEUE_CAPACITY = 100;
-/**
- * Truncates all of the dicNodes so that they start at the given commit point.
- * Only called for multi-word typing input.
- */
-DicNode *DicNodesCache::setCommitPoint(int commitPoint) {
- std::list<DicNode> dicNodesList;
- while (mCachedDicNodesForContinuousSuggestion->getSize() > 0) {
- DicNode dicNode;
- mCachedDicNodesForContinuousSuggestion->copyPop(&dicNode);
- dicNodesList.push_front(dicNode);
- }
-
- // Get the starting words of the top scoring dicNode (last dicNode popped from priority queue)
- // up to the commit point. These words have already been committed to the text view.
- DicNode *topDicNode = &dicNodesList.front();
- DicNode topDicNodeCopy;
- DicNodeUtils::initByCopy(topDicNode, &topDicNodeCopy);
-
- // Keep only those dicNodes that match the same starting words.
- std::list<DicNode>::iterator iter;
- for (iter = dicNodesList.begin(); iter != dicNodesList.end(); iter++) {
- DicNode *dicNode = &*iter;
- if (dicNode->truncateNode(&topDicNodeCopy, commitPoint)) {
- mCachedDicNodesForContinuousSuggestion->copyPush(dicNode);
- } else {
- // Top dicNode should be reprocessed.
- ASSERT(dicNode != topDicNode);
- DicNode::managedDelete(dicNode);
- }
- }
- mInputIndex -= commitPoint;
- return topDicNode;
-}
} // namespace latinime
diff --git a/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h
index c31c056f5..d4769e739 100644
--- a/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h
+++ b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h
@@ -76,8 +76,6 @@ class DicNodesCache {
moveNodesAndReturnReusableEmptyQueue(mNextActiveDicNodes, &mActiveDicNodes);
}
- DicNode *setCommitPoint(int commitPoint);
-
int activeSize() const { return mActiveDicNodes->getSize(); }
int terminalSize() const { return mTerminalDicNodes->getSize(); }
bool isLookAheadCorrectionInputIndex(const int inputIndex) const {
diff --git a/native/jni/src/suggest/core/dicnode/internal/dic_node_state_input.h b/native/jni/src/suggest/core/dicnode/internal/dic_node_state_input.h
index 3d788114f..03042a8a7 100644
--- a/native/jni/src/suggest/core/dicnode/internal/dic_node_state_input.h
+++ b/native/jni/src/suggest/core/dicnode/internal/dic_node_state_input.h
@@ -27,11 +27,6 @@ class DicNodeStateInput {
DicNodeStateInput() {}
~DicNodeStateInput() {}
- // TODO: Merge into DicNodeStatePrevWord::truncate
- void truncate(const int commitPoint) {
- mInputIndex[0] -= commitPoint;
- }
-
void init() {
for (int i = 0; i < MAX_POINTER_COUNT_G; i++) {
// TODO: The initial value for mInputIndex should be -1?
diff --git a/native/jni/src/suggest/core/dicnode/internal/dic_node_state_prevword.h b/native/jni/src/suggest/core/dicnode/internal/dic_node_state_prevword.h
index f2b1ce8f7..409841e2d 100644
--- a/native/jni/src/suggest/core/dicnode/internal/dic_node_state_prevword.h
+++ b/native/jni/src/suggest/core/dicnode/internal/dic_node_state_prevword.h
@@ -70,18 +70,6 @@ class DicNodeStatePrevWord {
mSecondWordFirstInputIndex = prevWordSecondWordFirstInputIndex;
}
- void truncate(const int offset) {
- // TODO: memmove
- if (mPrevWordLength < offset) {
- memset(mPrevWord, 0, sizeof(mPrevWord));
- mPrevWordLength = 0;
- return;
- }
- const int newPrevWordLength = mPrevWordLength - offset;
- memmove(mPrevWord, &mPrevWord[offset], newPrevWordLength * sizeof(mPrevWord[0]));
- mPrevWordLength = newPrevWordLength;
- }
-
void setSecondWordFirstInputIndex(const int inputIndex) {
mSecondWordFirstInputIndex = inputIndex;
}
@@ -111,18 +99,6 @@ class DicNodeStatePrevWord {
return mPrevWord[id];
}
- bool startsWith(const DicNodeStatePrevWord *const prefix, const int prefixLen) const {
- if (prefixLen > mPrevWordLength) {
- return false;
- }
- for (int i = 0; i < prefixLen; ++i) {
- if (mPrevWord[i] != prefix->mPrevWord[i]) {
- return false;
- }
- }
- return true;
- }
-
const int *getPrevWordBuf() const {
return mPrevWord;
}
diff --git a/native/jni/src/suggest/core/dicnode/internal/dic_node_state_scoring.h b/native/jni/src/suggest/core/dicnode/internal/dic_node_state_scoring.h
index 458eac81b..b0db55fc1 100644
--- a/native/jni/src/suggest/core/dicnode/internal/dic_node_state_scoring.h
+++ b/native/jni/src/suggest/core/dicnode/internal/dic_node_state_scoring.h
@@ -31,7 +31,7 @@ class DicNodeStateScoring {
AK_FORCE_INLINE DicNodeStateScoring()
: mDoubleLetterLevel(NOT_A_DOUBLE_LETTER),
mDigraphIndex(DigraphUtils::NOT_A_DIGRAPH_INDEX),
- mEditCorrectionCount(0), mProximityCorrectionCount(0),
+ mEditCorrectionCount(0), mProximityCorrectionCount(0), mCompletionCount(0),
mNormalizedCompoundDistance(0.0f), mSpatialDistance(0.0f), mLanguageDistance(0.0f),
mRawLength(0.0f), mContainedErrorTypes(ErrorTypeUtils::NOT_AN_ERROR),
mNormalizedCompoundDistanceAfterFirstWord(MAX_VALUE_FOR_WEIGHTING) {
@@ -42,6 +42,7 @@ class DicNodeStateScoring {
void init() {
mEditCorrectionCount = 0;
mProximityCorrectionCount = 0;
+ mCompletionCount = 0;
mNormalizedCompoundDistance = 0.0f;
mSpatialDistance = 0.0f;
mLanguageDistance = 0.0f;
@@ -55,6 +56,7 @@ class DicNodeStateScoring {
AK_FORCE_INLINE void init(const DicNodeStateScoring *const scoring) {
mEditCorrectionCount = scoring->mEditCorrectionCount;
mProximityCorrectionCount = scoring->mProximityCorrectionCount;
+ mCompletionCount = scoring->mCompletionCount;
mNormalizedCompoundDistance = scoring->mNormalizedCompoundDistance;
mSpatialDistance = scoring->mSpatialDistance;
mLanguageDistance = scoring->mLanguageDistance;
@@ -77,6 +79,9 @@ class DicNodeStateScoring {
if (ErrorTypeUtils::isProximityCorrectionError(errorType)) {
++mProximityCorrectionCount;
}
+ if (ErrorTypeUtils::isCompletion(errorType)) {
+ ++mCompletionCount;
+ }
}
// Saves the current normalized distance for space-aware gestures.
@@ -129,6 +134,10 @@ class DicNodeStateScoring {
return mProximityCorrectionCount;
}
+ int16_t getCompletionCount() const {
+ return mCompletionCount;
+ }
+
float getRawLength() const {
return mRawLength;
}
@@ -182,6 +191,7 @@ class DicNodeStateScoring {
int16_t mEditCorrectionCount;
int16_t mProximityCorrectionCount;
+ int16_t mCompletionCount;
float mNormalizedCompoundDistance;
float mSpatialDistance;
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.cpp b/native/jni/src/suggest/core/dictionary/dictionary.cpp
index c26e3aad6..07b07f725 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.cpp
+++ b/native/jni/src/suggest/core/dictionary/dictionary.cpp
@@ -45,7 +45,7 @@ Dictionary::Dictionary(JNIEnv *env, DictionaryStructureWithBufferPolicy::Structu
int Dictionary::getSuggestions(ProximityInfo *proximityInfo, DicTraverseSession *traverseSession,
int *xcoordinates, int *ycoordinates, int *times, int *pointerIds, int *inputCodePoints,
- int inputSize, int *prevWordCodePoints, int prevWordLength, int commitPoint,
+ int inputSize, int *prevWordCodePoints, int prevWordLength,
const SuggestOptions *const suggestOptions, int *outWords, int *outputScores,
int *spaceIndices, int *outputTypes, int *outputAutoCommitFirstWordConfidence) const {
TimeKeeper::setCurrentTime();
@@ -54,7 +54,7 @@ int Dictionary::getSuggestions(ProximityInfo *proximityInfo, DicTraverseSession
DicTraverseSession::initSessionInstance(
traverseSession, this, prevWordCodePoints, prevWordLength, suggestOptions);
result = mGestureSuggest->getSuggestions(proximityInfo, traverseSession, xcoordinates,
- ycoordinates, times, pointerIds, inputCodePoints, inputSize, commitPoint, outWords,
+ ycoordinates, times, pointerIds, inputCodePoints, inputSize, outWords,
outputScores, spaceIndices, outputTypes, outputAutoCommitFirstWordConfidence);
if (DEBUG_DICT) {
DUMP_RESULT(outWords, outputScores);
@@ -64,7 +64,7 @@ int Dictionary::getSuggestions(ProximityInfo *proximityInfo, DicTraverseSession
DicTraverseSession::initSessionInstance(
traverseSession, this, prevWordCodePoints, prevWordLength, suggestOptions);
result = mTypingSuggest->getSuggestions(proximityInfo, traverseSession, xcoordinates,
- ycoordinates, times, pointerIds, inputCodePoints, inputSize, commitPoint,
+ ycoordinates, times, pointerIds, inputCodePoints, inputSize,
outWords, outputScores, spaceIndices, outputTypes,
outputAutoCommitFirstWordConfidence);
if (DEBUG_DICT) {
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.h b/native/jni/src/suggest/core/dictionary/dictionary.h
index ce032fceb..4d482e742 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.h
+++ b/native/jni/src/suggest/core/dictionary/dictionary.h
@@ -64,7 +64,7 @@ class Dictionary {
int getSuggestions(ProximityInfo *proximityInfo, DicTraverseSession *traverseSession,
int *xcoordinates, int *ycoordinates, int *times, int *pointerIds, int *inputCodePoints,
- int inputSize, int *prevWordCodePoints, int prevWordLength, int commitPoint,
+ int inputSize, int *prevWordCodePoints, int prevWordLength,
const SuggestOptions *const suggestOptions, int *outWords, int *outputScores,
int *spaceIndices, int *outputTypes, int *outputAutoCommitFirstWordConfidence) const;
diff --git a/native/jni/src/suggest/core/dictionary/error_type_utils.h b/native/jni/src/suggest/core/dictionary/error_type_utils.h
index 1122291a6..cc7786765 100644
--- a/native/jni/src/suggest/core/dictionary/error_type_utils.h
+++ b/native/jni/src/suggest/core/dictionary/error_type_utils.h
@@ -59,6 +59,10 @@ class ErrorTypeUtils {
return (errorType & PROXIMITY_CORRECTION) != 0;
}
+ static bool isCompletion(const ErrorType errorType) {
+ return (errorType & COMPLETION) != 0;
+ }
+
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(ErrorTypeUtils);
diff --git a/native/jni/src/suggest/core/suggest.cpp b/native/jni/src/suggest/core/suggest.cpp
index f60a210d4..f6de571a8 100644
--- a/native/jni/src/suggest/core/suggest.cpp
+++ b/native/jni/src/suggest/core/suggest.cpp
@@ -44,7 +44,7 @@ const int Suggest::MIN_CONTINUOUS_SUGGESTION_INPUT_SIZE = 2;
*/
int Suggest::getSuggestions(ProximityInfo *pInfo, void *traverseSession,
int *inputXs, int *inputYs, int *times, int *pointerIds, int *inputCodePoints,
- int inputSize, int commitPoint, int *outWords, int *outputScores, int *outputIndices,
+ int inputSize, int *outWords, int *outputScores, int *outputIndices,
int *outputTypes, int *outputAutoCommitFirstWordConfidence) const {
PROF_OPEN;
PROF_START(0);
@@ -54,7 +54,7 @@ int Suggest::getSuggestions(ProximityInfo *pInfo, void *traverseSession,
pointerIds, maxSpatialDistance, TRAVERSAL->getMaxPointerCount());
// TODO: Add the way to evaluate cache
- initializeSearch(tSession, commitPoint);
+ initializeSearch(tSession);
PROF_END(0);
PROF_START(1);
@@ -77,27 +77,15 @@ int Suggest::getSuggestions(ProximityInfo *pInfo, void *traverseSession,
* Initializes the search at the root of the lexicon trie. Note that when possible the search will
* continue suggestion from where it left off during the last call.
*/
-void Suggest::initializeSearch(DicTraverseSession *traverseSession, int commitPoint) const {
+void Suggest::initializeSearch(DicTraverseSession *traverseSession) const {
if (!traverseSession->getProximityInfoState(0)->isUsed()) {
return;
}
- // Never auto partial commit for now.
- commitPoint = 0;
-
if (traverseSession->getInputSize() > MIN_CONTINUOUS_SUGGESTION_INPUT_SIZE
&& traverseSession->isContinuousSuggestionPossible()) {
- if (commitPoint == 0) {
- // Continue suggestion
- traverseSession->getDicTraverseCache()->continueSearch();
- } else {
- // Continue suggestion after partial commit.
- DicNode *topDicNode =
- traverseSession->getDicTraverseCache()->setCommitPoint(commitPoint);
- traverseSession->setPrevWordPtNodePos(topDicNode->getPrevWordPtNodePos());
- traverseSession->getDicTraverseCache()->continueSearch();
- traverseSession->setPartiallyCommited();
- }
+ // Continue suggestion
+ traverseSession->getDicTraverseCache()->continueSearch();
} else {
// Restart recognition at the root.
traverseSession->resetCache(TRAVERSAL->getMaxCacheSize(traverseSession->getInputSize()),
diff --git a/native/jni/src/suggest/core/suggest.h b/native/jni/src/suggest/core/suggest.h
index c42986ad6..33ea0b658 100644
--- a/native/jni/src/suggest/core/suggest.h
+++ b/native/jni/src/suggest/core/suggest.h
@@ -47,15 +47,15 @@ class Suggest : public SuggestInterface {
WEIGHTING(suggestPolicy ? suggestPolicy->getWeighting() : nullptr) {}
AK_FORCE_INLINE virtual ~Suggest() {}
int getSuggestions(ProximityInfo *pInfo, void *traverseSession, int *inputXs, int *inputYs,
- int *times, int *pointerIds, int *inputCodePoints, int inputSize, int commitPoint,
- int *outWords, int *outputScores, int *outputIndices, int *outputTypes,
+ int *times, int *pointerIds, int *inputCodePoints, int inputSize, int *outWords,
+ int *outputScores, int *outputIndices, int *outputTypes,
int *outputAutoCommitFirstWordConfidence) const;
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(Suggest);
void createNextWordDicNode(DicTraverseSession *traverseSession, DicNode *dicNode,
const bool spaceSubstitution) const;
- void initializeSearch(DicTraverseSession *traverseSession, int commitPoint) const;
+ void initializeSearch(DicTraverseSession *traverseSession) const;
void expandCurrentDicNodes(DicTraverseSession *traverseSession) const;
void processTerminalDicNode(DicTraverseSession *traverseSession, DicNode *dicNode) const;
void processExpandedDicNode(DicTraverseSession *traverseSession, DicNode *dicNode) const;
diff --git a/native/jni/src/suggest/core/suggest_interface.h b/native/jni/src/suggest/core/suggest_interface.h
index 9a0758085..f10db830f 100644
--- a/native/jni/src/suggest/core/suggest_interface.h
+++ b/native/jni/src/suggest/core/suggest_interface.h
@@ -27,8 +27,8 @@ class SuggestInterface {
public:
virtual int getSuggestions(ProximityInfo *pInfo, void *traverseSession, int *inputXs,
int *inputYs, int *times, int *pointerIds, int *inputCodePoints, int inputSize,
- int commitPoint, int *outWords, int *outputScores, int *outputIndices,
- int *outputTypes, int *outputAutoCommitFirstWordConfidence) const = 0;
+ int *outWords, int *outputScores, int *outputIndices, int *outputTypes,
+ int *outputAutoCommitFirstWordConfidence) const = 0;
SuggestInterface() {}
virtual ~SuggestInterface() {}
private:
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
index e691639a8..bbffc8dd5 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
@@ -25,8 +25,8 @@ import java.util.ArrayList;
@SmallTest
public class KeyboardLayoutSetSubtypesCountTests extends KeyboardLayoutSetTestsBase {
- private static final int NUMBER_OF_SUBTYPES = 63;
- private static final int NUMBER_OF_ASCII_CAPABLE_SUBTYPES = 40;
+ private static final int NUMBER_OF_SUBTYPES = 66;
+ private static final int NUMBER_OF_ASCII_CAPABLE_SUBTYPES = 42;
private static final int NUMBER_OF_PREDEFINED_ADDITIONAL_SUBTYPES = 2;
private static String toString(final ArrayList<InputMethodSubtype> subtypeList) {
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
index c342533c8..7923afc1a 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
@@ -22,12 +22,8 @@ import static com.android.inputmethod.keyboard.internal.KeyboardIconsSet.PREFIX_
import static com.android.inputmethod.latin.Constants.CODE_OUTPUT_TEXT;
import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED;
-import android.content.Context;
-import android.content.res.Resources;
import android.test.AndroidTestCase;
-import com.android.inputmethod.latin.utils.RunInLocale;
-
import java.util.Locale;
abstract class KeySpecParserTestsBase extends AndroidTestCase {
@@ -51,16 +47,7 @@ abstract class KeySpecParserTestsBase extends AndroidTestCase {
protected void setUp() throws Exception {
super.setUp();
- mTextsSet.setLocale(TEST_LOCALE);
- final Context context = getContext();
- new RunInLocale<Void>() {
- @Override
- protected Void job(final Resources res) {
- mTextsSet.loadStringResources(context);
- return null;
- }
- }.runInLocale(context.getResources(), TEST_LOCALE);
-
+ mTextsSet.setLocale(TEST_LOCALE, getContext());
mCodeSettings = KeyboardCodesSet.getCode(CODE_SETTINGS_NAME);
mCodeActionNext = KeyboardCodesSet.getCode("key_action_next");
mSettingsIconId = KeyboardIconsSet.getIconId(ICON_SETTINGS_NAME);
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java
index 17d768718..eb906cd9f 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSetTests.java
@@ -17,7 +17,6 @@
package com.android.inputmethod.keyboard.internal;
import android.content.Context;
-import android.content.res.Resources;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.inputmethod.InputMethodInfo;
@@ -25,7 +24,6 @@ import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.latin.RichInputMethodManager;
import com.android.inputmethod.latin.utils.CollectionUtils;
-import com.android.inputmethod.latin.utils.RunInLocale;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
import java.util.ArrayList;
@@ -58,10 +56,11 @@ public final class KeyboardTextsSetTests extends AndroidTestCase {
// subtypes. The text is needed to implement Emoji Keyboard, see
// {@link KeyboardSwitcher#setEmojiKeyboard()}.
public void testSwitchToAlphaKeyLabel() {
+ final Context context = getContext();
final KeyboardTextsSet textsSet = new KeyboardTextsSet();
for (final InputMethodSubtype subtype : mAllSubtypesList) {
final Locale locale = SubtypeLocaleUtils.getSubtypeLocale(subtype);
- textsSet.setLocale(locale);
+ textsSet.setLocale(locale, context);
final String switchToAlphaKeyLabel = textsSet.getText(
KeyboardTextsSet.SWITCH_TO_ALPHA_KEY_LABEL);
assertNotNull("Switch to alpha key label of " + locale, switchToAlphaKeyLabel);
@@ -87,15 +86,7 @@ public final class KeyboardTextsSetTests extends AndroidTestCase {
final KeyboardTextsSet textsSet = new KeyboardTextsSet();
for (final InputMethodSubtype subtype : mAllSubtypesList) {
final Locale locale = SubtypeLocaleUtils.getSubtypeLocale(subtype);
- textsSet.setLocale(locale);
- final RunInLocale<Void> job = new RunInLocale<Void>() {
- @Override
- protected Void job(final Resources res) {
- textsSet.loadStringResources(context);
- return null;
- }
- };
- job.runInLocale(context.getResources(), locale);
+ textsSet.setLocale(locale, context);
for (final String name : TEXT_NAMES_FROM_RESOURCE) {
final String text = textsSet.getText(name);
assertNotNull(name + " of " + locale, text);
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
index 42a94f420..a1933076a 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
@@ -23,7 +23,6 @@ import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.MediumTest;
import com.android.inputmethod.latin.utils.CollectionUtils;
-import com.android.inputmethod.latin.utils.RunInLocale;
import java.lang.reflect.Field;
import java.util.ArrayList;
@@ -41,20 +40,16 @@ public class MoreKeySpecSplitTests extends InstrumentationTestCase {
final Instrumentation instrumentation = getInstrumentation();
final Context targetContext = instrumentation.getTargetContext();
- mTextsSet.setLocale(TEST_LOCALE);
- new RunInLocale<Void>() {
- @Override
- protected Void job(final Resources res) {
- mTextsSet.loadStringResources(targetContext);
- return null;
- }
- }.runInLocale(targetContext.getResources(), TEST_LOCALE);
+ mTextsSet.setLocale(TEST_LOCALE, targetContext);
final String[] testResourceNames = getAllResourceIdNames(
com.android.inputmethod.latin.tests.R.string.class);
- mTextsSet.loadStringResourcesInternal(instrumentation.getContext(), testResourceNames,
+ final Context testContext = instrumentation.getContext();
+ final Resources testRes = testContext.getResources();
+ final String testResPackageName = testRes.getResourcePackageName(
// This dummy raw resource is needed to be able to load string resources from a test
// APK successfully.
com.android.inputmethod.latin.tests.R.raw.dummy_resource_for_testing);
+ mTextsSet.loadStringResourcesInternal(testRes, testResourceNames, testResPackageName);
}
private static String[] getAllResourceIdNames(final Class<?> resourceIdClass) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java b/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
index 838f98768..b0493d3f1 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
@@ -72,7 +72,7 @@ public final class Arabic extends LayoutBase {
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
if (isPhone) {
// U+060C: "،" ARABIC COMMA
- return joinKeys(key("\u060C", joinMoreKeys(",", SETTINGS_KEY)));
+ return joinKeys(key("\u060C", SETTINGS_KEY));
}
return super.getKeysLeftToSpacebar(isPhone);
}
@@ -312,7 +312,7 @@ public final class Arabic extends LayoutBase {
// U+00BF: "¿" INVERTED QUESTION MARK
.replaceKeyOfLabel("?", key("\u061F", joinMoreKeys("?", "\u00BF")))
// U+060C: "،" ARABIC COMMA
- .replaceKeyOfLabel(",", key("\u060C", moreKey(",")))
+ .replaceKeyOfLabel(",", "\u060C")
// U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
// U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
.replaceKeyOfLabel("(", key("(", ")",
@@ -342,7 +342,7 @@ public final class Arabic extends LayoutBase {
// U+266A: "♪" EIGHTH NOTE
.setMoreKeysOf("\u2022", "\u266A")
// U+060C: "،" ARABIC COMMA
- .replaceKeyOfLabel(",", key("\u060C", moreKey(",")))
+ .replaceKeyOfLabel(",", "\u060C")
.build();
}
}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java b/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
new file mode 100644
index 000000000..204bb01f7
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+/**
+ * The Armenian Phonetic alphabet keyboard.
+ */
+public final class ArmenianPhonetic extends LayoutBase {
+ private static final String LAYOUT_NAME = "armenian_phonetic";
+
+ public ArmenianPhonetic(final LayoutCustomizer customizer) {
+ super(customizer, ArmenianSymbols.class, SymbolsShifted.class);
+ }
+
+ @Override
+ public String getName() { return LAYOUT_NAME; }
+
+ public static class ArmenianPhoneticCustomizer extends LayoutCustomizer {
+ public ArmenianPhoneticCustomizer(final Locale locale) { super(locale); }
+
+ @Override
+ public ExpectedKey getAlphabetKey() { return ARMENIAN_ALPHABET_KEY; }
+
+ @Override
+ public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+ if (isPhone) {
+ return EMPTY_KEYS;
+ }
+ // U+055C: "՜" ARMENIAN EXCLAMATION MARK
+ // U+00A1: "¡" INVERTED EXCLAMATION MARK
+ // U+055E: "՞" ARMENIAN QUESTION MARK
+ // U+00BF: "¿" INVERTED QUESTION MARK
+ return joinKeys(key("!", joinMoreKeys("\u055C", "\u00A1")),
+ key("?", joinMoreKeys("\u055E", "\u00BF")),
+ SHIFT_KEY);
+ }
+
+ @Override
+ public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
+ // U+0589: "։" ARMENIAN FULL STOP
+ // U+055D: "՝" ARMENIAN COMMA
+ final ExpectedKey fullStopKey = key("\u0589", getPunctuationMoreKeys(isPhone));
+ return isPhone ? joinKeys(fullStopKey) : joinKeys("\u055D", fullStopKey);
+ }
+
+ @Override
+ public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) {
+ return ARMENIAN_PUNCTUATION_MORE_KEYS;
+ }
+
+ // U+0531: "Ա" ARMENIAN CAPITAL LETTER AYB
+ // U+0532: "Բ" ARMENIAN CAPITAL LETTER BEN
+ // U+0533: "Գ" ARMENIAN CAPITAL LETTER GIM
+ private static final ExpectedKey ARMENIAN_ALPHABET_KEY = key(
+ "\u0531\u0532\u0533", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+
+ // U+055E: "՞" ARMENIAN QUESTION MARK
+ // U+055C: "՜" ARMENIAN EXCLAMATION MARK
+ // U+055A: "՚" ARMENIAN APOSTROPHE
+ // U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING
+ // U+055D: "՝" ARMENIAN COMMA
+ // U+055B: "՛" ARMENIAN EMPHASIS MARK
+ // U+058A: "֊" ARMENIAN HYPHEN
+ // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ // U+055F: "՟" ARMENIAN ABBREVIATION MARK
+ private static final ExpectedKey[] ARMENIAN_PUNCTUATION_MORE_KEYS = joinMoreKeys(
+ ",", "\u055E", "\u055C", ".", "\u055A", "\u0559", "?", "!",
+ "\u055D", "\u055B", "\u058A", "\u00BB", "\u00AB", "\u055F", ";", ":");
+ }
+
+ @Override
+ ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
+ final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
+ if (isPhone) {
+ // U+056D: "խ" ARMENIAN SMALL LETTER XEH
+ // U+0577: "շ" ARMENIAN SMALL LETTER SHA
+ builder.addKeysOnTheRightOfRow(3, "\u056D")
+ .addKeysOnTheRightOfRow(4, "\u0577");
+ } else {
+ // U+056D: "խ" ARMENIAN SMALL LETTER XEH
+ // U+0577: "շ" ARMENIAN SMALL LETTER SHA
+ builder.addKeysOnTheRightOfRow(2, "\u056D")
+ .addKeysOnTheRightOfRow(3, "\u0577");
+ }
+ return builder.build();
+ }
+
+ // Helper method to create alphabet layout by adding special function keys.
+ @Override
+ ExpectedKeyboardBuilder convertCommonLayoutToKeyboard(final ExpectedKeyboardBuilder builder,
+ final boolean isPhone) {
+ final LayoutCustomizer customizer = getCustomizer();
+ builder.setKeysOfRow(5, (Object[])customizer.getSpaceKeys(isPhone));
+ builder.addKeysOnTheLeftOfRow(5, (Object[])customizer.getKeysLeftToSpacebar(isPhone));
+ builder.addKeysOnTheRightOfRow(5, (Object[])customizer.getKeysRightToSpacebar(isPhone));
+ if (isPhone) {
+ builder.addKeysOnTheRightOfRow(4, DELETE_KEY)
+ .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey())
+ .addKeysOnTheRightOfRow(5, key(ENTER_KEY, EMOJI_KEY));
+ } else {
+ builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
+ .addKeysOnTheRightOfRow(3, ENTER_KEY)
+ .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey(), SETTINGS_KEY)
+ .addKeysOnTheRightOfRow(5, EMOJI_KEY);
+ }
+ builder.addKeysOnTheLeftOfRow(4, (Object[])customizer.getLeftShiftKeys(isPhone))
+ .addKeysOnTheRightOfRow(4, (Object[])customizer.getRightShiftKeys(isPhone));
+ return builder;
+ }
+
+ private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+ .setKeysOfRow(1,
+ // U+0567: "է" ARMENIAN SMALL LETTER EH
+ key("\u0567", moreKey("1")),
+ // U+0569: "թ" ARMENIAN SMALL LETTER TO
+ key("\u0569", moreKey("2")),
+ // U+0583: "փ" ARMENIAN SMALL LETTER PIWR
+ key("\u0583", moreKey("3")),
+ // U+0571: "ձ" ARMENIAN SMALL LETTER JA
+ key("\u0571", moreKey("4")),
+ // U+057B: "ջ" ARMENIAN SMALL LETTER JHEH
+ key("\u057B", moreKey("5")),
+ // U+0580: "ր" ARMENIAN SMALL LETTER REH
+ key("\u0580", moreKey("6")),
+ // U+0579: "չ" ARMENIAN SMALL LETTER CHA
+ key("\u0579", moreKey("7")),
+ // U+0573: "ճ" ARMENIAN SMALL LETTER CHEH
+ key("\u0573", moreKey("8")),
+ // U+056A: "ժ" ARMENIAN SMALL LETTER ZHE
+ key("\u056A", moreKey("9")),
+ // U+056E: "ծ" ARMENIAN SMALL LETTER CA
+ key("\u056E", moreKey("0")))
+ .setKeysOfRow(2,
+ // U+0584: "ք" ARMENIAN SMALL LETTER KEH
+ // U+0578: "ո" ARMENIAN SMALL LETTER VO
+ "\u0584", "\u0578",
+ // U+0565: "ե" ARMENIAN SMALL LETTER ECH
+ // U+0587: "և" ARMENIAN SMALL LIGATURE ECH YIWN
+ key("\u0565", moreKey("\u0587")),
+ // U+057C: "ռ" ARMENIAN SMALL LETTER RA
+ // U+057F: "տ" ARMENIAN SMALL LETTER TIWN
+ // U+0568: "ը" ARMENIAN SMALL LETTER ET
+ // U+0582: "ւ" ARMENIAN SMALL LETTER YIWN
+ // U+056B: "ի" ARMENIAN SMALL LETTER INI
+ // U+0585: "օ" ARMENIAN SMALL LETTER OH
+ // U+057A: "պ" ARMENIAN SMALL LETTER PEH
+ "\u057C", "\u057F", "\u0568", "\u0582", "\u056B", "\u0585", "\u057A")
+ .setKeysOfRow(3,
+ // U+0561: "ա" ARMENIAN SMALL LETTER AYB
+ // U+057D: "ս" ARMENIAN SMALL LETTER SEH
+ // U+0564: "դ" ARMENIAN SMALL LETTER DA
+ // U+0586: "ֆ" ARMENIAN SMALL LETTER FEH
+ // U+0563: "գ" ARMENIAN SMALL LETTER GIM
+ // U+0570: "հ" ARMENIAN SMALL LETTER HO
+ // U+0575: "յ" ARMENIAN SMALL LETTER YI
+ // U+056F: "կ" ARMENIAN SMALL LETTER KEN
+ // U+056C: "լ" ARMENIAN SMALL LETTER LIWN
+ "\u0561", "\u057D", "\u0564", "\u0586", "\u0563", "\u0570", "\u0575", "\u056F",
+ "\u056C")
+ .setKeysOfRow(4,
+ // U+0566: "զ" ARMENIAN SMALL LETTER ZA
+ // U+0572: "ղ" ARMENIAN SMALL LETTER GHAD
+ // U+0581: "ց" ARMENIAN SMALL LETTER CO
+ // U+057E: "վ" ARMENIAN SMALL LETTER VEW
+ // U+0562: "բ" ARMENIAN SMALL LETTER BEN
+ // U+0576: "ն" ARMENIAN SMALL LETTER NOW
+ // U+0574: "մ" ARMENIAN SMALL LETTER MEN
+ "\u0566", "\u0572", "\u0581", "\u057E", "\u0562", "\u0576", "\u0574")
+ .build();
+
+ private static final class ArmenianSymbols extends Symbols {
+ public ArmenianSymbols(final LayoutCustomizer customizer) { super(customizer); }
+
+ @Override
+ public ExpectedKey[][] getLayout(final boolean isPhone) {
+ final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(
+ super.getLayout(isPhone));
+ // U+055C: "՜" ARMENIAN EXCLAMATION MARK
+ // U+00A1: "¡" INVERTED EXCLAMATION MARK
+ // U+055E: "՞" ARMENIAN QUESTION MARK
+ // U+00BF: "¿" INVERTED QUESTION MARK
+ builder.setMoreKeysOf("!", "\u055C", "\u00A1")
+ .setMoreKeysOf("?", "\u055E", "\u00BF");
+ return builder.build();
+ }
+ }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java b/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java
index 6da817fd9..a0070891a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java
@@ -70,7 +70,7 @@ public final class Farsi extends LayoutBase {
public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
if (isPhone) {
// U+060C: "،" ARABIC COMMA
- return joinKeys(key("\u060C", joinMoreKeys(",", SETTINGS_KEY)));
+ return joinKeys(key("\u060C", SETTINGS_KEY));
}
return super.getKeysLeftToSpacebar(isPhone);
}
@@ -315,7 +315,7 @@ public final class Farsi extends LayoutBase {
// U+00BF: "¿" INVERTED QUESTION MARK
.replaceKeyOfLabel("?", key("\u061F", joinMoreKeys("?", "\u00BF")))
// U+060C: "،" ARABIC COMMA
- .replaceKeyOfLabel(",", key("\u060C", moreKey(",")))
+ .replaceKeyOfLabel(",", "\u060C")
// U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
// U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
.replaceKeyOfLabel("(", key("(", ")",
@@ -345,7 +345,7 @@ public final class Farsi extends LayoutBase {
// U+266A: "♪" EIGHTH NOTE
.setMoreKeysOf("\u2022", "\u266A")
// U+060C: "،" ARABIC COMMA
- .replaceKeyOfLabel(",", key("\u060C", moreKey(",")))
+ .replaceKeyOfLabel(",", "\u060C")
// U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
// U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
// U+2264: "≤" LESS-THAN OR EQUAL TO
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Hebrew.java b/tests/src/com/android/inputmethod/keyboard/layout/Hebrew.java
index 83446dee3..552f0d3d5 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Hebrew.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Hebrew.java
@@ -91,12 +91,12 @@ public final class Hebrew extends LayoutBase {
private static final ExpectedKey CURRENCY_NEW_SHEQEL = key("\u20AA",
Symbols.CURRENCY_GENERIC_MORE_KEYS);
private static final ExpectedKey[] RTL_PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
- ";", "/", key("(", ")"), key(")", "("), "#", "!", ",", "?",
- "&", "%", "+", "\"", "-", ":", "'", "@");
+ ",", "?", "!", "#", key(")", "("), key("(", ")"), "/", ";",
+ "'", "@", ":", "-", "\"", "+", "%", "&");
// Punctuation more keys for tablet form factor.
private static final ExpectedKey[] RTL_TABLET_PUNCTUATION_MORE_KEYS = joinKeys(
- ";", "/", key("(", ")"), key(")", "("), "#", "'", ",",
- "&", "%", "+", "\"", "-", ":", "@");
+ ",", "'", "#", key(")", "("), key("(", ")"), "/", ";",
+ "@", ":", "-", "\"", "+", "%", "&");
}
@Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java b/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
index d870931ac..09cc8f9ca 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
@@ -270,13 +270,12 @@ public abstract class LayoutBase extends AbstractLayoutBase {
// Punctuation more keys for phone form factor.
public static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
- ";", "/", "(", ")", "#", "!", ",", "?",
- "&", "%", "+", "\"", "-", ":", "'", "@");
-
+ ",", "?", "!", "#", ")", "(", "/", ";",
+ "'", "@", ":", "-", "\"", "+", "%", "&");
// Punctuation more keys for tablet form factor.
public static final ExpectedKey[] TABLET_PUNCTUATION_MORE_KEYS = joinKeys(
- ";", "/", "(", ")", "#", "'", ",",
- "&", "%", "+", "\"", "-", ":", "@");
+ ",", "'", "#", ")", "(", "/", ";",
+ "@", ":", "-", "\"", "+", "%", "&");
/**
* Helper method to create alphabet layout adding special function keys.
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/PcQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/PcQwerty.java
new file mode 100644
index 000000000..9da6dcc44
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/PcQwerty.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout;
+
+import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * The PC QWERTY alphabet keyboard.
+ */
+public final class PcQwerty extends LayoutBase {
+ private static final String LAYOUT_NAME = "pcqwerty";
+
+ public PcQwerty(final LayoutCustomizer customizer) {
+ super(customizer, Symbols.class, SymbolsShifted.class);
+ }
+
+ @Override
+ public String getName() { return LAYOUT_NAME; }
+
+ public static class PcQwertyCustomizer extends LayoutCustomizer {
+ public PcQwertyCustomizer(final Locale locale) { super(locale); }
+
+ @Override
+ public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
+ return joinKeys(SHIFT_KEY);
+ }
+
+ @Override
+ public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+ return joinKeys(SHIFT_KEY);
+ }
+
+ @Override
+ public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
+ return joinKeys(SETTINGS_KEY);
+ }
+
+ @Override
+ public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
+ return isPhone ? joinKeys(key(ENTER_KEY, EMOJI_KEY)) : joinKeys(EMOJI_KEY);
+ }
+ }
+
+ @Override
+ ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
+ final LayoutCustomizer customizer = getCustomizer();
+ final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
+ customizer.setAccentedLetters(builder);
+ builder.replaceKeyOfLabel(ROW1_1, key("`", moreKey("~")))
+ .replaceKeyOfLabel(ROW2_11, key("[", moreKey("{")))
+ .replaceKeyOfLabel(ROW2_12, key("]", moreKey("}")))
+ .replaceKeyOfLabel(ROW2_13, key("\\", moreKey("|")))
+ .replaceKeyOfLabel(ROW3_10, key(";", moreKey(":")))
+ .replaceKeyOfLabel(ROW3_11, key("'", joinMoreKeys(additionalMoreKey("\""),
+ customizer.getDoubleQuoteMoreKeys(),
+ customizer.getSingleQuoteMoreKeys())))
+ .setAdditionalMoreKeysPositionOf("'", 4)
+ .replaceKeyOfLabel(ROW4_8, key(",", moreKey("<")))
+ .replaceKeyOfLabel(ROW4_9, key(".", moreKey(">")))
+ // U+00BF: "¿" INVERTED QUESTION MARK
+ .replaceKeyOfLabel(ROW4_10, key("/", joinMoreKeys("?", "\u00BF")));
+ if (isPhone) {
+ // U+221E: "∞" INFINITY
+ // U+2260: "≠" NOT EQUAL TO
+ // U+2248: "≈" ALMOST EQUAL TO
+ builder.replaceKeyOfLabel(ROW1_13, key("=",
+ joinMoreKeys("\u221E", "\u2260", "\u2248", "+")));
+ } else {
+ // U+221E: "∞" INFINITY
+ // U+2260: "≠" NOT EQUAL TO
+ // U+2248: "≈" ALMOST EQUAL TO
+ builder.replaceKeyOfLabel(ROW1_13, key("=",
+ joinMoreKeys("+", "\u221E", "\u2260", "\u2248")));
+ }
+ return builder.build();
+ }
+
+ @Override
+ ExpectedKey[][] getCommonAlphabetShiftLayout(final boolean isPhone, final int elementId) {
+ final ExpectedKeyboardBuilder builder;
+ if (elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED
+ || elementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED) {
+ builder = new ExpectedKeyboardBuilder(getCommonAlphabetLayout(isPhone));
+ } else {
+ builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
+ final LayoutCustomizer customizer = getCustomizer();
+ customizer.setAccentedLetters(builder);
+ builder.setKeysOfRow(1,
+ "~",
+ // U+00A1: "¡" INVERTED EXCLAMATION MARK
+ key("!", moreKey("\u00A1")),
+ "@", "#",
+ customizer.getCurrencyKey(),
+ // U+2030: "‰" PER MILLE SIGN
+ key("%", moreKey("\u2030")),
+ "^", "&",
+ // U+2020: "†" DAGGER
+ // U+2021: "‡" DOUBLE DAGGER
+ // U+2605: "★" BLACK STAR
+ key("*", joinMoreKeys("\u2020", "\u2021", "\u2605")),
+ "(", ")", "_",
+ // U+00B1: "±" PLUS-MINUS SIGN
+ // U+00D7: "×" MULTIPLICATION SIGN
+ // U+00F7: "÷" DIVISION SIGN
+ // U+221A: "√" SQUARE ROOT
+ key("+", joinMoreKeys("\u00B1", "\u00D7", "\u00F7", "\u221A")))
+ .replaceKeyOfLabel(ROW2_11, key("{"))
+ .replaceKeyOfLabel(ROW2_12, key("}"))
+ .replaceKeyOfLabel(ROW2_13, key("|"))
+ .replaceKeyOfLabel(ROW3_10, key(":"))
+ .replaceKeyOfLabel(ROW3_11, key("\"", joinMoreKeys(
+ customizer.getDoubleQuoteMoreKeys(),
+ customizer.getSingleQuoteMoreKeys())))
+ // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ // U+2264: "≤" LESS-THAN OR EQUAL TO
+ // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ .replaceKeyOfLabel(ROW4_8, key("<", joinMoreKeys("\u2039", "\u2264", "\u00AB")))
+ // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ // U+2265: "≥" GREATER-THAN EQUAL TO
+ // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ .replaceKeyOfLabel(ROW4_9, key(">", joinMoreKeys("\u203A", "\u2265", "\u00BB")))
+ // U+00BF: "¿" INVERTED QUESTION MARK
+ .replaceKeyOfLabel(ROW4_10, key("?", moreKey("\u00BF")));
+ }
+ builder.toUpperCase(getLocale());
+ return builder.build();
+ }
+
+ // Helper method to create alphabet layout by adding special function keys.
+ @Override
+ ExpectedKeyboardBuilder convertCommonLayoutToKeyboard(final ExpectedKeyboardBuilder builder,
+ final boolean isPhone) {
+ final LayoutCustomizer customizer = getCustomizer();
+ builder.setKeysOfRow(5, (Object[])customizer.getSpaceKeys(isPhone));
+ builder.addKeysOnTheLeftOfRow(5, (Object[])customizer.getKeysLeftToSpacebar(isPhone));
+ builder.addKeysOnTheRightOfRow(5, (Object[])customizer.getKeysRightToSpacebar(isPhone));
+ if (isPhone) {
+ builder.addKeysOnTheRightOfRow(3, DELETE_KEY);
+ } else {
+ builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
+ .addKeysOnTheLeftOfRow(2, TAB_KEY)
+ .addKeysOnTheRightOfRow(3, ENTER_KEY);
+ }
+ builder.addKeysOnTheLeftOfRow(4, (Object[])customizer.getLeftShiftKeys(isPhone))
+ .addKeysOnTheRightOfRow(4, (Object[])customizer.getRightShiftKeys(isPhone));
+ return builder;
+ }
+
+ @Override
+ public ExpectedKey[][] getLayout(final boolean isPhone, final int elementId) {
+ if (elementId == KeyboardId.ELEMENT_SYMBOLS
+ || elementId == KeyboardId.ELEMENT_SYMBOLS_SHIFTED) {
+ return null;
+ }
+ return super.getLayout(isPhone, elementId);
+ }
+
+ private static final String ROW1_1 = "ROW1_1";
+ private static final String ROW1_13 = "ROW1_13";
+ private static final String ROW2_11 = "ROW2_11";
+ private static final String ROW2_12 = "ROW2_12";
+ private static final String ROW2_13 = "ROW2_13";
+ private static final String ROW3_10 = "ROW3_10";
+ private static final String ROW3_11 = "ROW3_11";
+ private static final String ROW4_8 = "ROW4_8";
+ private static final String ROW4_9 = "ROW4_9";
+ private static final String ROW4_10 = "ROW4_10";
+
+ private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+ .setKeysOfRow(1,
+ ROW1_1,
+ // U+00A1: "¡" INVERTED EXCLAMATION MARK
+ // U+00B9: "¹" SUPERSCRIPT ONE
+ // U+00BD: "½" VULGAR FRACTION ONE HALF
+ // U+2153: "⅓" VULGAR FRACTION ONE THIRD
+ // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
+ // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH
+ key("1", joinMoreKeys(
+ "!", "\u00A1", "\u00B9", "\u00BD", "\u2153", "\u00BC", "\u215B")),
+ // U+00B2: "²" SUPERSCRIPT TWO
+ // U+2154: "⅔" VULGAR FRACTION TWO THIRDS
+ key("2", joinMoreKeys("@", "\u00B2", "\u2154")),
+ // U+00B3: "³" SUPERSCRIPT THREE
+ // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
+ // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
+ key("3", joinMoreKeys("#", "\u00B3", "\u00BE", "\u215C")),
+ // U+2074: "⁴" SUPERSCRIPT FOUR
+ key("4", joinMoreKeys("$", "\u2074")),
+ // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
+ key("5", joinMoreKeys("%", "\u215D")),
+ key("6", moreKey("^")),
+ // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
+ key("7", joinMoreKeys("&", "\u215E")),
+ key("8", moreKey("*")),
+ key("9", moreKey("(")),
+ // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
+ // U+2205: "∅" EMPTY SET
+ key("0", joinMoreKeys(")", "\u207F", "\u2205")),
+ // U+2013: "–" EN DASH
+ // U+2014: "—" EM DASH
+ // U+00B7: "·" MIDDLE DOT
+ key("-", joinMoreKeys("_", "\u2013", "\u2014", "\u00B7")),
+ ROW1_13)
+ .setKeysOfRow(2, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p",
+ ROW2_11, ROW2_12, ROW2_13)
+ .setKeysOfRow(3, "a", "s", "d", "f", "g", "h", "j", "k", "l", ROW3_10, ROW3_11)
+ .setKeysOfRow(4, "z", "x", "c", "v", "b", "n", "m", ROW4_8, ROW4_9, ROW4_10)
+ .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java
index a13ec7529..6176f6a3e 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java
@@ -109,10 +109,14 @@ public abstract class AbstractLayoutBase {
// Icon ids.
private static final int ICON_DELETE = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_DELETE_KEY);
+ private static final int ICON_TAB = KeyboardIconsSet.getIconId(
+ KeyboardIconsSet.NAME_TAB_KEY);
private static final int ICON_SHORTCUT = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_SHORTCUT_KEY);
private static final int ICON_SETTINGS = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_SETTINGS_KEY);
+ private static final int ICON_LANGUAGE_SWITCH = KeyboardIconsSet.getIconId(
+ KeyboardIconsSet.NAME_LANGUAGE_SWITCH_KEY);
private static final int ICON_ENTER = KeyboardIconsSet.getIconId(
KeyboardIconsSet.NAME_ENTER_KEY);
private static final int ICON_EMOJI = KeyboardIconsSet.getIconId(
@@ -120,8 +124,11 @@ public abstract class AbstractLayoutBase {
// Functional keys.
public static final ExpectedKey DELETE_KEY = key(ICON_DELETE, Constants.CODE_DELETE);
+ public static final ExpectedKey TAB_KEY = key(ICON_TAB, Constants.CODE_TAB);
public static final ExpectedKey SHORTCUT_KEY = key(ICON_SHORTCUT, Constants.CODE_SHORTCUT);
public static final ExpectedKey SETTINGS_KEY = key(ICON_SETTINGS, Constants.CODE_SETTINGS);
+ public static final ExpectedKey LANGUAGE_SWITCH_KEY = key(
+ ICON_LANGUAGE_SWITCH, Constants.CODE_LANGUAGE_SWITCH);
public static final ExpectedKey ENTER_KEY = key(ICON_ENTER, Constants.CODE_ENTER);
public static final ExpectedKey EMOJI_KEY = key(ICON_EMOJI, Constants.CODE_EMOJI);
public static final ExpectedKey SPACE_KEY = key(
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/SpanishCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/SpanishCustomizer.java
index da4a83c73..8974ad6ec 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/SpanishCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/SpanishCustomizer.java
@@ -38,8 +38,8 @@ class SpanishCustomizer extends LayoutCustomizer {
private static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = AbstractLayoutBase.joinKeys(
// U+00A1: "¡" INVERTED EXCLAMATION MARK
// U+00BF: "¿" INVERTED QUESTION MARK
- "\u00A1", ";", "/", "(", ")", "#", "!", ",", "?",
- "\u00BF", "&", "%", "+", "\"", "-", ":", "'", "@");
+ ",", "?", "!", "#", ")", "(", "/", ";", "\u00A1",
+ "'", "@", ":", "-", "\"", "+", "%", "&", "\u00BF");
@Override
public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArmenianAMPhonetic.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArmenianAMPhonetic.java
new file mode 100644
index 000000000..327e9438f
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArmenianAMPhonetic.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout.tests;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.inputmethod.keyboard.layout.ArmenianPhonetic;
+import com.android.inputmethod.keyboard.layout.ArmenianPhonetic.ArmenianPhoneticCustomizer;
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+
+import java.util.Locale;
+
+/**
+ * hy_AM: Armenian (Armenia) Phonetic/armenian_phonetic
+ */
+@SmallTest
+public final class TestsArmenianAMPhonetic extends LayoutTestsBase {
+ private static final Locale LOCALE = new Locale("hy", "AM");
+ private static final LayoutBase LAYOUT = new ArmenianPhonetic(
+ new ArmenianPhoneticCustomizer(LOCALE));
+
+ @Override
+ LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCatalan.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCatalan.java
index 988eb81a3..151a0a627 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCatalan.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCatalan.java
@@ -48,12 +48,12 @@ public class TestsCatalan extends LayoutTestsBase {
// U+00B7: "·" MIDDLE DOT
private static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
- ";", "/", "(", ")", "#", "\u00B7", "!", ",", "?",
- "&", "%", "+", "\"", "-", ":", "'", "@");
+ ",", "?", "!", "\u00B7", "#", ")", "(", "/", ";",
+ "'", "@", ":", "-", "\"", "+", "%", "&");
private static final ExpectedKey[] TABLET_PUNCTUATION_MORE_KEYS = joinKeys(
- ";", "/", "(", ")", "#", "\u00B7", "'", ",",
- "&", "%", "+", "\"", "-", ":", "@");
+ ",", "'", "\u00B7", "#", ")", "(", "/", ";",
+ "@", ":", "-", "\"", "+", "%", "&");
@Override
public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguagePcQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguagePcQwerty.java
new file mode 100644
index 000000000..cd8d43ca8
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguagePcQwerty.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout.tests;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.PcQwerty;
+import com.android.inputmethod.keyboard.layout.PcQwerty.PcQwertyCustomizer;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * zz: Alphabet/pcqwerty
+ */
+@SmallTest
+public final class TestsNoLanguagePcQwerty extends LayoutTestsBase {
+ private static final Locale LOCALE = new Locale("zz");
+ private static final LayoutBase LAYOUT = new PcQwerty(new NoLanguagePcQwertyCustomizer(LOCALE));
+
+ @Override
+ LayoutBase getLayout() { return LAYOUT; }
+
+ private static class NoLanguagePcQwertyCustomizer extends PcQwertyCustomizer {
+ private final NoLanguageCustomizer mNoLanguageCustomizer;
+
+ public NoLanguagePcQwertyCustomizer(final Locale locale) {
+ super(locale);
+ mNoLanguageCustomizer = new NoLanguageCustomizer(locale);
+ }
+
+ @Override
+ public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+ return mNoLanguageCustomizer.setAccentedLetters(builder);
+ }
+ }
+}
diff --git a/tools/dicttool/Android.mk b/tools/dicttool/Android.mk
index 948c03b4f..0e9c14ee4 100644
--- a/tools/dicttool/Android.mk
+++ b/tools/dicttool/Android.mk
@@ -35,6 +35,7 @@ MAKEDICT_CORE_SOURCE_DIRECTORY := $(LATINIME_BASE_SOURCE_DIRECTORY)/latin/makedi
# a significant part of the dependencies are mocked in the compat/ directory, with empty or
# nearly-empty implementations, for parts that we don't use in Dicttool.
LATINIME_SRCS_FOR_DICTTOOL := \
+ event/Combiner.java \
event/Event.java \
latin/BinaryDictionary.java \
latin/DicTraverseSession.java \
diff --git a/java/src/com/android/inputmethod/event/EventDecoderSpec.java b/tools/dicttool/compat/com/android/inputmethod/event/CombinerChain.java
index 303b4b4c9..66ad60c74 100644
--- a/java/src/com/android/inputmethod/event/EventDecoderSpec.java
+++ b/tools/dicttool/compat/com/android/inputmethod/event/CombinerChain.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2014 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,11 +16,11 @@
package com.android.inputmethod.event;
-/**
- * Class describing a decoder chain. This will depend on the language and the input medium (soft
- * or hard keyboard for example).
- */
-public class EventDecoderSpec {
- public EventDecoderSpec() {
- }
+import com.android.inputmethod.latin.utils.CollectionUtils;
+
+import java.util.ArrayList;
+
+public class CombinerChain {
+ public CombinerChain(final Combiner... combinerList) {}
+ public void processEvent(final ArrayList<Event> previousEvents, final Event newEvent) {}
}
diff --git a/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml
index 4bbe343ce..dcff29a57 100644
--- a/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-ar/donottranslate-more-keys.xml
@@ -64,7 +64,6 @@
<string name="additional_more_keys_for_symbols_0">0,&#x066B;,&#x066C;</string>
<!-- U+060C: "،" ARABIC COMMA -->
<string name="keylabel_for_comma">&#x060C;</string>
- <string name="more_keys_for_comma">"\\,"</string>
<!-- U+0651: "ّ" ARABIC SHADDA -->
<string name="keyhintlabel_for_period">&#x0651;</string>
<string name="more_keys_for_period">!text/more_keys_for_arabic_diacritics</string>
@@ -85,7 +84,6 @@
<string name="keylabel_for_tablet_comma">"&#x060C;"</string>
<string name="keyhintlabel_for_tablet_comma">"&#x061F;"</string>
<string name="more_keys_for_tablet_comma">"!fixedColumnOrder!4,:,!,&#x061F;,&#x061B;,-,/,\",\'"</string>
- <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,\",\',#,-,:,!,&#x060C;,&#x061F;,@,&amp;,\\%,+,&#x061B;,/,(|),)|("</string>
<!-- U+266A: "♪" EIGHTH NOTE -->
<string name="more_keys_for_bullet">&#x266A;</string>
<!-- U+2605: "★" BLACK STAR
diff --git a/tools/make-keyboard-text/res/values-ca/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-ca/donottranslate-more-keys.xml
index 8865a6057..574be244e 100644
--- a/tools/make-keyboard-text/res/values-ca/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-ca/donottranslate-more-keys.xml
@@ -71,8 +71,8 @@
U+0142: "ł" LATIN SMALL LETTER L WITH STROKE -->
<string name="more_keys_for_l">l&#x00B7;l,&#x0142;</string>
<!-- U+00B7: "·" MIDDLE DOT -->
- <string name="more_keys_for_punctuation">"!fixedColumnOrder!9,;,/,(,),#,&#x00B7;,!,\\,,?,&amp;,\\%,+,\",-,:,',@"</string>
- <string name="more_keys_for_tablet_punctuation">"!fixedColumnOrder!8,;,/,(,),#,&#x00B7;,',\\,,&amp;,\\%,+,\",-,:,@"</string>
+ <string name="more_keys_for_punctuation">"!autoColumnOrder!9,\\,,?,!,&#x00B7;,#,),(,/,;,',@,:,-,\",+,\\%,&amp;"</string>
+ <string name="more_keys_for_tablet_punctuation">"!autoColumnOrder!8,\\,,',&#x00B7;,#,),(,/,;,@,:,-,\",+,\\%,&amp;"</string>
<!-- U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA -->
<string name="keylabel_for_spanish_row2_10">&#x00E7;</string>
</resources>
diff --git a/tools/make-keyboard-text/res/values-es/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-es/donottranslate-more-keys.xml
index 453d5c196..173750262 100644
--- a/tools/make-keyboard-text/res/values-es/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-es/donottranslate-more-keys.xml
@@ -69,5 +69,5 @@
<string name="more_keys_for_c">&#x00E7;,&#x0107;,&#x010D;</string>
<!-- U+00A1: "¡" INVERTED EXCLAMATION MARK
U+00BF: "¿" INVERTED QUESTION MARK -->
- <string name="more_keys_for_punctuation">"!fixedColumnOrder!9,&#x00A1;,;,/,(,),#,!,\\,,?,&#x00BF;,&amp;,\\%,+,\",-,:,',@"</string>
-</resources>
+ <string name="more_keys_for_punctuation">"!autoColumnOrder!9,\\,,?,!,#,),(,/,;,&#x00A1;,',@,:,-,\",+,\\%,&amp;,&#x00BF;"</string>
+ </resources>
diff --git a/tools/make-keyboard-text/res/values-fa/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-fa/donottranslate-more-keys.xml
index 56993be97..b886195b5 100644
--- a/tools/make-keyboard-text/res/values-fa/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-fa/donottranslate-more-keys.xml
@@ -64,7 +64,6 @@
<string name="additional_more_keys_for_symbols_0">0,&#x066B;,&#x066C;</string>
<!-- U+060C: "،" ARABIC COMMA -->
<string name="keylabel_for_comma">&#x060C;</string>
- <string name="more_keys_for_comma">"\\,"</string>
<!-- U+064B: "ً" ARABIC FATHATAN -->
<string name="keyhintlabel_for_period">&#x064B;</string>
<string name="more_keys_for_period">!text/more_keys_for_arabic_diacritics</string>
@@ -89,10 +88,6 @@
<string name="more_keys_for_tablet_comma">"!fixedColumnOrder!4,:,!,&#x061F;,&#x061B;,-,/,!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote"</string>
<!-- U+FDFC: "﷼" RIAL SIGN -->
<string name="keylabel_for_currency">&#xFDFC;</string>
- <!-- U+061F: "؟" ARABIC QUESTION MARK
- U+060C: "،" ARABIC COMMA
- U+061B: "؛" ARABIC SEMICOLON -->
- <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,\",\',#,-,:,!,&#x060C;,&#x061F;,@,&amp;,\\%,+,&#x061B;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis"</string>
<!-- U+266A: "♪" EIGHTH NOTE -->
<string name="more_keys_for_bullet">&#x266A;</string>
<!-- U+2605: "★" BLACK STAR
diff --git a/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml
index a17dc101d..8ab78d06d 100644
--- a/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml
@@ -23,20 +23,22 @@
U+0532: "Բ" ARMENIAN CAPITAL LETTER BEN
U+0533: "Գ" ARMENIAN CAPITAL LETTER GIM -->
<string name="label_to_alpha_key">&#x0531;&#x0532;&#x0533;</string>
- <!-- U+058A: "֊" ARMENIAN HYPHEN -->
- <!-- U+055C: "՜" ARMENIAN EXCLAMATION MARK -->
- <!-- U+055D: "՝" ARMENIAN COMMA -->
- <!-- U+055E: "՞" ARMENIAN QUESTION MARK -->
- <!-- U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING -->
- <!-- U+055A: "՚" ARMENIAN APOSTROPHE -->
- <!-- U+055B: "՛" ARMENIAN EMPHASIS MARK -->
- <!-- U+055F: "՟" ARMENIAN ABBREVIATION MARK -->
- <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,!,?,&#x0559;,&#x055A;,.,&#x055C;,\\,,&#x055E;,:,;,&#x055F;,&#x00AB;,&#x00BB;,&#x058A;,&#x055D;,&#x055B;"</string>
- <!-- U+055E: "՞" ARMENIAN QUESTION MARK -->
- <!-- U+00BF: "¿" INVERTED QUESTION MARK -->
+ <!-- U+055E: "՞" ARMENIAN QUESTION MARK
+ U+055C: "՜" ARMENIAN EXCLAMATION MARK
+ U+055A: "՚" ARMENIAN APOSTROPHE
+ U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING
+ U+055D: "՝" ARMENIAN COMMA
+ U+055B: "՛" ARMENIAN EMPHASIS MARK
+ U+058A: "֊" ARMENIAN HYPHEN
+ U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ U+055F: "՟" ARMENIAN ABBREVIATION MARK -->
+ <string name="more_keys_for_punctuation">"!autoColumnOrder!8,\\,,&#x055E;,&#x055C;,.,&#x055A;,&#x0559;,?,!,&#x055D;,&#x055B;,&#x058A;,&#x00BB;,&#x00AB;,&#x055F;,;,:"</string>
+ <!-- U+055E: "՞" ARMENIAN QUESTION MARK
+ U+00BF: "¿" INVERTED QUESTION MARK -->
<string name="more_keys_for_question">&#x055E;,&#x00BF;</string>
- <!-- U+055C: "՜" ARMENIAN EXCLAMATION MARK -->
- <!-- U+00A1: "¡" INVERTED EXCLAMATION MARK -->
+ <!-- U+055C: "՜" ARMENIAN EXCLAMATION MARK
+ U+00A1: "¡" INVERTED EXCLAMATION MARK -->
<string name="more_keys_for_exclamation">&#x055C;,&#x00A1;</string>
<!-- U+058F: "֏" ARMENIAN DRAM SIGN -->
<!-- TODO: Enable this when we have glyph for the following letter
diff --git a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
index 1ea301810..79f2c657e 100644
--- a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
@@ -82,8 +82,8 @@
<string name="more_keys_for_currency_dollar">&#x00A2;,&#x00A3;,&#x20AC;,&#x00A5;,&#x20B1;</string>
<string name="keylabel_for_currency">$</string>
<string name="more_keys_for_currency">$,&#x00A2;,&#x20AC;,&#x00A3;,&#x00A5;,&#x20B1;</string>
- <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,#,!,\\,,?,&amp;,\\%,+,\",-,:,',@"</string>
- <string name="more_keys_for_tablet_punctuation">"!fixedColumnOrder!7,;,/,!text/keyspec_left_parenthesis,!text/keyspec_right_parenthesis,#,',\\,,&amp;,\\%,+,\",-,:,@"</string>
+ <string name="more_keys_for_punctuation">"!autoColumnOrder!8,\\,,?,!,#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,',@,:,-,\",+,\\%,&amp;"</string>
+ <string name="more_keys_for_tablet_punctuation">"!autoColumnOrder!7,\\,,',#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,@,:,-,\",+,\\%,&amp;"</string>
<!-- U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE -->
<string name="keylabel_for_spanish_row2_10">&#x00F1;</string>
<!-- U+2020: "†" DAGGER
@@ -177,7 +177,6 @@
<string name="keyspec_right_single_angle_quote">&#x203A;</string>
<!-- Comma key -->
<string name="keylabel_for_comma">,</string>
- <string name="more_keys_for_comma"></string>
<string name="keylabel_for_tablet_comma">,</string>
<string name="keyhintlabel_for_tablet_comma"></string>
<string name="more_keys_for_tablet_comma"></string>