Make F1 and Symbol keys static in XML file

Change-Id: If869f5ad4fe8f192f89a8679a4abde99a25e02e6
diff --git a/java/res/values-xlarge/bools.xml b/java/res/values-xlarge/bools.xml
index 2ac5fc6..3079133 100644
--- a/java/res/values-xlarge/bools.xml
+++ b/java/res/values-xlarge/bools.xml
@@ -22,5 +22,4 @@
     <bool name="default_popup_preview">false</bool>
     <bool name="config_enable_show_settings_key_option">false</bool>
     <bool name="config_dynamic_key_top_enter_key">false</bool>
-    <bool name="config_dynamic_key_top_symbol_key">false</bool>
 </resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 2087115..7de41f0 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -149,7 +149,8 @@
             <enum name="web" value="4" />
             <enum name="phone" value="5" />
         </attr>
-        <attr name="settingsKey" format="string" />
-        <attr name="voiceKey" format="string" />
+        <attr name="hasSettingsKey" format="string" />
+        <attr name="voiceKeyEnabled" format="string" />
+        <attr name="hasVoiceKey" format="string" />
     </declare-styleable>
 </resources>
diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml
index 0497a6a..5d932a6 100644
--- a/java/res/values/bools.xml
+++ b/java/res/values/bools.xml
@@ -32,5 +32,4 @@
     <bool name="config_long_press_comma_for_settings_enabled">true</bool>
     <bool name="config_enable_show_settings_key_option">true</bool>
     <bool name="config_dynamic_key_top_enter_key">true</bool>
-    <bool name="config_dynamic_key_top_symbol_key">true</bool>
 </resources>
diff --git a/java/res/values/keycodes.xml b/java/res/values/keycodes.xml
index c5d5b3c..cbfe896 100644
--- a/java/res/values/keycodes.xml
+++ b/java/res/values/keycodes.xml
@@ -28,5 +28,4 @@
     <!-- Keycode for F1 (function) key. This one switches between language switch & comma/.com -->
     <integer name="key_settings">-100</integer>
     <integer name="key_voice">-102</integer>
-    <integer name="key_f1">-103</integer>
 </resources>
diff --git a/java/res/xml/kbd_qwerty_black_f1.xml b/java/res/xml/kbd_qwerty_black_f1.xml
new file mode 100644
index 0000000..296d8a0
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_black_f1.xml
@@ -0,0 +1,62 @@
+<?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:mode="url"
+        >
+            <Key
+                latin:keyLabel="/"
+                latin:popupKeyboard="@xml/popup_slash"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </case>
+        <case
+            latin:mode="email"
+        >
+            <Key
+                latin:keyLabel="\@"
+                latin:popupKeyboard="@xml/popup_at"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </case>
+        <case
+            latin:hasVoiceKey="true"
+        >
+            <Key
+                latin:codes="@integer/key_voice"
+                latin:popupKeyboard="@xml/popup_mic"
+                latin:keyIcon="@drawable/sym_bkeyboard_mic"
+                latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </case>
+        <default>
+            <Key
+                latin:keyLabel=","
+                latin:popupKeyboard="@xml/popup_comma"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </default>
+    </switch>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_black_row4.xml b/java/res/xml/kbd_qwerty_black_row4.xml
index 2b9ef7f..c6e25b4 100644
--- a/java/res/xml/kbd_qwerty_black_row4.xml
+++ b/java/res/xml/kbd_qwerty_black_row4.xml
@@ -27,15 +27,12 @@
     >
         <switch>
             <case
-                latin:settingsKey="false"
+                latin:hasSettingsKey="false"
             >
-                <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_symbol_key"
-                    latin:keyWidth="20%p"
-                    latin:keyEdgeFlags="left" />
-                <Key
-                    latin:codes="@integer/key_f1" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_qwerty_black_symbol" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_qwerty_black_f1" />
                 <switch>
                     <case
                         latin:mode="web"
@@ -86,19 +83,16 @@
                 </switch>
             </case>
             <case
-                latin:settingsKey="true"
+                latin:hasSettingsKey="true"
             >
-                <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_symbol_key"
-                    latin:keyWidth="15%p"
-                    latin:keyEdgeFlags="left" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_qwerty_black_symbol" />
                 <Key
                     latin:codes="@integer/key_settings"
                     latin:keyIcon="@drawable/sym_bkeyboard_settings"
                     latin:iconPreview="@drawable/sym_keyboard_feedback_settings" />
-                <Key
-                    latin:codes="@integer/key_f1" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_qwerty_black_f1" />
                 <switch>
                     <case
                         latin:mode="web"
diff --git a/java/res/xml/kbd_qwerty_black_symbol.xml b/java/res/xml/kbd_qwerty_black_symbol.xml
new file mode 100644
index 0000000..c1ef170
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_black_symbol.xml
@@ -0,0 +1,84 @@
+<?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:hasSettingsKey="false"
+        >
+            <switch>
+                <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+                     symbol keyboard will have mic key. That means we should use "?123mic" key here.
+                     -->
+                <case
+                    latin:voiceKeyEnabled="true"
+                    latin:hasVoiceKey="false"
+                >
+                    <Key
+                        latin:codes="@integer/key_symbol"
+                        latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
+                        latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+                        latin:keyWidth="20%p"
+                        latin:isModifier="true"
+                        latin:keyEdgeFlags="left" />
+                </case>
+                <default>
+                    <Key
+                        latin:codes="@integer/key_symbol"
+                        latin:keyLabel="@string/label_symbol_key"
+                        latin:keyWidth="20%p"
+                        latin:isModifier="true"
+                        latin:keyEdgeFlags="left" />
+                </default>
+            </switch>
+        </case>
+        <case
+            latin:hasSettingsKey="true"
+        >
+            <switch>
+                <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+                     symbol keyboard will have mic key. That means we should use "?123mic" key here.
+                     -->
+                <case
+                    latin:voiceKeyEnabled="true"
+                    latin:hasVoiceKey="false"
+                >
+                    <Key
+                        latin:codes="@integer/key_symbol"
+                        latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
+                        latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+                        latin:keyWidth="15%p"
+                        latin:isModifier="true"
+                        latin:keyEdgeFlags="left" />
+                </case>
+                <default>
+                    <Key
+                        latin:codes="@integer/key_symbol"
+                        latin:keyLabel="@string/label_symbol_key"
+                        latin:keyWidth="15%p"
+                        latin:isModifier="true"
+                        latin:keyEdgeFlags="left" />
+                </default>
+            </switch>
+        </case>
+    </switch>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_f1.xml b/java/res/xml/kbd_qwerty_f1.xml
new file mode 100644
index 0000000..23e494c
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_f1.xml
@@ -0,0 +1,62 @@
+<?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:mode="url"
+        >
+            <Key
+                latin:keyLabel="/"
+                latin:popupKeyboard="@xml/popup_slash"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </case>
+        <case
+            latin:mode="email"
+        >
+            <Key
+                latin:keyLabel="\@"
+                latin:popupKeyboard="@xml/popup_at"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </case>
+        <case
+            latin:hasVoiceKey="true"
+        >
+            <Key
+                latin:codes="@integer/key_voice"
+                latin:popupKeyboard="@xml/popup_mic"
+                latin:keyIcon="@drawable/sym_keyboard_mic"
+                latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </case>
+        <default>
+            <Key
+                latin:keyLabel=","
+                latin:popupKeyboard="@xml/popup_comma"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </default>
+    </switch>
+</merge>
diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml
index 2e2b32e..a5113ea 100644
--- a/java/res/xml/kbd_qwerty_row4.xml
+++ b/java/res/xml/kbd_qwerty_row4.xml
@@ -27,17 +27,12 @@
     >
         <switch>
             <case
-                latin:settingsKey="false"
+                latin:hasSettingsKey="false"
             >
-                <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_symbol_key"
-                    latin:keyWidth="20%p"
-                    latin:isModifier="true"
-                    latin:keyEdgeFlags="left" />
-                <Key
-                    latin:codes="@integer/key_f1"
-                    latin:isModifier="true" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_qwerty_symbol" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_qwerty_f1" />
                 <switch>
                     <case
                         latin:mode="web"
@@ -94,22 +89,17 @@
                 </switch>
             </case>
             <case
-                latin:settingsKey="true"
+                latin:hasSettingsKey="true"
             >
-                <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_symbol_key"
-                    latin:keyWidth="15%p"
-                    latin:isModifier="true"
-                    latin:keyEdgeFlags="left" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_qwerty_symbol" />
                 <Key
                     latin:codes="@integer/key_settings"
                     latin:keyIcon="@drawable/sym_keyboard_settings"
                     latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
                     latin:isModifier="true" />
-                <Key
-                    latin:codes="@integer/key_f1"
-                    latin:isModifier="true" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_qwerty_f1" />
                 <switch>
                     <case
                         latin:mode="web"
@@ -163,7 +153,7 @@
                             latin:keyWidth="15%p"
                             latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
-                     </case>
+                    </case>
                     <default>
                         <Key
                             latin:codes="@integer/key_return"
diff --git a/java/res/xml/kbd_qwerty_symbol.xml b/java/res/xml/kbd_qwerty_symbol.xml
new file mode 100644
index 0000000..e90091c
--- /dev/null
+++ b/java/res/xml/kbd_qwerty_symbol.xml
@@ -0,0 +1,84 @@
+<?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:hasSettingsKey="false"
+        >
+            <switch>
+                <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+                     symbol keyboard will have mic key. That means we should use "?123mic" key here.
+                     -->
+                <case
+                    latin:voiceKeyEnabled="true"
+                    latin:hasVoiceKey="false"
+                >
+                    <Key
+                        latin:codes="@integer/key_symbol"
+                        latin:keyIcon="@drawable/sym_keyboard_123_mic"
+                        latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+                        latin:keyWidth="20%p"
+                        latin:isModifier="true"
+                        latin:keyEdgeFlags="left" />
+                </case>
+                <default>
+                    <Key
+                        latin:codes="@integer/key_symbol"
+                        latin:keyLabel="@string/label_symbol_key"
+                        latin:keyWidth="20%p"
+                        latin:isModifier="true"
+                        latin:keyEdgeFlags="left" />
+                </default>
+            </switch>
+        </case>
+        <case
+            latin:hasSettingsKey="true"
+        >
+            <switch>
+                <!-- When this qwerty keyboard has no voice key but voice key is enabled, then
+                     symbol keyboard will have mic key. That means we should use "?123mic" key here.
+                     -->
+                <case
+                    latin:voiceKeyEnabled="true"
+                    latin:hasVoiceKey="false"
+                >
+                    <Key
+                        latin:codes="@integer/key_symbol"
+                        latin:keyIcon="@drawable/sym_keyboard_123_mic"
+                        latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+                        latin:keyWidth="15%p"
+                        latin:isModifier="true"
+                        latin:keyEdgeFlags="left" />
+                </case>
+                <default>
+                    <Key
+                        latin:codes="@integer/key_symbol"
+                        latin:keyLabel="@string/label_symbol_key"
+                        latin:keyWidth="15%p"
+                        latin:isModifier="true"
+                        latin:keyEdgeFlags="left" />
+                </default>
+            </switch>
+        </case>
+    </switch>
+</merge>
diff --git a/java/res/xml/kbd_symbols_black_f1.xml b/java/res/xml/kbd_symbols_black_f1.xml
new file mode 100644
index 0000000..353b007
--- /dev/null
+++ b/java/res/xml/kbd_symbols_black_f1.xml
@@ -0,0 +1,46 @@
+<?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:hasVoiceKey="true"
+        >
+            <Key
+                latin:codes="@integer/key_voice"
+                latin:popupKeyboard="@xml/popup_mic"
+                latin:keyIcon="@drawable/sym_bkeyboard_mic"
+                latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </case>
+        <case
+            latin:hasVoiceKey="false"
+        >
+            <Key
+                latin:keyLabel=","
+                latin:popupKeyboard="@xml/popup_comma"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </case>
+    </switch>
+</merge>
diff --git a/java/res/xml/kbd_symbols_black_row4.xml b/java/res/xml/kbd_symbols_black_row4.xml
index d1ed527..a50f8c0 100644
--- a/java/res/xml/kbd_symbols_black_row4.xml
+++ b/java/res/xml/kbd_symbols_black_row4.xml
@@ -26,15 +26,15 @@
     >
         <switch>
             <case
-                latin:settingsKey="false"
+                latin:hasSettingsKey="false"
             >
                 <Key
                     latin:codes="@integer/key_symbol"
                     latin:keyLabel="@string/label_alpha_key"
                     latin:keyWidth="20%p"
                     latin:keyEdgeFlags="left" />
-                <Key
-                    latin:codes="@integer/key_f1" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_symbols_black_f1" />
                 <Key
                     latin:codes="@integer/key_space"
                     latin:keyIcon="@drawable/sym_bkeyboard_space"
@@ -67,7 +67,7 @@
                 </switch>
             </case>
             <case
-                latin:settingsKey="true"
+                latin:hasSettingsKey="true"
             >
                 <Key
                     latin:codes="@integer/key_symbol"
@@ -78,8 +78,8 @@
                     latin:codes="@integer/key_settings"
                     latin:keyIcon="@drawable/sym_bkeyboard_settings"
                     latin:iconPreview="@drawable/sym_keyboard_feedback_settings" />
-                <Key
-                    latin:codes="@integer/key_f1" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_symbols_black_f1" />
                 <Key
                     latin:codes="@integer/key_space"
                     latin:keyIcon="@drawable/sym_bkeyboard_space"
diff --git a/java/res/xml/kbd_symbols_f1.xml b/java/res/xml/kbd_symbols_f1.xml
new file mode 100644
index 0000000..39c411a
--- /dev/null
+++ b/java/res/xml/kbd_symbols_f1.xml
@@ -0,0 +1,46 @@
+<?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:hasVoiceKey="true"
+        >
+            <Key
+                latin:codes="@integer/key_voice"
+                latin:popupKeyboard="@xml/popup_mic"
+                latin:keyIcon="@drawable/sym_keyboard_mic"
+                latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </case>
+        <case
+            latin:hasVoiceKey="false"
+        >
+            <Key
+                latin:keyLabel=","
+                latin:popupKeyboard="@xml/popup_comma"
+                latin:keyHintIcon="@drawable/hint_popup"
+                latin:isModifier="true" />
+        </case>
+    </switch>
+</merge>
diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml
index 4b3dd90..f012a4d 100644
--- a/java/res/xml/kbd_symbols_row4.xml
+++ b/java/res/xml/kbd_symbols_row4.xml
@@ -26,7 +26,7 @@
     >
         <switch>
             <case
-                latin:settingsKey="false"
+                latin:hasSettingsKey="false"
             >
                 <Key
                     latin:codes="@integer/key_symbol"
@@ -34,9 +34,8 @@
                     latin:keyWidth="20%p"
                     latin:isModifier="true"
                     latin:keyEdgeFlags="left" />
-                <Key
-                    latin:codes="@integer/key_f1"
-                    latin:isModifier="true" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_symbols_f1" />
                 <Key
                     latin:codes="@integer/key_space"
                     latin:keyIcon="@drawable/sym_keyboard_space"
@@ -73,7 +72,7 @@
                 </switch>
             </case>
             <case
-                latin:settingsKey="true"
+                latin:hasSettingsKey="true"
             >
                 <Key
                     latin:codes="@integer/key_symbol"
@@ -86,9 +85,8 @@
                     latin:keyIcon="@drawable/sym_keyboard_settings"
                     latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
                     latin:isModifier="true" />
-                <Key
-                    latin:codes="@integer/key_f1"
-                    latin:isModifier="true" />
+                <include
+                    latin:keyboardLayout="@xml/kbd_symbols_f1" />
                 <Key
                     latin:codes="@integer/key_space"
                     latin:keyIcon="@drawable/sym_keyboard_space"
diff --git a/java/res/xml/kbd_symbols_shift_black_row4.xml b/java/res/xml/kbd_symbols_shift_black_row4.xml
index e18ab21..4e5ddcd 100644
--- a/java/res/xml/kbd_symbols_shift_black_row4.xml
+++ b/java/res/xml/kbd_symbols_shift_black_row4.xml
@@ -26,7 +26,7 @@
     >
         <switch>
             <case
-                latin:settingsKey="false"
+                latin:hasSettingsKey="false"
             >
                 <Key
                     latin:codes="@integer/key_symbol"
@@ -65,7 +65,7 @@
                 </switch>
             </case>
             <case
-                latin:settingsKey="true"
+                latin:hasSettingsKey="true"
             >
                 <Key
                     latin:codes="@integer/key_symbol"
diff --git a/java/res/xml/kbd_symbols_shift_row4.xml b/java/res/xml/kbd_symbols_shift_row4.xml
index f0df130..170c8b9 100644
--- a/java/res/xml/kbd_symbols_shift_row4.xml
+++ b/java/res/xml/kbd_symbols_shift_row4.xml
@@ -26,7 +26,7 @@
     >
         <switch>
             <case
-                latin:settingsKey="false"
+                latin:hasSettingsKey="false"
             >
                 <Key
                     latin:codes="@integer/key_symbol"
@@ -71,7 +71,7 @@
                 </switch>
             </case>
             <case
-                latin:settingsKey="true"
+                latin:hasSettingsKey="true"
             >
                 <Key
                     latin:codes="@integer/key_symbol"
diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java b/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java
index 276abfc..1aee2fc 100644
--- a/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java
+++ b/java/src/com/android/inputmethod/latin/BaseKeyboardParser.java
@@ -107,7 +107,6 @@
 public class BaseKeyboardParser {
     private static final String TAG = "BaseKeyboardParser";
     private static final boolean DEBUG_TAG = false;
-    private static final boolean DEBUG_PARSER = false;
 
     // Keyboard XML Tags
     private static final String TAG_KEYBOARD = "Keyboard";
@@ -144,7 +143,6 @@
 
     public void parseKeyboard(XmlResourceParser parser)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseKeyboard", false);
         int event;
         while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) {
             if (event == XmlResourceParser.START_TAG) {
@@ -159,7 +157,6 @@
                 }
             }
         }
-        if (DEBUG_PARSER) debugLeaveMethod("parseKeyboard", false);
     }
 
     private void parseKeyboardAttributes(XmlResourceParser parser) {
@@ -181,7 +178,6 @@
 
     private void parseKeyboardContent(XmlResourceParser parser, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseKeyboardContent", keys == null);
         int event;
         while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) {
             if (event == XmlResourceParser.START_TAG) {
@@ -214,12 +210,10 @@
                 }
             }
         }
-        if (DEBUG_PARSER) debugLeaveMethod("parseKeyboardContent", keys == null);
     }
 
     private void parseRowContent(XmlResourceParser parser, Row row, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseRowContent", keys == null);
         int event;
         while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) {
             if (event == XmlResourceParser.START_TAG) {
@@ -252,12 +246,10 @@
                 }
             }
         }
-        if (DEBUG_PARSER) debugLeaveMethod("parseRowContent", keys == null);
     }
 
     private void parseKey(XmlResourceParser parser, Row row, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseKey", keys == null);
         if (keys == null) {
             checkEndTag(TAG_KEY, parser);
         } else {
@@ -272,7 +264,6 @@
 
     private void parseSpacer(XmlResourceParser parser, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseSpacer", keys == null);
         if (keys == null) {
             checkEndTag(TAG_SPACER, parser);
         } else {
@@ -288,16 +279,12 @@
 
     private void parseIncludeKeyboardContent(XmlResourceParser parser, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseIncludeKeyboardContent", keys == null);
         parseIncludeInternal(parser, null, keys);
-        if (DEBUG_PARSER) debugLeaveMethod("parseIncludeKeyboardContent", keys == null);
     }
 
     private void parseIncludeRowContent(XmlResourceParser parser, Row row, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseIncludeRowContent", keys == null);
         parseIncludeInternal(parser, row, keys);
-        if (DEBUG_PARSER) debugLeaveMethod("parseIncludeRowContent", keys == null);
     }
 
     private void parseIncludeInternal(XmlResourceParser parser, Row row, List<Key> keys)
@@ -320,7 +307,6 @@
 
     private void parseMerge(XmlResourceParser parser, Row row, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseMerge", keys == null);
         int event;
         while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) {
             if (event == XmlResourceParser.START_TAG) {
@@ -339,21 +325,16 @@
                 }
             }
         }
-        if (DEBUG_PARSER) debugLeaveMethod("parseMerge", keys == null);
     }
 
     private void parseSwitchKeyboardContent(XmlResourceParser parser, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseSwitchKeyboardContent", keys == null);
         parseSwitchInternal(parser, null, keys);
-        if (DEBUG_PARSER) debugLeaveMethod("parseSwitchKeyboardContent", keys == null);
     }
 
     private void parseSwitchRowContent(XmlResourceParser parser, Row row, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseSwitchRowContent", keys == null);
         parseSwitchInternal(parser, row, keys);
-        if (DEBUG_PARSER) debugLeaveMethod("parseSwitchRowContent", keys == null);
     }
 
     private void parseSwitchInternal(XmlResourceParser parser, Row row, List<Key> keys)
@@ -386,7 +367,6 @@
 
     private boolean parseCase(XmlResourceParser parser, Row row, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseCase", keys == null);
         final boolean selected = parseCaseCondition(parser);
         if (row == null) {
             // Processing Rows.
@@ -395,46 +375,67 @@
             // Processing Keys.
             parseRowContent(parser, row, selected ? keys : null);
         }
-        if (DEBUG_PARSER) debugLeaveMethod("parseCase", keys == null || !selected);
         return selected;
     }
 
     private boolean parseCaseCondition(XmlResourceParser parser) {
-        final BaseKeyboard keyboard = mKeyboard;
-        final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
-                R.styleable.BaseKeyboard_Case);
-        final int mode = a.getInt(R.styleable.BaseKeyboard_Case_mode, -1);
-        final String settingsKey = a.getString(R.styleable.BaseKeyboard_Case_settingsKey);
-        final String voiceKey = a.getString(R.styleable.BaseKeyboard_Case_voiceKey);
-        a.recycle();
-
-        final KeyboardId id = keyboard.mId;
+        final KeyboardId id = mKeyboard.mId;
         if (id == null)
             return true;
-        final boolean modeMatched = (mode == -1 || id.mMode == mode);
-        final boolean settingsKeyMatched = (settingsKey == null
-                || id.mHasSettingsKey == Boolean.parseBoolean(settingsKey));
-        final boolean voiceKeyMatched = (voiceKey == null
-                || id.mHasVoiceKey == Boolean.parseBoolean(voiceKey));
-        final boolean selected = modeMatched && settingsKeyMatched && voiceKeyMatched;
-        if (DEBUG_TAG) {
+
+        final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+                R.styleable.BaseKeyboard_Case);
+        try {
+            final boolean modeMatched = matchInteger(
+                    a, R.styleable.BaseKeyboard_Case_mode, id.mMode);
+            final boolean settingsKeyMatched = matchBoolean(
+                    a, R.styleable.BaseKeyboard_Case_hasSettingsKey, id.mHasSettingsKey);
+            final boolean voiceEnabledMatched = matchBoolean(
+                    a, R.styleable.BaseKeyboard_Case_voiceKeyEnabled, id.mVoiceKeyEnabled);
+            final boolean voiceKeyMatched = matchBoolean(
+                    a, R.styleable.BaseKeyboard_Case_hasVoiceKey, id.mHasVoiceKey);
+
+            final boolean selected = modeMatched && settingsKeyMatched
+                    && voiceEnabledMatched && voiceKeyMatched;
+
+            if (DEBUG_TAG) {
             Log.d(TAG, "parseCaseCondition: " + Boolean.toString(selected).toUpperCase()
-                    + (mode != -1 ? " mode=" + mode : "")
-                    + (settingsKey != null ? " settingsKey="+settingsKey : "")
-                    + (voiceKey != null ? " voiceKey=" + voiceKey : ""));
+                    + debugInteger(a,
+                            R.styleable.BaseKeyboard_Case_mode, "mode")
+                    + debugBoolean(a,
+                            R.styleable.BaseKeyboard_Case_hasSettingsKey, "hasSettingsKey")
+                    + debugBoolean(a,
+                            R.styleable.BaseKeyboard_Case_voiceKeyEnabled, "voiceKeyEnabled")
+                    + debugBoolean(a,
+                            R.styleable.BaseKeyboard_Case_hasVoiceKey, "hasVoiceKey")
+                    );
+            }
+
+            return selected;
+        } finally {
+            a.recycle();
         }
-        return selected;
+    }
+
+    private static boolean matchInteger(TypedArray a, int index, int value) {
+        // If <case> does not have "index" attribute, that means this <case> is wild-card for the
+        // attribute.
+        return !a.hasValue(index) || a.getInt(index, 0) == value;
+    }
+
+    private static boolean matchBoolean(TypedArray a, int index, boolean value) {
+        // If <case> does not have "index" attribute, that means this <case> is wild-card for the
+        // attribute.
+        return !a.hasValue(index) || a.getBoolean(index, false) == value;
     }
 
     private boolean parseDefault(XmlResourceParser parser, Row row, List<Key> keys)
             throws XmlPullParserException, IOException {
-        if (DEBUG_PARSER) debugEnterMethod("parseDefault", keys == null);
         if (row == null) {
             parseKeyboardContent(parser, keys);
         } else {
             parseRowContent(parser, row, keys);
         }
-        if (DEBUG_PARSER) debugLeaveMethod("parseDefault", keys == null);
         return true;
     }
 
@@ -512,14 +513,6 @@
         }
     }
 
-    private static void debugEnterMethod(String title, boolean skip) {
-        Log.d(TAG, title + ": enter" + (skip ? " skip" : ""));
-    }
-
-    private static void debugLeaveMethod(String title, boolean skip) {
-        Log.d(TAG, title + ": leave" + (skip ? " skip" : ""));
-    }
-
     private static void debugStartTag(String title, String tag, boolean skip) {
         Log.d(TAG, title + ": <" + tag + ">" + (skip ? " skip" : ""));
     }
@@ -527,4 +520,12 @@
     private static void debugEndTag(String title, String tag, boolean skip) {
         Log.d(TAG, title + ": </" + tag + ">" + (skip ? " skip" : ""));
     }
- }
+
+    private static String debugInteger(TypedArray a, int index, String name) {
+        return a.hasValue(index) ? name + "=" + a.getInt(index, 0) : "";
+    }
+
+    private static String debugBoolean(TypedArray a, int index, String name) {
+        return a.hasValue(index) ? name + "=" + a.getBoolean(index, false) : "";
+    }
+}
diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index 7ae597f..08ff41b 100644
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -98,7 +98,7 @@
     /** mIsAutoCompletionActive indicates that auto completed word will be input instead of
      * what user actually typed. */
     private boolean mIsAutoCompletionActive;
-    private boolean mVoiceButtonEnabled;
+    private boolean mVoiceKeyEnabled;
     private boolean mVoiceButtonOnPrimary;
     private int mSymbolsModeState = SYMBOLS_MODE_STATE_NONE;
 
@@ -139,12 +139,13 @@
         final int mode = mMode;
         final int colorScheme = getCharColorId();
         final boolean hasSettingsKey = mHasSettingsKey;
-        final boolean hasVoiceKey = mVoiceButtonEnabled && !mVoiceButtonOnPrimary;
+        final boolean voiceKeyEnabled = mVoiceKeyEnabled;
+        final boolean hasVoiceKey = voiceKeyEnabled && !mVoiceButtonOnPrimary;
         final int imeOptions = mImeOptions;
-        mSymbolsId = new KeyboardId(locale, orientation, mode,
-                KBD_SYMBOLS, colorScheme, hasSettingsKey, hasVoiceKey, imeOptions, true);
-        mSymbolsShiftedId = new KeyboardId(locale, orientation, mode,
-                KBD_SYMBOLS_SHIFT, colorScheme, hasSettingsKey, hasVoiceKey, imeOptions, true);
+        mSymbolsId = new KeyboardId(locale, orientation, mode, KBD_SYMBOLS,
+                colorScheme, hasSettingsKey, voiceKeyEnabled, hasVoiceKey, imeOptions, true);
+        mSymbolsShiftedId = new KeyboardId(locale, orientation, mode, KBD_SYMBOLS_SHIFT,
+                colorScheme, hasSettingsKey, voiceKeyEnabled, hasVoiceKey, imeOptions, true);
     }
 
     /**
@@ -158,6 +159,7 @@
         public final int[] mXmlArray;
         public final int mColorScheme;
         public final boolean mHasSettingsKey;
+        public final boolean mVoiceKeyEnabled;
         public final boolean mHasVoiceKey;
         public final int mImeOptions;
         public final boolean mEnableShiftLock;
@@ -165,14 +167,15 @@
         private final int mHashCode;
 
         public KeyboardId(Locale locale, int orientation, int mode,
-                int[] xmlArray, int colorScheme, boolean hasSettingsKey, boolean hasVoiceKey,
-                int imeOptions, boolean enableShiftLock) {
+                int[] xmlArray, int colorScheme, boolean hasSettingsKey, boolean voiceKeyEnabled,
+                boolean hasVoiceKey, int imeOptions, boolean enableShiftLock) {
             this.mLocale = locale;
             this.mOrientation = orientation;
             this.mMode = mode;
             this.mXmlArray = xmlArray;
             this.mColorScheme = colorScheme;
             this.mHasSettingsKey = hasSettingsKey;
+            this.mVoiceKeyEnabled = voiceKeyEnabled;
             this.mHasVoiceKey = hasVoiceKey;
             this.mImeOptions = imeOptions;
             this.mEnableShiftLock = enableShiftLock;
@@ -184,6 +187,7 @@
                     xmlArray,
                     colorScheme,
                     hasSettingsKey,
+                    voiceKeyEnabled,
                     hasVoiceKey,
                     imeOptions,
                     enableShiftLock,
@@ -210,6 +214,7 @@
                 && other.mXmlArray == this.mXmlArray
                 && other.mColorScheme == this.mColorScheme
                 && other.mHasSettingsKey == this.mHasSettingsKey
+                && other.mVoiceKeyEnabled == this.mVoiceKeyEnabled
                 && other.mHasVoiceKey == this.mHasVoiceKey
                 && other.mImeOptions == this.mImeOptions
                 && other.mEnableShiftLock == this.mEnableShiftLock;
@@ -222,7 +227,7 @@
 
         @Override
         public String toString() {
-            return String.format("[%s %s %5s imeOptions=0x%08x xml=0x%08x %s%s%s%s]",
+            return String.format("[%s %s %5s imeOptions=0x%08x xml=0x%08x %s%s%s%s%s]",
                     mLocale,
                     (mOrientation == 1 ? "port" : "land"),
                     modeName(mMode),
@@ -230,6 +235,7 @@
                     mXmlArray[0],
                     (mColorScheme == CHAR_THEME_COLOR_WHITE ? "white" : "black"),
                     (mHasSettingsKey ? " hasSettingsKey" : ""),
+                    (mVoiceKeyEnabled ? " voiceKeyEnabled" : ""),
                     (mHasVoiceKey ? " hasVoiceKey" : ""),
                     (mEnableShiftLock ? " enableShiftLock" : ""));
         }
@@ -248,14 +254,14 @@
     }
 
     private boolean hasVoiceKey(boolean isSymbols) {
-        return mVoiceButtonEnabled && (isSymbols != mVoiceButtonOnPrimary);
+        return mVoiceKeyEnabled && (isSymbols != mVoiceButtonOnPrimary);
     }
 
-    public void loadKeyboard(int mode, int imeOptions, boolean voiceButtonEnabled,
+    public void loadKeyboard(int mode, int imeOptions, boolean voiceKeyEnabled,
             boolean voiceButtonOnPrimary) {
         mSymbolsModeState = SYMBOLS_MODE_STATE_NONE;
         try {
-            loadKeyboardInternal(mode, imeOptions, voiceButtonEnabled, voiceButtonOnPrimary,
+            loadKeyboardInternal(mode, imeOptions, voiceKeyEnabled, voiceButtonOnPrimary,
                     false);
         } catch (RuntimeException e) {
             Log.w(TAG, e);
@@ -270,7 +276,7 @@
 
         mMode = mode;
         mImeOptions = imeOptions;
-        mVoiceButtonEnabled = voiceButtonEnabled;
+        mVoiceKeyEnabled = voiceButtonEnabled;
         mVoiceButtonOnPrimary = voiceButtonOnPrimary;
         mIsSymbols = isSymbols;
         // Update the settings key state because number of enabled IMEs could have been changed
@@ -298,11 +304,7 @@
             final Locale savedLocale =  mSubtypeSwitcher.changeSystemLocale(
                     mSubtypeSwitcher.getInputLocale());
 
-            final int xml = id.getXmlId();
             keyboard = new LatinKeyboard(mInputMethodService, id);
-            keyboard.setVoiceMode(
-                    hasVoiceKey(xml == R.xml.kbd_symbols || xml == R.xml.kbd_symbols_black),
-                    mVoiceButtonEnabled);
             keyboard.setImeOptions(res, id.mMode, id.mImeOptions);
             keyboard.setColorOfSymbolIcons(isBlackSym(id.mColorScheme));
 
@@ -340,8 +342,8 @@
         }
         final int orientation = mInputMethodService.getResources().getConfiguration().orientation;
         final Locale locale = mSubtypeSwitcher.getInputLocale();
-        return new KeyboardId(locale, orientation, mode, xmlArray,
-                charColorId, mHasSettingsKey, hasVoiceKey, imeOptions, enableShiftLock);
+        return new KeyboardId(locale, orientation, mode, xmlArray, charColorId,
+                mHasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, imeOptions, enableShiftLock);
     }
 
     public int getKeyboardMode() {
@@ -605,7 +607,7 @@
     }
 
     private void toggleKeyboardMode() {
-        loadKeyboardInternal(mMode, mImeOptions, mVoiceButtonEnabled, mVoiceButtonOnPrimary,
+        loadKeyboardInternal(mMode, mImeOptions, mVoiceKeyEnabled, mVoiceButtonOnPrimary,
                 !mIsSymbols);
         if (mIsSymbols) {
             mSymbolsModeState = SYMBOLS_MODE_STATE_BEGIN;
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index e24bc0e..9c7af35 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -200,7 +200,7 @@
     private boolean mLocaleSupportedForVoiceInput;
     private boolean mIsShowingHint;
     private int     mCorrectionMode;
-    private boolean mVoiceButtonEnabled;
+    private boolean mVoiceKeyEnabled;
     private boolean mVoiceButtonOnPrimary;
     private int     mOrientation;
     private List<CharSequence> mSuggestPuncList;
@@ -531,7 +531,7 @@
             final int mode = mKeyboardSwitcher.getKeyboardMode();
             final EditorInfo attribute = getCurrentInputEditorInfo();
             final int imeOptions = (attribute != null) ? attribute.imeOptions : 0;
-            mKeyboardSwitcher.loadKeyboard(mode, imeOptions, mVoiceButtonEnabled,
+            mKeyboardSwitcher.loadKeyboard(mode, imeOptions, mVoiceKeyEnabled,
                     mVoiceButtonOnPrimary);
         }
 
@@ -679,8 +679,7 @@
         mJustAddedAutoSpace = false;
 
         loadSettings(attribute);
-        switcher.loadKeyboard(mode, attribute.imeOptions, mVoiceButtonEnabled,
-                mVoiceButtonOnPrimary);
+        switcher.loadKeyboard(mode, attribute.imeOptions, mVoiceKeyEnabled, mVoiceButtonOnPrimary);
         switcher.updateShiftState();
 
         setCandidatesViewShownInternal(isCandidateStripVisible(),
@@ -2222,7 +2221,7 @@
         final int mode = switcher.getKeyboardMode();
         final EditorInfo attribute = getCurrentInputEditorInfo();
         final int imeOptions = (attribute != null) ? attribute.imeOptions : 0;
-        switcher.loadKeyboard(mode, imeOptions, mVoiceButtonEnabled,
+        switcher.loadKeyboard(mode, imeOptions, mVoiceKeyEnabled,
                 mVoiceButtonOnPrimary);
         initSuggest();
         switcher.updateShiftState();
@@ -2468,7 +2467,7 @@
         if (VOICE_INSTALLED) {
             final String voiceMode = sp.getString(PREF_VOICE_MODE,
                     getString(R.string.voice_mode_main));
-            mVoiceButtonEnabled = !voiceMode.equals(getString(R.string.voice_mode_off))
+            mVoiceKeyEnabled = !voiceMode.equals(getString(R.string.voice_mode_off))
                     && shouldShowVoiceButton(makeFieldContext(), attribute);
             mVoiceButtonOnPrimary = voiceMode.equals(getString(R.string.voice_mode_main));
         }
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
index 6fcea22..1242818 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
@@ -52,29 +52,16 @@
     private Drawable mSpaceIcon;
     private Drawable mSpaceAutoCompletionIndicator;
     private Drawable mSpacePreviewIcon;
-    private Drawable mMicIcon;
-    private Drawable mMicPreviewIcon;
-    private Drawable m123MicIcon;
-    private Drawable m123MicPreviewIcon;
     private final Drawable mButtonArrowLeftIcon;
     private final Drawable mButtonArrowRightIcon;
     private Key mEnterKey;
-    private Key mF1Key;
-    private final Drawable mHintIcon;
     private Key mSpaceKey;
-    private Key m123Key;
     private int mSpaceKeyIndex = -1;
     private int mSpaceDragStartX;
     private int mSpaceDragLastDiff;
     private final Resources mRes;
     private final Context mContext;
-    private int mMode; // TODO: remove this and use the corresponding mode in the parent class
-    // Whether this keyboard has voice icon on it
-    private boolean mHasVoiceButton;
-    // Whether voice icon is enabled at all
-    private boolean mVoiceEnabled;
     private final boolean mIsAlphaKeyboard;
-    private CharSequence m123Label;
     private boolean mCurrentlyInSpace;
     private SlidingLocaleDrawable mSlidingLocaleIcon;
     private int[] mPrefLetterFrequencies;
@@ -112,22 +99,14 @@
         final Resources res = context.getResources();
         mContext = context;
         mRes = res;
-        mMode = id.mMode;
         mShiftedIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked);
         mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked);
         setDefaultBounds(mShiftLockPreviewIcon);
         mSpaceIcon = res.getDrawable(R.drawable.sym_keyboard_space);
         mSpaceAutoCompletionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led);
         mSpacePreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_space);
-        mMicIcon = res.getDrawable(R.drawable.sym_keyboard_mic);
-        mMicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_mic);
-        setDefaultBounds(mMicPreviewIcon);
         mButtonArrowLeftIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_left);
         mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right);
-        m123MicIcon = res.getDrawable(R.drawable.sym_keyboard_123_mic);
-        m123MicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_123_mic);
-        mHintIcon = res.getDrawable(R.drawable.hint_popup);
-        setDefaultBounds(m123MicPreviewIcon);
         sSpacebarVerticalCorrection = res.getDimensionPixelOffset(
                 R.dimen.spacebar_vertical_correction);
         final int xmlLayoutResId = id.getXmlId();
@@ -154,16 +133,9 @@
         case LatinIME.KEYCODE_ENTER:
             mEnterKey = key;
             break;
-        case LatinKeyboardView.KEYCODE_F1:
-            mF1Key = key;
-            break;
         case LatinIME.KEYCODE_SPACE:
             mSpaceKey = key;
             break;
-        case KEYCODE_MODE_CHANGE:
-            m123Key = key;
-            m123Label = key.label;
-            break;
         }
 
         return key;
@@ -180,7 +152,6 @@
     }
 
     public void setImeOptions(Resources res, int mode, int options) {
-        mMode = mode;
         if (mEnterKey == null)
             return;
         final boolean configDynamicKeyTopEnterKey = res.getBoolean(
@@ -290,87 +261,10 @@
         if (isBlack) {
             mShiftedIcon = res.getDrawable(R.drawable.sym_bkeyboard_shift_locked);
             mSpaceIcon = res.getDrawable(R.drawable.sym_bkeyboard_space);
-            mMicIcon = res.getDrawable(R.drawable.sym_bkeyboard_mic);
-            m123MicIcon = res.getDrawable(R.drawable.sym_bkeyboard_123_mic);
         } else {
             mShiftedIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked);
             mSpaceIcon = res.getDrawable(R.drawable.sym_keyboard_space);
-            mMicIcon = res.getDrawable(R.drawable.sym_keyboard_mic);
-            m123MicIcon = res.getDrawable(R.drawable.sym_keyboard_123_mic);
         }
-        updateDynamicKeys();
-    }
-
-    public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) {
-        mHasVoiceButton = hasVoiceButton;
-        mVoiceEnabled = hasVoice;
-        updateDynamicKeys();
-    }
-
-    private void updateDynamicKeys() {
-        update123Key();
-        updateF1Key();
-    }
-
-    private void update123Key() {
-        final boolean configDynamicKeyTopSymbolKey = mRes.getBoolean(
-                R.bool.config_dynamic_key_top_symbol_key);
-        // Update KEYCODE_MODE_CHANGE key only on alphabet mode, not on symbol mode.
-        if (m123Key != null && mIsAlphaKeyboard) {
-            if (configDynamicKeyTopSymbolKey && mVoiceEnabled && !mHasVoiceButton) {
-                m123Key.icon = m123MicIcon;
-                m123Key.iconPreview = m123MicPreviewIcon;
-                m123Key.label = null;
-            } else {
-                m123Key.icon = null;
-                m123Key.iconPreview = null;
-                m123Key.label = m123Label;
-            }
-        }
-    }
-
-    private void updateF1Key() {
-        // Update KEYCODE_F1 key. Please note that some keyboard layouts have no F1 key.
-        if (mF1Key == null)
-            return;
-
-        if (mIsAlphaKeyboard) {
-            if (mMode == KeyboardSwitcher.MODE_URL) {
-                setNonMicF1Key(mF1Key, "/", R.xml.popup_slash);
-            } else if (mMode == KeyboardSwitcher.MODE_EMAIL) {
-                setNonMicF1Key(mF1Key, "@", R.xml.popup_at);
-            } else {
-                if (mVoiceEnabled && mHasVoiceButton) {
-                    setMicF1Key(mF1Key);
-                } else {
-                    setNonMicF1Key(mF1Key, ",", R.xml.popup_comma);
-                }
-            }
-        } else {  // Symbols keyboard
-            if (mVoiceEnabled && mHasVoiceButton) {
-                setMicF1Key(mF1Key);
-            } else {
-                setNonMicF1Key(mF1Key, ",", R.xml.popup_comma);
-            }
-        }
-    }
-
-    private void setMicF1Key(Key key) {
-        key.label = null;
-        key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE };
-        key.popupResId = R.xml.popup_mic;
-        key.icon = mMicIcon;
-        key.hintIcon = mHintIcon;
-        key.iconPreview = mMicPreviewIcon;
-    }
-
-    private void setNonMicF1Key(Key key, String label, int popupResId) {
-        key.label = label;
-        key.codes = new int[] { label.charAt(0) };
-        key.popupResId = popupResId;
-        key.icon = null;
-        key.hintIcon = mHintIcon;
-        key.iconPreview = null;
     }
 
     /**
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
index a215621..fb8b69e 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
@@ -34,8 +34,8 @@
 
     public static final int KEYCODE_OPTIONS = -100;
     public static final int KEYCODE_OPTIONS_LONGPRESS = -101;
+    // TODO: remove this once LatinIME stops referring to this.
     public static final int KEYCODE_VOICE = -102;
-    public static final int KEYCODE_F1 = -103;
     public static final int KEYCODE_NEXT_LANGUAGE = -104;
     public static final int KEYCODE_PREV_LANGUAGE = -105;
     public static final int KEYCODE_CAPSLOCK = -106;