diff options
Diffstat (limited to 'java')
30 files changed, 681 insertions, 573 deletions
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 4c3ea83ed..e503d98a4 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -150,6 +150,8 @@ <attr name="popupKeyboardTemplate" format="reference" /> <!-- Locale of the keyboard layout --> <attr name="keyboardLocale" format="string" /> + <!-- True if the keyboard is Right-To-Left --> + <attr name="isRtlKeyboard" format="boolean" /> <!-- Icon set for key top and key preview. --> <attr name="iconShiftKey" format="reference" /> <attr name="iconToSymbolKey" format="reference" /> diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml index f88d2df1c..4cf930399 100644 --- a/java/res/values/donottranslate.xml +++ b/java/res/values/donottranslate.xml @@ -169,4 +169,7 @@ <item>English (UK)</item> <item>Deutsch (QWERTY)</item> </string-array> + + <!-- Generic subtype label --> + <string name="subtype_generic">%s</string> </resources> diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 574c2c75e..efc32a76e 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -329,89 +329,12 @@ <!-- Title of the item to change the keyboard theme [CHAR LIMIT=20]--> <string name="keyboard_layout">Keyboard theme</string> - <!-- Description for Czech keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_cs_keyboard">Czech Keyboard</string> - <!-- Description for Arabic keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_ar_keyboard">Arabic Keyboard</string> - <!-- Description for Danish keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_da_keyboard">Danish Keyboard</string> - <!-- Description for German keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_de_keyboard">German Keyboard</string> <!-- Description for German QWERTY keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_de_qwerty_keyboard">German QWERTY Keyboard</string> + <string name="subtype_de_qwerty">German QWERTY</string> <!-- Description for English (United Kingdom) keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_en_GB_keyboard">English (UK) Keyboard</string> + <string name="subtype_en_GB">English (UK)</string> <!-- Description for English (United States) keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_en_US_keyboard">English (US) Keyboard</string> - <!-- Description for Spanish keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_es_keyboard">Spanish Keyboard</string> - <!-- Description for Finnish keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_fi_keyboard">Finnish Keyboard</string> - <!-- Description for French keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_fr_keyboard">French Keyboard</string> - <!-- Description for French (Canada) keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_fr_CA_keyboard">French (Canada) Keyboard</string> - <!-- Description for French (Switzerland) keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_fr_CH_keyboard">French (Switzerland) Keyboard</string> - <!-- Description for Croatian keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_hr_keyboard">Croatian Keyboard</string> - <!-- Description for Hungarian keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_hu_keyboard">Hungarian Keyboard</string> - <!-- Description for Hebrew keyboard subtype [CHAR LIMIT=35] --> - <!-- Java uses the deprecated "iw" code instead of the standard "he" code --> - <string name="subtype_mode_iw_keyboard">Hebrew Keyboard</string> - <!-- Description for Italian keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_it_keyboard">Italian Keyboard</string> - <!-- Description for Norwegian keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_nb_keyboard">Norwegian Keyboard</string> - <!-- Description for Dutch keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_nl_keyboard">Dutch Keyboard</string> - <!-- Description for Polish keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_pl_keyboard">Polish Keyboard</string> - <!-- Description for Portuguese keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_pt_keyboard">Portuguese Keyboard</string> - <!-- Description for Russian keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_ru_keyboard">Russian Keyboard</string> - <!-- Description for Serbian keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_sr_keyboard">Serbian Keyboard</string> - <!-- Description for Swedish keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_sv_keyboard">Swedish Keyboard</string> - <!-- Description for Turkish keyboard subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_tr_keyboard">Turkish Keyboard</string> - <!-- Description for Afrikaans voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_af_voice">Afrikaans Voice</string> - <!-- Description for Czech voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_cs_voice">Czech Voice</string> - <!-- Description for German voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_de_voice">German Voice</string> - <!-- Description for English voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_en_voice">English Voice</string> - <!-- Description for Spanish voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_es_voice">Spanish Voice</string> - <!-- Description for French voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_fr_voice">French Voice</string> - <!-- Description for Italian voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_it_voice">Italian Voice</string> - <!-- Description for Japanese voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_ja_voice">Japanese Voice</string> - <!-- Description for Korean voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_ko_voice">Korean Voice</string> - <!-- Description for Dutch voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_nl_voice">Dutch Voice</string> - <!-- Description for Polish voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_pl_voice">Polish Voice</string> - <!-- Description for Portuguese voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_pt_voice">Portuguese Voice</string> - <!-- Description for Russian voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_ru_voice">Russian Voice</string> - <!-- Description for Turkish voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_tr_voice">Turkish Voice</string> - <!-- Description for Chinese, Yue voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_yue_voice">Chinese, Yue Voice</string> - <!-- Description for Chinese, Mandarin voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_zh_voice">Chinese, Mandarin Voice</string> - <!-- Description for isiZulu voice input subtype [CHAR LIMIT=35] --> - <string name="subtype_mode_zu_voice">isiZulu Voice</string> + <string name="subtype_en_US">English (US)</string> <!-- Title of an option for usability study mode --> <string name="prefs_usability_study_mode">Usability study mode</string> diff --git a/java/res/xml-ar/kbd_symbols.xml b/java/res/xml-ar/kbd_symbols.xml new file mode 100644 index 000000000..9e5c255d0 --- /dev/null +++ b/java/res/xml-ar/kbd_symbols.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:isRtlKeyboard="true" +> + <include + latin:keyboardLayout="@xml/kbd_rows_symbols" /> +</Keyboard> diff --git a/java/res/xml-ar/kbd_symbols_shift.xml b/java/res/xml-ar/kbd_symbols_shift.xml new file mode 100644 index 000000000..934e6f849 --- /dev/null +++ b/java/res/xml-ar/kbd_symbols_shift.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:isRtlKeyboard="true" +> + <include + latin:keyboardLayout="@xml/kbd_rows_symbols_shift" /> +</Keyboard> diff --git a/java/res/xml-iw/kbd_symbols.xml b/java/res/xml-iw/kbd_symbols.xml new file mode 100644 index 000000000..9e5c255d0 --- /dev/null +++ b/java/res/xml-iw/kbd_symbols.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:isRtlKeyboard="true" +> + <include + latin:keyboardLayout="@xml/kbd_rows_symbols" /> +</Keyboard> diff --git a/java/res/xml-iw/kbd_symbols_shift.xml b/java/res/xml-iw/kbd_symbols_shift.xml new file mode 100644 index 000000000..934e6f849 --- /dev/null +++ b/java/res/xml-iw/kbd_symbols_shift.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<Keyboard + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + latin:isRtlKeyboard="true" +> + <include + latin:keyboardLayout="@xml/kbd_rows_symbols_shift" /> +</Keyboard> diff --git a/java/res/xml-sw600dp/kbd_symbols.xml b/java/res/xml-sw600dp/kbd_rows_symbols.xml index fc89cd3c5..9982f4575 100644 --- a/java/res/xml-sw600dp/kbd_symbols.xml +++ b/java/res/xml-sw600dp/kbd_rows_symbols.xml @@ -18,7 +18,7 @@ */ --> -<Keyboard +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <include @@ -170,4 +170,4 @@ <include latin:keyboardLayout="@xml/kbd_qwerty_f2" /> </Row> -</Keyboard> +</merge> diff --git a/java/res/xml-sw600dp/kbd_symbols_shift.xml b/java/res/xml-sw600dp/kbd_rows_symbols_shift.xml index 99b78a435..ac4b93fa4 100644 --- a/java/res/xml-sw600dp/kbd_symbols_shift.xml +++ b/java/res/xml-sw600dp/kbd_rows_symbols_shift.xml @@ -18,7 +18,7 @@ */ --> -<Keyboard +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <include @@ -147,4 +147,4 @@ <include latin:keyboardLayout="@xml/kbd_qwerty_f2" /> </Row> -</Keyboard> +</merge> diff --git a/java/res/xml-sw768dp/kbd_symbols.xml b/java/res/xml-sw768dp/kbd_rows_symbols.xml index ba0715cd4..1d5bd9d15 100644 --- a/java/res/xml-sw768dp/kbd_symbols.xml +++ b/java/res/xml-sw768dp/kbd_rows_symbols.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ */ --> -<Keyboard +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <include @@ -189,4 +189,4 @@ </case> </switch> </Row> -</Keyboard> +</merge> diff --git a/java/res/xml-sw768dp/kbd_symbols_shift.xml b/java/res/xml-sw768dp/kbd_rows_symbols_shift.xml index 1ddd64be3..2219bdc92 100644 --- a/java/res/xml-sw768dp/kbd_symbols_shift.xml +++ b/java/res/xml-sw768dp/kbd_rows_symbols_shift.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2010, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ */ --> -<Keyboard +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <include @@ -164,4 +164,4 @@ </case> </switch> </Row> -</Keyboard> +</merge> diff --git a/java/res/xml/kbd_rows_symbols.xml b/java/res/xml/kbd_rows_symbols.xml new file mode 100644 index 000000000..a8eeb3b91 --- /dev/null +++ b/java/res/xml/kbd_rows_symbols.xml @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2011, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <include + latin:keyboardLayout="@xml/kbd_currency_key_styles" /> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyLabel="@string/keylabel_for_symbols_1" + latin:popupCharacters="@string/alternates_for_symbols_1" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_2" + latin:popupCharacters="@string/alternates_for_symbols_2" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_3" + latin:popupCharacters="@string/alternates_for_symbols_3" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_4" + latin:popupCharacters="@string/alternates_for_symbols_4" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_5" + latin:popupCharacters="@string/alternates_for_symbols_5" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_6" + latin:popupCharacters="@string/alternates_for_symbols_6" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_7" + latin:popupCharacters="@string/alternates_for_symbols_7" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_8" + latin:popupCharacters="@string/alternates_for_symbols_8" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_9" + latin:popupCharacters="@string/alternates_for_symbols_9" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_0" + latin:popupCharacters="@string/alternates_for_symbols_0" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyLabel="\@" /> + <Key + latin:keyLabel="\#" /> + <Key + latin:keyStyle="currencyKeyStyle" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_percent" + latin:popupCharacters="@string/alternates_for_symbols_percent" /> + <Key + latin:keyLabel="&" /> + <Key + latin:keyLabel="*" + latin:popupCharacters="†,‡,★" /> + <Key + latin:keyLabel="-" + latin:popupCharacters="_,–,—" /> + <Key + latin:keyLabel="+" + latin:popupCharacters="±" /> + <Key + latin:keyLabel="(" + latin:popupCharacters="[,{,<" /> + <Key + latin:keyLabel=")" + latin:popupCharacters="],},>" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyStyle="altKeyStyle" + latin:keyWidth="15%p" + latin:visualInsetsRight="1%p" /> + <Key + latin:keyLabel="!" + latin:popupCharacters="¡" /> + <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. --> + <!-- latin:popupCharacters="“,”,„,‟,«,»" --> + <Key + latin:keyLabel=""" + latin:popupCharacters="“,”,«,»" + latin:maxPopupKeyboardColumn="6" /> + <Key + latin:keyLabel="\'" + latin:popupCharacters="‘,’,‚,‛" /> + <Key + latin:keyLabel=":" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_semicolon" + latin:popupCharacters="@string/alternates_for_symbols_semicolon" /> + <Key + latin:keyLabel="/" /> + <Key + latin:keyLabel="@string/keylabel_for_symbols_question" + latin:popupCharacters="@string/alternates_for_symbols_question" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" + latin:visualInsetsLeft="1%p" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_symbols_row4" /> +</merge> diff --git a/java/res/xml/kbd_rows_symbols_shift.xml b/java/res/xml/kbd_rows_symbols_shift.xml new file mode 100644 index 000000000..0706cbc78 --- /dev/null +++ b/java/res/xml/kbd_rows_symbols_shift.xml @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2008, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/kbd_key_styles" /> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyLabel="~" /> + <Key + latin:keyLabel="`" /> + <Key + latin:keyLabel="|" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="•" + latin:popupCharacters="♪,♥,♠,♦,♣" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="√" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="π" + latin:popupCharacters="Π" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="÷" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="×" /> + <Key + latin:keyLabel="{" /> + <Key + latin:keyLabel="}" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyStyle="nonSpecialBackgroundTabKeyStyle" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="£" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¢" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="€" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="°" + latin:popupCharacters="′,″" /> + <Key + latin:keyLabel="^" + latin:popupCharacters="↑,↓,←,→" /> + <Key + latin:keyLabel="_" /> + <Key + latin:keyLabel="=" + latin:popupCharacters="≠,≈,∞" /> + <Key + latin:keyLabel="[" /> + <Key + latin:keyLabel="]" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="10%p" + > + <Key + latin:keyStyle="altKeyStyle" + latin:keyWidth="15%p" + latin:visualInsetsRight="1%p" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="™" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="®" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="©" /> + <Key + latin:keyStyle="nonPasswordSymbolKeyStyle" + latin:keyLabel="¶" + latin:popupCharacters="§" /> + <Key + latin:keyLabel="\\" /> + <Key + latin:keyLabel="<" + latin:popupCharacters="≤,«,‹" /> + <Key + latin:keyLabel=">" + latin:popupCharacters="≥,»,›" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" + latin:visualInsetsLeft="1%p" /> + </Row> + <include + latin:keyboardLayout="@xml/kbd_symbols_shift_row4" /> +</merge> diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml index 7bb8d0200..737f684a7 100644 --- a/java/res/xml/kbd_symbols.xml +++ b/java/res/xml/kbd_symbols.xml @@ -1,125 +1,26 @@ <?xml version="1.0" encoding="utf-8"?> <!-- -/* +/* ** ** Copyright 2008, The Android Open Source Project ** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at ** -** http://www.apache.org/licenses/LICENSE-2.0 +** http://www.apache.org/licenses/LICENSE-2.0 ** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and ** limitations under the License. */ --> <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - latin:keyWidth="10%p" > <include - latin:keyboardLayout="@xml/kbd_key_styles" /> - <include - latin:keyboardLayout="@xml/kbd_currency_key_styles" /> - <Row> - <Key - latin:keyLabel="@string/keylabel_for_symbols_1" - latin:popupCharacters="@string/alternates_for_symbols_1" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_2" - latin:popupCharacters="@string/alternates_for_symbols_2" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_3" - latin:popupCharacters="@string/alternates_for_symbols_3" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_4" - latin:popupCharacters="@string/alternates_for_symbols_4" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_5" - latin:popupCharacters="@string/alternates_for_symbols_5" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_6" - latin:popupCharacters="@string/alternates_for_symbols_6" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_7" - latin:popupCharacters="@string/alternates_for_symbols_7" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_8" - latin:popupCharacters="@string/alternates_for_symbols_8" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_9" - latin:popupCharacters="@string/alternates_for_symbols_9" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_0" - latin:popupCharacters="@string/alternates_for_symbols_0" - latin:keyWidth="fillRight" /> - </Row> - <Row> - <Key - latin:keyLabel="\@" /> - <Key - latin:keyLabel="\#" /> - <Key - latin:keyStyle="currencyKeyStyle" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_percent" - latin:popupCharacters="@string/alternates_for_symbols_percent" /> - <Key - latin:keyLabel="&" /> - <Key - latin:keyLabel="*" - latin:popupCharacters="†,‡,★" /> - <Key - latin:keyLabel="-" - latin:popupCharacters="_,–,—" /> - <Key - latin:keyLabel="+" - latin:popupCharacters="±" /> - <Key - latin:keyLabel="(" - latin:popupCharacters="[,{,<" /> - <Key - latin:keyLabel=")" - latin:popupCharacters="],},>" - latin:keyWidth="fillRight" /> - </Row> - <Row> - <Key - latin:keyStyle="altKeyStyle" - latin:keyWidth="15%p" - latin:visualInsetsRight="1%p" /> - <Key - latin:keyLabel="!" - latin:popupCharacters="¡" /> - <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. --> - <!-- latin:popupCharacters="“,”,„,‟,«,»" --> - <Key - latin:keyLabel=""" - latin:popupCharacters="“,”,«,»" - latin:maxPopupKeyboardColumn="6" /> - <Key - latin:keyLabel="\'" - latin:popupCharacters="‘,’,‚,‛" /> - <Key - latin:keyLabel=":" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_semicolon" - latin:popupCharacters="@string/alternates_for_symbols_semicolon" /> - <Key - latin:keyLabel="/" /> - <Key - latin:keyLabel="@string/keylabel_for_symbols_question" - latin:popupCharacters="@string/alternates_for_symbols_question" /> - <Key - latin:keyStyle="deleteKeyStyle" - latin:keyWidth="fillRight" - latin:visualInsetsLeft="1%p" /> - </Row> - <include - latin:keyboardLayout="@xml/kbd_symbols_row4" /> + latin:keyboardLayout="@xml/kbd_rows_symbols" /> </Keyboard> diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml index f4ccd6c09..9c163d694 100644 --- a/java/res/xml/kbd_symbols_shift.xml +++ b/java/res/xml/kbd_symbols_shift.xml @@ -1,119 +1,26 @@ <?xml version="1.0" encoding="utf-8"?> <!-- -/* +/* ** ** Copyright 2008, The Android Open Source Project ** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at ** -** http://www.apache.org/licenses/LICENSE-2.0 +** http://www.apache.org/licenses/LICENSE-2.0 ** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and ** limitations under the License. */ --> <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - latin:keyWidth="10%p" > <include - latin:keyboardLayout="@xml/kbd_key_styles" /> - <Row> - <Key - latin:keyLabel="~" /> - <Key - latin:keyLabel="`" /> - <Key - latin:keyLabel="|" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="•" - latin:popupCharacters="♪,♥,♠,♦,♣" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="√" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="π" - latin:popupCharacters="Π" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="÷" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="×" /> - <Key - latin:keyLabel="{" /> - <Key - latin:keyLabel="}" - latin:keyWidth="fillRight" /> - </Row> - <Row> - <Key - latin:keyStyle="nonSpecialBackgroundTabKeyStyle" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="£" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="¢" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="€" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="°" - latin:popupCharacters="′,″" /> - <Key - latin:keyLabel="^" - latin:popupCharacters="↑,↓,←,→" /> - <Key - latin:keyLabel="_" /> - <Key - latin:keyLabel="=" - latin:popupCharacters="≠,≈,∞" /> - <Key - latin:keyLabel="[" /> - <Key - latin:keyLabel="]" - latin:keyWidth="fillRight" /> - </Row> - <Row> - <Key - latin:keyStyle="shiftKeyStyle" - latin:keyWidth="15%p" - latin:visualInsetsRight="1%p" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="™" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="®" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="©" /> - <Key - latin:keyStyle="nonPasswordSymbolKeyStyle" - latin:keyLabel="¶" - latin:popupCharacters="§" /> - <Key - latin:keyLabel="\\" /> - <Key - latin:keyLabel="<" - latin:popupCharacters="≤,«,‹" /> - <Key - latin:keyLabel=">" - latin:popupCharacters="≥,»,›" /> - <Key - latin:keyStyle="deleteKeyStyle" - latin:keyWidth="fillRight" - latin:visualInsetsLeft="1%p" /> - </Row> - <include latin:keyboardLayout="@xml/kbd_symbols_shift_row4" /> + latin:keyboardLayout="@xml/kbd_rows_symbols_shift" /> </Keyboard> diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml index 7aaf57b47..7a4e7ea35 100644 --- a/java/res/xml/method.xml +++ b/java/res/xml/method.xml @@ -24,237 +24,132 @@ <!-- Voice: af, cs, da, de, en, es, fr, it, ja, ko, nl, pl, pt, ru, tr, yue, zh, zu --> <!-- TODO: use <lang>_keyboard icon instead of a common keyboard icon. --> <!-- TODO: use <lang>_mic icon instead of a common mic icon. --> -<!-- TODO: remove all comment outed voice subtypes --> <!-- If IME doesn't have an applicable subtype, the first subtype will be used as a default subtype.--> <input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.android.inputmethod.latin.Settings" android:isDefault="@bool/im_is_default"> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_en_US_keyboard" + android:label="@string/subtype_en_US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="TrySuppressingImeSwitcher" /> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_en_voice" --> -<!-- android:imeSubtypeLocale="en" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_en_GB_keyboard" + android:label="@string/subtype_en_GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="TrySuppressingImeSwitcher" /> - <!-- The file for Arabic layout is an alpha version. It needs to be run through UX. --> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_ar_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="ar" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_cs_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="cs" android:imeSubtypeMode="keyboard" /> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_cs_voice" --> -<!-- android:imeSubtypeLocale="cs" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_da_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="da" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_de_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="de" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_de_qwerty_keyboard" + android:label="@string/subtype_de_qwerty" android:imeSubtypeLocale="de_ZZ" android:imeSubtypeMode="keyboard" /> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_de_voice" --> -<!-- android:imeSubtypeLocale="de" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_es_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="es" android:imeSubtypeMode="keyboard" /> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_es_voice" --> -<!-- android:imeSubtypeLocale="es" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_fi_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="fi" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_fr_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="fr" android:imeSubtypeMode="keyboard" /> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_fr_voice" --> -<!-- android:imeSubtypeLocale="fr" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_fr_CA_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="fr_CA" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_fr_CH_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="fr_CH" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_hr_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="hr" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_hu_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="hu" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_it_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="it" android:imeSubtypeMode="keyboard" /> <!-- Java uses the deprecated "iw" code instead of the standard "he" code for Hebrew. --> - <!-- The file for Hebrew layout is an alpha version. It needs to be run through UX. --> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_iw_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="iw" android:imeSubtypeMode="keyboard" /> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_it_voice" --> -<!-- android:imeSubtypeLocale="it" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_nb_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="nb" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_nl_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="nl" android:imeSubtypeMode="keyboard" /> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_nl_voice" --> -<!-- android:imeSubtypeLocale="nl" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_pl_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="pl" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_pt_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="pt" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_ru_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="ru" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_sr_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="sr" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_sv_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="sv" android:imeSubtypeMode="keyboard" /> <subtype android:icon="@drawable/ic_subtype_keyboard" - android:label="@string/subtype_mode_tr_keyboard" + android:label="@string/subtype_generic" android:imeSubtypeLocale="tr" android:imeSubtypeMode="keyboard" /> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_af_voice" --> -<!-- android:imeSubtypeLocale="af" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_ja_voice" --> -<!-- android:imeSubtypeLocale="ja" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_ko_voice" --> -<!-- android:imeSubtypeLocale="ko" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_pl_voice" --> -<!-- android:imeSubtypeLocale="pl" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_pt_voice" --> -<!-- android:imeSubtypeLocale="pt" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_ru_voice" --> -<!-- android:imeSubtypeLocale="ru" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_tr_voice" --> -<!-- android:imeSubtypeLocale="tr" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_yue_voice" --> -<!-- android:imeSubtypeLocale="yue" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_zh_voice" --> -<!-- android:imeSubtypeLocale="zh" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> -<!-- <subtype android:icon="@drawable/ic_subtype_mic" --> -<!-- android:label="@string/subtype_mode_zu_voice" --> -<!-- android:imeSubtypeLocale="zu" --> -<!-- android:imeSubtypeMode="voice" --> -<!-- android:imeSubtypeExtraValue="excludeFromLastInputMethod,requireNetworkConnectivity" --> -<!-- /> --> </input-method> diff --git a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java index b8a8169bc..9397483ce 100644 --- a/java/src/com/android/inputmethod/deprecated/VoiceProxy.java +++ b/java/src/com/android/inputmethod/deprecated/VoiceProxy.java @@ -158,7 +158,10 @@ public class VoiceProxy implements VoiceInput.UiListener { } public void flushVoiceInputLogs(boolean configurationChanged) { - if (VOICE_INSTALLED && !configurationChanged) { + if (!VOICE_INSTALLED) { + return; + } + if (!configurationChanged) { if (mAfterVoiceInput) { mVoiceInput.flushAllTextModificationCounters(); mVoiceInput.logInputEnded(); @@ -301,6 +304,9 @@ public class VoiceProxy implements VoiceInput.UiListener { } public void showPunctuationHintIfNecessary() { + if (!VOICE_INSTALLED) { + return; + } InputConnection ic = mService.getCurrentInputConnection(); if (!mImmediatelyAfterVoiceInput && mAfterVoiceInput && ic != null) { if (mHints.showPunctuationHintIfNecessary(ic)) { @@ -375,9 +381,6 @@ public class VoiceProxy implements VoiceInput.UiListener { } private void revertVoiceInput() { - if (!VOICE_INSTALLED) { - return; - } InputConnection ic = mService.getCurrentInputConnection(); if (ic != null) ic.commitText("", 1); mService.updateSuggestions(); @@ -394,7 +397,10 @@ public class VoiceProxy implements VoiceInput.UiListener { } public boolean logAndRevertVoiceInput() { - if (VOICE_INSTALLED && mVoiceInputHighlighted) { + if (!VOICE_INSTALLED) { + return false; + } + if (mVoiceInputHighlighted) { mVoiceInput.incrementTextModificationDeleteCount( mVoiceResults.candidates.get(0).toString().length()); revertVoiceInput(); @@ -505,7 +511,10 @@ public class VoiceProxy implements VoiceInput.UiListener { } public void handleClose() { - if (VOICE_INSTALLED & mRecognizing) { + if (!VOICE_INSTALLED) { + return; + } + if (mRecognizing) { mVoiceInput.cancel(); } } @@ -553,6 +562,9 @@ public class VoiceProxy implements VoiceInput.UiListener { } public void switchToRecognitionStatusView(final Configuration configuration) { + if (!VOICE_INSTALLED) { + return; + } mHandler.post(new Runnable() { @Override public void run() { @@ -597,6 +609,9 @@ public class VoiceProxy implements VoiceInput.UiListener { } private void switchToLastInputMethod() { + if (!VOICE_INSTALLED) { + return; + } final IBinder token = mService.getWindow().getWindow().getAttributes().token; new AsyncTask<Void, Void, Boolean>() { @Override @@ -662,14 +677,15 @@ public class VoiceProxy implements VoiceInput.UiListener { } public void startListening(final boolean swipe, IBinder token) { + if (!VOICE_INSTALLED) { + return; + } // TODO: remove swipe which is no longer used. - if (VOICE_INSTALLED) { - if (needsToShowWarningDialog()) { - // Calls reallyStartListening if user clicks OK, does nothing if user clicks Cancel. - showVoiceWarningDialog(swipe, token); - } else { - reallyStartListening(swipe); - } + if (needsToShowWarningDialog()) { + // Calls reallyStartListening if user clicks OK, does nothing if user clicks Cancel. + showVoiceWarningDialog(swipe, token); + } else { + reallyStartListening(swipe); } } @@ -704,17 +720,18 @@ public class VoiceProxy implements VoiceInput.UiListener { mLocaleSupportedForVoiceInput = SubtypeSwitcher.getInstance().isVoiceSupported( SubtypeSwitcher.getInstance().getInputLocaleStr()); - if (VOICE_INSTALLED) { - final String voiceMode = sp.getString(PREF_VOICE_MODE, - mService.getString(R.string.voice_mode_main)); - mVoiceButtonEnabled = !voiceMode.equals(mService.getString(R.string.voice_mode_off)) - && shouldShowVoiceButton(makeFieldContext(), attribute); - mVoiceButtonOnPrimary = voiceMode.equals(mService.getString(R.string.voice_mode_main)); - } + final String voiceMode = sp.getString(PREF_VOICE_MODE, + mService.getString(R.string.voice_mode_main)); + mVoiceButtonEnabled = !voiceMode.equals(mService.getString(R.string.voice_mode_off)) + && shouldShowVoiceButton(makeFieldContext(), attribute); + mVoiceButtonOnPrimary = voiceMode.equals(mService.getString(R.string.voice_mode_main)); } public void destroy() { - if (VOICE_INSTALLED && mVoiceInput != null) { + if (!VOICE_INSTALLED) { + return; + } + if (mVoiceInput != null) { mVoiceInput.destroy(); } } @@ -826,10 +843,16 @@ public class VoiceProxy implements VoiceInput.UiListener { } public void cancel() { + if (!VOICE_INSTALLED) { + return; + } if (mVoiceInput != null) mVoiceInput.cancel(); } public void reset() { + if (!VOICE_INSTALLED) { + return; + } if (mVoiceInput != null) mVoiceInput.reset(); } } diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index 33ab511a5..8b8930a86 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -34,6 +34,8 @@ import com.android.inputmethod.keyboard.internal.Row; import com.android.inputmethod.latin.R; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; /** * Class for describing the position and characteristics of a single key in the keyboard. @@ -153,6 +155,38 @@ public class Key { android.R.attr.state_pressed }; + // RTL parenthesis character swapping map. + private static final Map<Integer, Integer> sRtlParenthesisMap = new HashMap<Integer, Integer>(); + + static { + addRtlParenthesisPair('(', ')'); + addRtlParenthesisPair('[', ']'); + addRtlParenthesisPair('{', '}'); + addRtlParenthesisPair('<', '>'); + // \u00ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + // \u00bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + addRtlParenthesisPair('\u00ab', '\u00bb'); + // \u2039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK + // \u203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + addRtlParenthesisPair('\u2039', '\u203a'); + // \u2264: LESS-THAN OR EQUAL TO + // \u2265: GREATER-THAN OR EQUAL TO + addRtlParenthesisPair('\u2264', '\u2265'); + } + + private static void addRtlParenthesisPair(int left, int right) { + sRtlParenthesisMap.put(left, right); + sRtlParenthesisMap.put(right, left); + } + + private static int getRtlParenthesisCode(int code) { + if (sRtlParenthesisMap.containsKey(code)) { + return sRtlParenthesisMap.get(code); + } else { + return code; + } + } + /** * This constructor is being used only for key in popup mini keyboard. */ @@ -174,7 +208,8 @@ public class Key { final String popupSpecification = popupCharacter.toString(); mLabel = PopupCharactersParser.getLabel(popupSpecification); mOutputText = PopupCharactersParser.getOutputText(popupSpecification); - mCode = PopupCharactersParser.getCode(res, popupSpecification); + final int code = PopupCharactersParser.getCode(res, popupSpecification); + mCode = keyboard.isRtlKeyboard() ? getRtlParenthesisCode(code) : code; mIcon = keyboard.mIconsSet.getIcon(PopupCharactersParser.getIconId(popupSpecification)); // Horizontal gap is divided equally to both sides of the key. mX = x + mGap / 2; @@ -298,7 +333,8 @@ public class Key { final int code = style.getInt(keyAttr, R.styleable.Keyboard_Key_code, Keyboard.CODE_UNSPECIFIED); if (code == Keyboard.CODE_UNSPECIFIED && !TextUtils.isEmpty(mLabel)) { - mCode = mLabel.charAt(0); + final int firstChar = mLabel.charAt(0); + mCode = mKeyboard.isRtlKeyboard() ? getRtlParenthesisCode(firstChar) : firstChar; } else if (code != Keyboard.CODE_UNSPECIFIED) { mCode = code; } else { diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java index d4a23aa15..19847c5ec 100644 --- a/java/src/com/android/inputmethod/keyboard/Keyboard.java +++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java @@ -110,6 +110,9 @@ public class Keyboard { /** Maximum column for popup keyboard */ private int mMaxPopupColumn; + /** True if Right-To-Left keyboard */ + private boolean mIsRtlKeyboard; + /** List of shift keys in this keyboard and its icons and state */ private final List<Key> mShiftKeys = new ArrayList<Key>(); private final HashMap<Key, Drawable> mShiftedIcons = new HashMap<Key, Drawable>(); @@ -257,6 +260,14 @@ public class Keyboard { mKeyboardHeight = height; } + public boolean isRtlKeyboard() { + return mIsRtlKeyboard; + } + + public void setRtlKeyboard(boolean isRtl) { + mIsRtlKeyboard = isRtl; + } + public int getPopupKeyboardResId() { return mPopupKeyboardResId; } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java index b2600dd3b..a71e31ec6 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java @@ -125,10 +125,10 @@ public class KeyboardId { mEnableShiftLock); } - public KeyboardId cloneWithNewGeometry(int width) { + public KeyboardId cloneWithNewGeometry(int orientation, int width) { if (mWidth == width) return this; - return new KeyboardId(mXmlName, mXmlId, mLocale, mOrientation, width, mMode, mAttribute, + return new KeyboardId(mXmlName, mXmlId, mLocale, orientation, width, mMode, mAttribute, mHasSettingsKey, mF2KeyMode, mClobberSettingsKey, mVoiceKeyEnabled, mHasVoiceKey, mEnableShiftLock); } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java index 52ecfe236..088c9d140 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -106,7 +106,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private int mThemeIndex = -1; private Context mThemeContext; - private int mKeyboardWidth; + private int mWindowWidth; private static final KeyboardSwitcher sInstance = new KeyboardSwitcher(); @@ -187,13 +187,24 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha setKeyboard(getKeyboard(id)); } - public void onSizeChanged() { + @SuppressWarnings("unused") + public void onSizeChanged(int w, int h, int oldw, int oldh) { final int width = mInputMethodService.getWindow().getWindow().getDecorView().getWidth(); + // If the window width hasn't fixed yet or keyboard doesn't exist, nothing to do with. if (width == 0 || mCurrentId == null) return; - mKeyboardWidth = width; - // Set keyboard with new width. - final KeyboardId newId = mCurrentId.cloneWithNewGeometry(width); + // The window width is fixed. + mWindowWidth = width; + // If this is the first time the {@link KeyboardView} has been shown, no need to reload + // keyboard. + if (oldw == 0 && oldh == 0) + return; + // Reload keyboard with new width. + final int orientation = mInputMethodService.getResources().getConfiguration().orientation; + final KeyboardId newId = mCurrentId.cloneWithNewGeometry(orientation, width); + // If the new keyboard is the same as the current one, no need to reload it. + if (newId.equals(mCurrentId)) + return; setKeyboard(getKeyboard(newId)); } @@ -289,11 +300,11 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha attribute); final Resources res = mInputMethodService.getResources(); final int orientation = res.getConfiguration().orientation; - if (mKeyboardWidth == 0) - mKeyboardWidth = res.getDisplayMetrics().widthPixels; + if (mWindowWidth == 0) + mWindowWidth = res.getDisplayMetrics().widthPixels; final Locale locale = mSubtypeSwitcher.getInputLocale(); return new KeyboardId( - res.getResourceEntryName(xmlId), xmlId, locale, orientation, mKeyboardWidth, + res.getResourceEntryName(xmlId), xmlId, locale, orientation, mWindowWidth, mode, attribute, hasSettingsKey, f2KeyMode, clobberSettingsKey, mVoiceKeyEnabled, hasVoiceKey, enableShiftLock); } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index 1641dc4a5..1010adbe0 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -73,8 +73,6 @@ import java.util.HashMap; * @attr ref R.styleable#KeyboardView_shadowRadius */ public class KeyboardView extends View implements PointerTracker.DrawingProxy { - private static final boolean DEBUG_KEYBOARD_GRID = false; - // Miscellaneous constants private static final int[] LONG_PRESSABLE_STATE_SET = { android.R.attr.state_long_pressable }; @@ -97,17 +95,15 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { private ViewGroup mPreviewPlacer; // Drawing - /** Whether the keyboard bitmap needs to be redrawn before it's blitted. **/ - private boolean mDrawPending; - /** Notes if the keyboard just changed, so that we could possibly reallocate the mBuffer. */ - private boolean mKeyboardChanged; + /** Whether the keyboard bitmap buffer needs to be redrawn before it's blitted. **/ + private boolean mBufferNeedsUpdate; /** The dirty region in the keyboard bitmap */ private final Rect mDirtyRect = new Rect(); /** The key to invalidate. */ private Key mInvalidatedKey; /** The dirty region for single key drawing */ private final Rect mInvalidatedKeyRect = new Rect(); - /** The keyboard bitmap for faster updates */ + /** The keyboard bitmap buffer for faster updates */ private Bitmap mBuffer; /** The canvas for the above mutable keyboard bitmap */ private Canvas mCanvas; @@ -175,10 +171,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { sendMessageDelayed(obtainMessage(MSG_DISMISS_KEY_PREVIEW, tracker), delay); } - public void cancelDismissKeyPreview(PointerTracker tracker) { - removeMessages(MSG_DISMISS_KEY_PREVIEW, tracker); - } - public void cancelAllDismissKeyPreviews() { removeMessages(MSG_DISMISS_KEY_PREVIEW); } @@ -363,7 +355,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { mKeyboard = keyboard; LatinImeLogger.onSetKeyboard(keyboard); requestLayout(); - mKeyboardChanged = true; + mDirtyRect.set(0, 0, getWidth(), getHeight()); + mBufferNeedsUpdate = true; invalidateAllKeys(); final int keyHeight = keyboard.getRowHeight() - keyboard.getVerticalGap(); mKeyDrawParams.updateKeyHeight(keyHeight); @@ -401,25 +394,21 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { } @Override - public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // Round up a little - if (mKeyboard == null) { - setMeasuredDimension( - getPaddingLeft() + getPaddingRight(), getPaddingTop() + getPaddingBottom()); + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mKeyboard != null) { + // The main keyboard expands to the display width. + final int height = mKeyboard.getKeyboardHeight() + getPaddingTop() + getPaddingBottom(); + setMeasuredDimension(widthMeasureSpec, height); } else { - int width = mKeyboard.getMinWidth() + getPaddingLeft() + getPaddingRight(); - if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) { - width = MeasureSpec.getSize(widthMeasureSpec); - } - setMeasuredDimension( - width, mKeyboard.getHeight() + getPaddingTop() + getPaddingBottom()); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); - if (mDrawPending || mBuffer == null || mKeyboardChanged) { + if (mBufferNeedsUpdate || mBuffer == null) { + mBufferNeedsUpdate = false; onBufferDraw(); } canvas.drawBitmap(mBuffer, 0, 0, null); @@ -430,14 +419,11 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { final int height = getHeight(); if (width == 0 || height == 0) return; - if (mBuffer == null || mKeyboardChanged) { - mKeyboardChanged = false; - mDirtyRect.union(0, 0, width, height); - } if (mBuffer == null || mBuffer.getWidth() != width || mBuffer.getHeight() != height) { if (mBuffer != null) mBuffer.recycle(); mBuffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + mDirtyRect.union(0, 0, width, height); if (mCanvas != null) { mCanvas.setBitmap(mBuffer); } else { @@ -471,24 +457,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { } } - // TODO: Move this function to ProximityInfo for getting rid of - // public declarations for - // GRID_WIDTH and GRID_HEIGHT - if (DEBUG_KEYBOARD_GRID) { - Paint p = new Paint(); - p.setStyle(Paint.Style.STROKE); - p.setStrokeWidth(1.0f); - p.setColor(0x800000c0); - int cw = (mKeyboard.getMinWidth() + mKeyboard.GRID_WIDTH - 1) - / mKeyboard.GRID_WIDTH; - int ch = (mKeyboard.getHeight() + mKeyboard.GRID_HEIGHT - 1) - / mKeyboard.GRID_HEIGHT; - for (int i = 0; i <= mKeyboard.GRID_WIDTH; i++) - canvas.drawLine(i * cw, 0, i * cw, ch * mKeyboard.GRID_HEIGHT, p); - for (int i = 0; i <= mKeyboard.GRID_HEIGHT; i++) - canvas.drawLine(0, i * ch, cw * mKeyboard.GRID_WIDTH, i * ch, p); - } - // Overlay a dark rectangle to dim the keyboard if (needsToDimKeyboard()) { mPaint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24); @@ -496,7 +464,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { } mInvalidatedKey = null; - mDrawPending = false; mDirtyRect.setEmpty(); } @@ -866,7 +833,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { */ public void invalidateAllKeys() { mDirtyRect.union(0, 0, getWidth(), getHeight()); - mDrawPending = true; + mBufferNeedsUpdate = true; invalidate(); } @@ -886,7 +853,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { final int y = key.mY + getPaddingTop(); mInvalidatedKeyRect.set(x, y, x + key.mWidth, y + key.mHeight); mDirtyRect.union(mInvalidatedKeyRect); - onBufferDraw(); + mBufferNeedsUpdate = true; invalidate(mInvalidatedKeyRect); } diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java index fb57a2dba..0ad91dbb0 100644 --- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java @@ -269,7 +269,7 @@ public class LatinKeyboardBaseView extends KeyboardView implements PointerTracke @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { // TODO: Should notify InputMethodService instead? - KeyboardSwitcher.getInstance().onSizeChanged(); + KeyboardSwitcher.getInstance().onSizeChanged(w, h, oldw, oldh); } /** diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java index 44f9f195c..95e32755e 100644 --- a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java +++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java @@ -34,6 +34,8 @@ public class MiniKeyboard extends Keyboard { // revert the above hacks and uncomment the following lines. //setHorizontalGap(parentKeyboard.getHorizontalGap()); //setVerticalGap(parentKeyboard.getVerticalGap()); + + setRtlKeyboard(parentKeyboard.isRtlKeyboard()); } public void setDefaultCoordX(int pos) { diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index 5b03ef4a1..e66ea7b79 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -199,8 +199,7 @@ public class PointerTracker { public static void dismissAllKeyPreviews() { for (final PointerTracker tracker : sTrackers) { - tracker.setReleasedKeyGraphics(); - tracker.dismissKeyPreview(); + tracker.setReleasedKeyGraphics(tracker.mKeyIndex); } } @@ -323,11 +322,8 @@ public class PointerTracker { return key != null && key.mCode == Keyboard.CODE_SPACE; } - public void setReleasedKeyGraphics() { - setReleasedKeyGraphics(mKeyIndex); - } - private void setReleasedKeyGraphics(int keyIndex) { + mDrawingProxy.dismissKeyPreview(this); final Key key = getKey(keyIndex); if (key != null) { key.onReleased(); @@ -336,6 +332,9 @@ public class PointerTracker { } private void setPressedKeyGraphics(int keyIndex) { + if (isKeyPreviewRequired(keyIndex)) { + mDrawingProxy.showKeyPreview(keyIndex, this); + } final Key key = getKey(keyIndex); if (key != null && key.isEnabled()) { key.onPressed(); @@ -343,6 +342,18 @@ public class PointerTracker { } } + // The modifier key, such as shift key, should not show its key preview. + private boolean isKeyPreviewRequired(int keyIndex) { + final Key key = getKey(keyIndex); + if (key == null || !key.isEnabled()) + return false; + final int code = key.mCode; + if (isModifierCode(code) || code == Keyboard.CODE_DELETE + || code == Keyboard.CODE_ENTER || code == Keyboard.CODE_SPACE) + return false; + return true; + } + public int getLastX() { return mLastX; } @@ -438,7 +449,6 @@ public class PointerTracker { startRepeatKey(keyIndex); startLongPressTimer(keyIndex); - showKeyPreview(keyIndex); setPressedKeyGraphics(keyIndex); } } @@ -471,7 +481,6 @@ public class PointerTracker { keyIndex = onMoveKey(x, y); onMoveToNewKey(keyIndex, x, y); startLongPressTimer(keyIndex); - showKeyPreview(keyIndex); setPressedKeyGraphics(keyIndex); } else if (isMajorEnoughMoveToBeOnNewKey(x, y, keyIndex)) { // The pointer has been slid in to the new key from the previous key, we must call @@ -491,7 +500,6 @@ public class PointerTracker { onMoveToNewKey(keyIndex, x, y); startLongPressTimer(keyIndex); setPressedKeyGraphics(keyIndex); - showKeyPreview(keyIndex); } else { // HACK: On some devices, quick successive touches may be translated to sudden // move by touch panel firmware. This hack detects the case and translates the @@ -503,11 +511,10 @@ public class PointerTracker { if (DEBUG_MODE) Log.w(TAG, String.format("onMoveEvent: sudden move is translated to " + "up[%d,%d]/down[%d,%d] events", lastX, lastY, x, y)); - onUpEventInternal(lastX, lastY, eventTime, true); + onUpEventInternal(lastX, lastY, eventTime); onDownEventInternal(x, y, eventTime); } else { mKeyAlreadyProcessed = true; - dismissKeyPreview(); setReleasedKeyGraphics(oldKeyIndex); } } @@ -524,7 +531,6 @@ public class PointerTracker { onMoveToNewKey(keyIndex, x, y); } else { mKeyAlreadyProcessed = true; - dismissKeyPreview(); } } } @@ -539,27 +545,26 @@ public class PointerTracker { if (isModifier()) { // Before processing an up event of modifier key, all pointers already being // tracked should be released. - queue.releaseAllPointersExcept(this, eventTime, true); + queue.releaseAllPointersExcept(this, eventTime); } else { queue.releaseAllPointersOlderThan(this, eventTime); } queue.remove(this); } - onUpEventInternal(x, y, eventTime, true); + onUpEventInternal(x, y, eventTime); } // Let this pointer tracker know that one of newer-than-this pointer trackers got an up event. // This pointer tracker needs to keep the key top graphics "pressed", but needs to get a // "virtual" up event. - public void onPhantomUpEvent(int x, int y, long eventTime, boolean updateReleasedKeyGraphics) { + public void onPhantomUpEvent(int x, int y, long eventTime) { if (DEBUG_EVENT) printTouchEvent("onPhntEvent:", x, y, eventTime); - onUpEventInternal(x, y, eventTime, updateReleasedKeyGraphics); + onUpEventInternal(x, y, eventTime); mKeyAlreadyProcessed = true; } - private void onUpEventInternal(int x, int y, long eventTime, - boolean updateReleasedKeyGraphics) { + private void onUpEventInternal(int x, int y, long eventTime) { mTimerProxy.cancelKeyTimers(); mDrawingProxy.cancelShowKeyPreview(this); mIsInSlidingKeyInput = false; @@ -573,9 +578,7 @@ public class PointerTracker { keyY = mKeyY; } final int keyIndex = onUpKey(keyX, keyY, eventTime); - dismissKeyPreview(); - if (updateReleasedKeyGraphics) - setReleasedKeyGraphics(keyIndex); + setReleasedKeyGraphics(keyIndex); if (mKeyAlreadyProcessed) return; if (!mIsRepeatableKey) { @@ -585,8 +588,7 @@ public class PointerTracker { public void onLongPressed() { mKeyAlreadyProcessed = true; - setReleasedKeyGraphics(); - dismissKeyPreview(); + setReleasedKeyGraphics(mKeyIndex); final PointerTrackerQueue queue = sPointerTrackerQueue; if (queue != null) { queue.remove(this); @@ -599,7 +601,7 @@ public class PointerTracker { final PointerTrackerQueue queue = sPointerTrackerQueue; if (queue != null) { - queue.releaseAllPointersExcept(this, eventTime, true); + queue.releaseAllPointersExcept(this, eventTime); queue.remove(this); } onCancelEventInternal(); @@ -608,7 +610,6 @@ public class PointerTracker { private void onCancelEventInternal() { mTimerProxy.cancelKeyTimers(); mDrawingProxy.cancelShowKeyPreview(this); - dismissKeyPreview(); setReleasedKeyGraphics(mKeyIndex); mIsInSlidingKeyInput = false; } @@ -616,7 +617,6 @@ public class PointerTracker { private void startRepeatKey(int keyIndex) { final Key key = getKey(keyIndex); if (key != null && key.mRepeatable) { - dismissKeyPreview(); onRepeatKey(keyIndex); mTimerProxy.startKeyRepeatTimer(sDelayBeforeKeyRepeatStart, keyIndex, this); mIsRepeatableKey = true; @@ -646,26 +646,6 @@ public class PointerTracker { } } - // The modifier key, such as shift key, should not show its key preview. - private boolean isKeyPreviewNotRequired(int keyIndex) { - final Key key = getKey(keyIndex); - if (key == null || !key.isEnabled()) - return true; - final int code = key.mCode; - return isModifierCode(code) || code == Keyboard.CODE_DELETE - || code == Keyboard.CODE_ENTER || code == Keyboard.CODE_SPACE; - } - - private void showKeyPreview(int keyIndex) { - if (isKeyPreviewNotRequired(keyIndex)) - return; - mDrawingProxy.showKeyPreview(keyIndex, this); - } - - private void dismissKeyPreview() { - mDrawingProxy.dismissKeyPreview(this); - } - private void startLongPressTimer(int keyIndex) { Key key = getKey(keyIndex); if (key.mCode == Keyboard.CODE_SHIFT) { diff --git a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java index 5ab44d063..a90f57c62 100644 --- a/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/PopupMiniKeyboardView.java @@ -108,6 +108,18 @@ public class PopupMiniKeyboardView extends KeyboardView implements PopupPanel { } @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final Keyboard keyboard = getKeyboard(); + if (keyboard != null) { + final int width = keyboard.getMinWidth() + getPaddingLeft() + getPaddingRight(); + final int height = keyboard.getKeyboardHeight() + getPaddingTop() + getPaddingBottom(); + setMeasuredDimension(width, height); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + + @Override public void setKeyboard(Keyboard keyboard) { super.setKeyboard(keyboard); mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(), diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java index 6f7349915..8eae2bb42 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParser.java @@ -222,8 +222,9 @@ public class KeyboardParser { final int height = Math.max( Math.min(keyboardHeight, maxKeyboardHeight), minKeyboardHeight); - keyboard.setKeyboardHeight(height); + keyboard.setRtlKeyboard(keyboardAttr.getBoolean( + R.styleable.Keyboard_isRtlKeyboard, false)); keyboard.setKeyWidth(getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyWidth, displayWidth, displayWidth / 10)); keyboard.setRowHeight(getDimensionOrFraction(keyboardAttr, diff --git a/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java index cc89579bb..965c679ea 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/internal/MiniKeyboardBuilder.java @@ -218,7 +218,7 @@ public class MiniKeyboardBuilder { mParams = params; keyboard.setRowHeight(params.mRowHeight); - keyboard.setHeight(params.getKeyboardHeight()); + keyboard.setKeyboardHeight(params.getKeyboardHeight()); keyboard.setMinWidth(params.getKeyboardWidth()); keyboard.setDefaultCoordX(params.getDefaultKeyCoordX() + params.mKeyWidth / 2); } diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java index 545b27fdc..55175e046 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java +++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java @@ -37,22 +37,21 @@ public class PointerTrackerQueue { if (t.isModifier()) { oldestPos++; } else { - t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime, true); + t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime); queue.remove(oldestPos); } } } public void releaseAllPointers(long eventTime) { - releaseAllPointersExcept(null, eventTime, true); + releaseAllPointersExcept(null, eventTime); } - public void releaseAllPointersExcept(PointerTracker tracker, long eventTime, - boolean updateReleasedKeyGraphics) { + public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) { for (PointerTracker t : mQueue) { if (t == tracker) continue; - t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime, updateReleasedKeyGraphics); + t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime); } mQueue.clear(); if (tracker != null) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 324a13045..3457ac984 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -174,7 +174,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar private int mCorrectionMode; private int mCommittedLength; - private int mOrientation; // Keep track of the last selection range to decide if we need to show word alternatives private int mLastSelectionStart; private int mLastSelectionEnd; @@ -193,6 +192,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar // TODO: Move this flag to VoiceProxy private boolean mConfigurationChanging; + // Member variables for remembering the current device orientation. + private int mDisplayOrientation; + private int mDisplayWidth; + private int mDisplayHeight; + // Object for reacting to adding/removing a dictionary pack. private BroadcastReceiver mDictionaryPackInstallReceiver = new DictionaryPackInstallBroadcastReceiver(this); @@ -200,7 +204,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar // Keeps track of most recently inserted text (multi-character key) for reverting private CharSequence mEnteredText; - public final UIHandler mHandler = new UIHandler(this); public static class UIHandler extends StaticInnerHandlerWrapper<LatinIME> { @@ -212,6 +215,29 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar private static final int MSG_DISMISS_LANGUAGE_ON_SPACEBAR = 5; private static final int MSG_SPACE_TYPED = 6; private static final int MSG_SET_BIGRAM_PREDICTIONS = 7; + private static final int MSG_CONFIRM_ORIENTATION_CHANGE = 8; + private static final int MSG_START_INPUT_VIEW = 9; + + private static class OrientationChangeArgs { + public final int mOldWidth; + public final int mOldHeight; + private int mRetryCount; + + public OrientationChangeArgs(int oldw, int oldh) { + mOldWidth = oldw; + mOldHeight = oldh; + mRetryCount = 0; + } + + public boolean hasTimedOut() { + mRetryCount++; + return mRetryCount >= 10; + } + + public boolean hasOrientationChangeFinished(DisplayMetrics dm) { + return dm.widthPixels != mOldWidth && dm.heightPixels != mOldHeight; + } + } public UIHandler(LatinIME outerInstance) { super(outerInstance); @@ -260,6 +286,21 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar (LatinKeyboard)msg.obj); } break; + case MSG_CONFIRM_ORIENTATION_CHANGE: { + final OrientationChangeArgs args = (OrientationChangeArgs)msg.obj; + final Resources res = latinIme.mResources; + final DisplayMetrics dm = res.getDisplayMetrics(); + if (args.hasTimedOut() || args.hasOrientationChangeFinished(dm)) { + latinIme.setDisplayGeometry(res.getConfiguration(), dm); + } else { + // It seems orientation changing is on going. + postConfirmOrientationChange(args); + } + break; + } + case MSG_START_INPUT_VIEW: + latinIme.onStartInputView((EditorInfo)msg.obj, false); + break; } } @@ -349,6 +390,33 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar public boolean isAcceptingDoubleSpaces() { return hasMessages(MSG_SPACE_TYPED); } + + private void postConfirmOrientationChange(OrientationChangeArgs args) { + removeMessages(MSG_CONFIRM_ORIENTATION_CHANGE); + // Will confirm whether orientation change has finished or not after 2ms again. + sendMessageDelayed(obtainMessage(MSG_CONFIRM_ORIENTATION_CHANGE, args), 2); + } + + public void startOrientationChanging(int oldw, int oldh) { + postConfirmOrientationChange(new OrientationChangeArgs(oldw, oldh)); + } + + public boolean postStartInputView(EditorInfo attribute) { + if (hasMessages(MSG_CONFIRM_ORIENTATION_CHANGE) || hasMessages(MSG_START_INPUT_VIEW)) { + removeMessages(MSG_START_INPUT_VIEW); + // Postpone onStartInputView 20ms afterward and see if orientation change has + // finished. + sendMessageDelayed(obtainMessage(MSG_START_INPUT_VIEW, attribute), 20); + return true; + } + return false; + } + } + + private void setDisplayGeometry(Configuration conf, DisplayMetrics metric) { + mDisplayOrientation = conf.orientation; + mDisplayWidth = metric.widthPixels; + mDisplayHeight = metric.heightPixels; } @Override @@ -388,7 +456,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar } } - mOrientation = res.getConfiguration().orientation; + setDisplayGeometry(res.getConfiguration(), res.getDisplayMetrics()); // Register to receive ringer mode change and network state change. // Also receive installation and removal of a dictionary pack. @@ -486,11 +554,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar public void onConfigurationChanged(Configuration conf) { mSubtypeSwitcher.onConfigurationChanged(conf); // If orientation changed while predicting, commit the change - if (conf.orientation != mOrientation) { + if (conf.orientation != mDisplayOrientation) { + mHandler.startOrientationChanging(mDisplayWidth, mDisplayHeight); InputConnection ic = getCurrentInputConnection(); commitTyped(ic); if (ic != null) ic.finishComposingText(); // For voice input - mOrientation = conf.orientation; if (isShowingOptionDialog()) mOptionsDialog.dismiss(); } @@ -527,6 +595,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { + if (mHandler.postStartInputView(attribute)) { + return; + } + final KeyboardSwitcher switcher = mKeyboardSwitcher; LatinKeyboardView inputView = switcher.getKeyboardView(); @@ -1446,7 +1518,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar public boolean isShowingSuggestionsStrip() { return (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_VALUE) || (mSuggestionVisibility == SUGGESTION_VISIBILILTY_SHOW_ONLY_PORTRAIT_VALUE - && mOrientation == Configuration.ORIENTATION_PORTRAIT); + && mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT); } public boolean isCandidateStripVisible() { |