diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 64a4c9fc62765e13c4d7f6e1cc5186c7dbc98678..2087115041c27e4654845988db33840a5027f7f6 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -106,6 +106,14 @@ <attr name="keyOutputText" format="string" /> <!-- The label to display on the key. --> <attr name="keyLabel" format="string" /> + <!-- The key label option --> + <attr name="keyLabelOption"> + <!-- This should be aligned with BaseKeyboardView.KEY_LABEL_OPTION_* --> + <flag name="alignLeft" value="1" /> + <flag name="alignRight" value="2" /> + <flag name="alignBottom" value="8" /> + <flag name="fontItalic" value="16" /> + </attr> <!-- The unicode that this key generates in manual temporary upper case mode. --> <attr name="manualTemporaryUpperCaseCode" format="integer" /> <!-- The icon to display on the key instead of the label. --> @@ -132,14 +140,14 @@ </declare-styleable> <declare-styleable name="BaseKeyboard_Case"> - <!-- This should be matched with KeyboardSwitcher.MODE_* --> + <!-- This should be aligned with KeyboardSwitcher.MODE_* --> <attr name="mode"> - <flag name="text" value="0" /> - <flag name="url" value="1" /> - <flag name="email" value="2" /> - <flag name="im" value="3" /> - <flag name="web" value="4" /> - <flag name="phone" value="5" /> + <enum name="text" value="0" /> + <enum name="url" value="1" /> + <enum name="email" value="2" /> + <enum name="im" value="3" /> + <enum name="web" value="4" /> + <enum name="phone" value="5" /> </attr> <attr name="settingsKey" format="string" /> <attr name="voiceKey" format="string" /> diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index cc513ae896b9517897b153a1eef54b01df71f3bb..018a1f98381455ec3e5925e6b3aed2bc89a58ec2 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -226,6 +226,12 @@ <string name="label_alpha_key">ABC</string> <!-- Label for ALT modifier key. Must be short to fit on key! --> <string name="label_alt_key">ALT</string> + <!-- Label for Backspace modifier key. Must be short to fit on key! --> + <string name="label_backspace_key">Backspace</string> + <!-- Label for Shift modifier key. Must be short to fit on key! --> + <string name="label_shift_key">Shift</string> + <!-- Label for Return key. Must be short to fit on key! --> + <string name="label_return_key">Return</string> <!-- Label for Shift modifier key of symbol keyboard. Must be short to fit on key! --> <string name="label_more_key">More</string> <!-- Label for "Tab" key. Must be short to fit on key! [CHAR LIMIT=4]--> diff --git a/java/res/xml-xlarge/kbd_phone.xml b/java/res/xml-xlarge/kbd_phone.xml index 8199b019b49a70bed9061a96ba75e39f9b208cff..013f005d42a621e54fcd8778a56d0fd08de08cbd 100644 --- a/java/res/xml-xlarge/kbd_phone.xml +++ b/java/res/xml-xlarge/kbd_phone.xml @@ -30,6 +30,7 @@ <Key latin:codes="@integer/key_tab" latin:keyLabel="@string/label_tab_key" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="12.1%p" latin:isModifier="true" latin:keyEdgeFlags="left" /> @@ -61,8 +62,8 @@ latin:horizontalGap="4.0%p" /> <Key latin:codes="@integer/key_delete" - latin:keyIcon="@drawable/sym_keyboard_delete" - latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyLabel="@string/label_backspace_key" + latin:keyLabelOption="fontItalic|alignRight|alignBottom" latin:keyWidth="15.0%p" latin:isModifier="true" latin:isRepeatable="true" @@ -72,6 +73,7 @@ <Key latin:codes="@integer/key_symbol" latin:keyLabel="@string/label_more_key" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="12.1%p" latin:isModifier="true" latin:isSticky="true" @@ -104,8 +106,8 @@ latin:horizontalGap="4.0%p" /> <Key latin:codes="@integer/key_return" - latin:keyIcon="@drawable/sym_keyboard_return" - latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyLabel="@string/label_return_key" + latin:keyLabelOption="fontItalic|alignRight|alignBottom" latin:keyWidth="15.0%p" latin:isModifier="true" latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-xlarge/kbd_phone_symbols.xml b/java/res/xml-xlarge/kbd_phone_symbols.xml index 2e604d374a74ca790eb553a32526314bdd62224f..618d2c3bc3ae33ecd52dd9e973b6c4724036961b 100644 --- a/java/res/xml-xlarge/kbd_phone_symbols.xml +++ b/java/res/xml-xlarge/kbd_phone_symbols.xml @@ -30,6 +30,7 @@ <Key latin:codes="@integer/key_tab" latin:keyLabel="@string/label_tab_key" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="12.1%p" latin:isModifier="true" latin:keyEdgeFlags="left" /> @@ -64,8 +65,8 @@ latin:horizontalGap="4.0%p" /> <Key latin:codes="@integer/key_delete" - latin:keyIcon="@drawable/sym_keyboard_delete" - latin:iconPreview="@drawable/sym_keyboard_feedback_delete" + latin:keyLabel="@string/label_backspace_key" + latin:keyLabelOption="fontItalic|alignRight|alignBottom" latin:keyWidth="15.0%p" latin:isModifier="true" latin:isRepeatable="true" @@ -75,6 +76,7 @@ <Key latin:codes="@integer/key_symbol" latin:keyLabel="@string/label_more_key" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="12.1%p" latin:isModifier="true" latin:isSticky="true" @@ -110,8 +112,8 @@ latin:horizontalGap="4.0%p" /> <Key latin:codes="@integer/key_return" - latin:keyIcon="@drawable/sym_keyboard_return" - latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyLabel="@string/label_return_key" + latin:keyLabelOption="fontItalic|alignRight|alignBottom" latin:keyWidth="15.0%p" latin:isModifier="true" latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-xlarge/kbd_qwerty_row1.xml b/java/res/xml-xlarge/kbd_qwerty_row1.xml index 51a792798f7fe0e476e5af5bbb4862517f05266e..75420798353501242951fa99d176e6e666fa4f6f 100644 --- a/java/res/xml-xlarge/kbd_qwerty_row1.xml +++ b/java/res/xml-xlarge/kbd_qwerty_row1.xml @@ -25,7 +25,8 @@ <Row> <Key latin:codes="@integer/key_tab" - latin:keyLabel="Tab" + latin:keyLabel="@string/label_tab_key" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="7.0%p" latin:isModifier="true" latin:keyEdgeFlags="left" /> diff --git a/java/res/xml-xlarge/kbd_qwerty_row2.xml b/java/res/xml-xlarge/kbd_qwerty_row2.xml index 71aa916c7a4cd9f42faa38ffa59dc33069404e09..cf1a908674e6f8ef4ae717761d2ae2b6243e1af6 100644 --- a/java/res/xml-xlarge/kbd_qwerty_row2.xml +++ b/java/res/xml-xlarge/kbd_qwerty_row2.xml @@ -25,6 +25,7 @@ <Key latin:codes="@integer/key_symbol" latin:keyLabel="@string/label_symbol_key" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="9.7%p" latin:isModifier="true" latin:keyEdgeFlags="left" /> @@ -75,8 +76,8 @@ </switch> <Key latin:codes="@integer/key_return" - latin:keyIcon="@drawable/sym_keyboard_return" - latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyLabel="@string/label_return_key" + latin:keyLabelOption="fontItalic|alignRight|alignBottom" latin:keyWidth="8.3%p" latin:isModifier="true" latin:keyEdgeFlags="right" /> diff --git a/java/res/xml-xlarge/kbd_qwerty_row3.xml b/java/res/xml-xlarge/kbd_qwerty_row3.xml index 24d1b1db9ebb0a0e8198e476c4dca46dcebe7d2b..cc3476cc774b3be369a50f5877877d486ffc5d2d 100644 --- a/java/res/xml-xlarge/kbd_qwerty_row3.xml +++ b/java/res/xml-xlarge/kbd_qwerty_row3.xml @@ -24,9 +24,9 @@ <Row> <Key latin:codes="@integer/key_shift" - latin:keyIcon="@drawable/sym_keyboard_shift" - latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyLabel="@string/label_shift_key" latin:keyWidth="13.1%p" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:isModifier="true" latin:isSticky="true" latin:keyEdgeFlags="left" /> @@ -80,8 +80,8 @@ </switch> <Key latin:codes="@integer/key_shift" - latin:keyIcon="@drawable/sym_keyboard_shift" - latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyLabel="@string/label_shift_key" + latin:keyLabelOption="fontItalic|alignRight|alignBottom" latin:keyWidth="13.1%p" latin:isModifier="true" latin:isSticky="true" diff --git a/java/res/xml-xlarge/kbd_symbols.xml b/java/res/xml-xlarge/kbd_symbols.xml index 102853320eb451547bd9e494897c1ac4515c6e75..354558e9d6576b42266bd1bea7b3a6ee3b5c2fc6 100644 --- a/java/res/xml-xlarge/kbd_symbols.xml +++ b/java/res/xml-xlarge/kbd_symbols.xml @@ -29,7 +29,8 @@ <Row> <Key latin:codes="@integer/key_tab" - latin:keyLabel="Tab" + latin:keyLabel="@string/label_tab_key" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="7.0%p" latin:isModifier="true" latin:keyEdgeFlags="left" /> @@ -80,6 +81,7 @@ <Key latin:codes="@integer/key_symbol" latin:keyLabel="@string/label_alpha_key" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="9.7%p" latin:isModifier="true" latin:keyEdgeFlags="left" /> @@ -119,8 +121,8 @@ latin:popupCharacters="]}>" /> <Key latin:codes="@integer/key_return" - latin:keyIcon="@drawable/sym_keyboard_return" - latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyLabel="@string/label_return_key" + latin:keyLabelOption="fontItalic|alignRight|alignBottom" latin:keyWidth="8.3%p" latin:isModifier="true" latin:keyEdgeFlags="right" /> @@ -129,7 +131,7 @@ <Key latin:codes="@integer/key_shift" latin:keyLabel="@string/label_more_key" - latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="13.1%p" latin:isModifier="true" latin:isSticky="true" @@ -162,6 +164,7 @@ latin:codes="@integer/key_shift" latin:keyLabel="@string/label_more_key" latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyLabelOption="fontItalic|alignRight|alignBottom" latin:keyWidth="13.1%p" latin:isModifier="true" latin:isSticky="true" diff --git a/java/res/xml-xlarge/kbd_symbols_shift.xml b/java/res/xml-xlarge/kbd_symbols_shift.xml index d6de3a0cdf4a0a53063fc7c85bede2f4e567967f..5042b7227e594d86079573928ae4e4d93bed052a 100644 --- a/java/res/xml-xlarge/kbd_symbols_shift.xml +++ b/java/res/xml-xlarge/kbd_symbols_shift.xml @@ -29,7 +29,8 @@ <Row> <Key latin:codes="@integer/key_tab" - latin:keyLabel="Tab" + latin:keyLabel="@string/label_tab_key" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="7.0%p" latin:isModifier="true" latin:keyEdgeFlags="left" /> @@ -70,6 +71,7 @@ <Key latin:codes="@integer/key_symbol" latin:keyLabel="@string/label_alpha_key" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="9.7%p" latin:isModifier="true" latin:keyEdgeFlags="left" /> @@ -99,8 +101,8 @@ latin:keyLabel="]" /> <Key latin:codes="@integer/key_return" - latin:keyIcon="@drawable/sym_keyboard_return" - latin:iconPreview="@drawable/sym_keyboard_feedback_return" + latin:keyLabel="@string/label_return_key" + latin:keyLabelOption="fontItalic|alignRight|alignBottom" latin:keyWidth="8.3%p" latin:isModifier="true" latin:keyEdgeFlags="right" /> @@ -109,7 +111,7 @@ <Key latin:codes="@integer/key_shift" latin:keyLabel="@string/label_more_key" - latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyLabelOption="fontItalic|alignLeft|alignBottom" latin:keyWidth="13.1%p" latin:isModifier="true" latin:isSticky="true" @@ -143,7 +145,7 @@ <Key latin:codes="@integer/key_shift" latin:keyLabel="@string/label_more_key" - latin:iconPreview="@drawable/sym_keyboard_feedback_shift" + latin:keyLabelOption="fontItalic|alignRight|alignBottom" latin:keyWidth="13.1%p" latin:isModifier="true" latin:isSticky="true" diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboard.java b/java/src/com/android/inputmethod/latin/BaseKeyboard.java index 9dbfff34aaf16a889db86406cc1c56060b39bd8e..cb0ac216ce69597f205d7c123202246a5aaf8f5f 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboard.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboard.java @@ -183,6 +183,8 @@ public class BaseKeyboard { /** Label to display */ public CharSequence label; + /** Option of the label */ + public int labelOption; /** Icon to display instead of a label. Icon takes precedence over a label */ public Drawable icon; @@ -331,6 +333,7 @@ public class BaseKeyboard { setDefaultBounds(manualTemporaryUpperCaseHintIcon); label = a.getText(R.styleable.BaseKeyboard_Key_keyLabel); + labelOption = a.getInt(R.styleable.BaseKeyboard_Key_keyLabelOption, 0); manualTemporaryUpperCaseCode = a.getInt( R.styleable.BaseKeyboard_Key_manualTemporaryUpperCaseCode, 0); text = a.getText(R.styleable.BaseKeyboard_Key_keyOutputText); diff --git a/java/src/com/android/inputmethod/latin/BaseKeyboardView.java b/java/src/com/android/inputmethod/latin/BaseKeyboardView.java index 89c9572b1c8ce384215de8dc31eb53956136c024..8efd0ae9a27c7969faf885f23fa9506d6d0a3923 100644 --- a/java/src/com/android/inputmethod/latin/BaseKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/BaseKeyboardView.java @@ -249,9 +249,20 @@ public class BaseKeyboardView extends View implements PointerTracker.UIProxy { private final Rect mClipRegion = new Rect(0, 0, 0, 0); // This map caches key label text height in pixel as value and key label text size as map key. private final HashMap<Integer, Integer> mTextHeightCache = new HashMap<Integer, Integer>(); - // Distance from horizontal center of the key, proportional to key label text height. - private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR = 0.55f; - private final String KEY_LABEL_HEIGHT_REFERENCE_CHAR = "H"; + // This map caches key label text width in pixel as value and key label text size as map key. + private final HashMap<Integer, Integer> mTextWidthCache = new HashMap<Integer, Integer>(); + // Distance from horizontal center of the key, proportional to key label text height and width. + private final float KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER = 0.55f; + private final float KEY_LABEL_VERTICAL_PADDING_FACTOR = 1.60f; + private final float KEY_LABEL_HORIZONTAL_PADDING_FACTOR = 0.80f; + private final String KEY_LABEL_REFERENCE_CHAR = "H"; + private final int KEY_LABEL_OPTION_ALIGN_LEFT = 1; + private final int KEY_LABEL_OPTION_ALIGN_RIGHT = 2; + private final int KEY_LABEL_OPTION_ALIGN_BOTTOM = 8; + private final int KEY_LABEL_OPTION_FONT_ITALIC = 16; + // TODO: Currently we don't have san-serif italic type face. This is actually san-serif + // non-italic type face. + private final Typeface TYPEFACE_ITALIC = Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC); private final UIHandler mHandler = new UIHandler(); @@ -808,12 +819,17 @@ public class BaseKeyboardView extends View implements PointerTracker.UIProxy { keyBackground.draw(canvas); boolean drawHintIcon = true; + // Draw key label if (label != null) { // For characters, use large font. For labels like "Done", use small font. final int labelSize; if (label.length() > 1 && key.codes.length < 2) { labelSize = mLabelTextSize; - paint.setTypeface(Typeface.DEFAULT_BOLD); + if ((key.labelOption & KEY_LABEL_OPTION_FONT_ITALIC) != 0) { + paint.setTypeface(TYPEFACE_ITALIC); + } else { + paint.setTypeface(Typeface.DEFAULT_BOLD); + } } else { labelSize = mKeyTextSize; paint.setTypeface(mKeyTextStyle); @@ -821,26 +837,51 @@ public class BaseKeyboardView extends View implements PointerTracker.UIProxy { paint.setTextSize(labelSize); Integer labelHeightValue = mTextHeightCache.get(labelSize); - final int labelHeight; + final int labelCharHeight; + final int labelCharWidth; if (labelHeightValue != null) { - labelHeight = labelHeightValue; + labelCharHeight = labelHeightValue; + labelCharWidth = mTextWidthCache.get(labelSize); } else { Rect textBounds = new Rect(); - paint.getTextBounds(KEY_LABEL_HEIGHT_REFERENCE_CHAR, 0, 1, textBounds); - labelHeight = textBounds.height(); - mTextHeightCache.put(labelSize, labelHeight); + paint.getTextBounds(KEY_LABEL_REFERENCE_CHAR, 0, 1, textBounds); + labelCharHeight = textBounds.height(); + labelCharWidth = textBounds.width(); + mTextHeightCache.put(labelSize, labelCharHeight); + mTextWidthCache.put(labelSize, labelCharWidth); } - // Draw a drop shadow for the text + // Vertical label text alignment. + final float baseline; + if ((key.labelOption & KEY_LABEL_OPTION_ALIGN_BOTTOM) != 0) { + baseline = key.height - + + labelCharHeight * KEY_LABEL_VERTICAL_PADDING_FACTOR; + } else { // Align center + final float centerY = (key.height + padding.top - padding.bottom) / 2; + baseline = centerY + + labelCharHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR_CENTER; + } + // Horizontal label text alignment + final int positionX; + if ((key.labelOption & KEY_LABEL_OPTION_ALIGN_LEFT) != 0) { + positionX = (int)( + labelCharWidth * KEY_LABEL_HORIZONTAL_PADDING_FACTOR + padding.left); + paint.setTextAlign(Align.LEFT); + } else if ((key.labelOption & KEY_LABEL_OPTION_ALIGN_RIGHT) != 0) { + positionX = (int)(key.width + - labelCharWidth * KEY_LABEL_HORIZONTAL_PADDING_FACTOR - padding.right); + paint.setTextAlign(Align.RIGHT); + } else { + positionX = (key.width + padding.left - padding.right) / 2; + paint.setTextAlign(Align.CENTER); + } + // Set a drop shadow for the text paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor); - final int centerX = (key.width + padding.left - padding.right) / 2; - final int centerY = (key.height + padding.top - padding.bottom) / 2; - final float baseline = centerY - + labelHeight * KEY_LABEL_VERTICAL_ADJUSTMENT_FACTOR; - canvas.drawText(label, centerX, baseline, paint); + canvas.drawText(label, positionX, baseline, paint); // Turn off drop shadow paint.setShadowLayer(0, 0, 0, 0); } + // Draw key icon if (key.label == null && key.icon != null) { int drawableWidth = key.icon.getIntrinsicWidth(); int drawableHeight = key.icon.getIntrinsicHeight();