Merge "Don't autocorrect after suggestion resuming" into jb-dev
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index e258f3b..69fdea7 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -248,23 +248,23 @@
     <!-- Title of the item to change the keyboard theme [CHAR LIMIT=20]-->
     <string name="keyboard_layout">Keyboard theme</string>
 
-    <!-- Description for English (United Kingdom) keyboard subtype [CHAR LIMIT=22] -->
+    <!-- Description for English (United Kingdom) keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_en_GB">English (UK)</string>
-    <!-- Description for English (United States) keyboard subtype [CHAR LIMIT=22] -->
+    <!-- Description for English (United States) keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_en_US">English (US)</string>
-    <!-- Description for language agnostic keyboard subtype [CHAR LIMIT=22] -->
+    <!-- Description for language agnostic keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_no_language">No language</string>
-    <!-- Description for language agnostic QWERTY keyboard subtype [CHAR LIMIT=22] -->
+    <!-- Description for language agnostic QWERTY keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_no_language_qwerty">No language (QWERTY)</string>
-    <!-- Description for language agnostic QWERTZ keyboard subtype [CHAR LIMIT=22] -->
+    <!-- Description for language agnostic QWERTZ keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_no_language_qwertz">No language (QWERTZ)</string>
-    <!-- Description for language agnostic AZERTY keyboard subtype [CHAR LIMIT=22] -->
+    <!-- Description for language agnostic AZERTY keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_no_language_azerty">No language (AZERTY)</string>
-    <!-- Description for language agnostic Dvorak keyboard subtype [CHAR LIMIT=22] -->
+    <!-- Description for language agnostic Dvorak keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_no_language_dvorak">No language (Dvorak)</string>
-    <!-- Description for language agnostic Colemak keyboard subtype [CHAR LIMIT=22] -->
+    <!-- Description for language agnostic Colemak keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_no_language_colemak">No language (Colemak)</string>
-    <!-- Description for language agnostic PC QWERTY keyboard subtype [CHAR LIMIT=22] -->
+    <!-- Description for language agnostic PC QWERTY keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_no_language_pcqwerty">No language (PC)</string>
 
     <!-- Title of the preference settings for custom input styles (language and keyboard layout pairs) [CHAR LIMIT=35]-->
diff --git a/java/res/xml-sw600dp-land/kbd_number.xml b/java/res/xml-sw600dp-land/kbd_number.xml
index 9d358b6..cb86b3b 100644
--- a/java/res/xml-sw600dp-land/kbd_number.xml
+++ b/java/res/xml-sw600dp-land/kbd_number.xml
@@ -21,7 +21,7 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHorizontalEdgesPadding="10%p"
-    latin:keyWidth="15.00%p"
+    latin:keyWidth="18%p"
 >
     <include
         latin:keyboardLayout="@xml/rows_number" />
diff --git a/java/res/xml-sw600dp-land/kbd_phone.xml b/java/res/xml-sw600dp-land/kbd_phone.xml
index abac6bd..71c7c04 100644
--- a/java/res/xml-sw600dp-land/kbd_phone.xml
+++ b/java/res/xml-sw600dp-land/kbd_phone.xml
@@ -21,7 +21,7 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHorizontalEdgesPadding="10%p"
-    latin:keyWidth="15.00%p"
+    latin:keyWidth="18%p"
 >
     <include
         latin:keyboardLayout="@xml/rows_phone" />
diff --git a/java/res/xml-sw600dp-land/kbd_phone_symbols.xml b/java/res/xml-sw600dp-land/kbd_phone_symbols.xml
index e3f56bc..39bdae3 100644
--- a/java/res/xml-sw600dp-land/kbd_phone_symbols.xml
+++ b/java/res/xml-sw600dp-land/kbd_phone_symbols.xml
@@ -21,7 +21,7 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardHorizontalEdgesPadding="10%p"
-    latin:keyWidth="15.00%p"
+    latin:keyWidth="18%p"
 >
     <!-- Tablet doesn't have phone symbols keyboard -->
     <include
diff --git a/java/res/xml-sw600dp/kbd_number.xml b/java/res/xml-sw600dp/kbd_number.xml
index 70cf6a2..4a8b08c 100644
--- a/java/res/xml-sw600dp/kbd_number.xml
+++ b/java/res/xml-sw600dp/kbd_number.xml
@@ -20,7 +20,7 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:keyWidth="15.00%p"
+    latin:keyWidth="18%p"
 >
     <include
         latin:keyboardLayout="@xml/rows_number" />
diff --git a/java/res/xml-sw600dp/kbd_phone.xml b/java/res/xml-sw600dp/kbd_phone.xml
index 72acef2..f63f1c6 100644
--- a/java/res/xml-sw600dp/kbd_phone.xml
+++ b/java/res/xml-sw600dp/kbd_phone.xml
@@ -20,7 +20,7 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:keyWidth="15.00%p"
+    latin:keyWidth="18%p"
 >
     <include
         latin:keyboardLayout="@xml/rows_phone" />
diff --git a/java/res/xml-sw600dp/kbd_phone_symbols.xml b/java/res/xml-sw600dp/kbd_phone_symbols.xml
index 9faeaf4..a0f55b7 100644
--- a/java/res/xml-sw600dp/kbd_phone_symbols.xml
+++ b/java/res/xml-sw600dp/kbd_phone_symbols.xml
@@ -20,7 +20,7 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:keyWidth="15.00%p"
+    latin:keyWidth="18%p"
 >
     <!-- Tablet doesn't have phone symbols keyboard -->
     <include
diff --git a/java/res/xml-sw600dp/rows_number_normal.xml b/java/res/xml-sw600dp/rows_number_normal.xml
index 04d2953..3954b00 100644
--- a/java/res/xml-sw600dp/rows_number_normal.xml
+++ b/java/res/xml-sw600dp/rows_number_normal.xml
@@ -22,25 +22,22 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row>
-        <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
-        <Spacer
-            latin:keyWidth="12.75%p" />
         <Key
             latin:keyLabel="-"
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyLabel="+"
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyLabel="."
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyLabel="1"
             latin:keyStyle="numKeyStyle"
-            latin:keyXPos="42.25%p" />
+            latin:keyXPos="31%p" />
         <Key
             latin:keyLabel="2"
             latin:keyStyle="numKeyStyle" />
@@ -49,20 +46,17 @@
             latin:keyStyle="numKeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyXPos="-11.00%p"
+            latin:keyXPos="-14%p"
             latin:keyWidth="fillRight" />
     </Row>
     <Row>
-        <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
-        <Spacer
-            latin:keyWidth="12.75%p" />
         <Key
             latin:keyStyle="numStarKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyLabel="/"
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <switch>
             <case
                 latin:mode="time|datetime"
@@ -72,19 +66,19 @@
                     latin:keyLabelFlags="hasPopupHint"
                     latin:moreKeys="!text/more_keys_for_am_pm"
                     latin:keyStyle="numKeyStyle"
-                    latin:keyWidth="9.25%p" />
+                    latin:keyWidth="10%p" />
             </case>
             <default>
                 <Key
                     latin:keyLabel=","
                     latin:keyStyle="numKeyStyle"
-                    latin:keyWidth="9.25%p" />
+                    latin:keyWidth="10%p" />
             </default>
         </switch>
         <Key
             latin:keyLabel="4"
             latin:keyStyle="numKeyStyle"
-            latin:keyXPos="42.25%p" />
+            latin:keyXPos="31%p" />
         <Key
             latin:keyLabel="5"
             latin:keyStyle="numKeyStyle" />
@@ -93,21 +87,18 @@
             latin:keyStyle="numKeyStyle" />
         <Key
             latin:keyStyle="enterKeyStyle"
-            latin:keyXPos="-11.00%p"
+            latin:keyXPos="-14%p"
             latin:keyWidth="fillRight" />
     </Row>
     <Row>
-        <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
-        <Spacer
-            latin:keyWidth="12.75%p" />
         <Key
             latin:keyLabel="("
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyLabel=")"
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <switch>
             <case
                 latin:mode="time|datetime"
@@ -115,19 +106,19 @@
                 <Key
                     latin:keyLabel=":"
                     latin:keyStyle="numKeyStyle"
-                    latin:keyWidth="9.25%p" />
+                    latin:keyWidth="10%p" />
             </case>
             <default>
                 <Key
                     latin:keyLabel="="
                     latin:keyStyle="numKeyStyle"
-                    latin:keyWidth="9.25%p" />
+                    latin:keyWidth="10%p" />
             </default>
         </switch>
         <Key
             latin:keyLabel="7"
             latin:keyStyle="numKeyStyle"
-            latin:keyXPos="42.25%p" />
+            latin:keyXPos="31%p" />
         <Key
             latin:keyLabel="8"
             latin:keyStyle="numKeyStyle" />
@@ -139,15 +130,11 @@
     </Row>
     <Row>
         <Key
-            latin:keyStyle="numTabKeyStyle"
-            latin:keyWidth="11.00%p" />
-        <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="27.75%p"
-            latin:keyXPos="12.75%p" />
+            latin:keyWidth="30%p" />
         <Key
             latin:keyStyle="numStarKeyStyle"
-            latin:keyXPos="42.25%p" />
+            latin:keyXPos="31%p" />
         <Key
             latin:keyLabel="0"
             latin:keyStyle="numKeyStyle" />
@@ -155,7 +142,7 @@
             latin:keyLabel="#"
             latin:keyStyle="numKeyStyle" />
         <include
-            latin:keyXPos="-11.0%p"
+            latin:keyXPos="-10%p"
             latin:keyWidth="fillRight"
             latin:keyboardLayout="@xml/key_shortcut" />
     </Row>
diff --git a/java/res/xml-sw600dp/rows_number_password.xml b/java/res/xml-sw600dp/rows_number_password.xml
index 2a2c33d..36f4bba 100644
--- a/java/res/xml-sw600dp/rows_number_password.xml
+++ b/java/res/xml-sw600dp/rows_number_password.xml
@@ -24,7 +24,7 @@
     <Row>
         <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
         <Spacer
-            latin:keyWidth="27.50%p" />
+            latin:keyWidth="23%p" />
         <Key
             latin:keyStyle="num1KeyStyle" />
         <Key
@@ -33,13 +33,13 @@
             latin:keyStyle="num3KeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyXPos="-11.00%p"
+            latin:keyXPos="-16%p"
             latin:keyWidth="fillRight" />
     </Row>
     <Row>
         <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
         <Spacer
-            latin:keyWidth="27.50%p" />
+            latin:keyWidth="23%p" />
         <Key
             latin:keyStyle="num4KeyStyle" />
         <Key
@@ -48,13 +48,13 @@
             latin:keyStyle="num6KeyStyle" />
         <Key
             latin:keyStyle="enterKeyStyle"
-            latin:keyXPos="-11.00%p"
+            latin:keyXPos="-16%p"
             latin:keyWidth="fillRight" />
     </Row>
     <Row>
         <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
         <Spacer
-            latin:keyWidth="27.50%p" />
+            latin:keyWidth="23%p" />
         <Key
             latin:keyStyle="num7KeyStyle" />
         <Key
@@ -65,14 +65,13 @@
         <Spacer />
     </Row>
     <Row>
+        <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
+        <Spacer
+            latin:keyWidth="41%p" />
         <Key
-            latin:keyStyle="tabKeyStyle"
-            latin:keyWidth="11.00%p" />
-        <Key
-            latin:keyStyle="num0KeyStyle"
-            latin:keyXPos="42.50%p"/>
+            latin:keyStyle="num0KeyStyle" />
         <include
-            latin:keyXPos="-11.00%p"
+            latin:keyXPos="-10%p"
             latin:keyWidth="fillRight"
             latin:keyboardLayout="@xml/key_shortcut" />
     </Row>
diff --git a/java/res/xml-sw600dp/rows_phone.xml b/java/res/xml-sw600dp/rows_phone.xml
index 687cadb..113ce1f 100644
--- a/java/res/xml-sw600dp/rows_phone.xml
+++ b/java/res/xml-sw600dp/rows_phone.xml
@@ -26,79 +26,69 @@
     <include
         latin:keyboardLayout="@xml/key_styles_number" />
     <Row>
-        <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
-        <Spacer
-            latin:keyWidth="12.75%p" />
         <Key
             latin:keyLabel="-"
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyLabel="+"
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyStyle="numPauseKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyStyle="num1KeyStyle"
-            latin:keyXPos="42.25%p" />
+            latin:keyXPos="31%p" />
         <Key
             latin:keyStyle="num2KeyStyle" />
         <Key
             latin:keyStyle="num3KeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyXPos="-11.00%p"
+            latin:keyXPos="-14%p"
             latin:keyWidth="fillRight" />
     </Row>
     <Row>
-        <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
-        <Spacer
-            latin:keyWidth="12.75%p" />
         <Key
             latin:keyLabel=","
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyLabel="."
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyStyle="numWaitKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyStyle="num4KeyStyle"
-            latin:keyXPos="42.25%p" />
+            latin:keyXPos="31%p" />
         <Key
             latin:keyStyle="num5KeyStyle" />
         <Key
             latin:keyStyle="num6KeyStyle" />
         <Key
             latin:keyStyle="enterKeyStyle"
-            latin:keyXPos="-11.00%p"
+            latin:keyXPos="-14%p"
             latin:keyWidth="fillRight" />
     </Row>
     <Row>
-        <!-- Note: This Spacer prevents the below key from being marked as a left edge key. -->
-        <Spacer
-            latin:keyWidth="12.75%p" />
         <Key
             latin:keyLabel="("
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p"
-            latin:keyXPos="12.75%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyLabel=")"
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyLabel="N"
             latin:keyStyle="numKeyStyle"
-            latin:keyWidth="9.25%p" />
+            latin:keyWidth="10%p" />
         <Key
             latin:keyStyle="num7KeyStyle"
-            latin:keyXPos="42.25%p" />
+            latin:keyXPos="31%p" />
         <Key
             latin:keyStyle="num8KeyStyle" />
         <Key
@@ -108,22 +98,18 @@
     </Row>
     <Row>
         <Key
-            latin:keyStyle="numTabKeyStyle"
-            latin:keyWidth="11.00%p" />
-        <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="27.75%p"
-            latin:keyXPos="12.75%p" />
+            latin:keyWidth="30%p" />
         <Key
             latin:keyStyle="numStarKeyStyle"
-            latin:keyXPos="42.25%p" />
+            latin:keyXPos="31%p" />
         <Key
             latin:keyStyle="num0KeyStyle" />
         <Key
             latin:keyLabel="#"
             latin:keyStyle="numKeyStyle" />
         <include
-            latin:keyXPos="-11.0%p"
+            latin:keyXPos="-10%p"
             latin:keyWidth="fillRight"
             latin:keyboardLayout="@xml/key_shortcut" />
     </Row>
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 0d78c39..4d7fe3d 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -33,12 +33,10 @@
 
 import com.android.inputmethod.keyboard.internal.KeySpecParser;
 import com.android.inputmethod.keyboard.internal.KeySpecParser.MoreKeySpec;
-import com.android.inputmethod.keyboard.internal.KeyStyles;
 import com.android.inputmethod.keyboard.internal.KeyStyles.KeyStyle;
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.StringUtils;
-import com.android.inputmethod.latin.XmlParseUtils;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -201,7 +199,6 @@
      */
     public Key(Resources res, Keyboard.Params params, Keyboard.Builder.Row row,
             XmlPullParser parser) throws XmlPullParserException {
-        final KeyStyles keyStyles = params.mKeyStyles;
         final float horizontalGap = isSpacer() ? 0 : params.mHorizontalGap;
         final int keyHeight = row.mRowHeight;
         mVerticalGap = params.mVerticalGap;
@@ -210,17 +207,7 @@
         final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.Keyboard_Key);
 
-        final KeyStyle style;
-        if (keyAttr.hasValue(R.styleable.Keyboard_Key_keyStyle)) {
-            String styleName = keyAttr.getString(R.styleable.Keyboard_Key_keyStyle);
-            style = keyStyles.getKeyStyle(styleName);
-            if (style == null) {
-                throw new XmlParseUtils.ParseException("Unknown key style: " + styleName, parser);
-            }
-        } else {
-            style = keyStyles.getEmptyKeyStyle();
-        }
-
+        final KeyStyle style = params.mKeyStyles.getKeyStyle(keyAttr, parser);
         final float keyXPos = row.getKeyX(keyAttr);
         final float keyWidth = row.getKeyWidth(keyAttr, keyXPos);
         final int keyYPos = row.getKeyY();
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
index b32172e..80f4f25 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
@@ -32,24 +32,19 @@
     private static final String TAG = KeyStyles.class.getSimpleName();
     private static final boolean DEBUG = false;
 
-    private final HashMap<String, DeclaredKeyStyle> mStyles =
-            new HashMap<String, DeclaredKeyStyle>();
+    final HashMap<String, KeyStyle> mStyles = new HashMap<String, KeyStyle>();
 
-    private final KeyboardTextsSet mTextsSet;
+    final KeyboardTextsSet mTextsSet;
     private final KeyStyle mEmptyKeyStyle;
+    private static final String EMPTY_STYLE_NAME = "<empty>";
 
     public KeyStyles(KeyboardTextsSet textsSet) {
         mTextsSet = textsSet;
-        mEmptyKeyStyle = new EmptyKeyStyle(textsSet);
+        mEmptyKeyStyle = new EmptyKeyStyle();
+        mStyles.put(EMPTY_STYLE_NAME, mEmptyKeyStyle);
     }
 
-    public static abstract class KeyStyle {
-        protected final KeyboardTextsSet mTextsSet;
-
-        public KeyStyle(KeyboardTextsSet textsSet) {
-            mTextsSet = textsSet;
-        }
-
+    public abstract class KeyStyle {
         public abstract String[] getStringArray(TypedArray a, int index);
         public abstract String getString(TypedArray a, int index);
         public abstract int getInt(TypedArray a, int index, int defaultValue);
@@ -70,11 +65,7 @@
         }
     }
 
-    private static class EmptyKeyStyle extends KeyStyle {
-        public EmptyKeyStyle(KeyboardTextsSet textsSet) {
-            super(textsSet);
-        }
-
+    class EmptyKeyStyle extends KeyStyle {
         @Override
         public String[] getStringArray(TypedArray a, int index) {
             return parseStringArray(a, index);
@@ -96,11 +87,12 @@
         }
     }
 
-    private static class DeclaredKeyStyle extends KeyStyle {
+    private class DeclaredKeyStyle extends KeyStyle {
+        private final String mParentStyleName;
         private final HashMap<Integer, Object> mStyleAttributes = new HashMap<Integer, Object>();
 
-        public DeclaredKeyStyle(KeyboardTextsSet textsSet) {
-            super(textsSet);
+        public DeclaredKeyStyle(String parentStyleName) {
+            mParentStyleName = parentStyleName;
         }
 
         @Override
@@ -108,7 +100,11 @@
             if (a.hasValue(index)) {
                 return parseStringArray(a, index);
             }
-            return (String[])mStyleAttributes.get(index);
+            if (mStyleAttributes.containsKey(index)) {
+                return (String[])mStyleAttributes.get(index);
+            }
+            final KeyStyle parentStyle = mStyles.get(mParentStyleName);
+            return parentStyle.getStringArray(a, index);
         }
 
         @Override
@@ -116,7 +112,11 @@
             if (a.hasValue(index)) {
                 return parseString(a, index);
             }
-            return (String)mStyleAttributes.get(index);
+            if (mStyleAttributes.containsKey(index)) {
+                return (String)mStyleAttributes.get(index);
+            }
+            final KeyStyle parentStyle = mStyles.get(mParentStyleName);
+            return parentStyle.getString(a, index);
         }
 
         @Override
@@ -124,15 +124,21 @@
             if (a.hasValue(index)) {
                 return a.getInt(index, defaultValue);
             }
-            final Integer styleValue = (Integer)mStyleAttributes.get(index);
-            return styleValue != null ? styleValue : defaultValue;
+            if (mStyleAttributes.containsKey(index)) {
+                return (Integer)mStyleAttributes.get(index);
+            }
+            final KeyStyle parentStyle = mStyles.get(mParentStyleName);
+            return parentStyle.getInt(a, index, defaultValue);
         }
 
         @Override
         public int getFlag(TypedArray a, int index) {
-            final int value = a.getInt(index, 0);
-            final Integer styleValue = (Integer)mStyleAttributes.get(index);
-            return (styleValue != null ? styleValue : 0) | value;
+            int value = a.getInt(index, 0);
+            if (mStyleAttributes.containsKey(index)) {
+                value |= (Integer)mStyleAttributes.get(index);
+            }
+            final KeyStyle parentStyle = mStyles.get(mParentStyleName);
+            return value | parentStyle.getFlag(a, index);
         }
 
         void readKeyAttributes(TypedArray keyAttr) {
@@ -177,10 +183,6 @@
                 mStyleAttributes.put(index, parseStringArray(a, index));
             }
         }
-
-        void addParentStyleAttributes(DeclaredKeyStyle parentStyle) {
-            mStyleAttributes.putAll(parentStyle.mStyleAttributes);
-        }
     }
 
     public void parseKeyStyleAttributes(TypedArray keyStyleAttr, TypedArray keyAttrs,
@@ -195,26 +197,28 @@
             }
         }
 
-        final DeclaredKeyStyle style = new DeclaredKeyStyle(mTextsSet);
+        String parentStyleName = EMPTY_STYLE_NAME;
         if (keyStyleAttr.hasValue(R.styleable.Keyboard_KeyStyle_parentStyle)) {
-            final String parentStyle = keyStyleAttr.getString(
-                    R.styleable.Keyboard_KeyStyle_parentStyle);
-            final DeclaredKeyStyle parent = mStyles.get(parentStyle);
-            if (parent == null) {
+            parentStyleName = keyStyleAttr.getString(R.styleable.Keyboard_KeyStyle_parentStyle);
+            if (!mStyles.containsKey(parentStyleName)) {
                 throw new XmlParseUtils.ParseException(
-                        "Unknown parentStyle " + parentStyle, parser);
+                        "Unknown parentStyle " + parentStyleName, parser);
             }
-            style.addParentStyleAttributes(parent);
         }
+        final DeclaredKeyStyle style = new DeclaredKeyStyle(parentStyleName);
         style.readKeyAttributes(keyAttrs);
         mStyles.put(styleName, style);
     }
 
-    public KeyStyle getKeyStyle(String styleName) {
+    public KeyStyle getKeyStyle(TypedArray keyAttr, XmlPullParser parser)
+            throws XmlParseUtils.ParseException {
+        if (!keyAttr.hasValue(R.styleable.Keyboard_Key_keyStyle)) {
+            return mEmptyKeyStyle;
+        }
+        final String styleName = keyAttr.getString(R.styleable.Keyboard_Key_keyStyle);
+        if (!mStyles.containsKey(styleName)) {
+            throw new XmlParseUtils.ParseException("Unknown key style: " + styleName, parser);
+        }
         return mStyles.get(styleName);
     }
-
-    public KeyStyle getEmptyKeyStyle() {
-        return mEmptyKeyStyle;
-    }
 }