Add next/prev navigate action more keys and remove tab key

Bug: 6037537
Bug: 5961814
Change-Id: I9c6dedf953452a180fcd5bce7bfadfd3c821f224
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index f91b0a3..a5d590e 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 f1c2d2b..02fd200 100644
--- a/java/res/values/donottranslate-more-keys.xml
+++ b/java/res/values/donottranslate-more-keys.xml
@@ -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/keycodes.xml b/java/res/values/keycodes.xml
index c85c022..7f9e4bd 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 bb75b1c..2fa8b38 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 9da0d1f..5c35f1c 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 6068d25..0000000
--- 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 c77189f..0000000
--- 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 eabbdb3..f0ea8ce 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
similarity index 64%
rename from java/res/xml/key_styles_enter_phone.xml
rename to java/res/xml/key_styles_enter.xml
index af34cb8..4c31c3e 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 7020891..0000000
--- 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 ac4031f..0000000
--- 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 2f8b82c..df9c8fe 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" />
-                <Key
-                    latin:keyStyle="punctuationKeyStyle" />
-                <Key
-                    latin:keyStyle="enterKeyStyle"
-                    latin:keyWidth="fillRight" />
+                    latin:keyLabel="/"
+                    latin:keyStyle="f1MoreKeysStyle" />
             </case>
-            <!-- TODO: Remove dedicated navigation tab key. -->
-            <!-- navigateAction="true" -->
+            <case
+                latin:mode="email"
+            >
+                <Key
+                    latin:keyLabel="\@"
+                    latin:keyStyle="f1MoreKeysStyle" />
+            </case>
+            <case
+                latin:hasShortcutKey="true"
+            >
+                <Key
+                    latin:keyStyle="shortcutKeyStyle" />
+            </case>
+            <!-- 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 ef77bc3..0000000
--- 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 632aafc..0000000
--- 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 27f75b5..21f7d1d 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 3fb8214..a7d0499 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 3247997..938388d 100644
--- a/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/EditorInfoCompatUtils.java
@@ -39,30 +39,30 @@
     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 60e5069..30ed59e 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -99,8 +99,10 @@
     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 @@
         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 @@
                         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 @@
                 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 a75caf2..ed4a89e 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -87,7 +87,6 @@
                 id.mElementId,
                 id.mMode,
                 id.mWidth,
-                id.navigateAction(),
                 id.passwordInput(),
                 id.mClobberSettingsKey,
                 id.mShortcutKeyEnabled,
@@ -95,6 +94,8 @@
                 id.isMultiLine(),
                 id.imeAction(),
                 id.mCustomActionLabel,
+                id.navigateNext(),
+                id.navigatePrevious(),
                 id.mLocale
         });
     }
@@ -106,7 +107,6 @@
                 && 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 @@
                 && 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 @@
         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 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 @@
 
     @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 12a9c51..9e5c227 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 @@
         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 730992b..aef248e 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1232,11 +1232,8 @@
                 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) {
@@ -1302,18 +1299,13 @@
             mSubtypeSwitcher.switchToShortcutIME();
             break;
         case Keyboard.CODE_ACTION_ENTER:
-            performeEditorAction(getEditorActionId(getCurrentInputEditorInfo()));
+            performeEditorAction(getActionId(switcher.getKeyboard()));
             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_NEXT:
+            performeEditorAction(EditorInfo.IME_ACTION_NEXT);
+            break;
+        case Keyboard.CODE_ACTION_PREVIOUS:
+            EditorInfoCompatUtils.performEditorActionPrevious(getCurrentInputConnection());
             break;
         default:
             mSpaceState = SPACE_STATE_NONE;
@@ -1488,30 +1480,6 @@
         }
     }
 
-    // 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) {
diff --git a/java/src/com/android/inputmethod/latin/XmlParseUtils.java b/java/src/com/android/inputmethod/latin/XmlParseUtils.java
index d747a02..e14c71c 100644
--- a/java/src/com/android/inputmethod/latin/XmlParseUtils.java
+++ b/java/src/com/android/inputmethod/latin/XmlParseUtils.java
@@ -27,8 +27,7 @@
     @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());
         }
     }