Merge "Fix potential "divided by zero" exception" into jb-dev

This commit is contained in:
Tadashi G. Takaoka 2012-04-26 00:21:07 -07:00 committed by Android (Google) Code Review
commit 93e122e28d

View file

@ -88,9 +88,8 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
private float mSpacebarTextSize; private float mSpacebarTextSize;
private final int mSpacebarTextColor; private final int mSpacebarTextColor;
private final int mSpacebarTextShadowColor; private final int mSpacebarTextShadowColor;
// If the full language name needs to be smaller than this value to be drawn on space key, // The minimum x-scale to fit the language name on spacebar.
// its short language name will be used instead. private static final float MINIMUM_XSCALE_OF_LANGUAGE_NAME = 0.8f;
private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f;
// Stuff to draw auto correction LED on spacebar. // Stuff to draw auto correction LED on spacebar.
private boolean mAutoCorrectionSpacebarLedOn; private boolean mAutoCorrectionSpacebarLedOn;
private final boolean mAutoCorrectionSpacebarLedEnabled; private final boolean mAutoCorrectionSpacebarLedEnabled;
@ -898,47 +897,38 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
} }
} }
// Compute width of text with specified text size using paint. private boolean fitsTextIntoWidth(final int width, String text, Paint paint) {
private int getTextWidth(Paint paint, String text, float textSize) { paint.setTextScaleX(1.0f);
paint.setTextSize(textSize); final float textWidth = getLabelWidth(text, paint);
return (int)getLabelWidth(text, paint); if (textWidth < width) return true;
final float scaleX = width / textWidth;
if (scaleX < MINIMUM_XSCALE_OF_LANGUAGE_NAME) return false;
paint.setTextScaleX(scaleX);
return getLabelWidth(text, paint) < width;
} }
// Layout locale language name on spacebar. // Layout language name on spacebar.
private String layoutLanguageOnSpacebar(Paint paint, InputMethodSubtype subtype, int width, private String layoutLanguageOnSpacebar(Paint paint, InputMethodSubtype subtype,
float origTextSize) { final int width) {
paint.setTextAlign(Align.CENTER); // Choose appropriate language name to fit into the width.
paint.setTypeface(Typeface.DEFAULT); String text = getFullDisplayName(subtype, getResources());
// Estimate appropriate language name text size to fit in maxTextWidth. if (fitsTextIntoWidth(width, text, paint)) {
String language = getFullDisplayName(subtype, getResources()); return text;
int textWidth = getTextWidth(paint, language, origTextSize);
// Assuming text width and text size are proportional to each other.
float textSize = origTextSize * Math.min(width / textWidth, 1.0f);
// allow variable text size
textWidth = getTextWidth(paint, language, textSize);
// If text size goes too small or text does not fit, use middle or short name
final boolean useMiddleName = (textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME)
|| (textWidth > width);
final boolean useShortName;
if (useMiddleName) {
language = getMiddleDisplayName(subtype);
textWidth = getTextWidth(paint, language, origTextSize);
textSize = origTextSize * Math.min(width / textWidth, 1.0f);
useShortName = (textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME)
|| (textWidth > width);
} else {
useShortName = false;
} }
if (useShortName) { text = getMiddleDisplayName(subtype);
language = getShortDisplayName(subtype); if (fitsTextIntoWidth(width, text, paint)) {
textWidth = getTextWidth(paint, language, origTextSize); return text;
textSize = origTextSize * Math.min(width / textWidth, 1.0f);
} }
paint.setTextSize(textSize);
return language; text = getShortDisplayName(subtype);
if (fitsTextIntoWidth(width, text, paint)) {
return text;
}
return "";
} }
private void drawSpacebar(Key key, Canvas canvas, Paint paint) { private void drawSpacebar(Key key, Canvas canvas, Paint paint) {
@ -947,11 +937,12 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
// If input language are explicitly selected. // If input language are explicitly selected.
if (mNeedsToDisplayLanguage) { if (mNeedsToDisplayLanguage) {
final String language = layoutLanguageOnSpacebar( paint.setTextAlign(Align.CENTER);
paint, getKeyboard().mId.mSubtype, width, mSpacebarTextSize); paint.setTypeface(Typeface.DEFAULT);
paint.setTextSize(mSpacebarTextSize);
final InputMethodSubtype subtype = getKeyboard().mId.mSubtype;
final String language = layoutLanguageOnSpacebar(paint, subtype, width);
// Draw language text with shadow // Draw language text with shadow
// In case there is no space icon, we will place the language text at the center of
// spacebar.
final float descent = paint.descent(); final float descent = paint.descent();
final float textHeight = -paint.ascent() + descent; final float textHeight = -paint.ascent() + descent;
final float baseline = height / 2 + textHeight / 2; final float baseline = height / 2 + textHeight / 2;