aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/res/values-es/donottranslate-more-keys.xml2
-rw-r--r--java/res/values/attrs.xml3
-rw-r--r--java/res/values/donottranslate-more-keys.xml4
-rw-r--r--java/res/values/donottranslate.xml16
-rw-r--r--java/res/values/keycodes.xml4
-rw-r--r--java/res/xml-sw600dp/key_styles_common.xml29
-rw-r--r--java/res/xml-sw768dp/key_styles_common.xml29
-rw-r--r--java/res/xml/key_f1.xml97
-rw-r--r--java/res/xml/key_navigation_tab.xml37
-rw-r--r--java/res/xml/key_styles_common.xml23
-rw-r--r--java/res/xml/key_styles_enter.xml (renamed from java/res/xml/key_styles_enter_phone.xml)69
-rw-r--r--java/res/xml/key_styles_enter_tablet.xml111
-rw-r--r--java/res/xml/key_symbols_f1.xml67
-rw-r--r--java/res/xml/row_qwerty4.xml58
-rw-r--r--java/res/xml/row_symbols4.xml67
-rw-r--r--java/res/xml/row_symbols_shift4.xml84
-rw-r--r--java/res/xml/rows_symbols.xml33
-rw-r--r--java/res/xml/rows_symbols_shift.xml27
-rw-r--r--java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java10
-rw-r--r--java/src/com/android/inputmethod/keyboard/Keyboard.java30
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardId.java34
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java8
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java101
-rw-r--r--java/src/com/android/inputmethod/latin/SettingsValues.java36
-rw-r--r--java/src/com/android/inputmethod/latin/XmlParseUtils.java3
25 files changed, 332 insertions, 650 deletions
diff --git a/java/res/values-es/donottranslate-more-keys.xml b/java/res/values-es/donottranslate-more-keys.xml
index 4833d6970..f56b1d54f 100644
--- a/java/res/values-es/donottranslate-more-keys.xml
+++ b/java/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!8,\",\',-,&#x00A1;,!,&#x00BF;,\\,,\?,\@,&amp;,+,;,:,/,(,)"</string>
+ <string name="more_keys_for_punctuation">"!fixedColumnOrder!7,#,-,&#x00A1;,!,&#x00BF;,\\,,\?,\\%,+,;,:,/,(,),\@,&amp;,\",\'"</string>
</resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index f91b0a3db..a5d590e04 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -355,7 +355,8 @@
<enum name="phone" value="4" />
<enum name="number" value="5" />
</attr>
- <attr name="navigateAction" format="boolean" />
+ <attr name="navigateNext" format="boolean" />
+ <attr name="navigatePrevious" format="boolean" />
<attr name="passwordInput" format="boolean" />
<attr name="clobberSettingsKey" format="boolean" />
<attr name="shortcutKeyEnabled" format="boolean" />
diff --git a/java/res/values/donottranslate-more-keys.xml b/java/res/values/donottranslate-more-keys.xml
index f1c2d2bfc..0581a6162 100644
--- a/java/res/values/donottranslate-more-keys.xml
+++ b/java/res/values/donottranslate-more-keys.xml
@@ -65,7 +65,7 @@
<string name="more_keys_for_currency_pound">&#x00A2;,$,&#x20AC;,&#x00A5;,&#x20B1;</string>
<string name="more_keys_for_currency_general">&#x00A2;,$,&#x20AC;,&#x00A3;,&#x00A5;,&#x20B1;</string>
<string name="more_keys_for_smiley">"!fixedColumnOrder!5,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ "</string>
- <string name="more_keys_for_punctuation">"!fixedColumnOrder!7,\",\',-,:,!,\\,,\?,\@,&amp;,+,;,/,(,)"</string>
+ <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,\",\',#,-,:,!,\\,,\?,\@,&amp;,\\%,+,;,/,(,)"</string>
<string name="keyhintlabel_for_punctuation"></string>
<string name="keylabel_for_popular_domain">".com"</string>
<!-- popular web domains for the locale - most popular, displayed on the keyboard -->
@@ -118,6 +118,8 @@
<string name="settings_as_more_key">\@icon/settingsKey|\@integer/key_settings</string>
<string name="keylabel_for_comma">,</string>
<string name="more_keys_for_comma"></string>
+ <string name="action_next_as_more_key">\@string/label_next_key|\@integer/key_action_next</string>
+ <string name="action_previous_as_more_key">\@string/label_previous_key|\@integer/key_action_previous</string>
<string name="keylabel_for_symbols_question">\?</string>
<string name="keylabel_for_symbols_semicolon">;</string>
<string name="keylabel_for_symbols_percent">%</string>
diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index 69d923a94..94da9462f 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -20,17 +20,17 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Symbols that are suggested between words -->
<string name="suggested_punctuations">!,?,\\,,:,;,\",(,),\',-,/,@,_</string>
- <!-- Symbols that should be swapped with a magic space -->
- <string name="magic_space_swapping_symbols">.,;:!?)]}\"</string>
- <!-- Symbols that should strip a magic space -->
- <string name="magic_space_stripping_symbols">"&#x0009;&#x0020;\n/_\'-"</string>
- <!-- Symbols that should convert magic spaces into real space -->
- <string name="magic_space_promoting_symbols">([*&amp;@{&lt;&gt;+=|</string>
+ <!-- Symbols that should be swapped with a weak space -->
+ <string name="weak_space_swapping_symbols">.,;:!?)]}\"</string>
+ <!-- Symbols that should strip a weak space -->
+ <string name="weak_space_stripping_symbols">"&#x0009;&#x0020;\n/_\'-"</string>
+ <!-- Symbols that should convert weak spaces into real space -->
+ <string name="weak_space_promoting_symbols">([*&amp;@{&lt;&gt;+=|</string>
<!-- Symbols that do NOT separate words -->
<string name="symbols_excluded_from_word_separators">\'-</string>
<!-- Word separator list is the union of all symbols except those that are not separators:
- magic_space_swapping_symbols | magic_space_stripping_symbols |
- magic_space_neutral_symbols \ symbols_excluded_from_word_separators -->
+ weak_space_swapping_symbols | weak_space_stripping_symbols
+ \ symbols_excluded_from_word_separators -->
<!-- Symbol characters list that should switch back to the main layout -->
<!-- U+2018: "‘" LEFT SINGLE QUOTATION MARK
U+2019: "’" RIGHT SINGLE QUOTATION MARK
diff --git a/java/res/values/keycodes.xml b/java/res/values/keycodes.xml
index c85c02263..7f9e4bda4 100644
--- a/java/res/values/keycodes.xml
+++ b/java/res/values/keycodes.xml
@@ -30,5 +30,7 @@
<integer name="key_settings">-5</integer>
<integer name="key_shortcut">-6</integer>
<integer name="key_action_enter">-7</integer>
- <integer name="key_unspecified">-9</integer>
+ <integer name="key_action_next">-8</integer>
+ <integer name="key_action_previous">-9</integer>
+ <integer name="key_unspecified">-10</integer>
</resources>
diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index bb75b1c82..2fa8b3812 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -73,7 +73,7 @@
latin:keyActionFlags="isRepeatable|noKeyPreview"
latin:backgroundType="functional" />
<include
- latin:keyboardLayout="@xml/key_styles_enter_tablet" />
+ latin:keyboardLayout="@xml/key_styles_enter" />
<key-style
latin:styleName="spaceKeyStyle"
latin:code="@integer/key_space"
@@ -102,12 +102,27 @@
latin:keyIcon="iconSettingsKey"
latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
latin:backgroundType="functional" />
- <key-style
- latin:styleName="tabKeyStyle"
- latin:code="@integer/key_tab"
- latin:keyIcon="iconTabKey"
- latin:keyIconPreview="iconPreviewTabKey"
- latin:backgroundType="functional" />
+ <switch>
+ <case
+ latin:keyboardSetElement="alphabetManualShifted|alphabetShiftLockShifted"
+ latin:navigatePrevious="true"
+ >
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_action_previous"
+ latin:keyIcon="iconTabKey"
+ latin:keyIconPreview="iconPreviewTabKey"
+ latin:backgroundType="functional" />
+ </case>
+ <default>
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyIcon="iconTabKey"
+ latin:keyIconPreview="iconPreviewTabKey"
+ latin:backgroundType="functional" />
+ </default>
+ </switch>
<key-style
latin:styleName="toSymbolKeyStyle"
latin:code="@integer/key_switch_alpha_symbol"
diff --git a/java/res/xml-sw768dp/key_styles_common.xml b/java/res/xml-sw768dp/key_styles_common.xml
index 9da0d1f1a..5c35f1cfb 100644
--- a/java/res/xml-sw768dp/key_styles_common.xml
+++ b/java/res/xml-sw768dp/key_styles_common.xml
@@ -72,7 +72,7 @@
latin:keyActionFlags="isRepeatable|noKeyPreview"
latin:backgroundType="functional" />
<include
- latin:keyboardLayout="@xml/key_styles_enter_tablet" />
+ latin:keyboardLayout="@xml/key_styles_enter" />
<key-style
latin:styleName="spaceKeyStyle"
latin:code="@integer/key_space"
@@ -101,12 +101,27 @@
latin:keyIcon="iconSettingsKey"
latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
latin:backgroundType="functional" />
- <key-style
- latin:styleName="tabKeyStyle"
- latin:code="@integer/key_tab"
- latin:keyLabel="@string/label_tab_key"
- latin:keyLabelFlags="fontNormal|preserveCase"
- latin:backgroundType="functional" />
+ <switch>
+ <case
+ latin:keyboardSetElement="alphabetManualShifted|alphabetShiftLockShifted"
+ latin:navigatePrevious="true"
+ >
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_action_previous"
+ latin:keyLabel="@string/label_tab_key"
+ latin:keyLabelFlags="fontNormal|preserveCase"
+ latin:backgroundType="functional" />
+ </case>
+ <default>
+ <key-style
+ latin:styleName="tabKeyStyle"
+ latin:code="@integer/key_tab"
+ latin:keyLabel="@string/label_tab_key"
+ latin:keyLabelFlags="fontNormal|preserveCase"
+ latin:backgroundType="functional" />
+ </default>
+ </switch>
<key-style
latin:styleName="toSymbolKeyStyle"
latin:code="@integer/key_switch_alpha_symbol"
diff --git a/java/res/xml/key_f1.xml b/java/res/xml/key_f1.xml
deleted file mode 100644
index 6068d258a..000000000
--- a/java/res/xml/key_f1.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
- xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
- <switch>
- <case
- latin:navigateAction="false"
- >
- <switch>
- <case
- latin:mode="url"
- >
- <Key
- latin:keyLabel="/"
- latin:keyStyle="f1PopupStyle" />
- </case>
- <case
- latin:mode="email"
- >
- <Key
- latin:keyLabel="\@"
- latin:keyStyle="f1PopupStyle" />
- </case>
- <case
- latin:hasShortcutKey="true"
- >
- <Key
- latin:keyStyle="shortcutKeyStyle" />
- </case>
- <!-- latin:hasShortcutKey="false" -->
- <default>
- <Key
- latin:keyLabel="@string/keylabel_for_comma"
- latin:keyLabelFlags="hasPopupHint"
- latin:additionalMoreKeys="@string/more_keys_for_comma"
- latin:keyStyle="f1PopupStyle" />
- </default>
- </switch>
- </case>
- <!-- TODO: Remove dedicated navigation tab key. -->
- <!-- navigateAction="true" -->
- <default>
- <switch>
- <case
- latin:mode="url"
- >
- <Key
- latin:keyLabel="/"
- latin:keyWidth="9.2%p"
- latin:keyStyle="f1PopupStyle" />
- </case>
- <case
- latin:mode="email"
- >
- <Key
- latin:keyLabel="\@"
- latin:keyWidth="9.2%p"
- latin:keyStyle="f1PopupStyle" />
- </case>
- <case
- latin:hasShortcutKey="true"
- >
- <Key
- latin:keyStyle="shortcutKeyStyle"
- latin:keyWidth="9.2%p" />
- </case>
- <!-- hasShortcutKey="false" -->
- <default>
- <Key
- latin:keyLabel="@string/keylabel_for_comma"
- latin:additionalMoreKeys="@string/more_keys_for_comma"
- latin:keyStyle="f1PopupStyle"
- latin:keyWidth="9.2%p" />
- </default>
- </switch>
- </default>
- </switch>
-</merge>
diff --git a/java/res/xml/key_navigation_tab.xml b/java/res/xml/key_navigation_tab.xml
deleted file mode 100644
index c77189fda..000000000
--- a/java/res/xml/key_navigation_tab.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2011, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
- xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
- <switch>
- <case
- latin:navigateAction="true"
- >
- <Key
- latin:keyStyle="tabKeyStyle"
- latin:keyWidth="9.2%p" />
- </case>
- <!-- hasSettingsKey="false" and navigateAction="false" -->
- <default>
- <!-- No key. -->
- </default>
- </switch>
-</merge>
diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index eabbdb399..f0ea8ce5a 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -27,13 +27,13 @@
latin:clobberSettingsKey="true"
>
<key-style
- latin:styleName="f1PopupStyle"
+ latin:styleName="f1MoreKeysStyle"
latin:backgroundType="functional" />
</case>
<!-- clobberSettingsKey="false" -->
<default>
<key-style
- latin:styleName="f1PopupStyle"
+ latin:styleName="f1MoreKeysStyle"
latin:keyLabelFlags="hasPopupHint"
latin:moreKeys="@string/settings_as_more_key"
latin:backgroundType="functional" />
@@ -77,7 +77,22 @@
latin:keyActionFlags="isRepeatable|noKeyPreview"
latin:backgroundType="functional" />
<include
- latin:keyboardLayout="@xml/key_styles_enter_phone" />
+ latin:keyboardLayout="@xml/key_styles_enter" />
+ <switch>
+ <!-- Smiley in textShortMessage field.
+ Overrides common enter key style. -->
+ <case
+ latin:mode="im"
+ >
+ <key-style
+ latin:styleName="enterKeyStyle"
+ latin:keyLabel=":-)"
+ latin:keyOutputText=":-) "
+ latin:keyLabelFlags="hasPopupHint"
+ latin:moreKeys="@string/more_keys_for_smiley"
+ latin:backgroundType="functional" />
+ </case>
+ </switch>
<key-style
latin:styleName="spaceKeyStyle"
latin:code="@integer/key_space"
@@ -91,7 +106,7 @@
latin:keyLabelFlags="preserveCase"
latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
latin:altCode="@integer/key_space"
- latin:parentStyle="f1PopupStyle" />
+ latin:parentStyle="f1MoreKeysStyle" />
<key-style
latin:styleName="settingsKeyStyle"
latin:code="@integer/key_settings"
diff --git a/java/res/xml/key_styles_enter_phone.xml b/java/res/xml/key_styles_enter.xml
index af34cb858..4c31c3e5b 100644
--- a/java/res/xml/key_styles_enter_phone.xml
+++ b/java/res/xml/key_styles_enter.xml
@@ -21,6 +21,60 @@
<merge
xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
>
+ <!-- Navigate more keys style -->
+ <switch>
+ <case
+ latin:imeAction="actionNext"
+ latin:navigatePrevious="true"
+ >
+ <key-style
+ latin:styleName="navigateMoreKeysStyle"
+ latin:keyLabelFlags="hasPopupHint|preserveCase"
+ latin:moreKeys="@string/action_previous_as_more_key" />
+ </case>
+ <case
+ latin:imeAction="actionPrevious"
+ latin:navigateNext="true"
+ >
+ <key-style
+ latin:styleName="navigateMoreKeysStyle"
+ latin:keyLabelFlags="hasPopupHint|preserveCase"
+ latin:moreKeys="@string/action_next_as_more_key" />
+ </case>
+ <!-- imeAction!="actionNext" and imeAction!="actionPrevious" -->
+ <case
+ latin:navigateNext="true"
+ latin:navigatePrevious="true"
+ >
+ <key-style
+ latin:styleName="navigateMoreKeysStyle"
+ latin:keyLabelFlags="hasPopupHint|preserveCase"
+ latin:moreKeys="!fixedColumnOrder!2,\@string/action_previous_as_more_key,\@string/action_next_as_more_key" />
+ </case>
+ <case
+ latin:navigateNext="true"
+ latin:navigatePrevious="false"
+ >
+ <key-style
+ latin:styleName="navigateMoreKeysStyle"
+ latin:keyLabelFlags="hasPopupHint|preserveCase"
+ latin:moreKeys="@string/action_next_as_more_key" />
+ </case>
+ <case
+ latin:navigateNext="false"
+ latin:navigatePrevious="true"
+ >
+ <key-style
+ latin:styleName="navigateMoreKeysStyle"
+ latin:keyLabelFlags="hasPopupHint|preserveCase"
+ latin:moreKeys="@string/action_previous_as_more_key" />
+ </case>
+ <!-- naviagteNext="false" and navigatePrevious="false" -->
+ <default>
+ <key-style
+ latin:styleName="navigateMoreKeysStyle" />
+ </default>
+ </switch>
<!-- Enter key style -->
<key-style
latin:styleName="defaultEnterKeyStyle"
@@ -28,7 +82,8 @@
latin:keyIcon="iconReturnKey"
latin:keyLabelFlags="autoXScale|preserveCase"
latin:keyActionFlags="noKeyPreview"
- latin:backgroundType="functional" />
+ latin:backgroundType="functional"
+ latin:parentStyle="navigateMoreKeysStyle" />
<key-style
latin:styleName="defaultActionKeyStyle"
latin:code="@integer/key_action_enter"
@@ -45,18 +100,6 @@
latin:styleName="enterKeyStyle"
latin:parentStyle="defaultEnterKeyStyle" />
</case>
- <!-- Smiley in textShortMessage field. -->
- <case
- latin:mode="im"
- >
- <key-style
- latin:styleName="enterKeyStyle"
- latin:keyLabel=":-)"
- latin:keyOutputText=":-) "
- latin:keyLabelFlags="hasPopupHint"
- latin:moreKeys="@string/more_keys_for_smiley"
- latin:backgroundType="functional" />
- </case>
<case
latin:imeAction="actionGo"
>
diff --git a/java/res/xml/key_styles_enter_tablet.xml b/java/res/xml/key_styles_enter_tablet.xml
deleted file mode 100644
index 702089181..000000000
--- a/java/res/xml/key_styles_enter_tablet.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
- xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
- <!-- Enter key style -->
- <key-style
- latin:styleName="defaultEnterKeyStyle"
- latin:code="@integer/key_enter"
- latin:keyIcon="iconReturnKey"
- latin:keyLabelFlags="autoXScale|preserveCase"
- latin:keyActionFlags="noKeyPreview"
- latin:backgroundType="functional" />
- <key-style
- latin:styleName="defaultActionKeyStyle"
- latin:code="@integer/key_action_enter"
- latin:keyIcon="iconUndefined"
- latin:backgroundType="action"
- latin:parentStyle="defaultEnterKeyStyle" />
- <switch>
- <!-- Shift + Enter in textMultiLine field. -->
- <case
- latin:isMultiLine="true"
- latin:keyboardSetElement="alphabetManualShifted|alphabetShiftLockShifted"
- >
- <key-style
- latin:styleName="enterKeyStyle"
- latin:parentStyle="defaultEnterKeyStyle" />
- </case>
- <case
- latin:imeAction="actionGo"
- >
- <key-style
- latin:styleName="enterKeyStyle"
- latin:keyLabel="@string/label_go_key"
- latin:parentStyle="defaultActionKeyStyle" />
- </case>
- <case
- latin:imeAction="actionNext"
- >
- <key-style
- latin:styleName="enterKeyStyle"
- latin:keyLabel="@string/label_next_key"
- latin:parentStyle="defaultActionKeyStyle" />
- </case>
- <case
- latin:imeAction="actionPrevious"
- >
- <key-style
- latin:styleName="enterKeyStyle"
- latin:keyLabel="@string/label_previous_key"
- latin:parentStyle="defaultActionKeyStyle" />
- </case>
- <case
- latin:imeAction="actionDone"
- >
- <key-style
- latin:styleName="enterKeyStyle"
- latin:keyLabel="@string/label_done_key"
- latin:parentStyle="defaultActionKeyStyle" />
- </case>
- <case
- latin:imeAction="actionSend"
- >
- <key-style
- latin:styleName="enterKeyStyle"
- latin:keyLabel="@string/label_send_key"
- latin:parentStyle="defaultActionKeyStyle" />
- </case>
- <case
- latin:imeAction="actionSearch"
- >
- <key-style
- latin:styleName="enterKeyStyle"
- latin:keyIcon="iconSearchKey"
- latin:parentStyle="defaultActionKeyStyle" />
- </case>
- <case
- latin:imeAction="actionCustomLabel"
- >
- <key-style
- latin:styleName="enterKeyStyle"
- latin:keyLabelFlags="fromCustomActionLabel"
- latin:parentStyle="defaultActionKeyStyle" />
- </case>
- <!-- imeAction is either actionNone or actionUnspecified. -->
- <default>
- <key-style
- latin:styleName="enterKeyStyle"
- latin:parentStyle="defaultEnterKeyStyle" />
- </default>
- </switch>
-</merge>
diff --git a/java/res/xml/key_symbols_f1.xml b/java/res/xml/key_symbols_f1.xml
deleted file mode 100644
index ac4031fcc..000000000
--- a/java/res/xml/key_symbols_f1.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
- xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
- <switch>
- <case
- latin:navigateAction="false"
- >
- <switch>
- <case
- latin:hasShortcutKey="true"
- >
- <Key
- latin:keyStyle="shortcutKeyStyle" />
- </case>
- <!-- latin:hasShortcutKey="false" -->
- <default>
- <Key
- latin:keyLabel="@string/keylabel_for_comma"
- latin:keyLabelFlags="hasPopupHint"
- latin:additionalMoreKeys="@string/more_keys_for_comma"
- latin:keyStyle="f1PopupStyle" />
- </default>
- </switch>
- </case>
- <!-- navigateAction="true" -->
- <default>
- <switch>
- <case
- latin:hasShortcutKey="true"
- >
- <Key
- latin:keyStyle="shortcutKeyStyle"
- latin:keyWidth="9.2%p" />
- </case>
- <!-- latin:hasShortcutKey="false" -->
- <default>
- <Key
- latin:keyLabel="@string/keylabel_for_comma"
- latin:keyLabelFlags="hasPopupHint"
- latin:additionalMoreKeys="@string/more_keys_for_comma"
- latin:keyStyle="f1PopupStyle"
- latin:keyWidth="9.2%p" />
- </default>
- </switch>
- </default>
- </switch>
-</merge>
diff --git a/java/res/xml/row_qwerty4.xml b/java/res/xml/row_qwerty4.xml
index 2f8b82c3a..df9c8fe3f 100644
--- a/java/res/xml/row_qwerty4.xml
+++ b/java/res/xml/row_qwerty4.xml
@@ -24,44 +24,46 @@
<Row
latin:keyWidth="10%p"
>
+ <Key
+ latin:keyStyle="toSymbolKeyStyle"
+ latin:keyWidth="15%p" />
<switch>
<case
- latin:navigateAction="false"
+ latin:mode="url"
>
<Key
- latin:keyStyle="toSymbolKeyStyle"
- latin:keyWidth="15%p" />
- <include
- latin:keyboardLayout="@xml/key_f1" />
- <Key
- latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="50%p" />
+ latin:keyLabel="/"
+ latin:keyStyle="f1MoreKeysStyle" />
+ </case>
+ <case
+ latin:mode="email"
+ >
<Key
- latin:keyStyle="punctuationKeyStyle" />
+ latin:keyLabel="\@"
+ latin:keyStyle="f1MoreKeysStyle" />
+ </case>
+ <case
+ latin:hasShortcutKey="true"
+ >
<Key
- latin:keyStyle="enterKeyStyle"
- latin:keyWidth="fillRight" />
+ latin:keyStyle="shortcutKeyStyle" />
</case>
- <!-- TODO: Remove dedicated navigation tab key. -->
- <!-- navigateAction="true" -->
+ <!-- latin:hasShortcutKey="false" -->
<default>
<Key
- latin:keyStyle="toSymbolKeyStyle"
- latin:keyWidth="13.75%p" />
- <include
- latin:keyboardLayout="@xml/key_navigation_tab" />
- <include
- latin:keyboardLayout="@xml/key_f1" />
- <Key
- latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="35.83%p" />
- <Key
- latin:keyStyle="punctuationKeyStyle"
- latin:keyWidth="9.2%p" />
- <Key
- latin:keyStyle="enterKeyStyle"
- latin:keyWidth="fillRight" />
+ latin:keyLabel="@string/keylabel_for_comma"
+ latin:keyLabelFlags="hasPopupHint"
+ latin:additionalMoreKeys="@string/more_keys_for_comma"
+ latin:keyStyle="f1MoreKeysStyle" />
</default>
</switch>
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="50%p" />
+ <Key
+ latin:keyStyle="punctuationKeyStyle" />
+ <Key
+ latin:keyStyle="enterKeyStyle"
+ latin:keyWidth="fillRight" />
</Row>
</merge>
diff --git a/java/res/xml/row_symbols4.xml b/java/res/xml/row_symbols4.xml
deleted file mode 100644
index ef77bc3cd..000000000
--- a/java/res/xml/row_symbols4.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
- xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
- <Row
- latin:keyWidth="10%p"
- >
- <switch>
- <case
- latin:navigateAction="false"
- >
- <Key
- latin:keyStyle="toAlphaKeyStyle"
- latin:keyWidth="15%p" />
- <include
- latin:keyboardLayout="@xml/key_symbols_f1" />
- <Key
- latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="50%p" />
- <Key
- latin:keyStyle="punctuationKeyStyle" />
- <Key
- latin:keyStyle="enterKeyStyle"
- latin:keyWidth="fillRight" />
- </case>
- <!-- TODO: Remove dedicated navigation tab key. -->
- <!-- navigateAction="true" -->
- <default>
- <Key
- latin:keyStyle="toAlphaKeyStyle"
- latin:keyWidth="13.75%p" />
- <include
- latin:keyboardLayout="@xml/key_navigation_tab" />
- <include
- latin:keyboardLayout="@xml/key_f1" />
- <Key
- latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="35.83%p" />
- <Key
- latin:keyStyle="punctuationKeyStyle"
- latin:keyWidth="9.2%p" />
- <Key
- latin:keyStyle="enterKeyStyle"
- latin:keyWidth="fillRight" />
- </default>
- </switch>
- </Row>
-</merge>
diff --git a/java/res/xml/row_symbols_shift4.xml b/java/res/xml/row_symbols_shift4.xml
deleted file mode 100644
index 632aafc74..000000000
--- a/java/res/xml/row_symbols_shift4.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
- xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
- <Row
- latin:keyWidth="10%p"
- >
- <switch>
- <case
- latin:navigateAction="false"
- >
- <Key
- latin:keyStyle="toAlphaKeyStyle"
- latin:keyWidth="15%p" />
- <!-- U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
- <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
- <!-- latin:keyLabelFlags="hasPopupHint" -->
- <!-- latin:moreKeys="&#x201F;" -->
- <!-- U+201E: "„" DOUBLE LOW-9 QUOTATION MARK -->
- <Key
- latin:keyLabel="&#x201E;"
- latin:backgroundType="functional" />
- <Key
- latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="50%p" />
- <!-- U+2026: "…" HORIZONTAL ELLIPSIS -->
- <Key
- latin:keyLabel="&#x2026;"
- latin:backgroundType="functional" />
- <Key
- latin:keyStyle="enterKeyStyle"
- latin:keyWidth="fillRight" />
- </case>
- <!-- TODO: Remove dedicated navigation tab key. -->
- <!-- navigateAction="true" -->
- <default>
- <Key
- latin:keyStyle="toAlphaKeyStyle"
- latin:keyWidth="13.75%p" />
- <include
- latin:keyboardLayout="@xml/key_navigation_tab" />
- <!-- U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
- <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
- <!-- latin:keyLabelFlags="hasPopupHint" -->
- <!-- latin:moreKeys="&#x201F;" -->
- <!-- U+201E: "„" DOUBLE LOW-9 QUOTATION MARK -->
- <Key
- latin:keyLabel="&#x201E;"
- latin:keyWidth="9.2%p"
- latin:backgroundType="functional" />
- <Key
- latin:keyStyle="spaceKeyStyle"
- latin:keyWidth="35.83%p" />
- <!-- U+2026: "…" HORIZONTAL ELLIPSIS -->
- <Key
- latin:keyLabel="&#x2026;"
- latin:keyWidth="9.2%p"
- latin:backgroundType="functional" />
- <Key
- latin:keyStyle="enterKeyStyle"
- latin:keyWidth="fillRight" />
- </default>
- </switch>
- </Row>
-</merge>
diff --git a/java/res/xml/rows_symbols.xml b/java/res/xml/rows_symbols.xml
index 27f75b564..21f7d1d27 100644
--- a/java/res/xml/rows_symbols.xml
+++ b/java/res/xml/rows_symbols.xml
@@ -128,6 +128,35 @@
latin:keyWidth="fillRight"
latin:visualInsetsLeft="1%p" />
</Row>
- <include
- latin:keyboardLayout="@xml/row_symbols4" />
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyWidth="15%p" />
+ <switch>
+ <case
+ latin:hasShortcutKey="true"
+ >
+ <Key
+ latin:keyStyle="shortcutKeyStyle" />
+ </case>
+ <!-- latin:hasShortcutKey="false" -->
+ <default>
+ <Key
+ latin:keyLabel="@string/keylabel_for_comma"
+ latin:keyLabelFlags="hasPopupHint"
+ latin:additionalMoreKeys="@string/more_keys_for_comma"
+ latin:keyStyle="f1MoreKeysStyle" />
+ </default>
+ </switch>
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="50%p" />
+ <Key
+ latin:keyStyle="punctuationKeyStyle" />
+ <Key
+ latin:keyStyle="enterKeyStyle"
+ latin:keyWidth="fillRight" />
+ </Row>
</merge>
diff --git a/java/res/xml/rows_symbols_shift.xml b/java/res/xml/rows_symbols_shift.xml
index 3fb821486..a7d0499e1 100644
--- a/java/res/xml/rows_symbols_shift.xml
+++ b/java/res/xml/rows_symbols_shift.xml
@@ -119,6 +119,29 @@
latin:keyWidth="fillRight"
latin:visualInsetsLeft="1%p" />
</Row>
- <include
- latin:keyboardLayout="@xml/row_symbols_shift4" />
+ <Row
+ latin:keyWidth="10%p"
+ >
+ <Key
+ latin:keyStyle="toAlphaKeyStyle"
+ latin:keyWidth="15%p" />
+ <!-- U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+ <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
+ <!-- latin:keyLabelFlags="hasPopupHint" -->
+ <!-- latin:moreKeys="&#x201F;" -->
+ <!-- U+201E: "„" DOUBLE LOW-9 QUOTATION MARK -->
+ <Key
+ latin:keyLabel="&#x201E;"
+ latin:backgroundType="functional" />
+ <Key
+ latin:keyStyle="spaceKeyStyle"
+ latin:keyWidth="50%p" />
+ <!-- U+2026: "…" HORIZONTAL ELLIPSIS -->
+ <Key
+ latin:keyLabel="&#x2026;"
+ latin:backgroundType="functional" />
+ <Key
+ latin:keyStyle="enterKeyStyle"
+ latin:keyWidth="fillRight" />
+ </Row>
</merge>
diff --git a/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java b/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java
index 3247997f6..938388d6c 100644
--- a/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java
@@ -39,30 +39,30 @@ public class EditorInfoCompatUtils {
private static final Integer OBJ_IME_ACTION_PREVIOUS = (Integer) CompatUtils
.getFieldValue(null, null, FIELD_IME_ACTION_PREVIOUS);
+ // EditorInfo.IME_FLAG_NAVIGATE_NEXT has been introduced since API#11 (Honeycomb).
public static boolean hasFlagNavigateNext(int imeOptions) {
if (OBJ_IME_FLAG_NAVIGATE_NEXT == null)
return false;
return (imeOptions & OBJ_IME_FLAG_NAVIGATE_NEXT) != 0;
}
+ // EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS has been introduced since API#11 (Honeycomb).
public static boolean hasFlagNavigatePrevious(int imeOptions) {
if (OBJ_IME_FLAG_NAVIGATE_PREVIOUS == null)
return false;
return (imeOptions & OBJ_IME_FLAG_NAVIGATE_PREVIOUS) != 0;
}
+ // EditorInfo.IME_FLAG_FORCE_ASCII has been introduced since API#16 (JellyBean).
public static boolean hasFlagForceAscii(int imeOptions) {
if (OBJ_IME_FLAG_FORCE_ASCII == null)
return false;
return (imeOptions & OBJ_IME_FLAG_FORCE_ASCII) != 0;
}
- public static void performEditorActionNext(InputConnection ic) {
- ic.performEditorAction(EditorInfo.IME_ACTION_NEXT);
- }
-
+ // EditorInfo.IME_ACTION_PREVIOUS has been introduced since API#11 (Honeycomb).
public static void performEditorActionPrevious(InputConnection ic) {
- if (OBJ_IME_ACTION_PREVIOUS == null)
+ if (OBJ_IME_ACTION_PREVIOUS == null || ic == null)
return;
ic.performEditorAction(OBJ_IME_ACTION_PREVIOUS);
}
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 60e506914..30ed59e18 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -99,8 +99,10 @@ public class Keyboard {
public static final int CODE_SETTINGS = -5;
public static final int CODE_SHORTCUT = -6;
public static final int CODE_ACTION_ENTER = -7;
+ public static final int CODE_ACTION_NEXT = -8;
+ public static final int CODE_ACTION_PREVIOUS = -9;
// Code value representing the code is not specified.
- public static final int CODE_UNSPECIFIED = -9;
+ public static final int CODE_UNSPECIFIED = -10;
public final KeyboardId mId;
public final int mThemeId;
@@ -381,6 +383,8 @@ public class Keyboard {
case CODE_SETTINGS: return "settings";
case CODE_SHORTCUT: return "shortcut";
case CODE_ACTION_ENTER: return "actionEnter";
+ case CODE_ACTION_NEXT: return "actionNext";
+ case CODE_ACTION_PREVIOUS: return "actionPrevious";
case CODE_UNSPECIFIED: return "unspec";
case CODE_TAB: return "tab";
case CODE_ENTER: return "enter";
@@ -1069,8 +1073,10 @@ public class Keyboard {
KeyboardId.elementIdToName(id.mElementId));
final boolean modeMatched = matchTypedValue(a,
R.styleable.Keyboard_Case_mode, id.mMode, KeyboardId.modeName(id.mMode));
- final boolean navigateActionMatched = matchBoolean(a,
- R.styleable.Keyboard_Case_navigateAction, id.navigateAction());
+ final boolean navigateNextMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_navigateNext, id.navigateNext());
+ final boolean navigatePreviousMatched = matchBoolean(a,
+ R.styleable.Keyboard_Case_navigatePrevious, id.navigatePrevious());
final boolean passwordInputMatched = matchBoolean(a,
R.styleable.Keyboard_Case_passwordInput, id.passwordInput());
final boolean clobberSettingsKeyMatched = matchBoolean(a,
@@ -1090,30 +1096,32 @@ public class Keyboard {
final boolean countryCodeMatched = matchString(a,
R.styleable.Keyboard_Case_countryCode, id.mLocale.getCountry());
final boolean selected = keyboardSetElementMatched && modeMatched
- && navigateActionMatched && passwordInputMatched
+ && navigateNextMatched && navigatePreviousMatched && passwordInputMatched
&& clobberSettingsKeyMatched && shortcutKeyEnabledMatched
&& hasShortcutKeyMatched && isMultiLineMatched && imeActionMatched
&& localeCodeMatched && languageCodeMatched && countryCodeMatched;
if (DEBUG) {
- startTag("<%s%s%s%s%s%s%s%s%s%s%s%s%s>%s", TAG_CASE,
+ startTag("<%s%s%s%s%s%s%s%s%s%s%s%s%s%s>%s", TAG_CASE,
textAttr(a.getString(R.styleable.Keyboard_Case_keyboardSetElement),
"keyboardSetElement"),
textAttr(a.getString(R.styleable.Keyboard_Case_mode), "mode"),
- booleanAttr(a, R.styleable.Keyboard_Case_navigateAction,
- "navigateAction"),
- booleanAttr(a, R.styleable.Keyboard_Case_passwordInput,
- "passwordInput"),
+ textAttr(a.getString(R.styleable.Keyboard_Case_imeAction),
+ "imeAction"),
+ booleanAttr(a, R.styleable.Keyboard_Case_navigateNext,
+ "navigateNext"),
+ booleanAttr(a, R.styleable.Keyboard_Case_navigatePrevious,
+ "navigatePrevious"),
booleanAttr(a, R.styleable.Keyboard_Case_clobberSettingsKey,
"clobberSettingsKey"),
+ booleanAttr(a, R.styleable.Keyboard_Case_passwordInput,
+ "passwordInput"),
booleanAttr(a, R.styleable.Keyboard_Case_shortcutKeyEnabled,
"shortcutKeyEnabled"),
booleanAttr(a, R.styleable.Keyboard_Case_hasShortcutKey,
"hasShortcutKey"),
booleanAttr(a, R.styleable.Keyboard_Case_isMultiLine,
"isMultiLine"),
- textAttr(a.getString(R.styleable.Keyboard_Case_imeAction),
- "imeAction"),
textAttr(a.getString(R.styleable.Keyboard_Case_localeCode),
"localeCode"),
textAttr(a.getString(R.styleable.Keyboard_Case_languageCode),
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
index a75caf262..ed4a89e0f 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -87,7 +87,6 @@ public class KeyboardId {
id.mElementId,
id.mMode,
id.mWidth,
- id.navigateAction(),
id.passwordInput(),
id.mClobberSettingsKey,
id.mShortcutKeyEnabled,
@@ -95,6 +94,8 @@ public class KeyboardId {
id.isMultiLine(),
id.imeAction(),
id.mCustomActionLabel,
+ id.navigateNext(),
+ id.navigatePrevious(),
id.mLocale
});
}
@@ -106,7 +107,6 @@ public class KeyboardId {
&& other.mElementId == this.mElementId
&& other.mMode == this.mMode
&& other.mWidth == this.mWidth
- && other.navigateAction() == this.navigateAction()
&& other.passwordInput() == this.passwordInput()
&& other.mClobberSettingsKey == this.mClobberSettingsKey
&& other.mShortcutKeyEnabled == this.mShortcutKeyEnabled
@@ -114,6 +114,8 @@ public class KeyboardId {
&& other.isMultiLine() == this.isMultiLine()
&& other.imeAction() == this.imeAction()
&& TextUtils.equals(other.mCustomActionLabel, this.mCustomActionLabel)
+ && other.navigateNext() == this.navigateNext()
+ && other.navigatePrevious() == this.navigatePrevious()
&& other.mLocale.equals(this.mLocale);
}
@@ -146,12 +148,12 @@ public class KeyboardId {
return mElementId == ELEMENT_PHONE_SYMBOLS;
}
- public boolean navigateAction() {
- // Note: Turn off checking navigation flag to show TAB key for now.
- boolean navigateAction = InputTypeCompatUtils.isWebInputType(mEditorInfo.inputType);
-// || EditorInfoCompatUtils.hasFlagNavigateNext(mImeOptions)
-// || EditorInfoCompatUtils.hasFlagNavigatePrevious(mImeOptions);
- return navigateAction;
+ public boolean navigateNext() {
+ return EditorInfoCompatUtils.hasFlagNavigateNext(mEditorInfo.imeOptions);
+ }
+
+ public boolean navigatePrevious() {
+ return EditorInfoCompatUtils.hasFlagNavigatePrevious(mEditorInfo.imeOptions);
}
public boolean passwordInput() {
@@ -165,15 +167,21 @@ public class KeyboardId {
}
public int imeAction() {
+ final int actionId = mEditorInfo.imeOptions & EditorInfo.IME_MASK_ACTION;
if ((mEditorInfo.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
return EditorInfo.IME_ACTION_NONE;
} else if (mEditorInfo.actionLabel != null) {
return IME_ACTION_CUSTOM_LABEL;
} else {
- return mEditorInfo.imeOptions & EditorInfo.IME_MASK_ACTION;
+ return actionId;
}
}
+ public int imeActionId() {
+ final int actionId = imeAction();
+ return actionId == IME_ACTION_CUSTOM_LABEL ? mEditorInfo.actionId : actionId;
+ }
+
@Override
public boolean equals(Object other) {
return other instanceof KeyboardId && equals((KeyboardId) other);
@@ -186,17 +194,19 @@ public class KeyboardId {
@Override
public String toString() {
- return String.format("[%s %s %s%d %s %s %s%s%s%s%s]",
+ return String.format("[%s %s %s%d %s %s %s%s%s%s%s%s%s]",
elementIdToName(mElementId),
mLocale,
(mOrientation == 1 ? "port" : "land"), mWidth,
modeName(mMode),
imeAction(),
+ (navigateNext() ? "navigateNext" : ""),
+ (navigatePrevious() ? "navigatePrevious" : ""),
(mClobberSettingsKey ? " clobberSettingsKey" : ""),
- (navigateAction() ? " navigateAction" : ""),
(passwordInput() ? " passwordInput" : ""),
(mShortcutKeyEnabled ? " shortcutKeyEnabled" : ""),
- (mHasShortcutKey ? " hasShortcutKey" : "")
+ (mHasShortcutKey ? " hasShortcutKey" : ""),
+ (isMultiLine() ? "isMultiLine" : "")
);
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
index 12a9c51f2..9e5c227eb 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
@@ -163,10 +163,10 @@ public class KeyStyles {
if (DEBUG) {
Log.d(TAG, String.format("<%s styleName=%s />",
Keyboard.Builder.TAG_KEY_STYLE, styleName));
- }
- if (mStyles.containsKey(styleName)) {
- throw new XmlParseUtils.ParseException(
- "duplicate key style declared: " + styleName, parser);
+ if (mStyles.containsKey(styleName)) {
+ Log.d(TAG, "key-style " + styleName + " is overridden at "
+ + parser.getPositionDescription());
+ }
}
final DeclaredKeyStyle style = new DeclaredKeyStyle();
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index ce306eaad..a208a8748 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -165,8 +165,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// Double space: the state where the user pressed space twice quickly, which LatinIME
// resolved as period-space. Undoing this converts the period to a space.
private static final int SPACE_STATE_DOUBLE = 1;
- // Swap punctuation: the state where a (weak or magic) space and a punctuation from the
- // suggestion strip have just been swapped. Undoing this swaps them back.
+ // Swap punctuation: the state where a weak space and a punctuation from the suggestion strip
+ // have just been swapped. Undoing this swaps them back; the space is still considered weak.
private static final int SPACE_STATE_SWAP_PUNCTUATION = 2;
// Weak space: a space that should be swapped only by suggestion strip punctuation. Weak
// spaces happen when the user presses space, accepting the current suggestion (whether
@@ -887,26 +887,16 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
// the second one - the first call successfully avoids this test, but the second one
// enters. For the moment we rely on noComposingSpan to further reduce the impact.
+ // TODO: the following is probably better done in resetEntireInputState().
+ // it should only happen when the cursor moved, and the very purpose of the
+ // test below is to narrow down whether this happened or not. Likewise with
+ // the call to postUpdateShiftState.
// We set this to NONE because after a cursor move, we don't want the space
// state-related special processing to kick in.
mSpaceState = SPACE_STATE_NONE;
- if (((mWordComposer.isComposingWord())
- || mVoiceProxy.isVoiceInputHighlighted())
- && (selectionChanged || noComposingSpan)) {
- resetComposingState(true /* alsoResetLastComposedWord */);
- updateSuggestions();
- final InputConnection ic = getCurrentInputConnection();
- if (ic != null) {
- ic.finishComposingText();
- }
- mComposingStateManager.onFinishComposingText();
- mVoiceProxy.setVoiceInputHighlighted(false);
- } else if (!mWordComposer.isComposingWord()) {
- // TODO: is the following reset still needed, given that we are not composing
- // a word?
- resetComposingState(true /* alsoResetLastComposedWord */);
- updateSuggestions();
+ if ((!mWordComposer.isComposingWord()) || selectionChanged || noComposingSpan) {
+ resetEntireInputState();
}
mHandler.postUpdateShiftState();
@@ -1116,6 +1106,20 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
return super.onKeyUp(keyCode, event);
}
+ // This will reset the whole input state to the starting state. It will clear
+ // the composing word, reset the last composed word, tell the inputconnection
+ // and the composingStateManager about it.
+ private void resetEntireInputState() {
+ resetComposingState(true /* alsoResetLastComposedWord */);
+ updateSuggestions();
+ final InputConnection ic = getCurrentInputConnection();
+ if (ic != null) {
+ ic.finishComposingText();
+ }
+ mComposingStateManager.onFinishComposingText();
+ mVoiceProxy.setVoiceInputHighlighted(false);
+ }
+
private void resetComposingState(final boolean alsoResetLastComposedWord) {
mWordComposer.reset();
if (alsoResetLastComposedWord)
@@ -1242,11 +1246,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
KeyboardActionListener.SUGGESTION_STRIP_COORDINATE);
}
- private static int getEditorActionId(EditorInfo editorInfo) {
- if (editorInfo == null) return 0;
- return (editorInfo.actionLabel != null)
- ? editorInfo.actionId
- : (editorInfo.imeOptions & EditorInfo.IME_MASK_ACTION);
+ private static int getActionId(Keyboard keyboard) {
+ return keyboard != null ? keyboard.mId.imeActionId() : EditorInfo.IME_ACTION_NONE;
}
private void performeEditorAction(int actionId) {
@@ -1312,18 +1313,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mSubtypeSwitcher.switchToShortcutIME();
break;
case Keyboard.CODE_ACTION_ENTER:
- performeEditorAction(getEditorActionId(getCurrentInputEditorInfo()));
+ performeEditorAction(getActionId(switcher.getKeyboard()));
+ break;
+ case Keyboard.CODE_ACTION_NEXT:
+ performeEditorAction(EditorInfo.IME_ACTION_NEXT);
break;
- case Keyboard.CODE_TAB:
- handleTab();
- // There are two cases for tab. Either we send a "next" event, that may change the
- // focus but will never move the cursor. Or, we send a real tab keycode, which some
- // applications may accept or ignore, and we don't know whether this will move the
- // cursor or not. So actually, we don't really know.
- // So to go with the safer option, we'd rather behave as if the user moved the
- // cursor when they didn't than the opposite. We also expect that most applications
- // will actually use tab only for focus movement.
- // To sum it up: do not update mExpectingUpdateSelection here.
+ case Keyboard.CODE_ACTION_PREVIOUS:
+ EditorInfoCompatUtils.performEditorActionPrevious(getCurrentInputConnection());
break;
default:
mSpaceState = SPACE_STATE_NONE;
@@ -1490,30 +1486,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
}
}
- // TODO: Implement next and previous actions using other key code than tab's code.
- private void handleTab() {
- final int imeOptions = getCurrentInputEditorInfo().imeOptions;
- if (!EditorInfoCompatUtils.hasFlagNavigateNext(imeOptions)
- && !EditorInfoCompatUtils.hasFlagNavigatePrevious(imeOptions)) {
- // TODO: This should be {@link #sendKeyCodePoint(int)}.
- sendDownUpKeyEvents(KeyEvent.KEYCODE_TAB);
- return;
- }
-
- final InputConnection ic = getCurrentInputConnection();
- if (ic == null)
- return;
-
- final Keyboard keyboard = mKeyboardSwitcher.getKeyboard();
- // True if keyboard is in either shift chording or manual shifted state.
- final boolean isManualShifted = (keyboard != null && keyboard.isManualShifted());
- if (EditorInfoCompatUtils.hasFlagNavigateNext(imeOptions) && !isManualShifted) {
- EditorInfoCompatUtils.performEditorActionNext(ic);
- } else if (EditorInfoCompatUtils.hasFlagNavigatePrevious(imeOptions) && isManualShifted) {
- EditorInfoCompatUtils.performEditorActionPrevious(ic);
- }
- }
-
// ic may be null
private boolean maybeStripSpaceWhileInBatchEdit(final InputConnection ic, final int code,
final int spaceState, final boolean isFromSuggestionStrip) {
@@ -1523,10 +1495,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} else if ((SPACE_STATE_WEAK == spaceState
|| SPACE_STATE_SWAP_PUNCTUATION == spaceState)
&& isFromSuggestionStrip) {
- if (mSettingsValues.isMagicSpaceSwapper(code)) {
+ if (mSettingsValues.isWeakSpaceSwapper(code)) {
return true;
} else {
- if (mSettingsValues.isMagicSpaceStripper(code)) {
+ if (mSettingsValues.isWeakSpaceStripper(code)) {
removeTrailingSpaceWhileInBatchEdit(ic);
}
return false;
@@ -1599,6 +1571,15 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
swapSwapperAndSpaceWhileInBatchEdit(ic);
mSpaceState = SPACE_STATE_WEAK;
}
+ // Some characters are not word separators, yet they don't start a new
+ // composing span. For these, we haven't changed the suggestion strip, and
+ // if the "add to dictionary" hint is shown, we should do so now. Examples of
+ // such characters include single quote, dollar, and others; the exact list is
+ // the list of characters for which we enter handleCharacterWhileInBatchEdit
+ // that don't match the test if ((isAlphabet...)) at the top of this method.
+ if (null != mSuggestionsView && mSuggestionsView.dismissAddToDictionaryHint()) {
+ mHandler.postUpdateBigramPredictions();
+ }
}
Utils.Stats.onNonSeparator((char)primaryCode, x, y);
}
diff --git a/java/src/com/android/inputmethod/latin/SettingsValues.java b/java/src/com/android/inputmethod/latin/SettingsValues.java
index 7a43cb827..d123b608f 100644
--- a/java/src/com/android/inputmethod/latin/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/SettingsValues.java
@@ -35,8 +35,8 @@ public class SettingsValues {
// From resources:
public final int mDelayUpdateOldSuggestions;
- public final String mMagicSpaceStrippers;
- public final String mMagicSpaceSwappers;
+ public final String mWeakSpaceStrippers;
+ public final String mWeakSpaceSwappers;
private final String mSuggestPuncs;
public final SuggestedWords mSuggestPuncList;
public final SuggestedWords mSuggestPuncOutputTextList;
@@ -89,14 +89,14 @@ public class SettingsValues {
// Get the resources
mDelayUpdateOldSuggestions = res.getInteger(R.integer.config_delay_update_old_suggestions);
- mMagicSpaceStrippers = res.getString(R.string.magic_space_stripping_symbols);
- mMagicSpaceSwappers = res.getString(R.string.magic_space_swapping_symbols);
+ mWeakSpaceStrippers = res.getString(R.string.weak_space_stripping_symbols);
+ mWeakSpaceSwappers = res.getString(R.string.weak_space_swapping_symbols);
if (LatinImeLogger.sDBG) {
- final int length = mMagicSpaceStrippers.length();
- for (int i = 0; i < length; i = mMagicSpaceStrippers.offsetByCodePoints(i, 1)) {
- if (isMagicSpaceSwapper(mMagicSpaceStrippers.codePointAt(i))) {
- throw new RuntimeException("Char code " + mMagicSpaceStrippers.codePointAt(i)
- + " is both a magic space swapper and stripper.");
+ final int length = mWeakSpaceStrippers.length();
+ for (int i = 0; i < length; i = mWeakSpaceStrippers.offsetByCodePoints(i, 1)) {
+ if (isWeakSpaceSwapper(mWeakSpaceStrippers.codePointAt(i))) {
+ throw new RuntimeException("Char code " + mWeakSpaceStrippers.codePointAt(i)
+ + " is both a weak space swapper and stripper.");
}
}
}
@@ -107,7 +107,7 @@ public class SettingsValues {
mSuggestPuncOutputTextList = createSuggestPuncOutputTextList(suggestPuncsSpec);
mSymbolsExcludedFromWordSeparators =
res.getString(R.string.symbols_excluded_from_word_separators);
- mWordSeparators = createWordSeparators(mMagicSpaceStrippers, mMagicSpaceSwappers,
+ mWordSeparators = createWordSeparators(mWeakSpaceStrippers, mWeakSpaceSwappers,
mSymbolsExcludedFromWordSeparators, res);
mHintToSaveText = context.getText(R.string.hint_add_to_dictionary);
@@ -188,11 +188,11 @@ public class SettingsValues {
return builder.setIsPunctuationSuggestions().build();
}
- private static String createWordSeparators(final String magicSpaceStrippers,
- final String magicSpaceSwappers, final String symbolsExcludedFromWordSeparators,
+ private static String createWordSeparators(final String weakSpaceStrippers,
+ final String weakSpaceSwappers, final String symbolsExcludedFromWordSeparators,
final Resources res) {
- String wordSeparators = magicSpaceStrippers + magicSpaceSwappers
- + res.getString(R.string.magic_space_promoting_symbols);
+ String wordSeparators = weakSpaceStrippers + weakSpaceSwappers
+ + res.getString(R.string.weak_space_promoting_symbols);
for (int i = symbolsExcludedFromWordSeparators.length() - 1; i >= 0; --i) {
wordSeparators = wordSeparators.replace(
symbolsExcludedFromWordSeparators.substring(i, i + 1), "");
@@ -215,14 +215,14 @@ public class SettingsValues {
return mSymbolsExcludedFromWordSeparators.contains(String.valueOf((char)code));
}
- public boolean isMagicSpaceStripper(int code) {
+ public boolean isWeakSpaceStripper(int code) {
// TODO: this does not work if the code does not fit in a char
- return mMagicSpaceStrippers.contains(String.valueOf((char)code));
+ return mWeakSpaceStrippers.contains(String.valueOf((char)code));
}
- public boolean isMagicSpaceSwapper(int code) {
+ public boolean isWeakSpaceSwapper(int code) {
// TODO: this does not work if the code does not fit in a char
- return mMagicSpaceSwappers.contains(String.valueOf((char)code));
+ return mWeakSpaceSwappers.contains(String.valueOf((char)code));
}
private static boolean isAutoCorrectEnabled(final Resources resources,
diff --git a/java/src/com/android/inputmethod/latin/XmlParseUtils.java b/java/src/com/android/inputmethod/latin/XmlParseUtils.java
index d747a024c..e14c71cb5 100644
--- a/java/src/com/android/inputmethod/latin/XmlParseUtils.java
+++ b/java/src/com/android/inputmethod/latin/XmlParseUtils.java
@@ -27,8 +27,7 @@ public class XmlParseUtils {
@SuppressWarnings("serial")
public static class ParseException extends XmlPullParserException {
public ParseException(String msg, XmlPullParser parser) {
- super(msg + " at line " + parser.getLineNumber()
- + ", column " + parser.getColumnNumber());
+ super(msg + " at " + parser.getPositionDescription());
}
}