Merge "Rename a resource more appropriate one"
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png
deleted file mode 100644
index 2ed1b34..0000000
--- a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/ic_dialog_keyboard.png b/java/res/drawable-hdpi/ic_dialog_keyboard.png
deleted file mode 100644
index 3054416..0000000
--- a/java/res/drawable-hdpi/ic_dialog_keyboard.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/ic_subtype_mic.png b/java/res/drawable-hdpi/ic_subtype_mic.png
deleted file mode 100644
index 25c9ee2..0000000
--- a/java/res/drawable-hdpi/ic_subtype_mic.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png
deleted file mode 100644
index 0e828a6..0000000
--- a/java/res/drawable-mdpi/btn_keyboard_key_light_popup_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/ic_dialog_keyboard.png b/java/res/drawable-mdpi/ic_dialog_keyboard.png
deleted file mode 100644
index 9a5aada..0000000
--- a/java/res/drawable-mdpi/ic_dialog_keyboard.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/ic_subtype_mic.png b/java/res/drawable-mdpi/ic_subtype_mic.png
deleted file mode 100644
index 0b6aca8..0000000
--- a/java/res/drawable-mdpi/ic_subtype_mic.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png
deleted file mode 100644
index 2ed1b34..0000000
--- a/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/ic_dialog_keyboard.png b/java/res/drawable-xhdpi/ic_dialog_keyboard.png
deleted file mode 100644
index f114c93..0000000
--- a/java/res/drawable-xhdpi/ic_dialog_keyboard.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/ic_subtype_mic.png b/java/res/drawable-xhdpi/ic_subtype_mic.png
deleted file mode 100644
index fc8d18c..0000000
--- a/java/res/drawable-xhdpi/ic_subtype_mic.png
+++ /dev/null
Binary files differ
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index b919bcf..c2f0a3d 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -243,14 +243,13 @@
      * parser.
      * @param res resources associated with the caller's context
      * @param params the keyboard building parameters.
-     * @param row the row that this key belongs to.
-     * @param x the x coordinate of the top-left
-     * @param y the y coordinate of the top-left
+     * @param row the row that this key belongs to. row's x-coordinate will be the right edge of
+     *        this key.
      * @param parser the XML parser containing the attributes for this key
      * @param keyStyles active key styles set
      */
-    public Key(Resources res, KeyboardParams params, Row row, int x, int y,
-            XmlResourceParser parser, KeyStyles keyStyles) {
+    public Key(Resources res, KeyboardParams params, Row row, XmlResourceParser parser,
+            KeyStyles keyStyles) {
 
         final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.Keyboard);
@@ -284,6 +283,7 @@
             }
 
             final int keyboardWidth = params.mOccupiedWidth;
+            final int x = row.mCurrentX;
             int keyXPos = KeyboardBuilder.getDimensionOrFraction(keyAttr,
                     R.styleable.Keyboard_Key_keyXPos, keyboardWidth, x);
             if (keyXPos < 0) {
@@ -309,9 +309,12 @@
 
             // Horizontal gap is divided equally to both sides of the key.
             mX = keyXPos + mHorizontalGap / 2;
-            mY = y;
+            mY = row.mCurrentY;
             mWidth = keyWidth - mHorizontalGap;
 
+            // Update row to have x-coordinate of the right edge of this key.
+            row.mCurrentX = keyXPos + keyWidth;
+
             final CharSequence[] moreKeys = style.getTextArray(
                     keyAttr, R.styleable.Keyboard_Key_moreKeys);
             // In Arabic symbol layouts, we'd like to keep digits in more keys regardless of
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
index c605deb..ff26b59 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
@@ -128,7 +128,6 @@
     protected final Resources mResources;
     private final DisplayMetrics mDisplayMetrics;
 
-    private int mCurrentX = 0;
     private int mCurrentY = 0;
     private Row mCurrentRow = null;
     private boolean mLeftEdge;
@@ -314,7 +313,7 @@
                 throw new IllegalAttribute(parser, "horizontalGap");
             if (a.hasValue(R.styleable.Keyboard_verticalGap))
                 throw new IllegalAttribute(parser, "verticalGap");
-            return new Row(mResources, mParams, parser);
+            return new Row(mResources, mParams, parser, mCurrentY);
         } finally {
             a.recycle();
         }
@@ -344,7 +343,7 @@
                 if (TAG_ROW.equals(tag)) {
                     if (DEBUG) Log.d(TAG, String.format("</%s>", TAG_ROW));
                     if (!skip)
-                        endRow();
+                        endRow(row);
                     break;
                 } else if (TAG_CASE.equals(tag) || TAG_DEFAULT.equals(tag)
                         || TAG_MERGE.equals(tag)) {
@@ -364,7 +363,7 @@
         if (skip) {
             checkEndTag(TAG_KEY, parser);
         } else {
-            Key key = new Key(mResources, mParams, row, mCurrentX, mCurrentY, parser, mKeyStyles);
+            Key key = new Key(mResources, mParams, row, parser, mKeyStyles);
             if (DEBUG) Log.d(TAG, String.format("<%s%s keyLabel=%s code=%d moreKeys=%s />",
                     TAG_KEY, (key.isEnabled() ? "" : " disabled"), key.mLabel, key.mCode,
                     Arrays.toString(key.mMoreKeys)));
@@ -392,14 +391,14 @@
             final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
                     R.styleable.Keyboard_Key);
             int keyXPos = KeyboardBuilder.getDimensionOrFraction(keyAttr,
-                    R.styleable.Keyboard_Key_keyXPos, keyboardWidth, mCurrentX);
+                    R.styleable.Keyboard_Key_keyXPos, keyboardWidth, row.mCurrentX);
             if (keyXPos < 0) {
                 // If keyXPos is negative, the actual x-coordinate will be display_width + keyXPos.
                 keyXPos += keyboardWidth;
             }
 
             checkEndTag(TAG_SPACER, parser);
-            setSpacer(keyXPos, keyWidth);
+            setSpacer(keyXPos, keyWidth, row);
         }
     }
 
@@ -655,28 +654,27 @@
     }
 
     private void startRow(Row row) {
-        mCurrentX = 0;
-        setSpacer(mCurrentX, mParams.mHorizontalEdgesPadding);
+        row.mCurrentX = 0;
+        setSpacer(row.mCurrentX, mParams.mHorizontalEdgesPadding, row);
         mCurrentRow = row;
         mLeftEdge = true;
         mRightEdgeKey = null;
     }
 
-    private void endRow() {
+    private void endRow(Row row) {
         if (mCurrentRow == null)
             throw new InflateException("orphant end row tag");
         if (mRightEdgeKey != null) {
             mRightEdgeKey.addEdgeFlags(Keyboard.EDGE_RIGHT);
             mRightEdgeKey = null;
         }
-        setSpacer(mCurrentX, mParams.mHorizontalEdgesPadding);
+        setSpacer(row.mCurrentX, mParams.mHorizontalEdgesPadding, row);
         mCurrentY += mCurrentRow.mRowHeight;
         mCurrentRow = null;
         mTopEdge = false;
     }
 
     private void endKey(Key key) {
-        mCurrentX = key.mX - key.mHorizontalGap / 2 + key.mWidth + key.mHorizontalGap;
         if (mLeftEdge) {
             key.addEdgeFlags(Keyboard.EDGE_LEFT);
             mLeftEdge = false;
@@ -690,8 +688,8 @@
     private void endKeyboard() {
     }
 
-    private void setSpacer(int keyXPos, int width) {
-        mCurrentX = keyXPos + width;
+    private void setSpacer(int keyXPos, int width, Row row) {
+        row.mCurrentX = keyXPos + width;
         mLeftEdge = false;
         mRightEdgeKey = null;
     }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/Row.java b/java/src/com/android/inputmethod/keyboard/internal/Row.java
index d53fe12..fdf1dec 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/Row.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/Row.java
@@ -35,7 +35,11 @@
     /** Default height of a key in this row. */
     public final int mRowHeight;
 
-    public Row(Resources res, KeyboardParams params, XmlResourceParser parser) {
+    public final int mCurrentY;
+    // Will be updated by {@link Key}'s constructor.
+    public int mCurrentX;
+
+    public Row(Resources res, KeyboardParams params, XmlResourceParser parser, int y) {
         final int keyboardWidth = params.mWidth;
         final int keyboardHeight = params.mHeight;
         TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser),
@@ -45,5 +49,8 @@
         mRowHeight = KeyboardBuilder.getDimensionOrFraction(a,
                 R.styleable.Keyboard_rowHeight, keyboardHeight, params.mDefaultRowHeight);
         a.recycle();
+
+        mCurrentY = y;
+        mCurrentX = 0;
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/SuggestionsView.java b/java/src/com/android/inputmethod/latin/SuggestionsView.java
index 07a44f7..10cd73d 100644
--- a/java/src/com/android/inputmethod/latin/SuggestionsView.java
+++ b/java/src/com/android/inputmethod/latin/SuggestionsView.java
@@ -89,7 +89,7 @@
     private SuggestedWords mSuggestions = SuggestedWords.EMPTY;
     private boolean mShowingAutoCorrectionInverted;
 
-    private final SuggestionsStripParams mStripParams;
+    private final SuggestionsViewParams mParams;
     private static final float MIN_TEXT_XSCALE = 0.70f;
 
     private final UiHandler mHandler = new UiHandler(this);
@@ -144,41 +144,22 @@
     }
 
     private static class SuggestionsViewParams {
-        public final int mPadding;
-        public final int mDividerWidth;
-        public final int mSuggestionsStripHeight;
-
-        protected final List<TextView> mWords;
-        protected final List<View> mDividers;
-        protected final List<TextView> mInfos;
-
-        protected SuggestionsViewParams(List<TextView> words, List<View> dividers,
-                List<TextView> infos) {
-            mWords = words;
-            mDividers = dividers;
-            mInfos = infos;
-
-            final TextView word = words.get(0);
-            final View divider = dividers.get(0);
-            mPadding = word.getCompoundPaddingLeft() + word.getCompoundPaddingRight();
-            divider.measure(
-                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
-            mDividerWidth = divider.getMeasuredWidth();
-
-            final Resources res = word.getResources();
-            mSuggestionsStripHeight = res.getDimensionPixelSize(R.dimen.suggestions_strip_height);
-        }
-    }
-
-    private static class SuggestionsStripParams extends SuggestionsViewParams {
         private static final int DEFAULT_SUGGESTIONS_COUNT_IN_STRIP = 3;
         private static final int DEFAULT_CENTER_SUGGESTION_PERCENTILE = 40;
         private static final int PUNCTUATIONS_IN_STRIP = 6;
 
+        public final int mPadding;
+        public final int mDividerWidth;
+        public final int mSuggestionsStripHeight;
+        public final int mSuggestionsCountInStrip;
+
+        private final List<TextView> mWords;
+        private final List<View> mDividers;
+        private final List<TextView> mInfos;
+
         private final int mColorTypedWord;
         private final int mColorAutoCorrect;
         private final int mColorSuggested;
-        public final int mSuggestionsCountInStrip;
         private final float mCenterSuggestionWeight;
         private final int mCenterSuggestionIndex;
         private final Drawable mMoreSuggestionsHint;
@@ -202,9 +183,22 @@
         private final TextView mHintToSaveView;
         private final CharSequence mHintToSaveText;
 
-        public SuggestionsStripParams(Context context, AttributeSet attrs, int defStyle,
+        public SuggestionsViewParams(Context context, AttributeSet attrs, int defStyle,
                 List<TextView> words, List<View> dividers, List<TextView> infos) {
-            super(words, dividers, infos);
+            mWords = words;
+            mDividers = dividers;
+            mInfos = infos;
+
+            final TextView word = words.get(0);
+            final View divider = dividers.get(0);
+            mPadding = word.getCompoundPaddingLeft() + word.getCompoundPaddingRight();
+            divider.measure(
+                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+            mDividerWidth = divider.getMeasuredWidth();
+
+            final Resources res = word.getResources();
+            mSuggestionsStripHeight = res.getDimensionPixelSize(R.dimen.suggestions_strip_height);
+
             final TypedArray a = context.obtainStyledAttributes(
                     attrs, R.styleable.SuggestionsView, defStyle, R.style.SuggestionsViewStyle);
             mSuggestionStripOption = a.getInt(R.styleable.SuggestionsView_suggestionStripOption, 0);
@@ -220,7 +214,6 @@
             a.recycle();
 
             mCenterSuggestionIndex = mSuggestionsCountInStrip / 2;
-            final Resources res = context.getResources();
             mMoreSuggestionsHint = res.getDrawable(R.drawable.more_suggestions_hint);
 
             mInvertedForegroundColorSpan = new ForegroundColorSpan(mColorTypedWord ^ 0x00ffffff);
@@ -496,9 +489,8 @@
             mInfos.add((TextView)inflater.inflate(R.layout.suggestion_info, null));
         }
 
-        mStripParams = new SuggestionsStripParams(context, attrs, defStyle, mWords, mDividers,
-                mInfos);
-        mStripParams.mWordToSaveView.setOnClickListener(this);
+        mParams = new SuggestionsViewParams(context, attrs, defStyle, mWords, mDividers, mInfos);
+        mParams.mWordToSaveView.setOnClickListener(this);
 
         mMoreSuggestionsContainer = inflater.inflate(R.layout.more_suggestions, null);
         mMoreSuggestionsView = (MoreSuggestionsView)mMoreSuggestionsContainer
@@ -535,7 +527,7 @@
         if (mSuggestions.size() == 0)
             return;
 
-        mStripParams.layout(mSuggestions, mSuggestionsStrip, mSuggestionsPlacer, getWidth());
+        mParams.layout(mSuggestions, mSuggestionsStrip, mSuggestionsPlacer, getWidth());
     }
 
     private static CharSequence getDebugInfo(SuggestedWords suggestions, int pos) {
@@ -624,7 +616,7 @@
     }
 
     public void onAutoCorrectionInverted(CharSequence autoCorrectedWord) {
-        final CharSequence inverted = mStripParams.getInvertedText(autoCorrectedWord);
+        final CharSequence inverted = mParams.getInvertedText(autoCorrectedWord);
         if (inverted == null)
             return;
         final TextView tv = mWords.get(1);
@@ -634,12 +626,12 @@
 
     public boolean isShowingAddToDictionaryHint() {
         return mSuggestionsStrip.getChildCount() > 0
-                && mSuggestionsStrip.getChildAt(0) == mStripParams.mWordToSaveView;
+                && mSuggestionsStrip.getChildAt(0) == mParams.mWordToSaveView;
     }
 
     public void showAddToDictionaryHint(CharSequence word) {
         clear();
-        mStripParams.layoutAddToDictionaryHint(word, mSuggestionsStrip, getWidth());
+        mParams.layoutAddToDictionaryHint(word, mSuggestionsStrip, getWidth());
     }
 
     public boolean dismissAddToDictionaryHint() {
@@ -671,7 +663,7 @@
             return;
 
         final TextView previewText = mPreviewText;
-        previewText.setTextColor(mStripParams.mColorTypedWord);
+        previewText.setTextColor(mParams.mColorTypedWord);
         previewText.setText(word);
         previewText.measure(
                 ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -692,7 +684,7 @@
     private void addToDictionary(CharSequence word) {
         if (mListener.addWordToDictionary(word.toString())) {
             final CharSequence message = getContext().getString(R.string.added_word, word);
-            showPreview(mStripParams.mWordToSaveView, message);
+            showPreview(mParams.mWordToSaveView, message);
         }
     }
 
@@ -732,7 +724,7 @@
 
     @Override
     public boolean onLongClick(View view) {
-        final SuggestionsStripParams params = mStripParams;
+        final SuggestionsViewParams params = mParams;
         if (params.mMoreSuggestionsAvailable) {
             final int stripWidth = getWidth();
             final View container = mMoreSuggestionsContainer;
@@ -799,7 +791,7 @@
 
     @Override
     public void onClick(View view) {
-        if (view == mStripParams.mWordToSaveView) {
+        if (view == mParams.mWordToSaveView) {
             addToDictionary((CharSequence)view.getTag());
             clear();
             return;