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 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;
|
||||||
|
|
Loading…
Reference in a new issue