From 5ef4fccbb90491e1f6c2e87b47ebf9f3659949fb Mon Sep 17 00:00:00 2001
From: "Tadashi G. Takaoka" <takaoka@google.com>
Date: Wed, 29 Feb 2012 22:21:57 +0900
Subject: [PATCH] Support dividers in MoreKeysKeyboard

Bug: 6080806
Change-Id: Iacd78c6aab6abf948717d34da7489a79c41316d2
---
 java/res/drawable-hdpi/more_keys_divider.png  | Bin 0 -> 1034 bytes
 java/res/drawable-mdpi/more_keys_divider.png  | Bin 0 -> 2940 bytes
 java/res/drawable-xhdpi/more_keys_divider.png | Bin 0 -> 1053 bytes
 java/res/xml/key_styles_enter.xml             |   2 +-
 .../com/android/inputmethod/keyboard/Key.java |   9 +++
 .../keyboard/MoreKeysKeyboard.java            |  64 +++++++++++++++---
 .../latin/suggestions/MoreSuggestions.java    |   4 +-
 ...oreKeysKeyboardBuilderFixedOrderTests.java |   2 +-
 .../MoreKeysKeyboardBuilderTests.java         |   2 +-
 9 files changed, 69 insertions(+), 14 deletions(-)
 create mode 100644 java/res/drawable-hdpi/more_keys_divider.png
 create mode 100644 java/res/drawable-mdpi/more_keys_divider.png
 create mode 100644 java/res/drawable-xhdpi/more_keys_divider.png

diff --git a/java/res/drawable-hdpi/more_keys_divider.png b/java/res/drawable-hdpi/more_keys_divider.png
new file mode 100644
index 0000000000000000000000000000000000000000..a5912f95cdb712d78efd974fe53e3981984690a6
GIT binary patch
literal 1034
zcmbVLPixdb6i+QksTT35c$lUr7To;pZjzy~Z2q+irY_qB7f)uBX*YC}36p6z?WN#F
z{0O3W@#3i;Ko5QZr5{7^BzP(wTqoO2^-y~-kj%Wv@BM!7y?O6tdvkqZ{`Ne_aSN>t
zr^D7O?A7M3vhTf_*N`nUd1u|?j!*7<<G9)FxZ9&W{}BvvA_NicBcVt#hT^!@wIU0`
zT|_}2?Zm0cfB*Q22XSQbPwKwpXEqwd8;1mK9d35R!`;w`__c>%wSbHuK{NnGGE8$=
znEZqnvVD0h@?Zj?yC&Z(1wqem0~-?r>Vi}YrG^9=vLLG~nx;JfiX=;-q=>RolQpO+
zP?Es(;h7qVwqeKdrdrH0`2nRF6vfeKB#cx6lO0hu45Q>wlo~_S@`IEHMJ>&jDh3DT
zA&D~@;}n#PK_Bl?lV_2hrI2L4e@>j{(?YS5iA9i!vLJ~`Qsy;5=d^?VgmED{?;d1G
z?4TU)kq|NXQsvBQcezjrWYNIKBxaWq3>_TqB`BpW$K=@`A&Mi|Fm&BjbWgGrt)a_u
z)AJl%m8H62xSFfk6~{%smS^d8-LRXM%pS+HT*Ym=s_r<7>e;SW`L@!W25E>Y-I(c4
zeXUD<p-oUgG3jDFtU91Qz!c{LoB?~Q4*VdD)6y=l=PX+Xk$4|P9>EEi)ECAV={M|^
zrei6d`memte53!VnaF|>%jWp2S*jz}f#vqR^_g)#JSb%oL)d8idVB2y8>>a?_UIPg
zrlWu$Zk+_#AP#Mu?ju4G0ry)eMZ@LMi=Vd`_-@N-c8fRt)A4w1c1~@doF0As@@o9<
h`cwJ+O~0Jd@pzW|eB)?2T5SI)?UuXg99z$x{{~vWK!E@N

literal 0
HcmV?d00001

diff --git a/java/res/drawable-mdpi/more_keys_divider.png b/java/res/drawable-mdpi/more_keys_divider.png
new file mode 100644
index 0000000000000000000000000000000000000000..a46284f218c2dd3ffd3000f6c7d619eac71cb68e
GIT binary patch
literal 2940
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

literal 0
HcmV?d00001

diff --git a/java/res/drawable-xhdpi/more_keys_divider.png b/java/res/drawable-xhdpi/more_keys_divider.png
new file mode 100644
index 0000000000000000000000000000000000000000..178594bf0b0ba99d51d8d8744f36acf27c96919f
GIT binary patch
literal 1053
zcmbVLO>5LZ7>*RB)b<Bdij1kCf}79o=7Ywv`DzzTyKEO+Z)THeH*}K;lW8}tH!mVy
zy$Gd0p?LA42fc{k!QUVrD&oP5hvLC?vfWe<wFd{1nRn)SpXZ%--uFp!b$Mp$$`r#e
zGmRCyMdu0nH6}07|M9o|mvp+2wU$lh@Z;Q9dbkm_JEY^?)dLiBeu%n|%j1-y7-n%P
zPyJvE63~U4QDU&)U%z2N6dLTkswa4<1$)uT9)|0CtL<QKE6_rA=?+-TbxIIJ;)6Wy
zCz+lb?1)#V>tdT{!3aXO47Oeff{xb&7QzrzIiV5=H38H_PLvlEMY#<mK@@mF;zg+<
zD!MG`f&j*YrD{0b&|9`U)}ofd_6SLJo*xVb+(70K-sDA1(+Unrs!&8F+f9g{SCVYL
zWUyft;3y>#N<hKrchNR6SQ_cc72?$MPKlFjoG6+yKKD~z<ODvBi+hdG8EL^kVVsH1
z+Pf*_TQEc0IDiyBUpmv=oi9`XX*Bv8j_9NKeH#VaF-%CqHduPXg;A*2G*xvZ)fG%h
zsi~q^cU@bRMWL!`j^Zd*$#Isi>6&U))vUTH(qX%%BRO?PR&867UCVJx-$s%VKM7!|
z8&Tb{uX(PoZei#Xgxd)9%L-`r5J6cFrNCOR0?!Ykq_B(UIk~M3akK+N7o!-A@~cN@
z>DR1<x@}6X{I7eT_=f+JGoA*+7sc^cv6Nf10*mEo=~Lshd0;|22GiE~b#VC=ZL4d<
z>5z4_K?XjC%rf@VUKCg;*@2iq3~n|O0{gcHkAKcmu-dTe?R>v`JRB}fOv}@gUp~Kk
zI(=j9AXL*&Oy_9$T;6<}Ka)SqUZ4B1puf0Z^!ac&!92WpR1x2=U8N?|a8~U@^TDIv
Dqen@v

literal 0
HcmV?d00001

diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml
index 61efb89b6d..03bcb86205 100644
--- a/java/res/xml/key_styles_enter.xml
+++ b/java/res/xml/key_styles_enter.xml
@@ -49,7 +49,7 @@
             <key-style
                 latin:styleName="navigateMoreKeysStyle"
                 latin:keyLabelFlags="hasPopupHint|preserveCase"
-                latin:moreKeys="!fixedColumnOrder!2,@string/action_previous_as_more_key,@string/action_next_as_more_key" />
+                latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,@string/action_previous_as_more_key,@string/action_next_as_more_key" />
         </case>
         <case
             latin:navigateNext="true"
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index f1611d9eec..a719b4aa70 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -108,9 +108,11 @@ public class Key {
     private static final int MORE_KEYS_COLUMN_MASK = 0x000000ff;
     private static final int MORE_KEYS_FLAGS_FIXED_COLUMN_ORDER = 0x80000000;
     private static final int MORE_KEYS_FLAGS_HAS_LABELS = 0x40000000;
+    private static final int MORE_KEYS_FLAGS_NEEDS_DIVIDERS = 0x40000000;
     private static final String MORE_KEYS_AUTO_COLUMN_ORDER = "!autoColumnOrder!";
     private static final String MORE_KEYS_FIXED_COLUMN_ORDER = "!fixedColumnOrder!";
     private static final String MORE_KEYS_HAS_LABELS = "!hasLabels!";
+    private static final String MORE_KEYS_NEEDS_DIVIDERS = "!needsDividers!";
 
     /** Background type that represents different key background visual than normal one. */
     public final int mBackgroundType;
@@ -253,6 +255,9 @@ public class Key {
         if (KeySpecParser.getBooleanValue(moreKeys, MORE_KEYS_HAS_LABELS)) {
             moreKeysColumn |= MORE_KEYS_FLAGS_HAS_LABELS;
         }
+        if (KeySpecParser.getBooleanValue(moreKeys, MORE_KEYS_NEEDS_DIVIDERS)) {
+            moreKeysColumn |= MORE_KEYS_FLAGS_NEEDS_DIVIDERS;
+        }
         mMoreKeysColumnAndFlags = moreKeysColumn;
 
         final String[] additionalMoreKeys = style.getStringArray(
@@ -539,6 +544,10 @@ public class Key {
         return (mMoreKeysColumnAndFlags & MORE_KEYS_FLAGS_HAS_LABELS) != 0;
     }
 
+    public boolean needsDividersInMoreKeys() {
+        return (mMoreKeysColumnAndFlags & MORE_KEYS_FLAGS_NEEDS_DIVIDERS) != 0;
+    }
+
     public Drawable getIcon(KeyboardIconsSet iconSet) {
         return iconSet.getIconDrawable(mIconId);
     }
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
index abbdfddfec..9f735cff7f 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
@@ -17,8 +17,10 @@
 package com.android.inputmethod.keyboard;
 
 import android.graphics.Paint;
+import android.graphics.drawable.Drawable;
 
 import com.android.inputmethod.keyboard.internal.KeySpecParser;
+import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.Utils;
 
@@ -36,8 +38,10 @@ public class MoreKeysKeyboard extends Keyboard {
 
     public static class Builder extends Keyboard.Builder<Builder.MoreKeysKeyboardParams> {
         private final Key mParentKey;
+        private final Drawable mDivider;
 
         private static final float LABEL_PADDING_RATIO = 0.2f;
+        private static final float DIVIDER_RATIO = 0.2f;
 
         public static class MoreKeysKeyboardParams extends Keyboard.Params {
             public boolean mIsFixedOrder;
@@ -47,6 +51,8 @@ public class MoreKeysKeyboard extends Keyboard {
             public int mTopKeys;
             public int mLeftKeys;
             public int mRightKeys; // includes default key.
+            public int mDividerWidth;
+            public int mColumnWidth;
 
             public MoreKeysKeyboardParams() {
                 super();
@@ -62,9 +68,11 @@ public class MoreKeysKeyboard extends Keyboard {
              * @param coordXInParent coordinate x of the key preview in parent keyboard.
              * @param parentKeyboardWidth parent keyboard width in pixel.
              * @param isFixedColumnOrder if true, more keys should be laid out in fixed order.
+             * @param dividerWidth width of divider, zero for no dividers.
              */
             public void setParameters(int numKeys, int maxColumns, int keyWidth, int rowHeight,
-                    int coordXInParent, int parentKeyboardWidth, boolean isFixedColumnOrder) {
+                    int coordXInParent, int parentKeyboardWidth, boolean isFixedColumnOrder,
+                    int dividerWidth) {
                 mIsFixedOrder = isFixedColumnOrder;
                 if (parentKeyboardWidth / keyWidth < maxColumns) {
                     throw new IllegalArgumentException(
@@ -116,7 +124,9 @@ public class MoreKeysKeyboard extends Keyboard {
                 // Adjustment of the top row.
                 mTopRowAdjustment = mIsFixedOrder ? getFixedOrderTopRowAdjustment()
                         : getAutoOrderTopRowAdjustment();
-                mBaseWidth = mOccupiedWidth = mNumColumns * mDefaultKeyWidth;
+                mDividerWidth = dividerWidth;
+                mColumnWidth = mDefaultKeyWidth + mDividerWidth;
+                mBaseWidth = mOccupiedWidth = mNumColumns * mColumnWidth - mDividerWidth;
                 // Need to subtract the bottom row's gutter only.
                 mBaseHeight = mOccupiedHeight = mNumRows * mDefaultRowHeight - mVerticalGap
                         + mTopPadding + mBottomPadding;
@@ -214,13 +224,13 @@ public class MoreKeysKeyboard extends Keyboard {
             }
 
             public int getDefaultKeyCoordX() {
-                return mLeftKeys * mDefaultKeyWidth;
+                return mLeftKeys * mColumnWidth;
             }
 
             public int getX(int n, int row) {
-                final int x = getColumnPos(n) * mDefaultKeyWidth + getDefaultKeyCoordX();
+                final int x = getColumnPos(n) * mColumnWidth + getDefaultKeyCoordX();
                 if (isTopRow(row)) {
-                    return x + mTopRowAdjustment * (mDefaultKeyWidth / 2);
+                    return x + mTopRowAdjustment * (mColumnWidth / 2);
                 }
                 return x;
             }
@@ -267,9 +277,19 @@ public class MoreKeysKeyboard extends Keyboard {
                 width = getMaxKeyWidth(view, parentKey, mParams.mDefaultKeyWidth);
                 height = parentKeyboard.mMostCommonKeyHeight;
             }
+            final int dividerWidth;
+            if (parentKey.needsDividersInMoreKeys()) {
+                mDivider = mResources.getDrawable(R.drawable.more_keys_divider);
+                // TODO: Drawable itself should have an alpha value.
+                mDivider.setAlpha(128);
+                dividerWidth = (int)(width * DIVIDER_RATIO);
+            } else {
+                mDivider = null;
+                dividerWidth = 0;
+            }
             mParams.setParameters(parentKey.mMoreKeys.length, parentKey.getMoreKeysColumn(),
                     width, height, parentKey.mX + parentKey.mWidth / 2, view.getMeasuredWidth(),
-                    parentKey.isFixedColumnOrderMoreKeys());
+                    parentKey.isFixedColumnOrderMoreKeys(), dividerWidth);
         }
 
         private static int getMaxKeyWidth(KeyboardView view, Key parentKey, int minKeyWidth) {
@@ -295,6 +315,21 @@ public class MoreKeysKeyboard extends Keyboard {
             return maxWidth;
         }
 
+        private static class MoreKeyDivider extends Key.Spacer {
+            private final Drawable mIcon;
+
+            public MoreKeyDivider(MoreKeysKeyboardParams params, Drawable icon, int x, int y) {
+                super(params, x, y, params.mDividerWidth, params.mDefaultRowHeight);
+                mIcon = icon;
+            }
+
+            @Override
+            public Drawable getIcon(KeyboardIconsSet iconSet) {
+                // KeyboardIconsSet is unused. Use the icon that has been passed to the constructor.
+                return mIcon;
+            }
+        }
+
         @Override
         public MoreKeysKeyboard build() {
             final MoreKeysKeyboardParams params = mParams;
@@ -306,11 +341,22 @@ public class MoreKeysKeyboard extends Keyboard {
             for (int n = 0; n < moreKeys.length; n++) {
                 final String moreKeySpec = moreKeys[n];
                 final int row = n / params.mNumColumns;
-                final Key key = new Key(mResources, params, moreKeySpec, params.getX(n, row),
-                        params.getY(row), params.mDefaultKeyWidth, params.mDefaultRowHeight,
-                        moreKeyFlags);
+                final int x = params.getX(n, row);
+                final int y = params.getY(row);
+                final Key key = new Key(mResources, params, moreKeySpec, x, y,
+                        params.mDefaultKeyWidth, params.mDefaultRowHeight, moreKeyFlags);
                 params.markAsEdgeKey(key, row);
                 params.onAddKey(key);
+
+                final int pos = params.getColumnPos(n);
+                // The "pos" value represents the offset from the default position. Negative means
+                // left of the default position.
+                if (params.mDividerWidth > 0 && pos != 0) {
+                    final int dividerX = (pos > 0) ? x - params.mDividerWidth
+                            : x + params.mDefaultKeyWidth;
+                    final Key divider = new MoreKeyDivider(params, mDivider, dividerX, y);
+                    params.onAddKey(divider);
+                }
             }
             return new MoreKeysKeyboard(params);
         }
diff --git a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java
index 0bd6abe09d..cb1b49c675 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java
@@ -34,7 +34,7 @@ import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 public class MoreSuggestions extends Keyboard {
     public static final int SUGGESTION_CODE_BASE = 1024;
 
-    private MoreSuggestions(Builder.MoreSuggestionsParam params) {
+    MoreSuggestions(Builder.MoreSuggestionsParam params) {
         super(params);
     }
 
@@ -63,7 +63,7 @@ public class MoreSuggestions extends Keyboard {
                 paint.setAntiAlias(true);
                 final Resources res = view.getContext().getResources();
                 mDivider = res.getDrawable(R.drawable.more_suggestions_divider);
-                // TODO: Drawable itself should has an alpha value.
+                // TODO: Drawable itself should have an alpha value.
                 mDivider.setAlpha(128);
                 mDividerWidth = mDivider.getIntrinsicWidth();
                 final int padding = (int) res.getDimension(
diff --git a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java
index afd3df40b1..5c6c834320 100644
--- a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderFixedOrderTests.java
@@ -45,7 +45,7 @@ public class MoreKeysKeyboardBuilderFixedOrderTests extends AndroidTestCase {
             int coordXInParnet) {
         final MoreKeysKeyboardParams params = new MoreKeysKeyboardParams();
         params.setParameters(numKeys, columnNum, WIDTH, HEIGHT, coordXInParnet, KEYBOARD_WIDTH,
-                /* isFixedOrderColumn */true);
+                /* isFixedOrderColumn */true, /* dividerWidth */0);
         return params;
     }
 
diff --git a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderTests.java b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderTests.java
index 456247baec..31f0e0fef8 100644
--- a/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/MoreKeysKeyboardBuilderTests.java
@@ -45,7 +45,7 @@ public class MoreKeysKeyboardBuilderTests extends AndroidTestCase {
             int coordXInParnet) {
         final MoreKeysKeyboardParams params = new MoreKeysKeyboardParams();
         params.setParameters(numKeys, maxColumns, WIDTH, HEIGHT, coordXInParnet, KEYBOARD_WIDTH,
-                /* isFixedOrderColumn */false);
+                /* isFixedOrderColumn */false, /* dividerWidth */0);
         return params;
     }
 
-- 
GitLab