diff options
Diffstat (limited to 'java')
-rw-r--r-- | java/res/values-ar/donottranslate-more-keys.xml | 47 | ||||
-rw-r--r-- | java/res/values-es/donottranslate-more-keys.xml | 6 | ||||
-rw-r--r-- | java/res/values-iw/donottranslate-more-keys.xml | 22 | ||||
-rw-r--r-- | java/res/values/donottranslate-more-keys.xml | 32 | ||||
-rw-r--r-- | java/res/xml-sw600dp/key_styles_common.xml | 3 | ||||
-rw-r--r-- | java/res/xml-sw600dp/rows_symbols.xml | 3 | ||||
-rw-r--r-- | java/res/xml-sw768dp/key_styles_common.xml | 3 | ||||
-rw-r--r-- | java/res/xml-sw768dp/rows_symbols.xml | 3 | ||||
-rw-r--r-- | java/res/xml/key_styles_common.xml | 1 | ||||
-rw-r--r-- | java/res/xml/key_styles_enter_phone.xml | 1 | ||||
-rw-r--r-- | java/res/xml/rows_azerty.xml | 6 | ||||
-rw-r--r-- | java/res/xml/rows_symbols.xml | 3 | ||||
-rw-r--r-- | java/src/com/android/inputmethod/keyboard/Key.java | 33 | ||||
-rw-r--r-- | java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java | 86 | ||||
-rw-r--r-- | java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java | 71 |
15 files changed, 202 insertions, 118 deletions
diff --git a/java/res/values-ar/donottranslate-more-keys.xml b/java/res/values-ar/donottranslate-more-keys.xml index bb36af2e4..7d69d28d5 100644 --- a/java/res/values-ar/donottranslate-more-keys.xml +++ b/java/res/values-ar/donottranslate-more-keys.xml @@ -18,27 +18,25 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- U+060C: "،" ARABIC COMMA - U+061B: "؛" ARABIC SEMICOLON - U+061F: "؟" ARABIC QUESTION MARK --> + <!-- U+061F: "؟" ARABIC QUESTION MARK + U+060C: "،" ARABIC COMMA + U+061B: "؛" ARABIC SEMICOLON --> <!-- U+0650: "ِ" ARABIC KASRA U+064E: "َ" ARABIC FATHA - U+064B: "ً" ARABIC FATHATAN - U+0640: "ـ" ARABIC TATWEEL U+064D: "ٍ" ARABIC KASRATAN - U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF + U+064B: "ً" ARABIC FATHATAN U+0656: "ٖ" ARABIC SUBSCRIPT ALEF - U+0654: "ٔ" ARABIC HAMZA ABOVE - U+0655: "ٕ" ARABIC HAMZA BELOW --> - <!-- U+0651: "ّ" ARABIC SHADDA - U+0652: "ْ" ARABIC SUKUN + U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF + U+0655: "ٕ" ARABIC HAMZA BELOW + U+0654: "ٔ" ARABIC HAMZA ABOVE --> + <!-- U+064F: "ُ" ARABIC DAMMA U+064C: "ٌ" ARABIC DAMMATAN + U+0651: "ّ" ARABIC SHADDA + U+0652: "ْ" ARABIC SUKUN U+0653: "ٓ" ARABIC MADDAH ABOVE - U+064F: "ُ" ARABIC DAMMA --> + U+0640: "ـ" ARABIC TATWEEL --> <!-- In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label. --> - <!-- TODO: Will introduce "grouping marks" to the more characters specification. --> - <string name="more_keys_for_punctuation">"،,؛,؟,!,:,-,/,\',\",ـــ|ـ,َ,ِ,ً,ٍ,ٰ,ٖ,ٕ,ٔ,ٓ,ْ,ّ,ٌ,ُ"</string> - <integer name="more_keys_keyboard_column_for_punctuation">9</integer> + <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,\",\',-,:,!,؟,،,؛,ِ,َ,ٍ,ً,ٖ,ٰ,ٕ,ٔ,ُ,ٌ,ّ,ْ,ٓ,ـــ|ـ,/"</string> <string name="keyhintlabel_for_punctuation">ً</string> <!-- U+0661: "١" ARABIC-INDIC DIGIT ONE --> <string name="keylabel_for_symbols_1">١</string> @@ -79,7 +77,8 @@ <!-- U+066A: "٪" ARABIC PERCENT SIGN --> <string name="keylabel_for_symbols_percent">٪</string> <string name="more_keys_for_comma">,</string> - <string name="more_keys_for_f1">,</string> + <!-- U+060C: "،" ARABIC COMMA --> + <string name="more_keys_for_f1">،</string> <string name="more_keys_for_f1_settings">\\,,\@icon/settingsKey|\@integer/key_settings</string> <string name="more_keys_for_f1_navigate">\\,,\@icon/tabKey|\@integer/key_tab</string> <string name="more_keys_for_symbols_question">\?</string> @@ -125,8 +124,8 @@ U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS --> <!-- TODO: DroidSansArabic lacks the glyph of U+FD3E ORNATE LEFT PARENTHESIS --> <!-- TODO: DroidSansArabic lacks the glyph of U+FD3F ORNATE RIGHT PARENTHESIS --> - <string name="more_keys_for_left_parenthesis">[|],{|},<|>,﴾|﴿</string> - <string name="more_keys_for_right_parenthesis">]|[,}|{,>|<,﴿|﴾</string> + <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!4,﴾|﴿,<|>,{|},[|]</string> + <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!4,﴿|﴾,>|<,}|{,]|[</string> <!-- U+003E: ">" GREATER-THAN SIGN --> <integer name="keycode_for_less_than">0x003E</integer> <!-- U+003C: "<" LESS-THAN SIGN --> @@ -146,8 +145,8 @@ U+201D: "”" RIGHT DOUBLE QUOTATION MARK U+201E: "„" DOUBLE LOW-9 QUOTATION MARK U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK --> - <string name="more_keys_for_less_than">≤|≥,«|»,‹|›</string> - <string name="more_keys_for_greater_than">≥|≤,»|«,›|‹</string> + <string name="more_keys_for_less_than">!fixedColumnOrder!3,‹|›,≤|≥,«|»</string> + <string name="more_keys_for_greater_than">!fixedColumnOrder!3,›|‹,≥|≤,»|«</string> <!-- U+005D: "]" RIGHT SQUARE BRACKET --> <integer name="keycode_for_left_square_bracket">0x005D</integer> <!-- U+005B: "[" LEFT SQUARE BRACKET --> @@ -157,11 +156,9 @@ <!-- U+007B: "{" LEFT CURLY BRACKET --> <integer name="keycode_for_right_curly_bracket">0x007B</integer> <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK --> - <!-- <string name="more_keys_for_double_quote">“,”,„,‟,«,»</string> --> - <!-- The 4-more keys will be displayed in order of "3,1,2,4". --> - <string name="more_keys_for_double_quote">”,«|»,“,»|«</string> + <!-- <string name="more_keys_for_double_quote">“,”,„,‟,«|»,»|«</string> --> + <string name="more_keys_for_double_quote">!fixedColumnOrder!4,“,”,«|»,»|«</string> <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK --> - <!-- <string name="more_keys_for_tablet_double_quote">“,”,„,‟,«,»,‘,’,‚,‛</string> --> - <!-- The 8-more keys with maxMoreKeysColumn=4 will be displayed in order of "3,1,2,4|7,5,6,8". --> - <string name="more_keys_for_tablet_double_quote">”,«|»,“,»|«,’,‚,‘,‛</string> + <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,“,”,„,‟,«|»,»|«;,‘,’,‚,‛</string> --> + <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!4,“,”,«|»,»|«,‘,’,‚,‛</string> </resources> diff --git a/java/res/values-es/donottranslate-more-keys.xml b/java/res/values-es/donottranslate-more-keys.xml index ec8b6e4ed..4833d6970 100644 --- a/java/res/values-es/donottranslate-more-keys.xml +++ b/java/res/values-es/donottranslate-more-keys.xml @@ -67,7 +67,7 @@ U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE U+010D: "č" LATIN SMALL LETTER C WITH CARON --> <string name="more_keys_for_c">ç,ć,č</string> - <!-- U+00BF: "¿" INVERTED QUESTION MARK - U+00A1: "¡" INVERTED EXCLAMATION MARK --> - <string name="more_keys_for_punctuation">"\\,,\?,!,¿,¡,:,-,\',\",),(,/,;,+,&,\@"</string> + <!-- U+00A1: "¡" INVERTED EXCLAMATION MARK + U+00BF: "¿" INVERTED QUESTION MARK --> + <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,\",\',-,¡,!,¿,\\,,\?,\@,&,+,;,:,/,(,)"</string> </resources> diff --git a/java/res/values-iw/donottranslate-more-keys.xml b/java/res/values-iw/donottranslate-more-keys.xml index 865aac6fc..c5431b612 100644 --- a/java/res/values-iw/donottranslate-more-keys.xml +++ b/java/res/values-iw/donottranslate-more-keys.xml @@ -29,8 +29,8 @@ <integer name="keycode_for_left_parenthesis">0x0029</integer> <!-- U+0028: "(" LEFT PARENTHESIS --> <integer name="keycode_for_right_parenthesis">0x0028</integer> - <string name="more_keys_for_left_parenthesis">[|],{|},<|></string> - <string name="more_keys_for_right_parenthesis">]|[,}|{,>|<</string> + <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!3,<|>,{|},[|]</string> + <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!3,>|<,}|{,]|[</string> <!-- U+003E: ">" GREATER-THAN SIGN --> <integer name="keycode_for_less_than">0x003E</integer> <!-- U+003C: "<" LESS-THAN SIGN --> @@ -50,8 +50,8 @@ U+201D: "”" RIGHT DOUBLE QUOTATION MARK U+201E: "„" DOUBLE LOW-9 QUOTATION MARK U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK --> - <string name="more_keys_for_less_than">≤|≥,«|»,‹|›</string> - <string name="more_keys_for_greater_than">≥|≤,»|«,›|‹</string> + <string name="more_keys_for_less_than">!fixedColumnOrder!3,‹|›,≤|≥,«|»</string> + <string name="more_keys_for_greater_than">!fixedColumnOrder!3,›|‹,≥|≤,»|«</string> <!-- U+005D: "]" RIGHT SQUARE BRACKET --> <integer name="keycode_for_left_square_bracket">0x005D</integer> <!-- U+005B: "[" LEFT SQUARE BRACKET --> @@ -60,12 +60,10 @@ <integer name="keycode_for_left_curly_bracket">0x007D</integer> <!-- U+007B: "{" LEFT CURLY BRACKET --> <integer name="keycode_for_right_curly_bracket">0x007B</integer> - <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. --> - <!-- <string name="more_keys_for_double_quote">“,”,„,‟,«,»</string> --> - <!-- The 4-more keys will be displayed in order of "3,1,2,4". --> - <string name="more_keys_for_double_quote">”,«|»,“,»|«</string> - <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. --> - <!-- <string name="more_keys_for_tablet_double_quote">“,”,„,‟,«,»,‘,’,‚,‛</string> --> - <!-- The 8-more keys with maxMoreKeysColumn=4 will be displayed in order of "3,1,2,4|7,5,6,8". --> - <string name="more_keys_for_tablet_double_quote">”,«|»,“,»|«,’,‚,‘,‛</string> + <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK --> + <!-- <string name="more_keys_for_double_quote">“,”,„,‟,«|»,»|«</string> --> + <string name="more_keys_for_double_quote">!fixedColumnOrder!4,“,”,«|»,»|«</string> + <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK --> + <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,“,”,„,‟,«|»,»|«;,‘,’,‚,‛</string> --> + <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!4,“,”,«|»,»|«,‘,’,‚,‛</string> </resources> diff --git a/java/res/values/donottranslate-more-keys.xml b/java/res/values/donottranslate-more-keys.xml index c04e6d0dc..5b68f855c 100644 --- a/java/res/values/donottranslate-more-keys.xml +++ b/java/res/values/donottranslate-more-keys.xml @@ -64,9 +64,8 @@ <string name="more_keys_for_currency_euro">¢,£,$,¥,₱</string> <string name="more_keys_for_currency_pound">¢,$,€,¥,₱</string> <string name="more_keys_for_currency_general">¢,$,€,£,¥,₱</string> - <string name="more_keys_for_smiley">":-)|:-) ,:-(|:-( ,;-)|;-) ,:-P|:-P ,=-O|=-O ,:-*|:-* ,:O|:O ,B-)|B-) ,:-$|:-$ ,:-!|:-! ,:-[|:-[ ,O:-)|O:-) ,:-\\\\|:-\\\\ ,:\'(|:\'( ,:-D|:-D "</string> - <string name="more_keys_for_punctuation">"\\,,\?,!,:,-,\',\",(,),/,;,+,&,\@"</string> - <integer name="more_keys_keyboard_column_for_punctuation">7</integer> + <string name="more_keys_for_smiley">"!fixedColumnOrder!5,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ "</string> + <string name="more_keys_for_punctuation">"!fixedColumnOrder!7,\",\',-,:,!,\\,,\?,\@,&,+,;,/,(,)"</string> <string name="keyhintlabel_for_punctuation"></string> <string name="keylabel_for_popular_domain">".com"</string> <!-- popular web domains for the locale - most popular, displayed on the keyboard --> @@ -154,18 +153,18 @@ <integer name="keycode_for_left_parenthesis">0x0028</integer> <!-- U+0029: ")" RIGHT PARENTHESIS --> <integer name="keycode_for_right_parenthesis">0x0029</integer> - <string name="more_keys_for_left_parenthesis">[,{,<</string> - <string name="more_keys_for_right_parenthesis">],},></string> + <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!3,<,{,[</string> + <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!3,>,},]</string> <!-- U+003C: "<" LESS-THAN SIGN --> <integer name="keycode_for_less_than">0x003C</integer> <!-- U+003E: ">" GREATER-THAN SIGN --> <integer name="keycode_for_greater_than">0x003E</integer> - <!-- U+2264: "≤" LESS-THAN OR EQUAL TO + <!-- U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK + U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + U+2264: "≤" LESS-THAN OR EQUAL TO U+2265: "≥" GREATER-THAN EQUAL TO U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK - U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK The following characters don't need BIDI mirroring. U+2018: "‘" LEFT SINGLE QUOTATION MARK U+2019: "’" RIGHT SINGLE QUOTATION MARK @@ -175,8 +174,8 @@ U+201D: "”" RIGHT DOUBLE QUOTATION MARK U+201E: "„" DOUBLE LOW-9 QUOTATION MARK U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK --> - <string name="more_keys_for_less_than">≤,«,‹</string> - <string name="more_keys_for_greater_than">≥,»,›</string> + <string name="more_keys_for_less_than">!fixedColumnOrder!3,‹,≤,«</string> + <string name="more_keys_for_greater_than">!fixedColumnOrder!3,›,≥,»</string> <!-- U+005B: "[" LEFT SQUARE BRACKET --> <integer name="keycode_for_left_square_bracket">0x005B</integer> <!-- U+005D: "]" RIGHT SQUARE BRACKET --> @@ -185,14 +184,11 @@ <integer name="keycode_for_left_curly_bracket">0x007B</integer> <!-- U+007D: "}" RIGHT CURLY BRACKET --> <integer name="keycode_for_right_curly_bracket">0x007D</integer> - <!-- The 4-more keys will be displayed in order of "3,1,2,4". --> - <string name="more_keys_for_single_quote">’,‚,‘,‛</string> + <string name="more_keys_for_single_quote">!fixedColumnOrder!4,‘,’,‚,‛</string> <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. --> - <!-- <string name="more_keys_for_double_quote">“,”,„,‟,«,»</string> --> - <!-- The 4-more keys will be displayed in order of "3,1,2,4". --> - <string name="more_keys_for_double_quote">”,«,“,»</string> + <!-- <string name="more_keys_for_double_quote">!fixedColumnOrder!6,“,”,„,‟,«,»</string> --> + <string name="more_keys_for_double_quote">!fixedColumnOrder!4,“,”,«,»</string> <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK. --> - <!-- <string name="more_keys_for_tablet_double_quote">“,”,„,‟,«,»,‘,’,‚,‛</string> --> - <!-- The 8-more keys with maxMoreKeysColumn=4 will be displayed in order of "3,1,2,4|7,5,6,8". --> - <string name="more_keys_for_tablet_double_quote">”,«,“,»,’,‚,‘,‛</string> + <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,“,”,„,‟,«,»,‘,’,‚,‛</string> --> + <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!4,“,”,«,»,‘,’,‚,‛</string> </resources> diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml index e524aa381..70fc28949 100644 --- a/java/res/xml-sw600dp/key_styles_common.xml +++ b/java/res/xml-sw600dp/key_styles_common.xml @@ -104,8 +104,7 @@ latin:keyLabel=":-)" latin:keyOutputText=":-) " latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="@string/more_keys_for_smiley" - latin:maxMoreKeysColumn="5" /> + latin:moreKeys="@string/more_keys_for_smiley" /> <key-style latin:styleName="shortcutKeyStyle" latin:code="@integer/key_shortcut" diff --git a/java/res/xml-sw600dp/rows_symbols.xml b/java/res/xml-sw600dp/rows_symbols.xml index 448e3bb85..61a56443c 100644 --- a/java/res/xml-sw600dp/rows_symbols.xml +++ b/java/res/xml-sw600dp/rows_symbols.xml @@ -160,8 +160,7 @@ latin:keyWidth="39.750%p" /> <Key latin:keyLabel=""" - latin:moreKeys="@string/more_keys_for_tablet_double_quote" - latin:maxMoreKeysColumn="4" /> + latin:moreKeys="@string/more_keys_for_tablet_double_quote" /> <Key latin:keyLabel="_" /> <Spacer diff --git a/java/res/xml-sw768dp/key_styles_common.xml b/java/res/xml-sw768dp/key_styles_common.xml index 07bdd7b18..9da0d1f1a 100644 --- a/java/res/xml-sw768dp/key_styles_common.xml +++ b/java/res/xml-sw768dp/key_styles_common.xml @@ -86,8 +86,7 @@ latin:keyLabel=":-)" latin:keyOutputText=":-) " latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="@string/more_keys_for_smiley" - latin:maxMoreKeysColumn="5" /> + latin:moreKeys="@string/more_keys_for_smiley" /> <key-style latin:styleName="shortcutKeyStyle" latin:code="@integer/key_shortcut" diff --git a/java/res/xml-sw768dp/rows_symbols.xml b/java/res/xml-sw768dp/rows_symbols.xml index d82f20b5d..a327684e7 100644 --- a/java/res/xml-sw768dp/rows_symbols.xml +++ b/java/res/xml-sw768dp/rows_symbols.xml @@ -175,8 +175,7 @@ latin:keyWidth="37.500%p" /> <Key latin:keyLabel=""" - latin:moreKeys="@string/more_keys_for_tablet_double_quote" - latin:maxMoreKeysColumn="4" /> + latin:moreKeys="@string/more_keys_for_tablet_double_quote" /> <Key latin:keyLabel="_" /> <switch> diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml index 0e31bcb31..4d0ad2996 100644 --- a/java/res/xml/key_styles_common.xml +++ b/java/res/xml/key_styles_common.xml @@ -188,6 +188,5 @@ latin:keyHintLabel="@string/keyhintlabel_for_punctuation" latin:keyLabelFlags="hasPopupHint|preserveCase" latin:moreKeys="@string/more_keys_for_punctuation" - latin:maxMoreKeysColumn="@integer/more_keys_keyboard_column_for_punctuation" latin:backgroundType="functional" /> </merge> diff --git a/java/res/xml/key_styles_enter_phone.xml b/java/res/xml/key_styles_enter_phone.xml index 6af81fb7b..af34cb858 100644 --- a/java/res/xml/key_styles_enter_phone.xml +++ b/java/res/xml/key_styles_enter_phone.xml @@ -55,7 +55,6 @@ latin:keyOutputText=":-) " latin:keyLabelFlags="hasPopupHint" latin:moreKeys="@string/more_keys_for_smiley" - latin:maxMoreKeysColumn="5" latin:backgroundType="functional" /> </case> <case diff --git a/java/res/xml/rows_azerty.xml b/java/res/xml/rows_azerty.xml index 6f607cbe1..bd3ff6f4b 100644 --- a/java/res/xml/rows_azerty.xml +++ b/java/res/xml/rows_azerty.xml @@ -130,13 +130,9 @@ <Key latin:keyLabel="n" latin:moreKeys="@string/more_keys_for_n" /> - <!-- TODO: Introduce a flag, such as strinctMoreKeysOrder, to control moreKeys display - order more precisely. --> - <!-- This key is close enough to right edge, so that the 4-more keys will be displayed in - order of "4,3,1,2". See @string/more_keys_for_single_quote --> <Key latin:keyLabel="\'" - latin:moreKeys="‘,’,‛,‚" /> + latin:moreKeys="@string/more_keys_for_single_quote" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" diff --git a/java/res/xml/rows_symbols.xml b/java/res/xml/rows_symbols.xml index 05699e0e1..27f75b564 100644 --- a/java/res/xml/rows_symbols.xml +++ b/java/res/xml/rows_symbols.xml @@ -109,8 +109,7 @@ latin:moreKeys="¡" /> <Key latin:keyLabel=""" - latin:moreKeys="@string/more_keys_for_double_quote" - latin:maxMoreKeysColumn="4" /> + latin:moreKeys="@string/more_keys_for_double_quote" /> <Key latin:keyLabel="\'" latin:moreKeys="@string/more_keys_for_single_quote" /> diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index cf3a437cf..f839376c0 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -105,6 +105,9 @@ public class Key { public final String[] mMoreKeys; /** More keys maximum column number */ public final int mMaxMoreKeysColumn; + public static final int MORE_KEYS_FIXED_COLUMN_ORDER = 0x80000000; + private static final String AUTO_COLUMN_ORDER = "!autoColumnOrder!"; + private static final String FIXED_COLUMN_ORDER = "!fixedColumnOrder!"; /** Background type that represents different key background visual than normal one. */ public final int mBackgroundType; @@ -232,10 +235,19 @@ public class Key { mLabelFlags = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags); final boolean preserveCase = (mLabelFlags & LABEL_FLAGS_PRESERVE_CASE) != 0; int actionFlags = style.getFlag(keyAttr, R.styleable.Keyboard_Key_keyActionFlags); + String[] moreKeys = style.getStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys); + int column; + if ((column = parseMoreKeysColumnOrder(moreKeys, AUTO_COLUMN_ORDER)) > 0) { + mMaxMoreKeysColumn = column; + } else if ((column = parseMoreKeysColumnOrder(moreKeys, FIXED_COLUMN_ORDER)) > 0) { + mMaxMoreKeysColumn = column | MORE_KEYS_FIXED_COLUMN_ORDER; + } else { + mMaxMoreKeysColumn = style.getInt(keyAttr, + R.styleable.Keyboard_Key_maxMoreKeysColumn, params.mMaxMoreKeysKeyboardColumn); + } final String[] additionalMoreKeys = style.getStringArray( keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys); - final String[] moreKeys = KeySpecParser.insertAddtionalMoreKeys(style.getStringArray( - keyAttr, R.styleable.Keyboard_Key_moreKeys), additionalMoreKeys); + moreKeys = KeySpecParser.insertAddtionalMoreKeys(moreKeys, additionalMoreKeys); if (moreKeys != null) { actionFlags |= ACTION_FLAGS_ENABLE_LONG_PRESS; for (int i = 0; i < moreKeys.length; i++) { @@ -245,8 +257,6 @@ public class Key { } mActionFlags = actionFlags; mMoreKeys = moreKeys; - mMaxMoreKeysColumn = style.getInt(keyAttr, - R.styleable.Keyboard_Key_maxMoreKeysColumn, params.mMaxMoreKeysKeyboardColumn); if ((mLabelFlags & LABEL_FLAGS_FROM_CUSTOM_ACTION_LABEL) != 0) { mLabel = params.mId.mCustomActionLabel; @@ -301,6 +311,21 @@ public class Key { } } + private static int parseMoreKeysColumnOrder(String[] moreKeys, String key) { + if (moreKeys == null || moreKeys.length == 0 || moreKeys[0] == null + || !moreKeys[0].startsWith(key)) { + return -1; + } + try { + final int column = Integer.parseInt(moreKeys[0].substring(key.length())); + moreKeys[0] = null; + return column; + } catch (NumberFormatException e) { + Log.w(TAG, "column number should follow after " + key); + return 0; + } + } + private static int adjustCaseOfCodeForKeyboardId(int code, boolean preserveCase, KeyboardId id) { if (!Keyboard.isLetterCode(code) || preserveCase) return code; diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java index 1597b1ebb..7d8181dda 100644 --- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java +++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java @@ -37,9 +37,11 @@ public class MoreKeysKeyboard extends Keyboard { private final String[] mMoreKeys; public static class MoreKeysKeyboardParams extends Keyboard.Params { + public boolean mIsFixedOrder; /* package */int mTopRowAdjustment; public int mNumRows; public int mNumColumns; + public int mTopKeys; public int mLeftKeys; public int mRightKeys; // includes default key. @@ -58,14 +60,17 @@ public class MoreKeysKeyboard extends Keyboard { * Set keyboard parameters of more keys keyboard. * * @param numKeys number of keys in this more keys keyboard. - * @param maxColumns number of maximum columns of this more keys keyboard. + * @param maxColumnsAndFlags number of maximum columns of this more keys keyboard. + * This might have {@link Key#MORE_KEYS_FIXED_COLUMN_ORDER} flag. * @param keyWidth more keys keyboard key width in pixel, including horizontal gap. * @param rowHeight more keys keyboard row height in pixel, including vertical gap. * @param coordXInParent coordinate x of the key preview in parent keyboard. * @param parentKeyboardWidth parent keyboard width in pixel. */ - public void setParameters(int numKeys, int maxColumns, int keyWidth, int rowHeight, - int coordXInParent, int parentKeyboardWidth) { + public void setParameters(int numKeys, int maxColumnsAndFlags, int keyWidth, + int rowHeight, int coordXInParent, int parentKeyboardWidth) { + mIsFixedOrder = (maxColumnsAndFlags & Key.MORE_KEYS_FIXED_COLUMN_ORDER) != 0; + final int maxColumns = maxColumnsAndFlags & ~Key.MORE_KEYS_FIXED_COLUMN_ORDER; if (parentKeyboardWidth / keyWidth < maxColumns) { throw new IllegalArgumentException( "Keyboard is too small to hold more keys keyboard: " @@ -76,8 +81,11 @@ public class MoreKeysKeyboard extends Keyboard { final int numRows = (numKeys + maxColumns - 1) / maxColumns; mNumRows = numRows; - final int numColumns = getOptimizedColumns(numKeys, maxColumns); + final int numColumns = mIsFixedOrder ? Math.min(numKeys, maxColumns) + : getOptimizedColumns(numKeys, maxColumns); mNumColumns = numColumns; + final int topKeys = numKeys % numColumns; + mTopKeys = topKeys == 0 ? numColumns : topKeys; final int numLeftKeys = (numColumns - 1) / 2; final int numRightKeys = numColumns - numLeftKeys; // including default key. @@ -110,28 +118,68 @@ public class MoreKeysKeyboard extends Keyboard { mLeftKeys = leftKeys; mRightKeys = rightKeys; - // Centering of the top row. - if (numRows < 2 || getTopRowEmptySlots(numKeys, numColumns) % 2 == 0) { - mTopRowAdjustment = 0; - } else if (mLeftKeys < mRightKeys - 1) { - mTopRowAdjustment = 1; - } else { - mTopRowAdjustment = -1; - } - + // Adjustment of the top row. + mTopRowAdjustment = mIsFixedOrder ? getFixedOrderTopRowAdjustment() + : getAutoOrderTopRowAdjustment(); mBaseWidth = mOccupiedWidth = mNumColumns * mDefaultKeyWidth; // Need to subtract the bottom row's gutter only. mBaseHeight = mOccupiedHeight = mNumRows * mDefaultRowHeight - mVerticalGap + mTopPadding + mBottomPadding; } + private int getFixedOrderTopRowAdjustment() { + if (mNumRows == 1 || mTopKeys % 2 == 1 || mTopKeys == mNumColumns + || mLeftKeys == 0 || mRightKeys == 1) { + return 0; + } + return -1; + } + + private int getAutoOrderTopRowAdjustment() { + if (mNumRows == 1 || mTopKeys == 1 || mNumColumns % 2 == mTopKeys % 2 + || mLeftKeys == 0 || mRightKeys == 1) { + return 0; + } + return -1; + } + // Return key position according to column count (0 is default). /* package */int getColumnPos(int n) { + return mIsFixedOrder ? getFixedOrderColumnPos(n) : getAutomaticColumnPos(n); + } + + private int getFixedOrderColumnPos(int n) { + final int col = n % mNumColumns; + final int row = n / mNumColumns; + if (!isTopRow(row)) { + return col - mLeftKeys; + } + final int rightSideKeys = mTopKeys / 2; + final int leftSideKeys = mTopKeys - (rightSideKeys + 1); + final int pos = col - leftSideKeys; + final int numLeftKeys = mLeftKeys + mTopRowAdjustment; + final int numRightKeys = mRightKeys - 1; + if (numRightKeys >= rightSideKeys && numLeftKeys >= leftSideKeys) { + return pos; + } else if (numRightKeys < rightSideKeys) { + return pos - (rightSideKeys - numRightKeys); + } else { // numLeftKeys < leftSideKeys + return pos + (leftSideKeys - numLeftKeys); + } + } + + private int getAutomaticColumnPos(int n) { final int col = n % mNumColumns; + final int row = n / mNumColumns; + int leftKeys = mLeftKeys; + if (isTopRow(row)) { + leftKeys += mTopRowAdjustment; + } if (col == 0) { // default position. return 0; } + int pos = 0; int right = 1; // include default position key. int left = 0; @@ -146,7 +194,7 @@ public class MoreKeysKeyboard extends Keyboard { if (i >= col) break; // Assign left key if available. - if (left < mLeftKeys) { + if (left < leftKeys) { left++; pos = -left; i++; @@ -158,12 +206,8 @@ public class MoreKeysKeyboard extends Keyboard { } private static int getTopRowEmptySlots(int numKeys, int numColumns) { - final int remainingKeys = numKeys % numColumns; - if (remainingKeys == 0) { - return 0; - } else { - return numColumns - remainingKeys; - } + final int remainings = numKeys % numColumns; + return remainings == 0 ? 0 : numColumns - remainings; } private int getOptimizedColumns(int numKeys, int maxColumns) { @@ -198,7 +242,7 @@ public class MoreKeysKeyboard extends Keyboard { } private boolean isTopRow(int rowCount) { - return rowCount == mNumRows - 1; + return mNumRows > 1 && rowCount == mNumRows - 1; } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java index 1626a140b..f61eefda5 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java @@ -206,9 +206,51 @@ public class KeySpecParser { return KeyboardIconsSet.ICON_UNDEFINED; } - public static String[] insertAddtionalMoreKeys(String[] moreKeys, String[] additionalMoreKeys) { - final int moreKeysCount = (moreKeys != null) ? moreKeys.length : 0; - final int additionalCount = (additionalMoreKeys != null) ? additionalMoreKeys.length : 0; + private static <T> ArrayList<T> arrayAsList(T[] array, int start, int end) { + if (array == null) { + throw new NullPointerException(); + } + if (start < 0 || start > end || end > array.length) { + throw new IllegalArgumentException(); + } + + final ArrayList<T> list = new ArrayList<T>(end - start); + for (int i = start; i < end; i++) { + list.add(array[i]); + } + return list; + } + + private static final String[] EMPTY_STRING_ARRAY = new String[0]; + + private static String[] filterOutEmptyString(String[] array) { + if (array == null) { + return EMPTY_STRING_ARRAY; + } + ArrayList<String> out = null; + for (int i = 0; i < array.length; i++) { + final String entry = array[i]; + if (TextUtils.isEmpty(entry)) { + if (out == null) { + out = arrayAsList(array, 0, i); + } + } else if (out != null) { + out.add(entry); + } + } + if (out == null) { + return array; + } else { + return out.toArray(new String[out.size()]); + } + } + + public static String[] insertAddtionalMoreKeys(String[] moreKeySpecs, + String[] additionalMoreKeySpecs) { + final String[] moreKeys = filterOutEmptyString(moreKeySpecs); + final String[] additionalMoreKeys = filterOutEmptyString(additionalMoreKeySpecs); + final int moreKeysCount = moreKeys.length; + final int additionalCount = additionalMoreKeys.length; ArrayList<String> out = null; int additionalIndex = 0; for (int moreKeyIndex = 0; moreKeyIndex < moreKeysCount; moreKeyIndex++) { @@ -226,10 +268,7 @@ public class KeySpecParser { } else { // Filter out excessive '%' marker. if (out == null) { - out = new ArrayList<String>(moreKeyIndex); - for (int i = 0; i < moreKeyIndex; i++) { - out.add(moreKeys[i]); - } + out = arrayAsList(moreKeys, 0, moreKeyIndex); } } } else { @@ -246,10 +285,7 @@ public class KeySpecParser { + " moreKeys=" + Arrays.toString(moreKeys) + " additionalMoreKeys=" + Arrays.toString(additionalMoreKeys)); } - out = new ArrayList<String>(additionalCount + moreKeysCount); - for (int i = additionalIndex; i < additionalCount; i++) { - out.add(additionalMoreKeys[i]); - } + out = arrayAsList(additionalMoreKeys, additionalIndex, additionalCount); for (int i = 0; i < moreKeysCount; i++) { out.add(moreKeys[i]); } @@ -261,18 +297,17 @@ public class KeySpecParser { + " moreKeys=" + Arrays.toString(moreKeys) + " additionalMoreKeys=" + Arrays.toString(additionalMoreKeys)); } - out = new ArrayList<String>(moreKeysCount); - for (int i = 0; i < moreKeysCount; i++) { - out.add(moreKeys[i]); - } + out = arrayAsList(moreKeys, 0, moreKeysCount); for (int i = additionalIndex; i < additionalCount; i++) { out.add(additionalMoreKeys[additionalIndex]); } } - if (out != null) { - return out.size() > 0 ? out.toArray(new String[out.size()]) : null; - } else { + if (out == null && moreKeysCount > 0) { return moreKeys; + } else if (out != null && out.size() > 0) { + return out.toArray(new String[out.size()]); + } else { + return null; } } |