diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index b919bcfc4..c2f0a3db6 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -243,14 +243,13 @@ public class Key { * 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 @@ public class Key { } 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 @@ public class Key { // 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 c605debab..ff26b5977 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 @@ public class KeyboardBuilder { 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 @@ public class KeyboardBuilder { 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 @@ public class KeyboardBuilder { if (TAG_ROW.equals(tag)) { if (DEBUG) Log.d(TAG, String.format("", 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 @@ public class KeyboardBuilder { 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 @@ public class KeyboardBuilder { 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 @@ public class KeyboardBuilder { } 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 @@ public class KeyboardBuilder { 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 d53fe12e2..fdf1dec68 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 @@ public class Row { /** 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 @@ public class Row { mRowHeight = KeyboardBuilder.getDimensionOrFraction(a, R.styleable.Keyboard_rowHeight, keyboardHeight, params.mDefaultRowHeight); a.recycle(); + + mCurrentY = y; + mCurrentX = 0; } }