diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index bc021a6..dfc893d 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -681,15 +681,6 @@
         }
     }
 
-    // This method is currently being used only by MiniKeyboardBuilder
-    public int getDefaultLabelSizeAndSetPaint(Paint paint) {
-        // For characters, use large font. For labels like "Done", use small font.
-        final int labelSize = mKeyDrawParams.mKeyLabelSize;
-        paint.setTextSize(labelSize);
-        paint.setTypeface(mKeyDrawParams.mKeyTextStyle);
-        return labelSize;
-    }
-
     private static final Rect sTextBounds = new Rect();
 
     private static float getCharHeight(Paint paint) {
@@ -733,6 +724,12 @@
         return sTextBounds.width();
     }
 
+    public float getDefaultLabelWidth(CharSequence label, Paint paint) {
+        paint.setTextSize(mKeyDrawParams.mKeyLabelSize);
+        paint.setTypeface(mKeyDrawParams.mKeyTextStyle);
+        return getLabelWidth(label, paint);
+    }
+
     private static void drawIcon(Canvas canvas, Drawable icon, int x, int y, int width,
             int height) {
         canvas.translate(x, y);
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
index 17c2539..8f47916 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
@@ -236,8 +236,7 @@
         private static int getMaxKeyWidth(KeyboardView view, CharSequence[] popupCharacters,
                 int minKeyWidth) {
             Paint paint = null;
-            Rect bounds = null;
-            int maxWidth = 0;
+            int maxWidth = minKeyWidth;
             for (CharSequence popupSpec : popupCharacters) {
                 final CharSequence label = PopupCharactersParser.getLabel(popupSpec.toString());
                 // If the label is single letter, minKeyWidth is enough to hold
@@ -247,18 +246,15 @@
                         paint = new Paint();
                         paint.setAntiAlias(true);
                     }
-                    final int labelSize = view.getDefaultLabelSizeAndSetPaint(paint);
-                    paint.setTextSize(labelSize);
-                    if (bounds == null)
-                        bounds = new Rect();
-                    paint.getTextBounds(label.toString(), 0, label.length(), bounds);
-                    if (maxWidth < bounds.width())
-                        maxWidth = bounds.width();
+                    final int width = (int)view.getDefaultLabelWidth(label, paint);
+                    if (maxWidth < width) {
+                        maxWidth = width;
+                    }
                 }
             }
             final int horizontalPadding = (int) view.getContext().getResources()
                     .getDimension(R.dimen.mini_keyboard_key_horizontal_padding);
-            return Math.max(minKeyWidth, maxWidth + horizontalPadding);
+            return maxWidth + horizontalPadding;
         }
 
         @Override
