Support <key-style/> and keyStyle attribute for Keyboard XML

Change-Id: Ie052e989d0180eecfc8c244ba6c60594a46103d1
diff --git a/java/res/xml/kbd_functional_key_style.xml b/java/res/xml/kbd_functional_key_style.xml
new file mode 100644
index 0000000..eabaa4a
--- /dev/null
+++ b/java/res/xml/kbd_functional_key_style.xml
@@ -0,0 +1,113 @@
+<?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"
+>
+    <key-style
+        latin:styleName="functionalKeyStyle"
+        latin:isModifier="true" />
+    <key-style
+        latin:styleName="shiftKeyStyle"
+        latin:codes="@integer/key_shift"
+        latin:keyIcon="@drawable/sym_keyboard_shift"
+        latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+        latin:parentStyle="functionalKeyStyle"
+        latin:isSticky="true" />
+    <key-style
+        latin:styleName="deleteKeyStyle"
+        latin:codes="@integer/key_delete"
+        latin:keyIcon="@drawable/sym_keyboard_delete"
+        latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+        latin:parentStyle="functionalKeyStyle"
+        latin:isRepeatable="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-style
+                latin:styleName="toSymbolKeyStyle"
+                latin:codes="@integer/key_switch_alpha_symbol"
+                latin:keyIcon="@drawable/sym_keyboard_123_mic"
+                latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
+                latin:parentStyle="functionalKeyStyle" />
+        </case>
+        <default>
+            <key-style
+                latin:styleName="toSymbolKeyStyle"
+                latin:codes="@integer/key_switch_alpha_symbol"
+                latin:keyLabel="@string/label_to_symbol_key"
+                latin:parentStyle="functionalKeyStyle" />
+        </default>
+    </switch>
+    <key-style
+        latin:styleName="toAlphaKeyStyle"
+        latin:codes="@integer/key_switch_alpha_symbol"
+        latin:keyLabel="@string/label_to_alpha_key"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="settingsKeyStyle"
+        latin:codes="@integer/key_settings"
+        latin:keyIcon="@drawable/sym_keyboard_settings"
+        latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="spaceKeyStyle"
+        latin:codes="@integer/key_space"
+        latin:keyIcon="@drawable/sym_keyboard_space"
+        latin:iconPreview="@drawable/sym_keyboard_feedback_space"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="tabKeyStyle"
+        latin:codes="@integer/key_tab"
+        latin:keyIcon="@drawable/sym_keyboard_tab"
+        latin:iconPreview="@drawable/sym_keyboard_feedback_tab"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="returnKeyStyle"
+        latin:codes="@integer/key_return"
+        latin:keyIcon="@drawable/sym_keyboard_return"
+        latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="altKeyStyle"
+        latin:codes="@integer/key_shift"
+        latin:keyLabel="@string/label_alt_key"
+        latin:parentStyle="functionalKeyStyle"
+        latin:isSticky="true" />
+    <key-style
+        latin:styleName="smileyKeyStyle"
+        latin:keyLabel=":-)"
+        latin:keyOutputText=":-) "
+        latin:keyHintIcon="@drawable/hint_popup"
+        latin:popupKeyboard="@xml/popup_smileys"
+        latin:parentStyle="functionalKeyStyle" />
+    <key-style
+        latin:styleName="micKeyStyle"
+        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:parentStyle="functionalKeyStyle" />
+</merge>
diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml
index e6f6a09..a01d697 100644
--- a/java/res/xml/kbd_phone.xml
+++ b/java/res/xml/kbd_phone.xml
@@ -25,6 +25,8 @@
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
+    <include
+        latin:keyboardLayout="@xml/kbd_functional_key_style" />
     <Row
         latin:rowEdgeFlags="top"
     >
@@ -40,8 +42,8 @@
             latin:keyIcon="@drawable/sym_keyboard_num3" />
         <Key
             latin:keyLabel="-"
+            latin:keyStyle="functionalKeyStyle"
             latin:keyWidth="20%p"
-            latin:isModifier="true"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -57,8 +59,8 @@
             latin:keyIcon="@drawable/sym_keyboard_num6" />
         <Key
             latin:keyLabel="."
+            latin:keyStyle="functionalKeyStyle"
             latin:keyWidth="20%p"
-            latin:isModifier="true"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -73,19 +75,15 @@
             latin:codes="57"
             latin:keyIcon="@drawable/sym_keyboard_num9" />
         <Key
-            latin:codes="@integer/key_delete"
-            latin:keyIcon="@drawable/sym_keyboard_delete"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+            latin:keyStyle="deleteKeyStyle"
             latin:keyWidth="20%p"
-            latin:isModifier="true"
-            latin:isRepeatable="true"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
         latin:rowEdgeFlags="bottom"
     >
         <Key
-            latin:codes="@integer/key_symbol"
+            latin:codes="@integer/key_switch_alpha_symbol"
             latin:keyIcon="@drawable/sym_keyboard_numalt"
             latin:iconPreview="@drawable/sym_keyboard_feedback_numalt"
             latin:keyEdgeFlags="left" />
@@ -97,10 +95,8 @@
             latin:keyIcon="@drawable/sym_keyboard_space"
             latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
         <Key
-            latin:codes="@integer/key_return"
-            latin:keyIcon="@drawable/sym_keyboard_return"
+            latin:keyStyle="returnKeyStyle"
             latin:keyWidth="20%p"
-            latin:isModifier="true"
             latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml/kbd_phone_black.xml b/java/res/xml/kbd_phone_black.xml
index 86759d6..75ce34a 100644
--- a/java/res/xml/kbd_phone_black.xml
+++ b/java/res/xml/kbd_phone_black.xml
@@ -82,7 +82,7 @@
         latin:rowEdgeFlags="bottom"
     >
         <Key
-            latin:codes="@integer/key_symbol"
+            latin:codes="@integer/key_switch_alpha_symbol"
             latin:keyIcon="@drawable/sym_bkeyboard_numalt"
             latin:iconPreview="@drawable/sym_keyboard_feedback_numalt" />
         <Key
diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml
index 1c691d2..d53107a 100644
--- a/java/res/xml/kbd_phone_symbols.xml
+++ b/java/res/xml/kbd_phone_symbols.xml
@@ -25,6 +25,7 @@
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
+    <include latin:keyboardLayout="@xml/kbd_functional_key_style" />
     <Row
         latin:rowEdgeFlags="top"
     >
@@ -37,8 +38,8 @@
             latin:keyLabel=")" />
         <Key
             latin:keyLabel="-"
+            latin:keyStyle="functionalKeyStyle"
             latin:keyWidth="20%p"
-            latin:isModifier="true"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -54,8 +55,8 @@
             latin:keyLabel="," />
         <Key
             latin:keyLabel="."
+            latin:keyStyle="functionalKeyStyle"
             latin:keyWidth="20%p"
-            latin:isModifier="true"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -71,19 +72,15 @@
             latin:codes="35"
             latin:keyIcon="@drawable/sym_keyboard_numpound" />
         <Key
-            latin:codes="@integer/key_delete"
-            latin:keyIcon="@drawable/sym_keyboard_delete"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+            latin:keyStyle="deleteKeyStyle"
             latin:keyWidth="20%p"
-            latin:isModifier="true"
-            latin:isRepeatable="true"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
         latin:rowEdgeFlags="bottom"
     >
         <Key
-            latin:codes="@integer/key_symbol"
+            latin:codes="@integer/key_switch_alpha_symbol"
             latin:keyLabel="@string/label_phone_key"
             latin:keyEdgeFlags="left" />
         <Key
@@ -93,10 +90,8 @@
             latin:keyIcon="@drawable/sym_keyboard_space"
             latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
         <Key
-            latin:codes="@integer/key_return"
-            latin:keyIcon="@drawable/sym_keyboard_return"
+            latin:keyStyle="returnKeyStyle"
             latin:keyWidth="20%p"
-            latin:isModifier="true"
             latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml/kbd_phone_symbols_black.xml b/java/res/xml/kbd_phone_symbols_black.xml
index 3e46c53..06db969 100644
--- a/java/res/xml/kbd_phone_symbols_black.xml
+++ b/java/res/xml/kbd_phone_symbols_black.xml
@@ -80,7 +80,7 @@
         latin:rowEdgeFlags="bottom"
     >
         <Key
-            latin:codes="@integer/key_symbol"
+            latin:codes="@integer/key_switch_alpha_symbol"
             latin:keyLabel="@string/label_phone_key"
             latin:keyEdgeFlags="left" />
         <Key
diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml
index 517b4fe..aac4dfa 100644
--- a/java/res/xml/kbd_qwerty.xml
+++ b/java/res/xml/kbd_qwerty.xml
@@ -25,6 +25,8 @@
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
+    <include
+        latin:keyboardLayout="@xml/kbd_functional_key_style" />
     <Row
         latin:rowEdgeFlags="top"
     >
@@ -117,12 +119,8 @@
     </Row>
     <Row>
         <Key
-            latin:codes="@integer/key_shift"
-            latin:keyIcon="@drawable/sym_keyboard_shift"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_shift"
+            latin:keyStyle="shiftKeyStyle"
             latin:keyWidth="15%p"
-            latin:isModifier="true"
-            latin:isSticky="true"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="z"
@@ -147,13 +145,10 @@
         <Key
             latin:keyLabel="m" />
         <Key
-            latin:codes="@integer/key_delete"
-            latin:keyIcon="@drawable/sym_keyboard_delete"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+            latin:keyStyle="deleteKeyStyle"
             latin:keyWidth="15%p"
-            latin:isModifier="true"
-            latin:isRepeatable="true"
             latin:keyEdgeFlags="right" />
     </Row>
-    <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
+    <include
+        latin:keyboardLayout="@xml/kbd_qwerty_row4" />
 </Keyboard>
diff --git a/java/res/xml/kbd_qwerty_black_symbol.xml b/java/res/xml/kbd_qwerty_black_symbol.xml
index c1ef170..840db9c 100644
--- a/java/res/xml/kbd_qwerty_black_symbol.xml
+++ b/java/res/xml/kbd_qwerty_black_symbol.xml
@@ -34,7 +34,7 @@
                     latin:hasVoiceKey="false"
                 >
                     <Key
-                        latin:codes="@integer/key_symbol"
+                        latin:codes="@integer/key_switch_alpha_symbol"
                         latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
                         latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
                         latin:keyWidth="20%p"
@@ -43,7 +43,7 @@
                 </case>
                 <default>
                     <Key
-                        latin:codes="@integer/key_symbol"
+                        latin:codes="@integer/key_switch_alpha_symbol"
                         latin:keyLabel="@string/label_symbol_key"
                         latin:keyWidth="20%p"
                         latin:isModifier="true"
@@ -63,7 +63,7 @@
                     latin:hasVoiceKey="false"
                 >
                     <Key
-                        latin:codes="@integer/key_symbol"
+                        latin:codes="@integer/key_switch_alpha_symbol"
                         latin:keyIcon="@drawable/sym_bkeyboard_123_mic"
                         latin:iconPreview="@drawable/sym_keyboard_feedback_123_mic"
                         latin:keyWidth="15%p"
@@ -72,7 +72,7 @@
                 </case>
                 <default>
                     <Key
-                        latin:codes="@integer/key_symbol"
+                        latin:codes="@integer/key_switch_alpha_symbol"
                         latin:keyLabel="@string/label_symbol_key"
                         latin:keyWidth="15%p"
                         latin:isModifier="true"
diff --git a/java/res/xml/kbd_qwerty_f1.xml b/java/res/xml/kbd_qwerty_f1.xml
index 23e494c..1f0ccfb 100644
--- a/java/res/xml/kbd_qwerty_f1.xml
+++ b/java/res/xml/kbd_qwerty_f1.xml
@@ -40,23 +40,24 @@
                 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" />
+            <switch>
+                <case
+                    latin:hasVoiceKey="true"
+                >
+                    <Key
+                        latin:keyStyle="micKeyStyle" />
+                </case>
+                <case
+                    latin:hasVoiceKey="false"
+                >
+                    <Key
+                        latin:keyLabel=","
+                        latin:popupKeyboard="@xml/popup_comma"
+                        latin:keyHintIcon="@drawable/hint_popup"
+                        latin:isModifier="true" />
+                </case>
+            </switch>
         </default>
     </switch>
 </merge>
diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml
index a5113ea..cd03c51 100644
--- a/java/res/xml/kbd_qwerty_row4.xml
+++ b/java/res/xml/kbd_qwerty_row4.xml
@@ -29,8 +29,10 @@
             <case
                 latin:hasSettingsKey="false"
             >
-                <include
-                    latin:keyboardLayout="@xml/kbd_qwerty_symbol" />
+                <Key
+                    latin:keyStyle="toSymbolKeyStyle"
+                    latin:keyWidth="20%p"
+                    latin:keyEdgeFlags="left" />
                 <include
                     latin:keyboardLayout="@xml/kbd_qwerty_f1" />
                 <switch>
@@ -38,52 +40,36 @@
                         latin:mode="web"
                     >
                         <Key
-                            latin:codes="@integer/key_space"
-                            latin:keyIcon="@drawable/sym_keyboard_space"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_space"
-                            latin:keyWidth="20%p"
-                            latin:isModifier="true" />
+                            latin:keyStyle="spaceKeyStyle"
+                            latin:keyWidth="20%p" />
                         <Key
-                            latin:codes="@integer/key_tab"
-                            latin:keyIcon="@drawable/sym_keyboard_tab"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_tab"
-                            latin:keyWidth="20%p"
-                            latin:isModifier="true" />
+                            latin:keyStyle="tabKeyStyle"
+                            latin:keyWidth="20%p" />
                     </case>
                     <default>
                         <Key
-                            latin:codes="@integer/key_space"
-                            latin:keyIcon="@drawable/sym_keyboard_space"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_space"
-                            latin:keyWidth="40%p"
-                            latin:isModifier="true" />
+                            latin:keyStyle="spaceKeyStyle"
+                            latin:keyWidth="40%p" />
                     </default>
                 </switch>
                 <Key
                     latin:keyLabel="."
                     latin:keyHintIcon="@drawable/hint_popup"
                     latin:popupKeyboard="@xml/popup_punctuation"
-                    latin:isModifier="true" />
+                    latin:keyStyle="functionalKeyStyle" />
                 <switch>
                     <case
                         latin:mode="im"
                     >
                         <Key
-                            latin:keyLabel=":-)"
-                            latin:keyOutputText=":-) "
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupKeyboard="@xml/popup_smileys"
+                            latin:keyStyle="smileyKeyStyle"
                             latin:keyWidth="20%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
-                            latin:codes="@integer/key_return"
-                            latin:keyIcon="@drawable/sym_keyboard_return"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+                            latin:keyStyle="returnKeyStyle"
                             latin:keyWidth="20%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
@@ -91,13 +77,12 @@
             <case
                 latin:hasSettingsKey="true"
             >
-                <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" />
+                    latin:keyStyle="toSymbolKeyStyle"
+                    latin:keyWidth="15%p"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyStyle="settingsKeyStyle" />
                 <include
                     latin:keyboardLayout="@xml/kbd_qwerty_f1" />
                 <switch>
@@ -105,62 +90,43 @@
                         latin:mode="web"
                     >
                         <Key
-                            latin:codes="@integer/key_space"
-                            latin:keyIcon="@drawable/sym_keyboard_space"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_space"
-                            latin:keyWidth="30%p"
-                            latin:isModifier="true" />
+                            latin:keyStyle="spaceKeyStyle"
+                            latin:keyWidth="30%p" />
                         <Key
-                            latin:codes="@integer/key_tab"
-                            latin:keyIcon="@drawable/sym_keyboard_tab"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_tab"
-                            latin:isModifier="true" />
+                            latin:keyStyle="tabKeyStyle" />
                     </case>
                     <default>
                         <Key
-                            latin:codes="@integer/key_space"
-                            latin:keyIcon="@drawable/sym_keyboard_space"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_space"
-                            latin:keyWidth="30%p"
-                            latin:isModifier="true" />
+                            latin:keyStyle="spaceKeyStyle"
+                            latin:keyWidth="30%p" />
                     </default>
                 </switch>
                 <Key
                     latin:keyLabel="."
                     latin:keyHintIcon="@drawable/hint_popup"
                     latin:popupKeyboard="@xml/popup_punctuation"
-                    latin:isModifier="true" />
+                    latin:keyStyle="functionalKeyStyle" />
                 <switch>
                     <case
                         latin:mode="im"
                     >
                         <Key
-                            latin:keyLabel=":-)"
-                            latin:keyOutputText=":-) "
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupKeyboard="@xml/popup_smileys"
+                            latin:keyStyle="smileyKeyStyle"
                             latin:keyWidth="25%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <case
                         latin:mode="web"
                     >
                         <Key
-                            latin:codes="@integer/key_return"
-                            latin:keyIcon="@drawable/sym_keyboard_return"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+                            latin:keyStyle="returnKeyStyle"
                             latin:keyWidth="15%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
-                            latin:codes="@integer/key_return"
-                            latin:keyIcon="@drawable/sym_keyboard_return"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+                            latin:keyStyle="returnKeyStyle"
                             latin:keyWidth="25%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
diff --git a/java/res/xml/kbd_qwerty_symbol.xml b/java/res/xml/kbd_qwerty_symbol.xml
deleted file mode 100644
index e90091c..0000000
--- a/java/res/xml/kbd_qwerty_symbol.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"
->
-    <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.xml b/java/res/xml/kbd_symbols.xml
index 55b7681..e9df816 100644
--- a/java/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -25,6 +25,8 @@
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
+    <include
+        latin:keyboardLayout="@xml/kbd_functional_key_style" />
     <Row
         latin:rowEdgeFlags="top"
     >
@@ -105,11 +107,8 @@
     </Row>
     <Row>
         <Key
-            latin:codes="@integer/key_shift"
-            latin:keyLabel="@string/label_alt_key"
+            latin:keyStyle="altKeyStyle"
             latin:keyWidth="15%p"
-            latin:isModifier="true"
-            latin:isSticky="true"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="!"
@@ -134,12 +133,8 @@
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="¿" />
         <Key
-            latin:codes="@integer/key_delete"
-            latin:keyIcon="@drawable/sym_keyboard_delete"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+            latin:keyStyle="deleteKeyStyle"
             latin:keyWidth="15%p"
-            latin:isModifier="true"
-            latin:isRepeatable="true"
             latin:keyEdgeFlags="right" />
     </Row>
     <include latin:keyboardLayout="@xml/kbd_symbols_row4" />
diff --git a/java/res/xml/kbd_symbols_black_row4.xml b/java/res/xml/kbd_symbols_black_row4.xml
index a50f8c0..57f491b 100644
--- a/java/res/xml/kbd_symbols_black_row4.xml
+++ b/java/res/xml/kbd_symbols_black_row4.xml
@@ -29,8 +29,8 @@
                 latin:hasSettingsKey="false"
             >
                 <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_alpha_key"
+                    latin:codes="@integer/key_switch_alpha_symbol"
+                    latin:keyLabel="@string/label_to_alpha_key"
                     latin:keyWidth="20%p"
                     latin:keyEdgeFlags="left" />
                 <include
@@ -70,8 +70,8 @@
                 latin:hasSettingsKey="true"
             >
                 <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_alpha_key"
+                    latin:codes="@integer/key_switch_alpha_symbol"
+                    latin:keyLabel="@string/label_to_alpha_key"
                     latin:keyWidth="15%p"
                     latin:keyEdgeFlags="left" />
                 <Key
diff --git a/java/res/xml/kbd_symbols_f1.xml b/java/res/xml/kbd_symbols_f1.xml
index 39c411a..07ee4ed 100644
--- a/java/res/xml/kbd_symbols_f1.xml
+++ b/java/res/xml/kbd_symbols_f1.xml
@@ -26,12 +26,7 @@
             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" />
+                latin:keyStyle="micKeyStyle" />
         </case>
         <case
             latin:hasVoiceKey="false"
@@ -40,7 +35,7 @@
                 latin:keyLabel=","
                 latin:popupKeyboard="@xml/popup_comma"
                 latin:keyHintIcon="@drawable/hint_popup"
-                latin:isModifier="true" />
+                latin:keyStyle="functionalKeyStyle" />
         </case>
     </switch>
 </merge>
diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml
index f012a4d..1a5417d 100644
--- a/java/res/xml/kbd_symbols_row4.xml
+++ b/java/res/xml/kbd_symbols_row4.xml
@@ -29,44 +29,32 @@
                 latin:hasSettingsKey="false"
             >
                 <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_alpha_key"
+                    latin:keyStyle="toAlphaKeyStyle"
                     latin:keyWidth="20%p"
-                    latin:isModifier="true"
                     latin:keyEdgeFlags="left" />
                 <include
                     latin:keyboardLayout="@xml/kbd_symbols_f1" />
                 <Key
-                    latin:codes="@integer/key_space"
-                    latin:keyIcon="@drawable/sym_keyboard_space"
-                    latin:iconPreview="@drawable/sym_keyboard_feedback_space"
-                    latin:keyWidth="40%p"
-                    latin:isModifier="true" />
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyWidth="40%p" />
                 <Key
                     latin:keyLabel="."
                     latin:keyHintIcon="@drawable/hint_popup"
                     latin:popupKeyboard="@xml/popup_punctuation"
-                    latin:isModifier="true" />
+                    latin:keyStyle="functionalKeyStyle" />
                 <switch>
                     <case
                         latin:mode="im"
                     >
                         <Key
-                            latin:keyLabel=":-)"
-                            latin:keyOutputText=":-) "
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupKeyboard="@xml/popup_smileys"
+                            latin:keyStyle="smileyKeyStyle"
                             latin:keyWidth="20%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
-                            latin:codes="@integer/key_return"
-                            latin:keyIcon="@drawable/sym_keyboard_return"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+                            latin:keyStyle="returnKeyStyle"
                             latin:keyWidth="20%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
@@ -75,49 +63,34 @@
                 latin:hasSettingsKey="true"
             >
                 <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_alpha_key"
+                    latin:keyStyle="toAlphaKeyStyle"
                     latin:keyWidth="15%p"
-                    latin:isModifier="true"
                     latin:keyEdgeFlags="left" />
                 <Key
-                    latin:codes="@integer/key_settings"
-                    latin:keyIcon="@drawable/sym_keyboard_settings"
-                    latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
-                    latin:isModifier="true" />
+                    latin:keyStyle="settingsKeyStyle" />
                 <include
                     latin:keyboardLayout="@xml/kbd_symbols_f1" />
                 <Key
-                    latin:codes="@integer/key_space"
-                    latin:keyIcon="@drawable/sym_keyboard_space"
-                    latin:iconPreview="@drawable/sym_keyboard_feedback_space"
-                    latin:keyWidth="30%p"
-                    latin:isModifier="true" />
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyWidth="30%p" />
                 <Key
                     latin:keyLabel="."
                     latin:keyHintIcon="@drawable/hint_popup"
                     latin:popupKeyboard="@xml/popup_punctuation"
-                    latin:isModifier="true" />
+                    latin:keyStyle="functionalKeyStyle" />
                 <switch>
                     <case
                         latin:mode="im"
                     >
                         <Key
-                            latin:keyLabel=":-)"
-                            latin:keyOutputText=":-) "
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupKeyboard="@xml/popup_smileys"
+                            latin:keyStyle="smileyKeyStyle"
                             latin:keyWidth="25%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
-                            latin:codes="@integer/key_return"
-                            latin:keyIcon="@drawable/sym_keyboard_return"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+                            latin:keyStyle="returnKeyStyle"
                             latin:keyWidth="25%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml
index 5279656..f3e79f7 100644
--- a/java/res/xml/kbd_symbols_shift.xml
+++ b/java/res/xml/kbd_symbols_shift.xml
@@ -25,6 +25,8 @@
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:keyHeight="@dimen/key_height"
 >
+    <include
+        latin:keyboardLayout="@xml/kbd_functional_key_style" />
     <Row
         latin:rowEdgeFlags="top"
     >
@@ -58,7 +60,8 @@
     <Row>
         <Key
             latin:codes="@integer/key_tab"
-            latin:keyLabel="\u21E5"
+            latin:keyIcon="@drawable/sym_keyboard_tab"
+            latin:iconPreview="@drawable/sym_keyboard_feedback_tab"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="£" />
@@ -86,11 +89,8 @@
     </Row>
     <Row>
         <Key
-            latin:codes="@integer/key_shift"
-            latin:keyLabel="@string/label_alt_key"
+            latin:keyStyle="shiftKeyStyle"
             latin:keyWidth="15%p"
-            latin:isModifier="true"
-            latin:isSticky="true"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="™" />
@@ -113,12 +113,8 @@
             latin:popupKeyboard="@xml/kbd_popup_template"
             latin:popupCharacters="≥»›" />
         <Key
-            latin:codes="@integer/key_delete"
-            latin:keyIcon="@drawable/sym_keyboard_delete"
-            latin:iconPreview="@drawable/sym_keyboard_feedback_delete"
+            latin:keyStyle="deleteKeyStyle"
             latin:keyWidth="15%p"
-            latin:isModifier="true"
-            latin:isRepeatable="true"
             latin:keyEdgeFlags="right" />
     </Row>
     <include latin:keyboardLayout="@xml/kbd_symbols_shift_row4" />
diff --git a/java/res/xml/kbd_symbols_shift_black_row4.xml b/java/res/xml/kbd_symbols_shift_black_row4.xml
index 4e5ddcd..731cc6e 100644
--- a/java/res/xml/kbd_symbols_shift_black_row4.xml
+++ b/java/res/xml/kbd_symbols_shift_black_row4.xml
@@ -29,8 +29,8 @@
                 latin:hasSettingsKey="false"
             >
                 <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_alpha_key"
+                    latin:codes="@integer/key_switch_alpha_symbol"
+                    latin:keyLabel="@string/label_to_alpha_key"
                     latin:keyWidth="20%p"
                     latin:keyEdgeFlags="left" />
                 <Key
@@ -68,8 +68,8 @@
                 latin:hasSettingsKey="true"
             >
                 <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_alpha_key"
+                    latin:codes="@integer/key_switch_alpha_symbol"
+                    latin:keyLabel="@string/label_to_alpha_key"
                     latin:keyWidth="15%p"
                     latin:keyEdgeFlags="left" />
                 <Key
diff --git a/java/res/xml/kbd_symbols_shift_row4.xml b/java/res/xml/kbd_symbols_shift_row4.xml
index 170c8b9..9159bab 100644
--- a/java/res/xml/kbd_symbols_shift_row4.xml
+++ b/java/res/xml/kbd_symbols_shift_row4.xml
@@ -29,43 +29,31 @@
                 latin:hasSettingsKey="false"
             >
                 <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_alpha_key"
+                    latin:keyStyle="toAlphaKeyStyle"
                     latin:keyWidth="20%p"
-                    latin:isModifier="true"
                     latin:keyEdgeFlags="left" />
                 <Key
                     latin:keyLabel="„"
-                    latin:isModifier="true" />
+                    latin:keyStyle="functionalKeyStyle" />
                 <Key
-                    latin:codes="@integer/key_space"
-                    latin:keyIcon="@drawable/sym_keyboard_space"
-                    latin:iconPreview="@drawable/sym_keyboard_feedback_space"
-                    latin:keyWidth="40%p"
-                    latin:isModifier="true" />
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyWidth="40%p" />
                 <Key
                     latin:keyLabel="…"
-                    latin:isModifier="true" />
+                    latin:keyStyle="functionalKeyStyle" />
                 <switch>
                     <case
                         latin:mode="im"
                     >
                         <Key
-                            latin:keyLabel=":-)"
-                            latin:keyOutputText=":-) "
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupKeyboard="@xml/popup_smileys"
+                            latin:keyStyle="smileyKeyStyle"
                             latin:keyWidth="20%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
-                            latin:codes="@integer/key_return"
-                            latin:keyIcon="@drawable/sym_keyboard_return"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+                            latin:keyStyle="returnKeyStyle"
                             latin:keyWidth="20%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
@@ -74,48 +62,33 @@
                 latin:hasSettingsKey="true"
             >
                 <Key
-                    latin:codes="@integer/key_symbol"
-                    latin:keyLabel="@string/label_alpha_key"
+                    latin:keyStyle="toAlphaKeyStyle"
                     latin:keyWidth="15%p"
-                    latin:isModifier="true"
                     latin:keyEdgeFlags="left" />
                 <Key
-                    latin:codes="@integer/key_settings"
-                    latin:keyIcon="@drawable/sym_keyboard_settings"
-                    latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
-                    latin:isModifier="true" />
+                    latin:keyStyle="settingsKeyStyle" />
                 <Key
                     latin:keyLabel="„"
-                    latin:isModifier="true" />
+                    latin:keyStyle="functionalKeyStyle" />
                 <Key
-                    latin:codes="@integer/key_space"
-                    latin:keyIcon="@drawable/sym_keyboard_space"
-                    latin:iconPreview="@drawable/sym_keyboard_feedback_space"
-                    latin:keyWidth="30%p"
-                    latin:isModifier="true" />
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyWidth="30%p" />
                 <Key
                     latin:keyLabel="…"
-                    latin:isModifier="true" />
+                    latin:keyStyle="functionalKeyStyle" />
                 <switch>
                     <case
                         latin:mode="im"
                     >
                         <Key
-                            latin:keyLabel=":-)"
-                            latin:keyOutputText=":-) "
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupKeyboard="@xml/popup_smileys"
+                            latin:keyStyle="smileyKeyStyle"
                             latin:keyWidth="25%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
-                            latin:codes="@integer/key_return"
-                            latin:keyIcon="@drawable/sym_keyboard_return"
-                            latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+                            latin:keyStyle="returnKeyStyle"
                             latin:keyWidth="25%p"
-                            latin:isModifier="true"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>