diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml index 2c188bc0c..69283202e 100644 --- a/java/res/values-xlarge/dimens.xml +++ b/java/res/values-xlarge/dimens.xml @@ -30,6 +30,7 @@ 0.0mm 13.0mm + 12dip 15.6mm diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index cf2019ff8..504e007e0 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -30,6 +30,7 @@ 0.06in 80sp + 8dip 0.390in diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index 3b35c93d3..c2aa4ecba 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -136,11 +136,11 @@ public class Key { * This constructor is being used only for key in mini popup keyboard. */ public Key(Resources res, Keyboard keyboard, CharSequence popupCharacter, int x, int y, - int edgeFlags) { + int width, int edgeFlags) { mKeyboard = keyboard; mHeight = keyboard.getRowHeight() - keyboard.getVerticalGap(); mGap = keyboard.getHorizontalGap(); - mWidth = keyboard.getKeyWidth() - mGap; + mWidth = width - mGap; mEdgeFlags = edgeFlags; mHintIcon = null; mManualTemporaryUpperCaseHintIcon = null; diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index b259e0c03..e7dd716fb 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -692,7 +692,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy { // Draw key label if (label != null) { // For characters, use large font. For labels like "Done", use small font. - final int labelSize = getLabelSizeAndSetPaint(label, key, paint); + final int labelSize = getLabelSizeAndSetPaint(label, key.mLabelOption, paint); final int labelCharHeight = getLabelCharHeight(labelSize, paint); // Vertical label text alignment. @@ -828,13 +828,13 @@ public class KeyboardView extends View implements PointerTracker.UIProxy { mDirtyRect.setEmpty(); } - private int getLabelSizeAndSetPaint(CharSequence label, Key key, Paint paint) { + public int getLabelSizeAndSetPaint(CharSequence label, int keyLabelOption, Paint paint) { // For characters, use large font. For labels like "Done", use small font. final int labelSize; final Typeface labelStyle; if (label.length() > 1) { labelSize = mLabelTextSize; - if ((key.mLabelOption & KEY_LABEL_OPTION_FONT_NORMAL) != 0) { + if ((keyLabelOption & KEY_LABEL_OPTION_FONT_NORMAL) != 0) { labelStyle = Typeface.DEFAULT; } else { labelStyle = Typeface.DEFAULT_BOLD; @@ -1126,7 +1126,7 @@ public class KeyboardView extends View implements PointerTracker.UIProxy { // Remove gesture detector on mini-keyboard miniKeyboard.mGestureDetector = null; - Keyboard keyboard = new MiniKeyboardBuilder(getContext(), popupKeyboardResId, popupKey) + Keyboard keyboard = new MiniKeyboardBuilder(this, popupKeyboardResId, popupKey) .build(); miniKeyboard.setKeyboard(keyboard); miniKeyboard.setPopupParent(this); diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java index 33d19602d..458a9eed4 100644 --- a/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java @@ -16,8 +16,12 @@ package com.android.inputmethod.keyboard; +import com.android.inputmethod.latin.R; + import android.content.Context; import android.content.res.Resources; +import android.graphics.Paint; +import android.graphics.Rect; import java.util.List; @@ -25,6 +29,8 @@ public class MiniKeyboardBuilder { private final Resources mRes; private final Keyboard mKeyboard; private final CharSequence[] mPopupCharacters; + private final int mMiniKeyboardKeyHorizontalPadding; + private final int mKeyWidth; private final int mMaxColumns; private final int mNumRows; private int mColPos; @@ -32,35 +38,61 @@ public class MiniKeyboardBuilder { private int mX; private int mY; - public MiniKeyboardBuilder(Context context, int layoutTemplateResId, Key popupKey) { + public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key popupKey) { + final Context context = view.getContext(); mRes = context.getResources(); final Keyboard keyboard = new Keyboard(context, layoutTemplateResId, null); mKeyboard = keyboard; mPopupCharacters = popupKey.mPopupCharacters; - final int numKeys = mPopupCharacters.length; + mMiniKeyboardKeyHorizontalPadding = (int)mRes.getDimension( + R.dimen.mini_keyboard_key_horizontal_padding); + mKeyWidth = getMaxKeyWidth(view, mPopupCharacters, mKeyboard.getKeyWidth()); final int maxColumns = popupKey.mMaxPopupColumn; + mMaxColumns = maxColumns; + final int numKeys = mPopupCharacters.length; int numRows = numKeys / maxColumns; if (numKeys % maxColumns != 0) numRows++; - mMaxColumns = maxColumns; mNumRows = numRows; keyboard.setHeight((keyboard.getRowHeight() + keyboard.getVerticalGap()) * numRows - keyboard.getVerticalGap()); - // TODO: To determine key width we should pay attention to key label length. if (numRows > 1) { mColPos = numKeys % maxColumns; if (mColPos > 0) mColPos = maxColumns - mColPos; // Centering top-row keys. - mX = mColPos * (keyboard.getKeyWidth() + keyboard.getHorizontalGap()) / 2; + mX = mColPos * (mKeyWidth + keyboard.getHorizontalGap()) / 2; } mKeyboard.setMinWidth(0); } + private int getMaxKeyWidth(KeyboardView view, CharSequence[] popupCharacters, int minKeyWidth) { + Paint paint = null; + Rect bounds = null; + int maxWidth = 0; + for (CharSequence popupSpec : popupCharacters) { + final CharSequence label = PopupCharactersParser.getLabel(popupSpec.toString()); + // If the label is single letter, minKeyWidth is enough to hold the label. + if (label.length() > 1) { + if (paint == null) { + paint = new Paint(); + paint.setAntiAlias(true); + } + final int labelSize = view.getLabelSizeAndSetPaint(label, 0, 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(); + } + } + return Math.max(minKeyWidth, maxWidth + mMiniKeyboardKeyHorizontalPadding); + } + public Keyboard build() { final Keyboard keyboard = mKeyboard; final List keys = keyboard.getKeys(); for (CharSequence label : mPopupCharacters) { refresh(); - final Key key = new Key(mRes, keyboard, label, mX, mY, getRowFlags()); + final Key key = new Key(mRes, keyboard, label, mX, mY, mKeyWidth, getRowFlags()); keys.add(key); advance(); } @@ -89,7 +121,7 @@ public class MiniKeyboardBuilder { private void advance() { final Keyboard keyboard = mKeyboard; // TODO: Allocate key position depending the precedence of popup characters. - mX += keyboard.getKeyWidth() + keyboard.getHorizontalGap(); + mX += mKeyWidth + keyboard.getHorizontalGap(); if (mX > keyboard.getMinWidth()) keyboard.setMinWidth(mX); mColPos++;