Fix potential "divided by zero" exception
This change also refactors the language name selection to use text x-scale. Bug: 6396854 Change-Id: I31249a85bd042a93d627f40413161aef13617c87
This commit is contained in:
parent
27b42ced86
commit
bd2ca9c021
1 changed files with 33 additions and 42 deletions
|
@ -88,9 +88,8 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
private float mSpacebarTextSize;
|
||||
private final int mSpacebarTextColor;
|
||||
private final int mSpacebarTextShadowColor;
|
||||
// If the full language name needs to be smaller than this value to be drawn on space key,
|
||||
// its short language name will be used instead.
|
||||
private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f;
|
||||
// The minimum x-scale to fit the language name on spacebar.
|
||||
private static final float MINIMUM_XSCALE_OF_LANGUAGE_NAME = 0.8f;
|
||||
// Stuff to draw auto correction LED on spacebar.
|
||||
private boolean mAutoCorrectionSpacebarLedOn;
|
||||
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 int getTextWidth(Paint paint, String text, float textSize) {
|
||||
paint.setTextSize(textSize);
|
||||
return (int)getLabelWidth(text, paint);
|
||||
private boolean fitsTextIntoWidth(final int width, String text, Paint paint) {
|
||||
paint.setTextScaleX(1.0f);
|
||||
final float textWidth = 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.
|
||||
private String layoutLanguageOnSpacebar(Paint paint, InputMethodSubtype subtype, int width,
|
||||
float origTextSize) {
|
||||
paint.setTextAlign(Align.CENTER);
|
||||
paint.setTypeface(Typeface.DEFAULT);
|
||||
// Estimate appropriate language name text size to fit in maxTextWidth.
|
||||
String language = getFullDisplayName(subtype, getResources());
|
||||
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;
|
||||
// Layout language name on spacebar.
|
||||
private String layoutLanguageOnSpacebar(Paint paint, InputMethodSubtype subtype,
|
||||
final int width) {
|
||||
// Choose appropriate language name to fit into the width.
|
||||
String text = getFullDisplayName(subtype, getResources());
|
||||
if (fitsTextIntoWidth(width, text, paint)) {
|
||||
return text;
|
||||
}
|
||||
|
||||
if (useShortName) {
|
||||
language = getShortDisplayName(subtype);
|
||||
textWidth = getTextWidth(paint, language, origTextSize);
|
||||
textSize = origTextSize * Math.min(width / textWidth, 1.0f);
|
||||
text = getMiddleDisplayName(subtype);
|
||||
if (fitsTextIntoWidth(width, text, paint)) {
|
||||
return text;
|
||||
}
|
||||
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) {
|
||||
|
@ -947,11 +937,12 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
|
||||
// If input language are explicitly selected.
|
||||
if (mNeedsToDisplayLanguage) {
|
||||
final String language = layoutLanguageOnSpacebar(
|
||||
paint, getKeyboard().mId.mSubtype, width, mSpacebarTextSize);
|
||||
paint.setTextAlign(Align.CENTER);
|
||||
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
|
||||
// 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 textHeight = -paint.ascent() + descent;
|
||||
final float baseline = height / 2 + textHeight / 2;
|
||||
|
|
Loading…
Reference in a new issue