diff --git a/java/res/xml/kbd_rows_russian.xml b/java/res/xml/kbd_rows_russian.xml index d6075d2e309a731c5ea7cb1e7e4fc955f80624ea..f1794e7500be329f6e8a2362b53e32000309cd66 100644 --- a/java/res/xml/kbd_rows_russian.xml +++ b/java/res/xml/kbd_rows_russian.xml @@ -29,8 +29,7 @@ <Key latin:keyLabel="й" latin:keyHintLabel="1" - latin:moreKeys="1" - latin:keyWidth="8.75%p" /> + latin:moreKeys="1" /> <Key latin:keyLabel="ц" latin:keyHintLabel="2" diff --git a/java/res/xml/kbd_rows_scandinavian.xml b/java/res/xml/kbd_rows_scandinavian.xml index 6ef54ebba19cf7aa5962ce9849fc0c1965920f28..4f138c514a1f553a41fb5fbf43c4a4b2c83137d0 100644 --- a/java/res/xml/kbd_rows_scandinavian.xml +++ b/java/res/xml/kbd_rows_scandinavian.xml @@ -24,13 +24,12 @@ <include latin:keyboardLayout="@xml/kbd_key_styles" /> <Row - latin:keyWidth="9.09%p" + latin:keyWidth="9.091%p" > <Key latin:keyLabel="q" latin:keyHintLabel="1" - latin:moreKeys="@string/more_keys_for_q" - latin:keyWidth="8.75%p" /> + latin:moreKeys="@string/more_keys_for_q" /> <Key latin:keyLabel="w" latin:keyHintLabel="2" @@ -72,7 +71,7 @@ latin:keyWidth="fillRight" /> </Row> <Row - latin:keyWidth="9.09%p" + latin:keyWidth="9.091%p" > <Key latin:keyLabel="a" diff --git a/java/res/xml/kbd_rows_serbian.xml b/java/res/xml/kbd_rows_serbian.xml index c911ae8075060634de926a3c1bf88d7a820176a8..da4d695218da90b2798f57e655d399478000e4d7 100644 --- a/java/res/xml/kbd_rows_serbian.xml +++ b/java/res/xml/kbd_rows_serbian.xml @@ -24,7 +24,7 @@ <include latin:keyboardLayout="@xml/kbd_key_styles" /> <Row - latin:keyWidth="9.09%p" + latin:keyWidth="9.091%p" > <Key latin:keyLabel="љ" @@ -71,7 +71,7 @@ latin:keyWidth="fillRight" /> </Row> <Row - latin:keyWidth="9.09%p" + latin:keyWidth="9.091%p" > <Key latin:keyLabel="а" /> @@ -98,10 +98,11 @@ latin:keyWidth="fillRight" /> </Row> <Row - latin:keyWidth="8.90%p" + latin:keyWidth="8.5%p" > <Key - latin:keyStyle="shiftKeyStyle" /> + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="11.75%p" /> <Key latin:keyLabel="ѕ" /> <Key diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index c2f0a3db68e25e89494d4add7cf1f9b3a841ad0e..ced18f0f31cd3f57108f6c0034fe2dcf1ddd5198 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -253,126 +253,115 @@ public class Key { final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.Keyboard); - int keyWidth; - try { - mHeight = KeyboardBuilder.getDimensionOrFraction(keyboardAttr, - R.styleable.Keyboard_rowHeight, - params.mHeight, row.mRowHeight) - params.mVerticalGap; - mHorizontalGap = KeyboardBuilder.getDimensionOrFraction(keyboardAttr, - R.styleable.Keyboard_horizontalGap, - params.mWidth, params.mHorizontalGap); - mVerticalGap = params.mVerticalGap; - keyWidth = KeyboardBuilder.getDimensionOrFraction(keyboardAttr, - R.styleable.Keyboard_keyWidth, - params.mWidth, row.mDefaultKeyWidth); - } finally { - keyboardAttr.recycle(); - } + mHeight = (int)KeyboardBuilder.getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_rowHeight, params.mHeight, row.mRowHeight) + - params.mVerticalGap; + final float horizontalGap = KeyboardBuilder.getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_horizontalGap, params.mWidth, params.mHorizontalGap); + mVerticalGap = params.mVerticalGap; + float keyWidth = KeyboardBuilder.getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_keyWidth, params.mWidth, row.mDefaultKeyWidth); + keyboardAttr.recycle(); final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.Keyboard_Key); - try { - final KeyStyle style; - if (keyAttr.hasValue(R.styleable.Keyboard_Key_keyStyle)) { - String styleName = keyAttr.getString(R.styleable.Keyboard_Key_keyStyle); - style = keyStyles.getKeyStyle(styleName); - if (style == null) - throw new ParseException("Unknown key style: " + styleName, parser); - } else { - style = keyStyles.getEmptyKeyStyle(); - } - 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) { - // If keyXPos is negative, the actual x-coordinate will be k + keyXPos. - keyXPos += keyboardWidth; - if (keyXPos < x) { - // keyXPos shouldn't be less than x because drawable area for this key starts - // at x. Or, this key will overlaps the adjacent key on its left hand side. - keyXPos = x; - } - } - if (keyWidth == KEYWIDTH_FILL_RIGHT) { - // If keyWidth is zero, the actual key width will be determined to fill out the - // area up to the right edge of the keyboard. - keyWidth = keyboardWidth - keyXPos; - } else if (keyWidth <= KEYWIDTH_FILL_BOTH) { - // If keyWidth is negative, the actual key width will be determined to fill out the - // area between the nearest key on the left hand side and the right edge of the - // keyboard. + final KeyStyle style; + if (keyAttr.hasValue(R.styleable.Keyboard_Key_keyStyle)) { + String styleName = keyAttr.getString(R.styleable.Keyboard_Key_keyStyle); + style = keyStyles.getKeyStyle(styleName); + if (style == null) + throw new ParseException("Unknown key style: " + styleName, parser); + } else { + style = keyStyles.getEmptyKeyStyle(); + } + + final int keyboardWidth = params.mOccupiedWidth; + final float x = row.mCurrentX; + float keyXPos = KeyboardBuilder.getDimensionOrFraction(keyAttr, + R.styleable.Keyboard_Key_keyXPos, keyboardWidth, x); + if (keyXPos < 0) { + // If keyXPos is negative, the actual x-coordinate will be keyboardWidth + keyXPos. + keyXPos += keyboardWidth; + if (keyXPos < x) { + // keyXPos shouldn't be less than x because drawable area for this key starts + // at x. Or, this key will overlaps the adjacent key on its left hand side. keyXPos = x; - keyWidth = keyboardWidth - keyXPos; } + } + if (keyWidth == KEYWIDTH_FILL_RIGHT) { + // If keyWidth is zero, the actual key width will be determined to fill out the + // area up to the right edge of the keyboard. + keyWidth = keyboardWidth - keyXPos; + } else if (keyWidth <= KEYWIDTH_FILL_BOTH) { + // If keyWidth is negative, the actual key width will be determined to fill out the + // area between the nearest key on the left hand side and the right edge of the + // keyboard. + keyXPos = x; + keyWidth = keyboardWidth - keyXPos; + } - // Horizontal gap is divided equally to both sides of the key. - mX = keyXPos + mHorizontalGap / 2; - 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 - // config_digit_more_keys_enabled. - if (params.mId.isAlphabetKeyboard() && !res.getBoolean( - R.bool.config_digit_more_keys_enabled)) { - mMoreKeys = MoreKeySpecParser.filterOut( - res, moreKeys, MoreKeySpecParser.DIGIT_FILTER); - } else { - mMoreKeys = moreKeys; - } - mMaxMoreKeysColumn = style.getInt(keyboardAttr, - R.styleable.Keyboard_Key_maxMoreKeysColumn, - params.mMaxMiniKeyboardColumn); - - mRepeatable = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable, false); - mFunctional = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isFunctional, false); - mSticky = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky, false); - mEnabled = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_enabled, true); - mEdgeFlags = 0; - - final KeyboardIconsSet iconsSet = params.mIconsSet; - mVisualInsetsLeft = KeyboardBuilder.getDimensionOrFraction(keyAttr, - R.styleable.Keyboard_Key_visualInsetsLeft, keyboardWidth, 0); - mVisualInsetsRight = KeyboardBuilder.getDimensionOrFraction(keyAttr, - R.styleable.Keyboard_Key_visualInsetsRight, keyboardWidth, 0); - mPreviewIcon = iconsSet.getIcon(style.getInt( - keyAttr, R.styleable.Keyboard_Key_keyIconPreview, - KeyboardIconsSet.ICON_UNDEFINED)); - mIcon = iconsSet.getIcon(style.getInt( - keyAttr, R.styleable.Keyboard_Key_keyIcon, - KeyboardIconsSet.ICON_UNDEFINED)); - final int shiftedIconId = style.getInt(keyAttr, R.styleable.Keyboard_Key_keyIconShifted, - KeyboardIconsSet.ICON_UNDEFINED); - if (shiftedIconId != KeyboardIconsSet.ICON_UNDEFINED) { - final Drawable shiftedIcon = iconsSet.getIcon(shiftedIconId); - params.addShiftedIcon(this, shiftedIcon); - } - mHintLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyHintLabel); - - mLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyLabel); - mLabelOption = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption, 0); - mOutputText = style.getText(keyAttr, R.styleable.Keyboard_Key_keyOutputText); - // Choose the first letter of the label as primary code if not - // specified. - final int code = style.getInt(keyAttr, R.styleable.Keyboard_Key_code, - Keyboard.CODE_UNSPECIFIED); - if (code == Keyboard.CODE_UNSPECIFIED && !TextUtils.isEmpty(mLabel)) { - final int firstChar = mLabel.charAt(0); - mCode = getRtlParenthesisCode(firstChar, params.mIsRtlKeyboard); - } else if (code != Keyboard.CODE_UNSPECIFIED) { - mCode = code; - } else { - mCode = Keyboard.CODE_DUMMY; - } - } finally { - keyAttr.recycle(); + // Horizontal gap is divided equally to both sides of the key. + mX = (int) (keyXPos + horizontalGap / 2); + mY = row.mCurrentY; + mWidth = (int) (keyWidth - horizontalGap); + mHorizontalGap = (int) horizontalGap; + // Update row to have current x coordinate. + 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 + // config_digit_more_keys_enabled. + if (params.mId.isAlphabetKeyboard() + && !res.getBoolean(R.bool.config_digit_more_keys_enabled)) { + mMoreKeys = MoreKeySpecParser.filterOut(res, moreKeys, MoreKeySpecParser.DIGIT_FILTER); + } else { + mMoreKeys = moreKeys; + } + mMaxMoreKeysColumn = style.getInt(keyboardAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn, + params.mMaxMiniKeyboardColumn); + + mRepeatable = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable, false); + mFunctional = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isFunctional, false); + mSticky = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky, false); + mEnabled = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_enabled, true); + mEdgeFlags = 0; + + final KeyboardIconsSet iconsSet = params.mIconsSet; + mVisualInsetsLeft = (int) KeyboardBuilder.getDimensionOrFraction(keyAttr, + R.styleable.Keyboard_Key_visualInsetsLeft, keyboardWidth, 0); + mVisualInsetsRight = (int) KeyboardBuilder.getDimensionOrFraction(keyAttr, + R.styleable.Keyboard_Key_visualInsetsRight, keyboardWidth, 0); + mPreviewIcon = iconsSet.getIcon(style.getInt(keyAttr, + R.styleable.Keyboard_Key_keyIconPreview, KeyboardIconsSet.ICON_UNDEFINED)); + mIcon = iconsSet.getIcon(style.getInt(keyAttr, R.styleable.Keyboard_Key_keyIcon, + KeyboardIconsSet.ICON_UNDEFINED)); + final int shiftedIconId = style.getInt(keyAttr, R.styleable.Keyboard_Key_keyIconShifted, + KeyboardIconsSet.ICON_UNDEFINED); + if (shiftedIconId != KeyboardIconsSet.ICON_UNDEFINED) { + final Drawable shiftedIcon = iconsSet.getIcon(shiftedIconId); + params.addShiftedIcon(this, shiftedIcon); } + mHintLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyHintLabel); + + mLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyLabel); + mLabelOption = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption, 0); + mOutputText = style.getText(keyAttr, R.styleable.Keyboard_Key_keyOutputText); + // Choose the first letter of the label as primary code if not + // specified. + final int code = style.getInt(keyAttr, R.styleable.Keyboard_Key_code, + Keyboard.CODE_UNSPECIFIED); + if (code == Keyboard.CODE_UNSPECIFIED && !TextUtils.isEmpty(mLabel)) { + final int firstChar = mLabel.charAt(0); + mCode = getRtlParenthesisCode(firstChar, params.mIsRtlKeyboard); + } else if (code != Keyboard.CODE_UNSPECIFIED) { + mCode = code; + } else { + mCode = Keyboard.CODE_DUMMY; + } + + keyAttr.recycle(); } public void addEdgeFlags(int flags) { diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java index ff26b5977c4aec590cef384e0aa1a1b790cc4b7d..5336ea90961571afbc8b19ac37048a30963d6b3d 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java @@ -218,14 +218,14 @@ public class KeyboardBuilder<KP extends KeyboardParams> { final int displayHeight = mDisplayMetrics.heightPixels; final int keyboardHeight = (int)keyboardAttr.getDimension( R.styleable.Keyboard_keyboardHeight, displayHeight / 2); - final int maxKeyboardHeight = getDimensionOrFraction(keyboardAttr, + final int maxKeyboardHeight = (int)getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_maxKeyboardHeight, displayHeight, displayHeight / 2); - int minKeyboardHeight = getDimensionOrFraction(keyboardAttr, + int minKeyboardHeight = (int)getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_minKeyboardHeight, displayHeight, displayHeight / 2); if (minKeyboardHeight < 0) { // Specified fraction was negative, so it should be calculated against display // width. - minKeyboardHeight = -getDimensionOrFraction(keyboardAttr, + minKeyboardHeight = -(int)getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_minKeyboardHeight, displayWidth, displayWidth / 2); } // Keyboard height will not exceed maxKeyboardHeight and will not be less than @@ -233,9 +233,9 @@ public class KeyboardBuilder<KP extends KeyboardParams> { mParams.mOccupiedHeight = Math.max( Math.min(keyboardHeight, maxKeyboardHeight), minKeyboardHeight); mParams.mOccupiedWidth = mParams.mId.mWidth; - mParams.mTopPadding = getDimensionOrFraction(keyboardAttr, + mParams.mTopPadding = (int)getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyboardTopPadding, mParams.mOccupiedHeight, 0); - mParams.mBottomPadding = getDimensionOrFraction(keyboardAttr, + mParams.mBottomPadding = (int)getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyboardBottomPadding, mParams.mOccupiedHeight, 0); final int height = mParams.mOccupiedHeight; @@ -243,13 +243,13 @@ public class KeyboardBuilder<KP extends KeyboardParams> { - mParams.mHorizontalCenterPadding; mParams.mHeight = height; mParams.mWidth = width; - mParams.mDefaultKeyWidth = getDimensionOrFraction(keyboardAttr, + mParams.mDefaultKeyWidth = (int)getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyWidth, width, width / 10); - mParams.mDefaultRowHeight = getDimensionOrFraction(keyboardAttr, + mParams.mDefaultRowHeight = (int)getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_rowHeight, height, height / 4); - mParams.mHorizontalGap = getDimensionOrFraction(keyboardAttr, + mParams.mHorizontalGap = (int)getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_horizontalGap, width, 0); - mParams.mVerticalGap = getDimensionOrFraction(keyboardAttr, + mParams.mVerticalGap = (int)getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_verticalGap, height, 0); mParams.mIsRtlKeyboard = keyboardAttr.getBoolean( @@ -384,13 +384,13 @@ public class KeyboardBuilder<KP extends KeyboardParams> { if (keyboardAttr.hasValue(R.styleable.Keyboard_horizontalGap)) throw new IllegalAttribute(parser, "horizontalGap"); final int keyboardWidth = mParams.mWidth; - final int keyWidth = getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyWidth, - keyboardWidth, row.mDefaultKeyWidth); + final float keyWidth = getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_keyWidth, keyboardWidth, row.mDefaultKeyWidth); keyboardAttr.recycle(); final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.Keyboard_Key); - int keyXPos = KeyboardBuilder.getDimensionOrFraction(keyAttr, + float keyXPos = getDimensionOrFraction(keyAttr, R.styleable.Keyboard_Key_keyXPos, keyboardWidth, row.mCurrentX); if (keyXPos < 0) { // If keyXPos is negative, the actual x-coordinate will be display_width + keyXPos. @@ -688,24 +688,23 @@ public class KeyboardBuilder<KP extends KeyboardParams> { private void endKeyboard() { } - private void setSpacer(int keyXPos, int width, Row row) { + private void setSpacer(float keyXPos, float width, Row row) { row.mCurrentX = keyXPos + width; mLeftEdge = false; mRightEdgeKey = null; } - public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) { + public static float getDimensionOrFraction(TypedArray a, int index, int base, float defValue) { final TypedValue value = a.peekValue(index); if (value == null) return defValue; if (isFractionValue(value)) { - // Round it to avoid values like 47.9999 from getting truncated - return Math.round(a.getFraction(index, base, base, defValue)); + return a.getFraction(index, base, base, defValue); } else if (isDimensionValue(value)) { - return a.getDimensionPixelOffset(index, defValue); + return a.getDimension(index, defValue); } else if (isIntegerValue(value)) { // For enum value. - return a.getInt(index, defValue); + return a.getInt(index, 0); } return defValue; } diff --git a/java/src/com/android/inputmethod/keyboard/internal/Row.java b/java/src/com/android/inputmethod/keyboard/internal/Row.java index fdf1dec68d058291646328e33225725eb9d32131..d81881d77e0cfc3c451f45a75857436d26b1bbcb 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/Row.java +++ b/java/src/com/android/inputmethod/keyboard/internal/Row.java @@ -31,13 +31,13 @@ import com.android.inputmethod.latin.R; */ public class Row { /** Default width of a key in this row. */ - public final int mDefaultKeyWidth; + public final float mDefaultKeyWidth; /** Default height of a key in this row. */ public final int mRowHeight; public final int mCurrentY; // Will be updated by {@link Key}'s constructor. - public int mCurrentX; + public float mCurrentX; public Row(Resources res, KeyboardParams params, XmlResourceParser parser, int y) { final int keyboardWidth = params.mWidth; @@ -46,11 +46,11 @@ public class Row { R.styleable.Keyboard); mDefaultKeyWidth = KeyboardBuilder.getDimensionOrFraction(a, R.styleable.Keyboard_keyWidth, keyboardWidth, params.mDefaultKeyWidth); - mRowHeight = KeyboardBuilder.getDimensionOrFraction(a, + mRowHeight = (int)KeyboardBuilder.getDimensionOrFraction(a, R.styleable.Keyboard_rowHeight, keyboardHeight, params.mDefaultRowHeight); a.recycle(); mCurrentY = y; - mCurrentX = 0; + mCurrentX = 0.0f; } }