Add visual dividers to more suggestions panel

Bug: 5275003
Change-Id: I9464db71388a40ea768984b4cf06c8da05bfa26c
diff --git a/java/res/drawable-hdpi/more_suggestions_divider.png b/java/res/drawable-hdpi/more_suggestions_divider.png
new file mode 100644
index 0000000..a5912f9
--- /dev/null
+++ b/java/res/drawable-hdpi/more_suggestions_divider.png
Binary files differ
diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-hdpi/suggestions_strip_divider.png
similarity index 100%
rename from java/res/drawable-hdpi/keyboard_suggest_strip_divider.png
rename to java/res/drawable-hdpi/suggestions_strip_divider.png
Binary files differ
diff --git a/java/res/drawable-mdpi/more_suggestions_divider.png b/java/res/drawable-mdpi/more_suggestions_divider.png
new file mode 100644
index 0000000..a46284f
--- /dev/null
+++ b/java/res/drawable-mdpi/more_suggestions_divider.png
Binary files differ
diff --git a/java/res/drawable-mdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-mdpi/suggestions_strip_divider.png
similarity index 100%
rename from java/res/drawable-mdpi/keyboard_suggest_strip_divider.png
rename to java/res/drawable-mdpi/suggestions_strip_divider.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/more_suggestions_divider.png b/java/res/drawable-xhdpi/more_suggestions_divider.png
new file mode 100644
index 0000000..178594b
--- /dev/null
+++ b/java/res/drawable-xhdpi/more_suggestions_divider.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/suggestions_strip_divider.png b/java/res/drawable-xhdpi/suggestions_strip_divider.png
new file mode 100644
index 0000000..157513e
--- /dev/null
+++ b/java/res/drawable-xhdpi/suggestions_strip_divider.png
Binary files differ
diff --git a/java/res/layout/suggestion_divider.xml b/java/res/layout/suggestion_divider.xml
index e38a725..a8b78c0 100644
--- a/java/res/layout/suggestion_divider.xml
+++ b/java/res/layout/suggestion_divider.xml
@@ -22,6 +22,6 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="wrap_content"
     android:layout_height="match_parent"
-    android:src="@drawable/keyboard_suggest_strip_divider"
+    android:src="@drawable/suggestions_strip_divider"
     android:padding="0dp"
     android:gravity="center" />
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 735caae..4ccb27e 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -573,6 +573,13 @@
             super(res, params, row, parser, keyStyles);
         }
 
+        /**
+         * This constructor is being used only for divider in more keys keyboard.
+         */
+        public Spacer(KeyboardParams params, Drawable icon, int x, int y, int width, int height) {
+            super(params, null, null, icon, Keyboard.CODE_DUMMY, null, x, y, width, height, 0);
+        }
+
         @Override
         public boolean isSpacer() {
             return true;
diff --git a/java/src/com/android/inputmethod/latin/MoreSuggestions.java b/java/src/com/android/inputmethod/latin/MoreSuggestions.java
index 10d5b5c..24011c4 100644
--- a/java/src/com/android/inputmethod/latin/MoreSuggestions.java
+++ b/java/src/com/android/inputmethod/latin/MoreSuggestions.java
@@ -16,7 +16,9 @@
 
 package com.android.inputmethod.latin;
 
+import android.content.res.Resources;
 import android.graphics.Paint;
+import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
 
 import com.android.inputmethod.keyboard.Key;
@@ -49,14 +51,21 @@
             private final int[] mNumColumnsInRow = new int[SuggestionsView.MAX_SUGGESTIONS];
             private static final int MAX_COLUMNS_IN_ROW = 3;
             private int mNumRows;
+            public Drawable mDivider;
+            public int mDividerWidth;
 
             public int layout(SuggestedWords suggestions, int fromPos, int maxWidth, int minWidth,
                     int maxRow, KeyboardView view) {
                 clearKeys();
                 final Paint paint = new Paint();
                 paint.setAntiAlias(true);
-                final int padding = (int) view.getContext().getResources()
-                        .getDimension(R.dimen.more_suggestions_key_horizontal_padding);
+                final Resources res = view.getContext().getResources();
+                mDivider = res.getDrawable(R.drawable.more_suggestions_divider);
+                // TODO: Drawable itself should has an alpha value.
+                mDivider.setAlpha(128);
+                mDividerWidth = mDivider.getIntrinsicWidth();
+                final int padding = (int) res.getDimension(
+                        R.dimen.more_suggestions_key_horizontal_padding);
 
                 int row = 0;
                 int pos = fromPos, rowStartPos = fromPos;
@@ -66,8 +75,10 @@
                     // TODO: Should take care of text x-scaling.
                     mWidths[pos] = (int)view.getDefaultLabelWidth(word, paint) + padding;
                     final int numColumn = pos - rowStartPos + 1;
+                    final int columnWidth =
+                            (maxWidth - mDividerWidth * (numColumn - 1)) / numColumn;
                     if (numColumn > MAX_COLUMNS_IN_ROW
-                            || !fitInWidth(rowStartPos, pos + 1, maxWidth / numColumn)) {
+                            || !fitInWidth(rowStartPos, pos + 1, columnWidth)) {
                         if ((row + 1) >= maxRow) {
                             break;
                         }
@@ -98,13 +109,14 @@
                 int maxRowWidth = 0;
                 int pos = startPos;
                 for (int row = 0; row < mNumRows; row++) {
-                    final int numColumn = mNumColumnsInRow[row];
+                    final int numColumnInRow = mNumColumnsInRow[row];
                     int maxKeyWidth = 0;
                     while (pos < endPos && mRowNumbers[pos] == row) {
                         maxKeyWidth = Math.max(maxKeyWidth, mWidths[pos]);
                         pos++;
                     }
-                    maxRowWidth = Math.max(maxRowWidth, maxKeyWidth * numColumn);
+                    maxRowWidth = Math.max(maxRowWidth,
+                            maxKeyWidth * numColumnInRow + mDividerWidth * (numColumnInRow - 1));
                 }
                 return maxRowWidth;
             }
@@ -115,15 +127,19 @@
                 { 2, 0, 1},
             };
 
-            private int getColumnNumber(int pos) {
+            public int getNumColumnInRow(int pos) {
+                return mNumColumnsInRow[mRowNumbers[pos]];
+            }
+
+            public int getColumnNumber(int pos) {
                 final int columnOrder = mColumnOrders[pos];
-                final int numColumn = mNumColumnsInRow[mRowNumbers[pos]];
+                final int numColumn = getNumColumnInRow(pos);
                 return COLUMN_ORDER_TO_NUMBER[numColumn - 1][columnOrder];
             }
 
             public int getX(int pos) {
                 final int columnNumber = getColumnNumber(pos);
-                return columnNumber * getWidth(pos);
+                return columnNumber * (getWidth(pos) + mDividerWidth);
             }
 
             public int getY(int pos) {
@@ -132,9 +148,8 @@
             }
 
             public int getWidth(int pos) {
-                final int row = mRowNumbers[pos];
-                final int numColumn = mNumColumnsInRow[row];
-                return mWidth / numColumn;
+                final int numColumnInRow = getNumColumnInRow(pos);
+                return (mWidth - mDividerWidth * (numColumnInRow - 1)) / numColumnInRow;
             }
 
             public int getFlags(int pos) {
@@ -146,11 +161,11 @@
                 if (row == mNumRows - 1)
                     rowFlags |= Keyboard.EDGE_TOP;
 
-                final int numColumn = mNumColumnsInRow[row];
+                final int numColumnInRow = mNumColumnsInRow[row];
                 final int column = getColumnNumber(pos);
                 if (column == 0)
                     rowFlags |= Keyboard.EDGE_LEFT;
-                if (column == numColumn - 1)
+                if (column == numColumnInRow - 1)
                     rowFlags |= Keyboard.EDGE_RIGHT;
 
                 return rowFlags;
@@ -190,13 +205,23 @@
         public MoreSuggestions build() {
             final MoreSuggestionsParam params = mParams;
             for (int pos = mFromPos; pos < mToPos; pos++) {
+                final int x = params.getX(pos);
+                final int y = params.getY(pos);
+                final int width = params.getWidth(pos);
                 final String word = mSuggestions.getWord(pos).toString();
                 final String info = getDebugInfo(mSuggestions, pos);
                 final int index = pos + SUGGESTION_CODE_BASE;
                 final Key key = new Key(
-                        params, word, info, null, index, null, params.getX(pos), params.getY(pos),
-                        params.getWidth(pos), params.mDefaultRowHeight, params.getFlags(pos));
+                        params, word, info, null, index, null, x, y, width,
+                        params.mDefaultRowHeight, params.getFlags(pos));
                 params.onAddKey(key);
+                final int columnNumber = params.getColumnNumber(pos);
+                final int numColumnInRow = params.getNumColumnInRow(pos);
+                if (columnNumber < numColumnInRow - 1) {
+                    final Key.Spacer spacer = new Key.Spacer(params, params.mDivider, x + width, y,
+                            params.mDividerWidth, params.mDefaultRowHeight);
+                    params.onAddKey(spacer);
+                }
             }
             return new MoreSuggestions(params);
         }