am 331c84d7: am 5fe9ab1c: Merge "Fix the suggestion size." into klp-dev

* commit '331c84d790cfc04040e7b4e4102519f7be3f5e48':
  Fix the suggestion size.
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
index 8d2689a..faa5560 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 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 @@
                 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 @@
         // 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 @@
 
         // 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;
     }