Merge "Suggest words with missing space"
diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml
index f7fc4b1..7df124b 100644
--- a/java/res/values-land/dimens.xml
+++ b/java/res/values-land/dimens.xml
@@ -19,8 +19,10 @@
 -->
 
 <resources>
+    <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+    <dimen name="keyboardHeight">1.060in</dimen>
     <!-- key_height + key_bottom_gap = popup_key_height -->
-    <dimen name="key_height">0.250in</dimen>
+<!--    <dimen name="key_height">0.250in</dimen>-->
     <dimen name="key_bottom_gap">0.020in</dimen>
     <dimen name="popup_key_height">0.270in</dimen>
     <dimen name="keyboard_top_padding">0.0in</dimen>
diff --git a/java/res/values-xlarge-land/dimens.xml b/java/res/values-xlarge-land/dimens.xml
index e1a53f9..5b9d50a 100644
--- a/java/res/values-xlarge-land/dimens.xml
+++ b/java/res/values-xlarge-land/dimens.xml
@@ -19,7 +19,8 @@
 -->
 
 <resources>
-    <dimen name="key_label_text_size">18dip</dimen>
+    <dimen name="key_letter_size">28dip</dimen>
+    <dimen name="key_label_text_size">20dip</dimen>
     <!-- left or right padding of label alignment -->
     <dimen name="key_label_horizontal_alignment_padding">18dip</dimen>
     <dimen name="candidate_strip_padding">40.0mm</dimen>
diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml
index dc1b5c3..dbdfa96 100644
--- a/java/res/values-xlarge/dimens.xml
+++ b/java/res/values-xlarge/dimens.xml
@@ -19,8 +19,10 @@
 -->
 
 <resources>
+    <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+    <dimen name="keyboardHeight">58.0mm</dimen>
     <!-- key_height + key_bottom_gap = popup_key_height -->
-    <dimen name="key_height">14.5mm</dimen>
+<!--    <dimen name="key_height">14.5mm</dimen>-->
     <dimen name="key_bottom_gap">0.0mm</dimen>
     <dimen name="key_horizontal_gap">0.0mm</dimen>
     <dimen name="popup_key_height">13.0mm</dimen>
@@ -34,13 +36,13 @@
     <!-- popup_key_height x -1.0 -->
     <dimen name="mini_keyboard_vertical_correction">-13.0mm</dimen>
 
-    <dimen name="key_letter_size">24dip</dimen>
-    <dimen name="key_label_text_size">14dip</dimen>
+    <dimen name="key_letter_size">26dip</dimen>
+    <dimen name="key_label_text_size">16dip</dimen>
     <dimen name="key_preview_text_size_large">24dip</dimen>
     <!-- left or right padding of label alignment -->
-    <dimen name="key_label_horizontal_alignment_padding">4dip</dimen>
+    <dimen name="key_label_horizontal_alignment_padding">6dip</dimen>
 
-    <dimen name="candidate_strip_height">56dip</dimen>
+    <dimen name="candidate_strip_height">46dip</dimen>
     <dimen name="candidate_strip_padding">15.0mm</dimen>
     <dimen name="candidate_text_size">22dip</dimen>
 </resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 4fc5351..55c806c 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -76,10 +76,15 @@
     </declare-styleable>
 
     <declare-styleable name="Keyboard">
+        <!-- Default keyboard height -->
+        <attr name="keyboardHeight" format="dimension" />
+        <!-- Maximum keyboard height, in pixels or percentage of display height -->
+        <attr name="maxKeyboardHeight" format="dimension|fraction" />
         <!-- Default width of a key, in pixels or percentage of display width. -->
         <attr name="keyWidth" format="dimension|fraction" />
-        <!-- Default height of a key, in pixels or percentage of display width. -->
-        <attr name="keyHeight" format="dimension|fraction" />
+        <!-- Default height of a row (key height + vertical gap), in pixels or percentage of
+             keyboard height. -->
+        <attr name="rowHeight" format="dimension|fraction" />
         <!-- Default horizontal gap between keys. -->
         <attr name="horizontalGap" format="dimension|fraction" />
         <!-- Default vertical gap between rows of keys. -->
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index 833963c..27d324b 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -19,8 +19,10 @@
 -->
 
 <resources>
+    <!-- keyboardHeight = key_height*4 + key_bottom_gap*3 -->
+    <dimen name="keyboardHeight">1.265in</dimen>
     <!-- key_height + key_bottom_gap = popup_key_height -->
-    <dimen name="key_height">0.290in</dimen>
+<!--    <dimen name="key_height">0.290in</dimen>-->
     <dimen name="key_bottom_gap">0.035in</dimen>
     <dimen name="key_horizontal_gap">0.000in</dimen>
     <dimen name="popup_key_height">0.325in</dimen>
diff --git a/java/res/xml-da-xlarge/kbd_qwerty.xml b/java/res/xml-da-xlarge/kbd_qwerty.xml
index 3170b08..2852c76 100644
--- a/java/res/xml-da-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-da-xlarge/kbd_qwerty.xml
@@ -26,9 +26,11 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml
index ac30b00..43215de 100644
--- a/java/res/xml-da/kbd_qwerty.xml
+++ b/java/res/xml-da/kbd_qwerty.xml
@@ -26,10 +26,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
diff --git a/java/res/xml-de-xlarge/kbd_qwerty.xml b/java/res/xml-de-xlarge/kbd_qwerty.xml
index 8e8e692..3c92b29 100644
--- a/java/res/xml-de-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-de-xlarge/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwertz_rows" />
diff --git a/java/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml
index 8e8e692..3c92b29 100644
--- a/java/res/xml-de/kbd_qwerty.xml
+++ b/java/res/xml-de/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwertz_rows" />
diff --git a/java/res/xml-fr-rCA-xlarge/kbd_qwerty.xml b/java/res/xml-fr-rCA-xlarge/kbd_qwerty.xml
index 42f1515..b102eb6 100644
--- a/java/res/xml-fr-rCA-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-fr-rCA-xlarge/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows" />
diff --git a/java/res/xml-fr-rCA/kbd_qwerty.xml b/java/res/xml-fr-rCA/kbd_qwerty.xml
index 42f1515..b102eb6 100644
--- a/java/res/xml-fr-rCA/kbd_qwerty.xml
+++ b/java/res/xml-fr-rCA/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows" />
diff --git a/java/res/xml-fr-rCH-xlarge/kbd_qwerty.xml b/java/res/xml-fr-rCH-xlarge/kbd_qwerty.xml
index 8e8e692..3c92b29 100644
--- a/java/res/xml-fr-rCH-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-fr-rCH-xlarge/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwertz_rows" />
diff --git a/java/res/xml-fr-rCH/kbd_qwerty.xml b/java/res/xml-fr-rCH/kbd_qwerty.xml
index 8e8e692..3c92b29 100644
--- a/java/res/xml-fr-rCH/kbd_qwerty.xml
+++ b/java/res/xml-fr-rCH/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwertz_rows" />
diff --git a/java/res/xml-fr-xlarge/kbd_qwerty.xml b/java/res/xml-fr-xlarge/kbd_qwerty.xml
index 8d68a55..a943843 100644
--- a/java/res/xml-fr-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-fr-xlarge/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_azerty_rows" />
diff --git a/java/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml
index 8d68a55..a943843 100644
--- a/java/res/xml-fr/kbd_qwerty.xml
+++ b/java/res/xml-fr/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_azerty_rows" />
diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml
index 514f935..7d7774e 100644
--- a/java/res/xml-iw/kbd_qwerty.xml
+++ b/java/res/xml-iw/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml-nb-xlarge/kbd_qwerty.xml b/java/res/xml-nb-xlarge/kbd_qwerty.xml
index b137b58..e647966 100644
--- a/java/res/xml-nb-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-nb-xlarge/kbd_qwerty.xml
@@ -26,9 +26,11 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml
index fe33e53..2985354 100644
--- a/java/res/xml-nb/kbd_qwerty.xml
+++ b/java/res/xml-nb/kbd_qwerty.xml
@@ -26,10 +26,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
diff --git a/java/res/xml-ru-xlarge/kbd_qwerty.xml b/java/res/xml-ru-xlarge/kbd_qwerty.xml
index fef0421..10f0241 100644
--- a/java/res/xml-ru-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-ru-xlarge/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="9.091%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml
index d5744c9..b96c958 100644
--- a/java/res/xml-ru/kbd_qwerty.xml
+++ b/java/res/xml-ru/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="9.091%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml-sr-xlarge/kbd_qwerty.xml b/java/res/xml-sr-xlarge/kbd_qwerty.xml
index 297d726..7290c13 100644
--- a/java/res/xml-sr-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-sr-xlarge/kbd_qwerty.xml
@@ -21,10 +21,12 @@
 <!-- Serbian keyboard layout, based on the X11 layout for Serbian -->
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml
index 279b040..aa025b2 100644
--- a/java/res/xml-sr/kbd_qwerty.xml
+++ b/java/res/xml-sr/kbd_qwerty.xml
@@ -21,10 +21,12 @@
 <!-- Serbian keyboard layout, based on the X11 layout for Serbian -->
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml-sv-xlarge/kbd_qwerty.xml b/java/res/xml-sv-xlarge/kbd_qwerty.xml
index 80d9453..b6c80ad 100644
--- a/java/res/xml-sv-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-sv-xlarge/kbd_qwerty.xml
@@ -28,9 +28,11 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
diff --git a/java/res/xml-sv/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml
index 464a463..b3d1b87 100644
--- a/java/res/xml-sv/kbd_qwerty.xml
+++ b/java/res/xml-sv/kbd_qwerty.xml
@@ -28,10 +28,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="9.09%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows_scandinavia" />
diff --git a/java/res/xml-xlarge-land/kbd_popup_template.xml b/java/res/xml-xlarge-land/kbd_popup_template.xml
index fd348f2..3caae1a 100644
--- a/java/res/xml-xlarge-land/kbd_popup_template.xml
+++ b/java/res/xml-xlarge-land/kbd_popup_template.xml
@@ -22,6 +22,6 @@
     latin:keyWidth="3.5%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
     >
 </Keyboard>
diff --git a/java/res/xml-xlarge-land/popup_domains.xml b/java/res/xml-xlarge-land/popup_domains.xml
index deedba4..03a3846 100644
--- a/java/res/xml-xlarge-land/popup_domains.xml
+++ b/java/res/xml-xlarge-land/popup_domains.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="4.0%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top|bottom"
diff --git a/java/res/xml-xlarge-land/popup_smileys.xml b/java/res/xml-xlarge-land/popup_smileys.xml
index e882a50..cc4acb0 100644
--- a/java/res/xml-xlarge-land/popup_smileys.xml
+++ b/java/res/xml-xlarge-land/popup_smileys.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="4.0%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top"
diff --git a/java/res/xml-xlarge/kbd_number.xml b/java/res/xml-xlarge/kbd_number.xml
index 1198466..11cf8fb 100644
--- a/java/res/xml-xlarge/kbd_number.xml
+++ b/java/res/xml-xlarge/kbd_number.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="11.949%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml-xlarge/kbd_phone.xml b/java/res/xml-xlarge/kbd_phone.xml
index 5a6ec9a..6389a8c 100644
--- a/java/res/xml-xlarge/kbd_phone.xml
+++ b/java/res/xml-xlarge/kbd_phone.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="11.949%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml-xlarge/kbd_phone_symbols.xml b/java/res/xml-xlarge/kbd_phone_symbols.xml
index 743f5a5..59d8181 100644
--- a/java/res/xml-xlarge/kbd_phone_symbols.xml
+++ b/java/res/xml-xlarge/kbd_phone_symbols.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="11.949%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml-xlarge/kbd_popup_template.xml b/java/res/xml-xlarge/kbd_popup_template.xml
index aa99cee..7d39d1a 100644
--- a/java/res/xml-xlarge/kbd_popup_template.xml
+++ b/java/res/xml-xlarge/kbd_popup_template.xml
@@ -22,6 +22,6 @@
     latin:keyWidth="5.0%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
     >
 </Keyboard>
diff --git a/java/res/xml-xlarge/kbd_qwerty.xml b/java/res/xml-xlarge/kbd_qwerty.xml
index 56cfe00..75fe183 100644
--- a/java/res/xml-xlarge/kbd_qwerty.xml
+++ b/java/res/xml-xlarge/kbd_qwerty.xml
@@ -20,9 +20,11 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows" />
diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-xlarge/kbd_symbols.xml
index 6701c9c..f5d0c4c 100644
--- a/java/res/xml-xlarge/kbd_symbols.xml
+++ b/java/res/xml-xlarge/kbd_symbols.xml
@@ -20,9 +20,11 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml
index b635271..99f48eb 100644
--- a/java/res/xml-xlarge/kbd_symbols_shift.xml
+++ b/java/res/xml-xlarge/kbd_symbols_shift.xml
@@ -20,9 +20,11 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml-xlarge/popup_domains.xml b/java/res/xml-xlarge/popup_domains.xml
index be0c918..6d65c89 100644
--- a/java/res/xml-xlarge/popup_domains.xml
+++ b/java/res/xml-xlarge/popup_domains.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="5.5%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top|bottom"
diff --git a/java/res/xml-xlarge/popup_smileys.xml b/java/res/xml-xlarge/popup_smileys.xml
index bdd6805..552dc42 100644
--- a/java/res/xml-xlarge/popup_smileys.xml
+++ b/java/res/xml-xlarge/popup_smileys.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="5.0%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top"
diff --git a/java/res/xml/kbd_number.xml b/java/res/xml/kbd_number.xml
index cde7205..f09da86 100644
--- a/java/res/xml/kbd_number.xml
+++ b/java/res/xml/kbd_number.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="26.67%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml
index 7e146ed..fb0e6d7 100644
--- a/java/res/xml/kbd_phone.xml
+++ b/java/res/xml/kbd_phone.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="26.67%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml
index 1bb4bac..a5ff5d2 100644
--- a/java/res/xml/kbd_phone_symbols.xml
+++ b/java/res/xml/kbd_phone_symbols.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="26.67%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml/kbd_popup_narrow_template.xml b/java/res/xml/kbd_popup_narrow_template.xml
index 9b78711..36caf1c 100644
--- a/java/res/xml/kbd_popup_narrow_template.xml
+++ b/java/res/xml/kbd_popup_narrow_template.xml
@@ -22,6 +22,6 @@
     latin:keyWidth="9.45%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
     >
 </Keyboard>
diff --git a/java/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml
index 004d490..9ee2749 100644
--- a/java/res/xml/kbd_popup_template.xml
+++ b/java/res/xml/kbd_popup_template.xml
@@ -22,6 +22,6 @@
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
     >
 </Keyboard>
diff --git a/java/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml
index 42f1515..b102eb6 100644
--- a/java/res/xml/kbd_qwerty.xml
+++ b/java/res/xml/kbd_qwerty.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_rows" />
diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml
index 7264179..a7da011 100644
--- a/java/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml
index 83963bf..ee8d882 100644
--- a/java/res/xml/kbd_symbols_shift.xml
+++ b/java/res/xml/kbd_symbols_shift.xml
@@ -20,10 +20,12 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardHeight="@dimen/keyboardHeight"
+    latin:maxKeyboardHeight="50%p"
+    latin:rowHeight="25%p"
     latin:keyWidth="10%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
-    latin:keyHeight="@dimen/key_height"
 >
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
diff --git a/java/res/xml/popup_at.xml b/java/res/xml/popup_at.xml
index 4b19d4f..92ad816 100644
--- a/java/res/xml/popup_at.xml
+++ b/java/res/xml/popup_at.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top|bottom"
diff --git a/java/res/xml/popup_comma.xml b/java/res/xml/popup_comma.xml
index cef836a..9ef49df 100644
--- a/java/res/xml/popup_comma.xml
+++ b/java/res/xml/popup_comma.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top|bottom"
diff --git a/java/res/xml/popup_domains.xml b/java/res/xml/popup_domains.xml
index 5f92e2f..9fbbdec 100644
--- a/java/res/xml/popup_domains.xml
+++ b/java/res/xml/popup_domains.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="15%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top|bottom"
diff --git a/java/res/xml/popup_mic.xml b/java/res/xml/popup_mic.xml
index 99c97ce..1851eba 100644
--- a/java/res/xml/popup_mic.xml
+++ b/java/res/xml/popup_mic.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top|bottom"
diff --git a/java/res/xml/popup_punctuation.xml b/java/res/xml/popup_punctuation.xml
index 76572b0..6c778c7 100644
--- a/java/res/xml/popup_punctuation.xml
+++ b/java/res/xml/popup_punctuation.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top"
diff --git a/java/res/xml/popup_slash.xml b/java/res/xml/popup_slash.xml
index 1ace909..611500c 100644
--- a/java/res/xml/popup_slash.xml
+++ b/java/res/xml/popup_slash.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="10%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top|bottom"
diff --git a/java/res/xml/popup_smileys.xml b/java/res/xml/popup_smileys.xml
index 2f08231..b876672 100644
--- a/java/res/xml/popup_smileys.xml
+++ b/java/res/xml/popup_smileys.xml
@@ -23,7 +23,7 @@
     latin:keyWidth="15%p"
     latin:horizontalGap="0px"
     latin:verticalGap="0px"
-    latin:keyHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/popup_key_height"
 >
     <Row
         latin:rowEdgeFlags="top"
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index cd42669..e74c968 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -139,7 +139,7 @@
     /** Create an empty key with no attributes. */
     public Key(Row row, char letter, int x, int y) {
         mKeyboard = row.getKeyboard();
-        mHeight = row.mDefaultHeight;
+        mHeight = row.mDefaultHeight - row.mVerticalGap;
         mGap = row.mDefaultHorizontalGap;
         mWidth = row.mDefaultWidth - mGap;
         mEdgeFlags = row.mRowEdgeFlags;
@@ -176,14 +176,14 @@
         TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.Keyboard);
         mHeight = KeyboardParser.getDimensionOrFraction(a,
-                R.styleable.Keyboard_keyHeight,
-                mKeyboard.getKeyboardHeight(), row.mDefaultHeight);
+                R.styleable.Keyboard_rowHeight,
+                mKeyboard.getKeyboardHeight(), row.mDefaultHeight) - row.mVerticalGap;
         mGap = KeyboardParser.getDimensionOrFraction(a,
                 R.styleable.Keyboard_horizontalGap,
-                mKeyboard.getKeyboardWidth(), row.mDefaultHorizontalGap);
+                mKeyboard.getDisplayWidth(), row.mDefaultHorizontalGap);
         mWidth = KeyboardParser.getDimensionOrFraction(a,
                 R.styleable.Keyboard_keyWidth,
-                mKeyboard.getKeyboardWidth(), row.mDefaultWidth) - mGap;
+                mKeyboard.getDisplayWidth(), row.mDefaultWidth) - mGap;
         a.recycle();
 
         a = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.Keyboard_Key);
@@ -202,25 +202,27 @@
         this.mX = x + mGap / 2;
         this.mY = y;
 
-        mPreviewIcon = style.getDrawable(a, R.styleable.Keyboard_Key_iconPreview);
-        Keyboard.setDefaultBounds(mPreviewIcon);
         final CharSequence popupCharacters = style.getText(a,
                 R.styleable.Keyboard_Key_popupCharacters);
         final int popupResId = style.getResourceId(a, R.styleable.Keyboard_Key_popupKeyboard, 0);
-        // Set popup keyboard resource and characters only when both are specified.
-        if (popupResId != 0 && !TextUtils.isEmpty(popupCharacters)) {
-            mPopupResId = popupResId;
-            mPopupCharacters = popupCharacters;
-        } else {
+        // We should not display mini keyboard when both popupResId and popupCharacters are
+        // specified but popupCharacters is empty string.
+        if (popupResId != 0 && popupCharacters != null && popupCharacters.length() == 0) {
             mPopupResId = 0;
             mPopupCharacters = null;
+        } else {
+            mPopupResId = popupResId;
+            mPopupCharacters = popupCharacters;
         }
+
         mRepeatable = style.getBoolean(a, R.styleable.Keyboard_Key_isRepeatable, false);
         mModifier = style.getBoolean(a, R.styleable.Keyboard_Key_isModifier, false);
         mSticky = style.getBoolean(a, R.styleable.Keyboard_Key_isSticky, false);
         mEdgeFlags = style.getFlag(a, R.styleable.Keyboard_Key_keyEdgeFlags, 0)
                 | row.mRowEdgeFlags;
 
+        mPreviewIcon = style.getDrawable(a, R.styleable.Keyboard_Key_iconPreview);
+        Keyboard.setDefaultBounds(mPreviewIcon);
         mIcon = style.getDrawable(a, R.styleable.Keyboard_Key_keyIcon);
         Keyboard.setDefaultBounds(mIcon);
         mHintIcon = style.getDrawable(a, R.styleable.Keyboard_Key_keyHintIcon);
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 6a1d62e..7641b4d 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -122,6 +122,9 @@
     /** Height of the screen */
     private final int mDisplayHeight;
 
+    /** Height of keyboard */
+    private int mKeyboardHeight;
+
     public final KeyboardId mId;
 
     // Variables for pre-computing nearest keys.
@@ -248,11 +251,11 @@
         mDefaultVerticalGap = gap;
     }
 
-    public int getKeyHeight() {
+    public int getRowHeight() {
         return mDefaultHeight;
     }
 
-    public void setKeyHeight(int height) {
+    public void setRowHeight(int height) {
         mDefaultHeight = height;
     }
 
@@ -278,14 +281,22 @@
         return mTotalWidth;
     }
 
-    public int getKeyboardHeight() {
+    public int getDisplayHeight() {
         return mDisplayHeight;
     }
 
-    public int getKeyboardWidth() {
+    public int getDisplayWidth() {
         return mDisplayWidth;
     }
 
+    public int getKeyboardHeight() {
+        return mKeyboardHeight;
+    }
+
+    public void setKeyboardHeight(int height) {
+        mKeyboardHeight = height;
+    }
+
     public List<Key> getShiftKeys() {
         return mShiftKeys;
     }
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
index dd80f0e..213eac5 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
@@ -161,12 +161,20 @@
         final Keyboard keyboard = mKeyboard;
         final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.Keyboard);
-        final int width = keyboard.getKeyboardWidth();
-        final int height = keyboard.getKeyboardHeight();
+        final int displayHeight = keyboard.getDisplayHeight();
+        final int keyboardHeight = (int)a.getDimension(
+                R.styleable.Keyboard_keyboardHeight, displayHeight / 2);
+        final int maxKeyboardHeight = getDimensionOrFraction(a,
+                R.styleable.Keyboard_maxKeyboardHeight, displayHeight,  displayHeight / 2);
+        // Keyboard height will not exceed maxKeyboardHeight.
+        final int height = Math.min(keyboardHeight, maxKeyboardHeight);
+        final int width = keyboard.getDisplayWidth();
+
+        keyboard.setKeyboardHeight(height);
         keyboard.setKeyWidth(getDimensionOrFraction(a,
                 R.styleable.Keyboard_keyWidth, width, width / 10));
-        keyboard.setKeyHeight(getDimensionOrFraction(a,
-                R.styleable.Keyboard_keyHeight, height, 50));
+        keyboard.setRowHeight(getDimensionOrFraction(a,
+                R.styleable.Keyboard_rowHeight, height, 50));
         keyboard.setHorizontalGap(getDimensionOrFraction(a,
                 R.styleable.Keyboard_horizontalGap, width, 0));
         keyboard.setVerticalGap(getDimensionOrFraction(a,
@@ -280,7 +288,7 @@
             final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
                     R.styleable.Keyboard);
             final int gap = getDimensionOrFraction(a, R.styleable.Keyboard_horizontalGap,
-                    mKeyboard.getKeyboardWidth(), 0);
+                    mKeyboard.getDisplayWidth(), 0);
             a.recycle();
             checkEndTag(TAG_SPACER, parser);
             setSpacer(gap);
@@ -494,7 +502,7 @@
     private void endRow() {
         if (mCurrentRow == null)
             throw new InflateException("orphant end row tag");
-        mCurrentY += mCurrentRow.mVerticalGap + mCurrentRow.mDefaultHeight;
+        mCurrentY += mCurrentRow.mDefaultHeight;
         mCurrentRow = null;
     }
 
diff --git a/java/src/com/android/inputmethod/keyboard/Row.java b/java/src/com/android/inputmethod/keyboard/Row.java
index 37fa4e3..7c158bc 100644
--- a/java/src/com/android/inputmethod/keyboard/Row.java
+++ b/java/src/com/android/inputmethod/keyboard/Row.java
@@ -47,7 +47,7 @@
 
     public Row(Keyboard keyboard) {
         this.mKeyboard = keyboard;
-        mDefaultHeight = keyboard.getKeyHeight();
+        mDefaultHeight = keyboard.getRowHeight();
         mDefaultWidth = keyboard.getKeyWidth();
         mDefaultHorizontalGap = keyboard.getHorizontalGap();
         mVerticalGap = keyboard.getVerticalGap();
@@ -56,14 +56,14 @@
 
     public Row(Resources res, Keyboard keyboard, XmlResourceParser parser) {
         this.mKeyboard = keyboard;
-        final int keyboardWidth = keyboard.getKeyboardWidth();
+        final int keyboardWidth = keyboard.getDisplayWidth();
         final int keyboardHeight = keyboard.getKeyboardHeight();
         TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.Keyboard);
         mDefaultWidth = KeyboardParser.getDimensionOrFraction(a,
                 R.styleable.Keyboard_keyWidth, keyboardWidth, keyboard.getKeyWidth());
         mDefaultHeight = KeyboardParser.getDimensionOrFraction(a,
-                R.styleable.Keyboard_keyHeight, keyboardHeight, keyboard.getKeyHeight());
+                R.styleable.Keyboard_rowHeight, keyboardHeight, keyboard.getRowHeight());
         mDefaultHorizontalGap = KeyboardParser.getDimensionOrFraction(a,
                 R.styleable.Keyboard_horizontalGap, keyboardWidth, keyboard.getHorizontalGap());
         mVerticalGap = KeyboardParser.getDimensionOrFraction(a,
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index 460ef86..bb3c09d 100644
--- a/java/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -21,7 +21,12 @@
 import android.graphics.Typeface;
 import android.os.Handler;
 import android.os.Message;
+import android.text.Spannable;
+import android.text.SpannableString;
 import android.text.TextUtils;
+import android.text.style.CharacterStyle;
+import android.text.style.StyleSpan;
+import android.text.style.UnderlineSpan;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -50,6 +55,8 @@
     private final int mColorNormal;
     private final int mColorRecommended;
     private final int mColorOther;
+    private static final StyleSpan BOLD_SPAN = new StyleSpan(Typeface.BOLD);
+    private static final CharacterStyle UNDERLINE_SPAN = new UnderlineSpan();
 
     private boolean mShowingCompletions;
 
@@ -136,21 +143,25 @@
 
             View v = mWords.get(i);
             TextView tv = (TextView)v.findViewById(R.id.candidate_word);
-            tv.setTypeface(Typeface.DEFAULT);
             tv.setTextColor(mColorNormal);
-            if (mConfigCandidateHighlightFontColorEnabled) {
-                if (haveMinimalSuggestion
-                        && ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid))) {
-                    tv.setTypeface(Typeface.DEFAULT_BOLD);
+            if (haveMinimalSuggestion
+                    && ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid))) {
+                final Spannable word = new SpannableString(suggestion);
+                if (mConfigCandidateHighlightFontColorEnabled) {
+                    word.setSpan(BOLD_SPAN, 0, wordLength, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                     tv.setTextColor(mColorRecommended);
-                    existsAutoCompletion = true;
-                } else if (i != 0 || (wordLength == 1 && count > 1)) {
-                    // HACK: even if i == 0, we use mColorOther when this suggestion's length is 1
-                    // and there are multiple suggestions, such as the default punctuation list.
-                    tv.setTextColor(mColorOther);
+                } else {
+                    word.setSpan(UNDERLINE_SPAN, 0, wordLength, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                 }
-            } else {
-                // TODO: Display underline for the auto-correction word
+                suggestion = word;
+                existsAutoCompletion = true;
+            } else if (i != 0 || (wordLength == 1 && count > 1)) {
+                // HACK: even if i == 0, we use mColorOther when this
+                // suggestion's length is 1
+                // and there are multiple suggestions, such as the default
+                // punctuation list.
+                if (mConfigCandidateHighlightFontColorEnabled)
+                    tv.setTextColor(mColorOther);
             }
             tv.setText(suggestion);
             tv.setClickable(true);