Introduce maxMoreSuggestionsRow and minMoreSuggetionsWidth attributes to SuggestionsView

Bug: 5257594
Change-Id: Id52c841b72e38eb9034a1a7f26bcf3d4d81ad216
diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml
index 9de201e..0f9bde8 100644
--- a/java/res/values-land/dimens.xml
+++ b/java/res/values-land/dimens.xml
@@ -60,7 +60,10 @@
 
     <dimen name="suggestions_strip_height">36dip</dimen>
     <dimen name="more_suggestions_row_height">36dip</dimen>
-    <dimen name="key_preview_backing_height">36dip</dimen>
+    <integer name="max_more_suggestions_row">2</integer>
+    <fraction name="min_more_suggestions_width">60%</fraction>
+    <!-- key_preview_backing_height = more_suggestions_row_height * max_more_suggestions_row -->
+    <dimen name="key_preview_backing_height">72dip</dimen>
     <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
     <!-- popup_key_height x 1.2 -->
     <dimen name="mini_keyboard_slide_allowance">0.336in</dimen>
diff --git a/java/res/values-sw600dp-land/dimens.xml b/java/res/values-sw600dp-land/dimens.xml
index f1715af..c1cef1d 100644
--- a/java/res/values-sw600dp-land/dimens.xml
+++ b/java/res/values-sw600dp-land/dimens.xml
@@ -51,4 +51,8 @@
     <fraction name="key_uppercase_letter_ratio">29%</fraction>
 
     <dimen name="suggestions_strip_padding">40.0mm</dimen>
+    <integer name="max_more_suggestions_row">5</integer>
+    <fraction name="min_more_suggestions_width">50%</fraction>
+    <!-- key_preview_backing_height = more_suggestions_row_height * max_more_suggestions_row -->
+    <dimen name="key_preview_backing_height">220dip</dimen>
 </resources>
diff --git a/java/res/values-sw600dp/dimens.xml b/java/res/values-sw600dp/dimens.xml
index 3b87fd6..d02b4ea 100644
--- a/java/res/values-sw600dp/dimens.xml
+++ b/java/res/values-sw600dp/dimens.xml
@@ -68,7 +68,10 @@
 
     <dimen name="suggestions_strip_height">44dip</dimen>
     <dimen name="more_suggestions_row_height">44dip</dimen>
-    <dimen name="key_preview_backing_height">44dip</dimen>
+    <integer name="max_more_suggestions_row">6</integer>
+    <fraction name="min_more_suggestions_width">90%</fraction>
+    <!-- key_preview_backing_height = more_suggestions_row_height * max_more_suggestions_row -->
+    <dimen name="key_preview_backing_height">264dip</dimen>
     <dimen name="suggestions_strip_padding">15.0mm</dimen>
     <dimen name="suggestion_min_width">0.3in</dimen>
     <dimen name="suggestion_padding">12dip</dimen>
diff --git a/java/res/values-sw768dp-land/dimens.xml b/java/res/values-sw768dp-land/dimens.xml
index 7303ea1..8f9b006 100644
--- a/java/res/values-sw768dp-land/dimens.xml
+++ b/java/res/values-sw768dp-land/dimens.xml
@@ -59,4 +59,5 @@
     <dimen name="key_preview_offset_ics">0.05in</dimen>
 
     <dimen name="suggestions_strip_padding">40.0mm</dimen>
+    <fraction name="min_more_suggestions_width">50%</fraction>
 </resources>
diff --git a/java/res/values-sw768dp/dimens.xml b/java/res/values-sw768dp/dimens.xml
index 7f79909..bfc2593 100644
--- a/java/res/values-sw768dp/dimens.xml
+++ b/java/res/values-sw768dp/dimens.xml
@@ -71,7 +71,10 @@
 
     <dimen name="suggestions_strip_height">44dip</dimen>
     <dimen name="more_suggestions_row_height">44dip</dimen>
-    <dimen name="key_preview_backing_height">44dip</dimen>
+    <integer name="max_more_suggestions_row">6</integer>
+    <fraction name="min_more_suggestions_width">90%</fraction>
+    <!-- key_preview_backing_height = more_suggestions_row_height * max_more_suggestions_row -->
+    <dimen name="key_preview_backing_height">264dip</dimen>
     <dimen name="suggestions_strip_padding">15.0mm</dimen>
     <dimen name="suggestion_min_width">46dip</dimen>
     <dimen name="suggestion_padding">8dip</dimen>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 2af2554..20f1e32 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -124,6 +124,8 @@
         <attr name="colorSuggested" format="color" />
         <attr name="suggestionsCountInStrip" format="integer" />
         <attr name="centerSuggestionPercentile" format="integer" />
+        <attr name="maxMoreSuggestionsRow" format="integer" />
+        <attr name="minMoreSuggestionsWidth" format="float" />
     </declare-styleable>
 
     <declare-styleable name="Keyboard">
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index 0ec65e3..e753474 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -80,8 +80,11 @@
     <dimen name="more_suggestions_key_horizontal_padding">12dip</dimen>
     <dimen name="more_suggestions_row_height">40dip</dimen>
     <dimen name="more_suggestions_slide_allowance">0.2in</dimen>
+    <integer name="max_more_suggestions_row">6</integer>
+    <fraction name="min_more_suggestions_width">90%</fraction>
     <fraction name="more_suggestions_info_ratio">18%</fraction>
-    <dimen name="key_preview_backing_height">40dip</dimen>
+    <!-- key_preview_backing_height = more_suggestions_row_height * max_more_suggestions_row -->
+    <dimen name="key_preview_backing_height">160dip</dimen>
     <dimen name="suggestions_strip_padding">0dip</dimen>
     <dimen name="suggestion_min_width">44dip</dimen>
     <dimen name="suggestion_padding">6dip</dimen>
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index 45b98ca..dc2021a 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -92,6 +92,8 @@
         <item name="colorSuggested">#FFFCAE00</item>
         <item name="suggestionsCountInStrip">@integer/suggestions_count_in_strip</item>
         <item name="centerSuggestionPercentile">@integer/center_suggestion_percentile</item>
+        <item name="maxMoreSuggestionsRow">@integer/max_more_suggestions_row</item>
+        <item name="minMoreSuggestionsWidth">@fraction/min_more_suggestions_width</item>
     </style>
     <style
         name="MoreSuggestionsViewStyle"
@@ -242,6 +244,8 @@
         <item name="colorSuggested">#FFA7A9AC</item>
         <item name="suggestionsCountInStrip">@integer/suggestions_count_in_strip</item>
         <item name="centerSuggestionPercentile">@integer/center_suggestion_percentile</item>
+        <item name="maxMoreSuggestionsRow">@integer/max_more_suggestions_row</item>
+        <item name="minMoreSuggestionsWidth">@fraction/min_more_suggestions_width</item>
     </style>
     <style
         name="MoreSuggestionsViewStyle.IceCreamSandwich"
diff --git a/java/src/com/android/inputmethod/latin/MoreSuggestions.java b/java/src/com/android/inputmethod/latin/MoreSuggestions.java
index a9e75b7..10d5b5c 100644
--- a/java/src/com/android/inputmethod/latin/MoreSuggestions.java
+++ b/java/src/com/android/inputmethod/latin/MoreSuggestions.java
@@ -50,8 +50,8 @@
             private static final int MAX_COLUMNS_IN_ROW = 3;
             private int mNumRows;
 
-            public int layout(SuggestedWords suggestions, int fromPos, int maxWidth, int maxHeight,
-                    KeyboardView view) {
+            public int layout(SuggestedWords suggestions, int fromPos, int maxWidth, int minWidth,
+                    int maxRow, KeyboardView view) {
                 clearKeys();
                 final Paint paint = new Paint();
                 paint.setAntiAlias(true);
@@ -68,7 +68,7 @@
                     final int numColumn = pos - rowStartPos + 1;
                     if (numColumn > MAX_COLUMNS_IN_ROW
                             || !fitInWidth(rowStartPos, pos + 1, maxWidth / numColumn)) {
-                        if ((row + 1) * mDefaultRowHeight > maxHeight) {
+                        if ((row + 1) >= maxRow) {
                             break;
                         }
                         mNumColumnsInRow[row] = pos - rowStartPos;
@@ -81,7 +81,7 @@
                 }
                 mNumColumnsInRow[row] = pos - rowStartPos;
                 mNumRows = row + 1;
-                mWidth = mOccupiedWidth = calcurateMaxRowWidth(fromPos, pos);
+                mWidth = mOccupiedWidth = Math.max(minWidth, calcurateMaxRowWidth(fromPos, pos));
                 mHeight = mOccupiedHeight = mNumRows * mDefaultRowHeight + mVerticalGap;
                 return pos - fromPos;
             }
@@ -163,13 +163,14 @@
         }
 
         public Builder layout(SuggestedWords suggestions, int fromPos, int maxWidth,
-                int maxHeight) {
+                int minWidth, int maxRow) {
             final Keyboard keyboard = KeyboardSwitcher.getInstance().getLatinKeyboard();
             final int xmlId = R.xml.kbd_suggestions_pane_template;
             load(keyboard.mId.cloneWithNewXml(mResources.getResourceEntryName(xmlId), xmlId));
             mParams.mVerticalGap = mParams.mTopPadding = keyboard.mVerticalGap / 2;
 
-            final int count = mParams.layout(suggestions, fromPos, maxWidth, maxHeight, mPaneView);
+            final int count = mParams.layout(suggestions, fromPos, maxWidth, minWidth, maxRow,
+                    mPaneView);
             mFromPos = fromPos;
             mToPos = fromPos + count;
             mSuggestions = suggestions;
diff --git a/java/src/com/android/inputmethod/latin/SuggestionsView.java b/java/src/com/android/inputmethod/latin/SuggestionsView.java
index f11ac1d..e99c6d4 100644
--- a/java/src/com/android/inputmethod/latin/SuggestionsView.java
+++ b/java/src/com/android/inputmethod/latin/SuggestionsView.java
@@ -35,7 +35,6 @@
 import android.text.style.StyleSpan;
 import android.text.style.UnderlineSpan;
 import android.util.AttributeSet;
-import android.util.DisplayMetrics;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -146,12 +145,15 @@
     private static class SuggestionsViewParams {
         private static final int DEFAULT_SUGGESTIONS_COUNT_IN_STRIP = 3;
         private static final int DEFAULT_CENTER_SUGGESTION_PERCENTILE = 40;
+        private static final int DEFAULT_MAX_MORE_SUGGESTIONS_ROW = 2;
         private static final int PUNCTUATIONS_IN_STRIP = 6;
 
         public final int mPadding;
         public final int mDividerWidth;
         public final int mSuggestionsStripHeight;
         public final int mSuggestionsCountInStrip;
+        public final int mMaxMoreSuggestionsRow;
+        public final float mMinMoreSuggestionsWidth;
 
         private final List<TextView> mWords;
         private final List<View> mDividers;
@@ -211,6 +213,11 @@
             mCenterSuggestionWeight = a.getInt(
                     R.styleable.SuggestionsView_centerSuggestionPercentile,
                     DEFAULT_CENTER_SUGGESTION_PERCENTILE) / 100.0f;
+            mMaxMoreSuggestionsRow = a.getInt(
+                    R.styleable.SuggestionsView_maxMoreSuggestionsRow,
+                    DEFAULT_MAX_MORE_SUGGESTIONS_ROW);
+            mMinMoreSuggestionsWidth = getRatio(a,
+                    R.styleable.SuggestionsView_minMoreSuggestionsWidth);
             a.recycle();
 
             mCenterSuggestionIndex = mSuggestionsCountInStrip / 2;
@@ -225,6 +232,11 @@
             mHintToSaveText = context.getText(R.string.hint_add_to_dictionary);
         }
 
+        // Read fraction value in TypedArray as float.
+        private static float getRatio(TypedArray a, int index) {
+            return a.getFraction(index, 1000, 1000, 1) / 1000.0f;
+        }
+
         private CharSequence getStyledSuggestionWord(SuggestedWords suggestions, int pos) {
             final CharSequence word = suggestions.getWord(pos);
             final boolean isAutoCorrect = pos == 1 && willAutoCorrect(suggestions);
@@ -718,11 +730,10 @@
             final View container = mMoreSuggestionsContainer;
             final int maxWidth = stripWidth - container.getPaddingLeft()
                     - container.getPaddingRight();
-            final DisplayMetrics dm = getContext().getResources().getDisplayMetrics();
-            // TODO: Revise how we determine the height
-            final int maxHeight = dm.heightPixels - mKeyboardView.getHeight() - getHeight() * 3;
             final MoreSuggestions.Builder builder = mMoreSuggestionsBuilder;
-            builder.layout(mSuggestions, params.mSuggestionsCountInStrip, maxWidth, maxHeight);
+            builder.layout(mSuggestions, params.mSuggestionsCountInStrip, maxWidth,
+                    (int)(maxWidth * params.mMinMoreSuggestionsWidth),
+                    params.mMaxMoreSuggestionsRow);
             mMoreSuggestionsView.setKeyboard(builder.build());
             container.measure(
                     ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);