aboutsummaryrefslogtreecommitdiffstats
path: root/java/src
diff options
context:
space:
mode:
authorJean Chalard <jchalard@google.com>2013-10-10 22:16:17 +0900
committerJean Chalard <jchalard@google.com>2013-10-11 16:42:46 +0900
commitc0bd0a244d7e222de13f1a8454b4463183604b75 (patch)
treeb43179115bc6ccd3f5fdef7486e70e8e0350a517 /java/src
parent6dac27eeb4cfc969a07e646f013a25a27760c773 (diff)
downloadlatinime-c0bd0a244d7e222de13f1a8454b4463183604b75.tar.gz
latinime-c0bd0a244d7e222de13f1a8454b4463183604b75.tar.xz
latinime-c0bd0a244d7e222de13f1a8454b4463183604b75.zip
Fix the suggestion size.
The available space was not computed correctly. This makes the decision to ellipsize/expand the middle suggestion correct. Also, the scale was not applied correctly in some cases. Finally, for some reason ellipsize does not work as we expect. I'm not sure how to get it to work like we want it to, but this works around the problem in a simple manner. Bug: 11158757 Change-Id: I083e7ac56e157f100923733e67b92a6368a526c9
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java35
1 files changed, 26 insertions, 9 deletions
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
index 8d2689a7d..faa5560e4 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
@@ -302,18 +302,19 @@ final class SuggestionStripLayoutHelper {
final int countInStrip = mSuggestionsCountInStrip;
setupWordViewsTextAndColor(suggestedWords, countInStrip);
final TextView centerWordView = mWordViews.get(mCenterPositionInStrip);
- final int stripWidth = placerView.getWidth();
- final int centerWidth = getSuggestionWidth(mCenterPositionInStrip, stripWidth);
+ final int availableStripWidth = placerView.getWidth()
+ - placerView.getPaddingRight() - placerView.getPaddingLeft();
+ final int centerWidth = getSuggestionWidth(mCenterPositionInStrip, availableStripWidth);
if (getTextScaleX(centerWordView.getText(), centerWidth, centerWordView.getPaint())
< MIN_TEXT_XSCALE) {
// Layout only the most relevant suggested word at the center of the suggestion strip
// by consolidating all slots in the strip.
mMoreSuggestionsAvailable = (suggestedWords.size() > 1);
- layoutWord(mCenterPositionInStrip, stripWidth);
+ layoutWord(mCenterPositionInStrip, availableStripWidth - mPadding);
stripView.addView(centerWordView);
setLayoutWeight(centerWordView, 1.0f, ViewGroup.LayoutParams.MATCH_PARENT);
if (SuggestionStripView.DBG) {
- layoutDebugInfo(mCenterPositionInStrip, placerView, stripWidth);
+ layoutDebugInfo(mCenterPositionInStrip, placerView, availableStripWidth);
}
return;
}
@@ -328,7 +329,7 @@ final class SuggestionStripLayoutHelper {
x += divider.getMeasuredWidth();
}
- final int width = getSuggestionWidth(positionInStrip, stripWidth);
+ final int width = getSuggestionWidth(positionInStrip, availableStripWidth);
final TextView wordView = layoutWord(positionInStrip, width);
stripView.addView(wordView);
setLayoutWeight(wordView, getSuggestionWeight(positionInStrip),
@@ -373,9 +374,9 @@ final class SuggestionStripLayoutHelper {
// Disable this suggestion if the suggestion is null or empty.
wordView.setEnabled(!TextUtils.isEmpty(word));
final CharSequence text = getEllipsizedText(word, width, wordView.getPaint());
- final float scaleX = wordView.getTextScaleX();
+ final float scaleX = getTextScaleX(word, width, wordView.getPaint());
wordView.setText(text); // TextView.setText() resets text scale x to 1.0.
- wordView.setTextScaleX(scaleX);
+ wordView.setTextScaleX(Math.max(scaleX, MIN_TEXT_XSCALE));
return wordView;
}
@@ -545,8 +546,24 @@ final class SuggestionStripLayoutHelper {
// Note that TextUtils.ellipsize() use text-x-scale as 1.0 if ellipsize is needed. To
// get squeezed and ellipsized text, passes enlarged width (maxWidth / MIN_TEXT_XSCALE).
- final CharSequence ellipsized = TextUtils.ellipsize(
- text, paint, maxWidth / MIN_TEXT_XSCALE, TextUtils.TruncateAt.MIDDLE);
+ final float upscaledWidth = maxWidth / MIN_TEXT_XSCALE;
+ CharSequence ellipsized = TextUtils.ellipsize(
+ text, paint, upscaledWidth, TextUtils.TruncateAt.MIDDLE);
+ // For an unknown reason, ellipsized seems to return a text that does indeed fit inside the
+ // passed width according to paint.measureText, but not according to paint.getTextWidths.
+ // But when rendered, the text seems to actually take up as many pixels as returned by
+ // paint.getTextWidths, hence problem.
+ // To save this case, we compare the measured size of the new text, and if it's too much,
+ // try it again removing the difference. This may still give a text too long by one or
+ // two pixels so we take an additional 2 pixels cushion and call it a day.
+ // TODO: figure out why getTextWidths and measureText don't agree with each other, and
+ // remove the following code.
+ final float ellipsizedTextWidth = getTextWidth(ellipsized, paint);
+ if (upscaledWidth <= ellipsizedTextWidth) {
+ ellipsized = TextUtils.ellipsize(
+ text, paint, upscaledWidth - (ellipsizedTextWidth - upscaledWidth) - 2,
+ TextUtils.TruncateAt.MIDDLE);
+ }
paint.setTextScaleX(MIN_TEXT_XSCALE);
return ellipsized;
}