From 4f8a8f125e329b55e49d31a98b5368113440c755 Mon Sep 17 00:00:00 2001
From: "Tadashi G. Takaoka" <takaoka@google.com>
Date: Wed, 12 Feb 2014 15:22:13 +0900
Subject: [PATCH] Fix showing all suggestions when the top suggestion is long

This change also fixes Bug#12982404; displays the suggestion word
using entire suggestions strip if there is only one suggestion.

Bug: 12564279
Bug: 12982404
Change-Id: I51806b90c3ee34a2072880245d4e33f7be273c8f
---
 .../SuggestionStripLayoutHelper.java          | 80 +++++++++++--------
 .../suggestions/SuggestionStripView.java      |  8 +-
 2 files changed, 51 insertions(+), 37 deletions(-)

diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
index 4063edcccb..5f05b48d4f 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
@@ -65,7 +65,7 @@ final class SuggestionStripLayoutHelper {
     public final int mPadding;
     public final int mDividerWidth;
     public final int mSuggestionsStripHeight;
-    public final int mSuggestionsCountInStrip;
+    private final int mSuggestionsCountInStrip;
     public final int mMoreSuggestionsRowHeight;
     private int mMaxMoreSuggestionsRow;
     public final float mMinMoreSuggestionsWidth;
@@ -288,54 +288,65 @@ final class SuggestionStripLayoutHelper {
         params.gravity = Gravity.CENTER;
     }
 
-    public void layout(final SuggestedWords suggestedWords, final ViewGroup stripView,
-            final ViewGroup placerView) {
+    /**
+     * Layout suggestions to the suggestions strip. And returns the number of suggestions displayed
+     * in the suggestions strip.
+     *
+     * @param suggestedWords suggestions to be shown in the suggestions strip.
+     * @param stripView the suggestions strip view.
+     * @param placerView the view where the debug info will be placed.
+     * @return the number of suggestions displayed in the suggestions strip
+     */
+    public int layoutAndReturnSuggestionCountInStrip(final SuggestedWords suggestedWords,
+            final ViewGroup stripView, final ViewGroup placerView) {
         if (suggestedWords.mIsPunctuationSuggestions) {
-            layoutPunctuationSuggestions(suggestedWords, stripView);
-            return;
+            return layoutPunctuationSuggestionsAndReturnSuggestionCountInStrip(
+                    suggestedWords, stripView);
         }
 
-        final int countInStrip = mSuggestionsCountInStrip;
-        setupWordViewsTextAndColor(suggestedWords, countInStrip);
+        setupWordViewsTextAndColor(suggestedWords, mSuggestionsCountInStrip);
         final TextView centerWordView = mWordViews.get(mCenterPositionInStrip);
         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) {
+        final int countInStrip;
+        if (suggestedWords.size() == 1 || 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);
+            countInStrip = 1;
+            mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
             layoutWord(mCenterPositionInStrip, availableStripWidth - mPadding);
             stripView.addView(centerWordView);
             setLayoutWeight(centerWordView, 1.0f, ViewGroup.LayoutParams.MATCH_PARENT);
             if (SuggestionStripView.DBG) {
                 layoutDebugInfo(mCenterPositionInStrip, placerView, availableStripWidth);
             }
-            return;
-        }
-
-        mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
-        int x = 0;
-        for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) {
-            if (positionInStrip != 0) {
-                final View divider = mDividerViews.get(positionInStrip);
-                // Add divider if this isn't the left most suggestion in suggestions strip.
-                addDivider(stripView, divider);
-                x += divider.getMeasuredWidth();
-            }
-
-            final int width = getSuggestionWidth(positionInStrip, availableStripWidth);
-            final TextView wordView = layoutWord(positionInStrip, width);
-            stripView.addView(wordView);
-            setLayoutWeight(wordView, getSuggestionWeight(positionInStrip),
-                    ViewGroup.LayoutParams.MATCH_PARENT);
-            x += wordView.getMeasuredWidth();
-
-            if (SuggestionStripView.DBG) {
-                layoutDebugInfo(positionInStrip, placerView, x);
+        } else {
+            countInStrip = mSuggestionsCountInStrip;
+            mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
+            int x = 0;
+            for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) {
+                if (positionInStrip != 0) {
+                    final View divider = mDividerViews.get(positionInStrip);
+                    // Add divider if this isn't the left most suggestion in suggestions strip.
+                    addDivider(stripView, divider);
+                    x += divider.getMeasuredWidth();
+                }
+
+                final int width = getSuggestionWidth(positionInStrip, availableStripWidth);
+                final TextView wordView = layoutWord(positionInStrip, width);
+                stripView.addView(wordView);
+                setLayoutWeight(wordView, getSuggestionWeight(positionInStrip),
+                        ViewGroup.LayoutParams.MATCH_PARENT);
+                x += wordView.getMeasuredWidth();
+
+                if (SuggestionStripView.DBG) {
+                    layoutDebugInfo(positionInStrip, placerView, x);
+                }
             }
         }
+        return countInStrip;
     }
 
     /**
@@ -435,8 +446,8 @@ final class SuggestionStripLayoutHelper {
         }
     }
 
-    private void layoutPunctuationSuggestions(final SuggestedWords suggestedWords,
-            final ViewGroup stripView) {
+    private int layoutPunctuationSuggestionsAndReturnSuggestionCountInStrip(
+            final SuggestedWords suggestedWords, final ViewGroup stripView) {
         final int countInStrip = Math.min(suggestedWords.size(), PUNCTUATIONS_IN_STRIP);
         for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) {
             if (positionInStrip != 0) {
@@ -457,6 +468,7 @@ final class SuggestionStripLayoutHelper {
             setLayoutWeight(wordView, 1.0f, mSuggestionsStripHeight);
         }
         mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
+        return countInStrip;
     }
 
     public void layoutAddToDictionaryHint(final String word, final ViewGroup addToDictionaryStrip,
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index 68c891bf31..32d7d23177 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -77,6 +77,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
 
     Listener mListener;
     private SuggestedWords mSuggestedWords = SuggestedWords.EMPTY;
+    private int mSuggestionsCountInStrip;
 
     private final SuggestionStripLayoutHelper mLayoutHelper;
     private final StripVisibilityGroup mStripVisibilityGroup;
@@ -189,7 +190,8 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
         clear();
         mStripVisibilityGroup.setLayoutDirection(isRtlLanguage);
         mSuggestedWords = suggestedWords;
-        mLayoutHelper.layout(mSuggestedWords, mSuggestionsStrip, this);
+        mSuggestionsCountInStrip = mLayoutHelper.layoutAndReturnSuggestionCountInStrip(
+                mSuggestedWords, mSuggestionsStrip, this);
         if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
             ResearchLogger.suggestionStripView_setSuggestions(mSuggestedWords);
         }
@@ -313,7 +315,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
         final View container = mMoreSuggestionsContainer;
         final int maxWidth = stripWidth - container.getPaddingLeft() - container.getPaddingRight();
         final MoreSuggestions.Builder builder = mMoreSuggestionsBuilder;
-        builder.layout(mSuggestedWords, layoutHelper.mSuggestionsCountInStrip, maxWidth,
+        builder.layout(mSuggestedWords, mSuggestionsCountInStrip, maxWidth,
                 (int)(maxWidth * layoutHelper.mMinMoreSuggestionsWidth),
                 layoutHelper.getMaxMoreSuggestionsRow(), parentKeyboard);
         mMoreSuggestionsView.setKeyboard(builder.build());
@@ -327,7 +329,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
         mMoreSuggestionsMode = MORE_SUGGESTIONS_CHECKING_MODAL_OR_SLIDING;
         mOriginX = mLastX;
         mOriginY = mLastY;
-        for (int i = 0; i < layoutHelper.mSuggestionsCountInStrip; i++) {
+        for (int i = 0; i < mSuggestionsCountInStrip; i++) {
             mWordViews.get(i).setPressed(false);
         }
         return true;
-- 
GitLab