aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/AndroidManifest.xml4
-rw-r--r--java/res/values-af/strings.xml2
-rw-r--r--java/res/values-es/strings.xml2
-rw-r--r--java/res/values-ka/strings.xml241
-rw-r--r--java/res/values-sw/strings.xml2
-rw-r--r--java/res/values/keypress-vibration-durations.xml2
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java11
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/DictionaryService.java11
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java28
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java36
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/GestureTrail.java2
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/RoundedLine.java7
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java11
-rw-r--r--java/src/com/android/inputmethod/latin/RichInputMethodManager.java7
-rw-r--r--java/src/com/android/inputmethod/latin/Settings.java8
-rw-r--r--java/src/com/android/inputmethod/latin/SettingsFragment.java23
-rw-r--r--java/src/com/android/inputmethod/latin/SubtypeSwitcher.java32
-rw-r--r--java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java21
-rw-r--r--java/src/com/android/inputmethod/latin/setup/SetupActivity.java48
-rw-r--r--java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java37
-rw-r--r--java/src/com/android/inputmethod/latin/utils/Base64Reader.java117
-rw-r--r--java/src/com/android/inputmethod/research/ResearchLogger.java17
22 files changed, 566 insertions, 103 deletions
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml
index fb973f336..42f343a42 100644
--- a/java/AndroidManifest.xml
+++ b/java/AndroidManifest.xml
@@ -109,7 +109,7 @@
<receiver android:name=".DictionaryPackInstallBroadcastReceiver">
<intent-filter>
- <action android:name="com.android.inputmethod.dictionarypack.UNKNOWN_CLIENT" />
+ <action android:name="com.android.inputmethod.dictionarypack.aosp.UNKNOWN_CLIENT" />
</intent-filter>
</receiver>
@@ -129,7 +129,7 @@
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
<action android:name="android.intent.action.DATE_CHANGED" />
- <action android:name="com.android.inputmethod.latin.dictionarypack.UPDATE_NOW" />
+ <action android:name="com.android.inputmethod.dictionarypack.aosp.UPDATE_NOW" />
</intent-filter>
</receiver>
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 77a76b5d6..f1212f93e 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -183,7 +183,7 @@
<string name="setup_step2_instruction" msgid="9141481964870023336">"Volgende, kies \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" as jou aktiewe teks-invoermetode."</string>
<string name="setup_step2_action" msgid="1660330307159824337">"Wissel invoermetodes"</string>
<string name="setup_step3_title" msgid="3154757183631490281">"Veels geluk, jy\'s gereed!"</string>
- <string name="setup_step3_instruction" msgid="8025981829605426000">"Nou kan jy in al jou gunsteling programme tik met <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string>
+ <string name="setup_step3_instruction" msgid="8025981829605426000">"Nou kan jy in al jou gunstelingprogramme tik met <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string>
<string name="setup_step3_action" msgid="600879797256942259">"Stel bykomende tale op"</string>
<string name="setup_finish_action" msgid="276559243409465389">"Klaar"</string>
<string name="show_setup_wizard_icon" msgid="5008028590593710830">"Wys program-ikoon"</string>
diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml
index cbb07ddf3..0bdb06e3a 100644
--- a/java/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -87,7 +87,7 @@
<string name="spoken_description_shift" msgid="244197883292549308">"Mayús"</string>
<string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Mayúsculas activadas (tocar para inhabilitar)"</string>
<string name="spoken_description_caps_lock" msgid="3276478269526304432">"Bloqueo de mayúsculas activado (tocar para inhabilitar)"</string>
- <string name="spoken_description_delete" msgid="8740376944276199801">"Suprimir"</string>
+ <string name="spoken_description_delete" msgid="8740376944276199801">"Eliminar"</string>
<string name="spoken_description_to_symbol" msgid="5486340107500448969">"Símbolos"</string>
<string name="spoken_description_to_alpha" msgid="23129338819771807">"Letras"</string>
<string name="spoken_description_to_numeric" msgid="591752092685161732">"Números"</string>
diff --git a/java/res/values-ka/strings.xml b/java/res/values-ka/strings.xml
new file mode 100644
index 000000000..7630cdeec
--- /dev/null
+++ b/java/res/values-ka/strings.xml
@@ -0,0 +1,241 @@
+<?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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="english_ime_input_options" msgid="3909945612939668554">"შეყვანის მეთოდები"</string>
+ <string name="english_ime_research_log" msgid="8492602295696577851">"კვლევის აღრიცხვის ბრძანებები"</string>
+ <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"კონტაქტების სახელების მოძიება"</string>
+ <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"მართლწერის შემმოწმებელი ერთეულებს თქვენი კონტაქტების სიიდან იყენებს"</string>
+ <string name="vibrate_on_keypress" msgid="5258079494276955460">"ვიბრაცია კლავიშზე დაჭერისას"</string>
+ <string name="sound_on_keypress" msgid="6093592297198243644">"ხმაური კლავიშზე დაჭერისას"</string>
+ <string name="popup_on_keypress" msgid="123894815723512944">"გადიდება ღილაკზე დაჭერისას"</string>
+ <string name="general_category" msgid="1859088467017573195">"ზოგადი"</string>
+ <string name="correction_category" msgid="2236750915056607613">"ტექსტის კორექცია"</string>
+ <string name="gesture_typing_category" msgid="497263612130532630">"ჟესტებით წერა"</string>
+ <string name="misc_category" msgid="6894192814868233453">"სხვა პარამეტრები"</string>
+ <string name="advanced_settings" msgid="362895144495591463">"გაფართუებული პარამეტრები"</string>
+ <string name="advanced_settings_summary" msgid="4487980456152830271">"პარამეტრები ექსპერტთათვის"</string>
+ <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"შეყვანის სხვა მეთოდებზე გადართვა"</string>
+ <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"ენის გადართვის ღილაკს შეყვანის სხვა მეთოდებსაც შეიცავს"</string>
+ <string name="show_language_switch_key" msgid="5915478828318774384">"ენის გადართვის კლავიში"</string>
+ <string name="show_language_switch_key_summary" msgid="7343403647474265713">"აჩვენე, როდესაც ჩართულია სხვადასხვა შეყვანის ენა"</string>
+ <string name="sliding_key_input_preview" msgid="6604262359510068370">"გასრიალების ინდიკატ. ჩვენება"</string>
+ <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift ან Symbol კლავიშებიდან გასრიალებისას ვიზუალური მინიშნების ჩვენება"</string>
+ <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"ამომხტ.კლავიშის დაყოვნება"</string>
+ <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"არ დაყოვნდეს"</string>
+ <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ნაგულისხმევი"</string>
+ <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>მწმ"</string>
+ <string name="use_contacts_dict" msgid="4435317977804180815">"კონტაქტის სახელების შეთავაზება"</string>
+ <string name="use_contacts_dict_summary" msgid="6599983334507879959">"კონტაქტებიდან სახელების გამოყენება შეთავაზებებისთვის და კორექციისთვის"</string>
+ <string name="use_double_space_period" msgid="8781529969425082860">"წერტილი ორმაგი შორისით"</string>
+ <string name="use_double_space_period_summary" msgid="6532892187247952799">"შორისზე ორჯერ შეხება დაწერს წერტილს და შორისის სიმბოლოს"</string>
+ <string name="auto_cap" msgid="1719746674854628252">"ავტო-კაპიტალიზაცია"</string>
+ <string name="auto_cap_summary" msgid="7934452761022946874">"ყოველი წინადადების პირველი სიტყვის კაპიტალიზაცია"</string>
+ <string name="edit_personal_dictionary" msgid="3996910038952940420">"პერსონალური ლექსიკონი"</string>
+ <string name="configure_dictionaries_title" msgid="4238652338556902049">"დამატებითი ლექსიკონები"</string>
+ <string name="main_dictionary" msgid="4798763781818361168">"მთავარი ლექსიკონი"</string>
+ <string name="prefs_show_suggestions" msgid="8026799663445531637">"კორექციის შეთავაზებების ჩვენება"</string>
+ <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"წერისას შეთავაზებული სიტყვების ჩვენება"</string>
+ <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"ყოველთვის ჩვენება"</string>
+ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"პორტრეტის რეჟიმში ჩვენება"</string>
+ <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ყოველთვის დამალვა"</string>
+ <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"შეურაცხმყოფელი სიტყვების დაბლოკვა"</string>
+ <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"არ მოხდეს პოტენციურად შეურაცხმყოფელი სიტყვების შეთავაზება"</string>
+ <string name="auto_correction" msgid="7630720885194996950">"ავტოკორექცია"</string>
+ <string name="auto_correction_summary" msgid="5625751551134658006">"შორისი და პუნქტუაცია ავტომატურად ასწორებს არასწორად აკრეფილ სიტყვებს"</string>
+ <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"გამორთულია"</string>
+ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"მოკრძალებული"</string>
+ <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"აგრესიული"</string>
+ <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"ძალიან აგრესიული"</string>
+ <string name="bigram_prediction" msgid="1084449187723948550">"შემდეგი სიტყვის შეთავაზებები"</string>
+ <string name="bigram_prediction_summary" msgid="3896362682751109677">"შეთავაზებებისას წინა სიტყვის გამოყენება"</string>
+ <string name="gesture_input" msgid="826951152254563827">"ჟესტებით წერის ჩართვა"</string>
+ <string name="gesture_input_summary" msgid="9180350639305731231">"სიტყვის შეყვანა ასო-ნიშებზე გასრიალებით"</string>
+ <string name="gesture_preview_trail" msgid="3802333369335722221">"ჟესტიკულაციის კუდის ჩვენება"</string>
+ <string name="gesture_floating_preview_text" msgid="4443240334739381053">"დინამიურად მოლივლივე გადახედვა"</string>
+ <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ჟესტიკულაციისას შეთავაზებული სიტყვის ნახვა"</string>
+ <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : შეინახა"</string>
+ <string name="label_go_key" msgid="1635148082137219148">"წასვლ"</string>
+ <string name="label_next_key" msgid="362972844525672568">"შემდ."</string>
+ <string name="label_previous_key" msgid="1211868118071386787">"წინა"</string>
+ <string name="label_done_key" msgid="2441578748772529288">"დასრულდა"</string>
+ <string name="label_send_key" msgid="2815056534433717444">"გაგზ."</string>
+ <string name="label_pause_key" msgid="181098308428035340">"პაუზა"</string>
+ <string name="label_wait_key" msgid="6402152600878093134">"მოცდა"</string>
+ <string name="spoken_use_headphones" msgid="896961781287283493">"შეაერთეთ ყურსაცვამი, რათა მოისმინოთ აკრეფილი პაროლის კლავიშების სახელები."</string>
+ <string name="spoken_current_text_is" msgid="2485723011272583845">"მიმდინარე ტექსტი არის %s"</string>
+ <string name="spoken_no_text_entered" msgid="7479685225597344496">"ტექსტ არ შეყვანილა"</string>
+ <string name="spoken_description_unknown" msgid="3197434010402179157">"კლავიატურის კოდი %d"</string>
+ <string name="spoken_description_shift" msgid="244197883292549308">"Shift-"</string>
+ <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift ჩართულია (შეეხეთ გამოსართავად)"</string>
+ <string name="spoken_description_caps_lock" msgid="3276478269526304432">"ჩართულია Caps (შეეხეთ გამოსართავად)"</string>
+ <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string>
+ <string name="spoken_description_to_symbol" msgid="5486340107500448969">"სიმბოლოები"</string>
+ <string name="spoken_description_to_alpha" msgid="23129338819771807">"ასოები"</string>
+ <string name="spoken_description_to_numeric" msgid="591752092685161732">"ნომრები"</string>
+ <string name="spoken_description_settings" msgid="4627462689603838099">"პარამეტრები"</string>
+ <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string>
+ <string name="spoken_description_space" msgid="2582521050049860859">"შორისი"</string>
+ <string name="spoken_description_mic" msgid="615536748882611950">"ხმოვანი შეყვანა"</string>
+ <string name="spoken_description_smiley" msgid="2256309826200113918">"მომღიმარი სახე"</string>
+ <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string>
+ <string name="spoken_description_search" msgid="1247236163755920808">"ძიება"</string>
+ <string name="spoken_description_dot" msgid="40711082435231673">"წერტილი"</string>
+ <string name="spoken_description_language_switch" msgid="5507091328222331316">"ენის გადართვა"</string>
+ <string name="spoken_description_action_next" msgid="8636078276664150324">"შემდეგი"</string>
+ <string name="spoken_description_action_previous" msgid="800872415009336208">"წინა"</string>
+ <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift ჩართულია"</string>
+ <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock ჩართულია"</string>
+ <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift გამორთულია"</string>
+ <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"სიმბოლოების რეჟიმი"</string>
+ <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"ასოების რეჟიმი"</string>
+ <string name="spoken_description_mode_phone" msgid="6520207943132026264">"ტელეფონის რეჟიმი"</string>
+ <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"ტელეფონის სიმბოლოების რეჟიმი"</string>
+ <string name="announce_keyboard_hidden" msgid="8718927835531429807">"კლავიატურა დამალულია"</string>
+ <string name="announce_keyboard_mode" msgid="4729081055438508321">"ნაჩვენებია <xliff:g id="MODE">%s</xliff:g> კლავიატურა"</string>
+ <string name="keyboard_mode_date" msgid="3137520166817128102">"თარიღი"</string>
+ <string name="keyboard_mode_date_time" msgid="339593358488851072">"თარიღი და დრო"</string>
+ <string name="keyboard_mode_email" msgid="6216248078128294262">"ელფოსტა"</string>
+ <string name="keyboard_mode_im" msgid="1137405089766557048">"შეტყობინებები"</string>
+ <string name="keyboard_mode_number" msgid="7991623440699957069">"რიცხვები"</string>
+ <string name="keyboard_mode_phone" msgid="6851627527401433229">"ტელეფონი"</string>
+ <string name="keyboard_mode_text" msgid="6479436687899701619">"ტექსტი"</string>
+ <string name="keyboard_mode_time" msgid="4381856885582143277">"დრო"</string>
+ <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string>
+ <string name="voice_input" msgid="3583258583521397548">"ხმოვანი შეყვანის კლავიში"</string>
+ <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"მთავარ კლავიატურაზე"</string>
+ <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"სიმბოლოთა კლავიატურაზე"</string>
+ <string name="voice_input_modes_off" msgid="3745699748218082014">"გამორთულია"</string>
+ <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"მიკროფონი მთავარ კლავიატურაზე"</string>
+ <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"მიკროფონი სიმბოლოთა კლავიატურაზე"</string>
+ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ხმოვანი შეყვანა გამორთულია"</string>
+ <string name="configure_input_method" msgid="373356270290742459">"შეყვანის მეთოდების კონფიგურაცია"</string>
+ <string name="language_selection_title" msgid="1651299598555326750">"შეყვანის ენები"</string>
+ <string name="send_feedback" msgid="1780431884109392046">"უკუკავშირი"</string>
+ <string name="select_language" msgid="3693815588777926848">"შეყვანის ენები"</string>
+ <string name="hint_add_to_dictionary" msgid="573678656946085380">"შეეხეთ ისევ შესანახად"</string>
+ <string name="has_dictionary" msgid="6071847973466625007">"ხელმისაწვდომია ლექსიკონი"</string>
+ <string name="prefs_enable_log" msgid="6620424505072963557">"მომხმარებლის უკუკავშირის ჩართვა"</string>
+ <string name="prefs_description_log" msgid="7525225584555429211">"შეიტანეთ წვლილი შეყვანის ამ მეთოდის გაუმჯობესებაში და გააგზავნეთ მოხმარების სტატისტიკა ავარიული გათიშვების ანგარიშები"</string>
+ <string name="keyboard_layout" msgid="8451164783510487501">"კლავიატურის თემა"</string>
+ <string name="subtype_en_GB" msgid="88170601942311355">"ინგლისური (გართ. სამ.)"</string>
+ <string name="subtype_en_US" msgid="6160452336634534239">"ინგლისური (აშშ)"</string>
+ <string name="subtype_es_US" msgid="5583145191430180200">"ესპანური (აშშ)"</string>
+ <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"ინგლისური (გაერთ. სამ.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string>
+ <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"ინგლისური (აშშ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string>
+ <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"ესპანური (აშშ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string>
+ <string name="subtype_no_language" msgid="141420857808801746">"ენის გარეშე"</string>
+ <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"ენის გარეშე (QWERTY)"</string>
+ <string name="subtype_no_language_qwertz" msgid="1177848172397202890">"ენის გარეშე (QWERTZ)"</string>
+ <string name="subtype_no_language_azerty" msgid="8721460968141187394">"ენის გარეშე (AZERTY)"</string>
+ <string name="subtype_no_language_dvorak" msgid="3122976737669823935">"ენის გარეშე (Dvorak)"</string>
+ <string name="subtype_no_language_colemak" msgid="4205992994906097244">"ენის გარეშე (Colemak)"</string>
+ <string name="subtype_no_language_pcqwerty" msgid="8840928374394180189">"ენის გარეშე (PC)"</string>
+ <string name="custom_input_styles_title" msgid="8429952441821251512">"შეყვანის სტილების კონფიგურაცია"</string>
+ <string name="add_style" msgid="6163126614514489951">"სტილის დამატება"</string>
+ <string name="add" msgid="8299699805688017798">"დამატება"</string>
+ <string name="remove" msgid="4486081658752944606">"ამოშლა"</string>
+ <string name="save" msgid="7646738597196767214">"შენახვა"</string>
+ <string name="subtype_locale" msgid="8576443440738143764">"ენა"</string>
+ <string name="keyboard_layout_set" msgid="4309233698194565609">"განლაგება"</string>
+ <string name="custom_input_style_note_message" msgid="8826731320846363423">"თქვენი მორგებული შეყვანის სტილი გამოყენებამდე უნდა გაააქტიუროთ. გსურთ მისი აქტივაცია ახლა?"</string>
+ <string name="enable" msgid="5031294444630523247">"ჩართვა"</string>
+ <string name="not_now" msgid="6172462888202790482">"ახლა არა"</string>
+ <string name="custom_input_style_already_exists" msgid="8008728952215449707">"შეყვანის იგივე სტილი უკე არსებობს: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string>
+ <string name="prefs_usability_study_mode" msgid="1261130555134595254">"გამოყენებადობის კვლევის რეჟიმი"</string>
+ <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"კლავიშზე გრძელი დაჭერის დაყოვნება"</string>
+ <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"კლავიშზე დაჭერის ვიბრაციის ხანგრძლივობა"</string>
+ <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"კლავიშზე დაჭერის ხმა"</string>
+ <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"გარე ლექსიკონის ფაილის წაკითხვა"</string>
+ <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ჩამოტვირთვების საქაღალდეში ლექსიკონის ფაილები არ არის"</string>
+ <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ინსტალაციისათვის აირჩიეთ ლექსიკონის ფაილი"</string>
+ <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"ნამდვილად გსურთ ამ ფაილის <xliff:g id="LOCALE_NAME">%s</xliff:g>-ისთვის ინსტალაცია?"</string>
+ <string name="error" msgid="8940763624668513648">"წარმოიშვა შეცდომა"</string>
+ <string name="button_default" msgid="3988017840431881491">"ნაგულისხმევი"</string>
+ <string name="setup_welcome_title" msgid="6112821709832031715">"კეთილი იყოს თქვენი მობრძანება <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ში"</string>
+ <string name="setup_welcome_additional_description" msgid="8150252008545768953">"ჟესტებით წერით"</string>
+ <string name="setup_start_action" msgid="8936036460897347708">"დაწყება"</string>
+ <string name="setup_next_action" msgid="371821437915144603">"შემდეგი საფეხური"</string>
+ <string name="setup_steps_title" msgid="6400373034871816182">"მიმდინარეობს <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ის დაყენება"</string>
+ <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-ის ჩართვა"</string>
+ <string name="setup_step1_instruction" msgid="2578631936624637241">"გთხოვთ მონიშნოთ „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“ თქვენი ენის და შეყვანის პარამეტრებში. ეს უფლებას მიცემს მას გაეშვას თქვენს მოწყობილობაზე."</string>
+ <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> უკვე გააქტიურებულია თქვენი ენის შეყვანის პარამეტრებში, ასე რომ ეს საფეხური დასრულებულია. გადადით შემდეგ საფეხურზე!"</string>
+ <string name="setup_step1_action" msgid="4366513534999901728">"პარამეტრებში გააქტიურება"</string>
+ <string name="setup_step2_title" msgid="6860725447906690594">"გადართეთ <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ზე"</string>
+ <string name="setup_step2_instruction" msgid="9141481964870023336">"შემდეგ, აირჩიეთ „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“ თქვენს აქტიურ შეყვანის მეთოდად."</string>
+ <string name="setup_step2_action" msgid="1660330307159824337">"შეყვანის მეთოდების გადართვა"</string>
+ <string name="setup_step3_title" msgid="3154757183631490281">"გილოცავთ, პრცესი დასრულდა!"</string>
+ <string name="setup_step3_instruction" msgid="8025981829605426000">"ამიერიდან შეძლებთ ყველა სასურველ აპში <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ით წერას."</string>
+ <string name="setup_step3_action" msgid="600879797256942259">"დამატებითი ენების კონფიგურაცია"</string>
+ <string name="setup_finish_action" msgid="276559243409465389">"დასრულებული"</string>
+ <string name="show_setup_wizard_icon" msgid="5008028590593710830">"აპის ხატულის ჩვენება"</string>
+ <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"გაშვების ხატულის ჩვენება გამშვებში"</string>
+ <string name="app_name" msgid="6320102637491234792">"ლექსიკონის პროვაიდერი"</string>
+ <string name="dictionary_provider_name" msgid="3027315045397363079">"ლექსიკონის პროვაიდერი"</string>
+ <string name="dictionary_service_name" msgid="6237472350693511448">"ლექსიკონს სერვისი"</string>
+ <string name="download_description" msgid="6014835283119198591">"ლექსიკონის განახლების მონაცემები"</string>
+ <string name="dictionary_settings_title" msgid="8091417676045693313">"დამატებითი ლექსიკონები"</string>
+ <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"ხელმისაწვდომია ლექსიკონი"</string>
+ <string name="dictionary_settings_summary" msgid="5305694987799824349">"ლექსიკონების პარამეტრები"</string>
+ <string name="user_dictionaries" msgid="3582332055892252845">"მომხმარებლის ლექსიკონები"</string>
+ <string name="default_user_dict_pref_name" msgid="1625055720489280530">"მომხარებლის ლექსიკონი"</string>
+ <string name="dictionary_available" msgid="4728975345815214218">"ხელმისაწვდომია ლექსიკონი"</string>
+ <string name="dictionary_downloading" msgid="2982650524622620983">"მიმდინარეობს ჩამოტვირთვა"</string>
+ <string name="dictionary_installed" msgid="8081558343559342962">"დაყენებულია"</string>
+ <string name="dictionary_disabled" msgid="8950383219564621762">"დაყენებულია, გაუქმებულია"</string>
+ <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"ლექსიკონის სერვისთან დაკავშირებით პრობლემა წარმოიშვა"</string>
+ <string name="no_dictionaries_available" msgid="8039920716566132611">"ლექსიკონები მიუწვდომელია"</string>
+ <string name="check_for_updates_now" msgid="8087688440916388581">"განახლება"</string>
+ <string name="last_update" msgid="730467549913588780">"ბოლო განახლება"</string>
+ <string name="message_updating" msgid="4457761393932375219">"მიმდინარეობს განახლებების შემოწმება"</string>
+ <string name="message_loading" msgid="8689096636874758814">"იტვირთება..."</string>
+ <string name="main_dict_description" msgid="3072821352793492143">"მთავარი ლექსიკონი"</string>
+ <string name="cancel" msgid="6830980399865683324">"გაუქმება"</string>
+ <string name="install_dict" msgid="180852772562189365">"ინსტალაცია"</string>
+ <string name="cancel_download_dict" msgid="7843340278507019303">"გაუქმება"</string>
+ <string name="delete_dict" msgid="756853268088330054">"წაშლა"</string>
+ <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"თქვენს მიერ მობილურ მოწყობილობაზე არჩეული ენისათვის ხელმისაწვდომია ლექსიკონი.&lt;br/&gt; გირჩევთ, &lt;b&gt;ჩამოტვირთოთ&lt;/b&gt; <xliff:g id="LANGUAGE">%1$s</xliff:g> ლექსიკონი, რათა გაიმარტივოთ ტექსტის შეყვანა.&lt;br/&gt; &lt;br/&gt; ჩამოტვირთვას შესაძლოა დაჭირდეს ერთი ან ორი წუთი 3G სისწრაფეზე. თუ ულიმიტო არ გაგაჩნიათ &lt;b&gt; მობილური ინტერნეტის ტარიფი&lt;/b&gt;.&lt;br/&amp;gt, შესაძლოა ჩამოტვირთვა დამატებით გადასახადებთან იყოს დაკავშირებული; თუ არ ხართ დარწმუნებული მობილური ინტერნეტის აქტიური ტარიფის შესახებ, გირჩევთ იპოვოთ Wi-Fi კავშირი და ავტომატურად დაიწყოთ ჩამოტვირთვა.&lt;br/&gt; &lt;br/&gt; რჩევა: ლექსიკონების ჩამოტვირთვა და ამოშლა შესაძლებელია სექციიდან &lt;b&gt;ენა და შეყვანა&lt;/b&gt; სექციიდან, თქვენი მობილური მოწყობილობის &lt;b&gt;პარამეტრების&lt;/b&gt; მენიუში."</string>
+ <string name="download_over_metered" msgid="1643065851159409546">"ახლა ჩამოტვირთვა (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>მბაიტი)"</string>
+ <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi კავშირზე ჩამოტვირთვა"</string>
+ <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g>-ისთვის ხელმისაწვდომია ლექსიკონი"</string>
+ <string name="dict_available_notification_description" msgid="1075194169443163487">"დააჭირეთ განხილვას და ჩამოტვირთეთ"</string>
+ <string name="toast_downloading_suggestions" msgid="1313027353588566660">"ჩამოტვირთვა: <xliff:g id="LANGUAGE">%1$s</xliff:g>-ის შემოთავაზებები მალე მომზადდება."</string>
+ <string name="version_text" msgid="2715354215568469385">"ვერსია <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string>
+ <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"დამატება"</string>
+ <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"ლექსიკონში დამატება"</string>
+ <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"ფრაზა"</string>
+ <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"მეტი ვარიანტები"</string>
+ <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"ნაკლები ვარიანტები"</string>
+ <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"კარგი"</string>
+ <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"სიტყვა:"</string>
+ <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"მალსახმობი:"</string>
+ <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"ენა:"</string>
+ <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"შიყვანეთ სიტყვა"</string>
+ <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"არასავალდებულო მალსახმობი"</string>
+ <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"სიტყვის შესწორება"</string>
+ <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"რედაქტირება"</string>
+ <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"წაშლა"</string>
+ <string name="user_dict_settings_empty_text" msgid="558499587532668203">"თქვენ არ გაქვთ სიტყვები მომხმარებლის ლექსიკონში. დაამატეთ სიტყვები ღილაკ Add (+) შეხებით."</string>
+ <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"ყველა ენისთვის"</string>
+ <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"სხვა ენები…"</string>
+ <string name="user_dict_settings_delete" msgid="110413335187193859">"წაშლა"</string>
+ <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+</resources>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
index 53e46aae0..116ce1644 100644
--- a/java/res/values-sw/strings.xml
+++ b/java/res/values-sw/strings.xml
@@ -31,7 +31,7 @@
<string name="correction_category" msgid="2236750915056607613">"Marekebisho ya maandishi"</string>
<string name="gesture_typing_category" msgid="497263612130532630">"Kuandika kwa ishara"</string>
<string name="misc_category" msgid="6894192814868233453">"Chaguo zingine"</string>
- <string name="advanced_settings" msgid="362895144495591463">"Mipangilio mahiri"</string>
+ <string name="advanced_settings" msgid="362895144495591463">"Mipangilio ya kina"</string>
<string name="advanced_settings_summary" msgid="4487980456152830271">"Chaguo za wataalamu"</string>
<string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Badilisha hadi kwa mbinu zingine za ingizo"</string>
<string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Ufunguo wa kubadilisha lugha unashughulikia mbinu zingine za ingizo pia"</string>
diff --git a/java/res/values/keypress-vibration-durations.xml b/java/res/values/keypress-vibration-durations.xml
index 0474b1c92..e8d92256b 100644
--- a/java/res/values/keypress-vibration-durations.xml
+++ b/java/res/values/keypress-vibration-durations.xml
@@ -51,7 +51,7 @@
<!-- HTC One X -->
<item>MODEL=HTC One X:MANUFACTURER=HTC,20</item>
<!-- HTC One -->
- <item>MODEL=HTC One:MANUFACTURER=HTC,15</item>
+ <item>MODEL=HTC One( special edition)?:MANUFACTURER=HTC,15</item>
<!-- Motorola Razor M -->
<item>MODEL=XT907:MANUFACTURER=motorola,30</item>
<!-- Sony Xperia Z -->
diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java
index 69615887f..df0e3f0e1 100644
--- a/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java
+++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java
@@ -28,13 +28,13 @@ public class DictionaryPackConstants {
* The root domain for the dictionary pack, upon which authorities and actions will append
* their own distinctive strings.
*/
- private static final String DICTIONARY_DOMAIN = "com.android.inputmethod.dictionarypack";
+ private static final String DICTIONARY_DOMAIN = "com.android.inputmethod.dictionarypack.aosp";
/**
* Authority for the ContentProvider protocol.
*/
// TODO: find some way to factorize this string with the one in the resources
- public static final String AUTHORITY = DICTIONARY_DOMAIN + ".aosp";
+ public static final String AUTHORITY = DICTIONARY_DOMAIN;
/**
* The action of the intent for publishing that new dictionary data is available.
@@ -52,7 +52,14 @@ public class DictionaryPackConstants {
*/
public static final String UNKNOWN_DICTIONARY_PROVIDER_CLIENT = DICTIONARY_DOMAIN
+ ".UNKNOWN_CLIENT";
+
// In the above intents, the name of the string extra that contains the name of the client
// we want information about.
public static final String DICTIONARY_PROVIDER_CLIENT_EXTRA = "client";
+
+ /**
+ * The action of the intent to tell the dictionary provider to update now.
+ */
+ public static final String UPDATE_NOW_INTENT_ACTION = DICTIONARY_DOMAIN
+ + ".UPDATE_NOW";
}
diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryService.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryService.java
index 46bb5543a..6e3dd7109 100644
--- a/java/src/com/android/inputmethod/dictionarypack/DictionaryService.java
+++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryService.java
@@ -54,12 +54,7 @@ public final class DictionaryService extends Service {
/**
* The package name, to use in the intent actions.
*/
- private static final String PACKAGE_NAME = "com.android.android.inputmethod.latin";
-
- /**
- * The action of the intent to tell the dictionary provider to update now.
- */
- private static final String UPDATE_NOW_INTENT_ACTION = PACKAGE_NAME + ".UPDATE_NOW";
+ private static final String PACKAGE_NAME = "com.android.inputmethod.latin";
/**
* The action of the date changing, used to schedule a periodic freshness check
@@ -173,7 +168,7 @@ public final class DictionaryService extends Service {
// at midnight local time, but it may happen if the user changes the date
// by hand or something similar happens.
checkTimeAndMaybeSetupUpdateAlarm(context);
- } else if (UPDATE_NOW_INTENT_ACTION.equals(intent.getAction())) {
+ } else if (DictionaryPackConstants.UPDATE_NOW_INTENT_ACTION.equals(intent.getAction())) {
// Intent to trigger an update now.
UpdateHandler.update(context, false);
} else {
@@ -196,7 +191,7 @@ public final class DictionaryService extends Service {
// It doesn't matter too much if this is very inexact.
final long now = System.currentTimeMillis();
final long alarmTime = now + new Random().nextInt(MAX_ALARM_DELAY);
- final Intent updateIntent = new Intent(DictionaryService.UPDATE_NOW_INTENT_ACTION);
+ final Intent updateIntent = new Intent(DictionaryPackConstants.UPDATE_NOW_INTENT_ACTION);
final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
updateIntent, PendingIntent.FLAG_CANCEL_CURRENT);
diff --git a/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java b/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java
index 1511dbcfe..dac12137d 100644
--- a/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java
+++ b/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java
@@ -36,8 +36,6 @@ import java.util.TreeMap;
* Various helper functions for the state database
*/
public class MetadataDbHelper extends SQLiteOpenHelper {
-
- @SuppressWarnings("unused")
private static final String TAG = MetadataDbHelper.class.getSimpleName();
// This was the initial release version of the database. It should never be
@@ -437,37 +435,37 @@ public class MetadataDbHelper extends SQLiteOpenHelper {
*/
public static ContentValues completeWithDefaultValues(final ContentValues result)
throws BadFormatException {
- if (!result.containsKey(WORDLISTID_COLUMN) || !result.containsKey(LOCALE_COLUMN)) {
+ if (null == result.get(WORDLISTID_COLUMN) || null == result.get(LOCALE_COLUMN)) {
throw new BadFormatException();
}
// 0 for the pending id, because there is none
- if (!result.containsKey(PENDINGID_COLUMN)) result.put(PENDINGID_COLUMN, 0);
+ if (null == result.get(PENDINGID_COLUMN)) result.put(PENDINGID_COLUMN, 0);
// This is a binary blob of a dictionary
- if (!result.containsKey(TYPE_COLUMN)) result.put(TYPE_COLUMN, TYPE_BULK);
+ if (null == result.get(TYPE_COLUMN)) result.put(TYPE_COLUMN, TYPE_BULK);
// This word list is unknown, but it's present, else we wouldn't be here, so INSTALLED
- if (!result.containsKey(STATUS_COLUMN)) result.put(STATUS_COLUMN, STATUS_INSTALLED);
+ if (null == result.get(STATUS_COLUMN)) result.put(STATUS_COLUMN, STATUS_INSTALLED);
// No description unless specified, because we can't guess it
- if (!result.containsKey(DESCRIPTION_COLUMN)) result.put(DESCRIPTION_COLUMN, "");
+ if (null == result.get(DESCRIPTION_COLUMN)) result.put(DESCRIPTION_COLUMN, "");
// File name - this is an asset, so it works as an already deleted file.
// hence, we need to supply a non-existent file name. Anything will
// do as long as it returns false when tested with File#exist(), and
// the empty string does not, so it's set to "_".
- if (!result.containsKey(LOCAL_FILENAME_COLUMN)) result.put(LOCAL_FILENAME_COLUMN, "_");
+ if (null == result.get(LOCAL_FILENAME_COLUMN)) result.put(LOCAL_FILENAME_COLUMN, "_");
// No remote file name : this can't be downloaded. Unless specified.
- if (!result.containsKey(REMOTE_FILENAME_COLUMN)) result.put(REMOTE_FILENAME_COLUMN, "");
+ if (null == result.get(REMOTE_FILENAME_COLUMN)) result.put(REMOTE_FILENAME_COLUMN, "");
// 0 for the update date : 1970/1/1. Unless specified.
- if (!result.containsKey(DATE_COLUMN)) result.put(DATE_COLUMN, 0);
+ if (null == result.get(DATE_COLUMN)) result.put(DATE_COLUMN, 0);
// Checksum unknown unless specified
- if (!result.containsKey(CHECKSUM_COLUMN)) result.put(CHECKSUM_COLUMN, "");
+ if (null == result.get(CHECKSUM_COLUMN)) result.put(CHECKSUM_COLUMN, "");
// No filesize unless specified
- if (!result.containsKey(FILESIZE_COLUMN)) result.put(FILESIZE_COLUMN, 0);
+ if (null == result.get(FILESIZE_COLUMN)) result.put(FILESIZE_COLUMN, 0);
// Smallest possible version unless specified
- if (!result.containsKey(VERSION_COLUMN)) result.put(VERSION_COLUMN, 1);
+ if (null == result.get(VERSION_COLUMN)) result.put(VERSION_COLUMN, 1);
// Assume current format unless specified
- if (!result.containsKey(FORMATVERSION_COLUMN))
+ if (null == result.get(FORMATVERSION_COLUMN))
result.put(FORMATVERSION_COLUMN, UpdateHandler.MAXIMUM_SUPPORTED_FORMAT_VERSION);
// No flags unless specified
- if (!result.containsKey(FLAGS_COLUMN)) result.put(FLAGS_COLUMN, 0);
+ if (null == result.get(FLAGS_COLUMN)) result.put(FLAGS_COLUMN, 0);
return result;
}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
index d4051f74b..a074b6334 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
@@ -80,6 +80,14 @@ public final class KeyboardLayoutSet {
private final Context mContext;
private final Params mParams;
+ // How many layouts we forcibly keep in cache. This only includes ALPHABET (default) and
+ // ALPHABET_AUTOMATIC_SHIFTED layouts - other layouts may stay in memory in the map of
+ // soft-references, but we forcibly cache this many alphabetic/auto-shifted layouts.
+ private static final int FORCIBLE_CACHE_SIZE = 4;
+ // By construction of soft references, anything that is also referenced somewhere else
+ // will stay in the cache. So we forcibly keep some references in an array to prevent
+ // them from disappearing from sKeyboardCache.
+ private static final Keyboard[] sForcibleKeyboardCache = new Keyboard[FORCIBLE_CACHE_SIZE];
private static final HashMap<KeyboardId, SoftReference<Keyboard>> sKeyboardCache =
CollectionUtils.newHashMap();
private static final KeysCache sKeysCache = new KeysCache();
@@ -110,6 +118,7 @@ public final class KeyboardLayoutSet {
boolean mNoSettingsKey;
boolean mLanguageSwitchKeyEnabled;
InputMethodSubtype mSubtype;
+ boolean mIsSpellChecker;
int mOrientation;
int mKeyboardWidth;
int mKeyboardHeight;
@@ -185,7 +194,18 @@ public final class KeyboardLayoutSet {
elementParams.mProximityCharsCorrectionEnabled);
keyboard = builder.build();
sKeyboardCache.put(id, new SoftReference<Keyboard>(keyboard));
-
+ if ((id.mElementId == KeyboardId.ELEMENT_ALPHABET
+ || id.mElementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED)
+ && !mParams.mIsSpellChecker) {
+ // We only forcibly cache the primary, "ALPHABET", layouts.
+ for (int i = sForcibleKeyboardCache.length - 1; i >= 1; --i) {
+ sForcibleKeyboardCache[i] = sForcibleKeyboardCache[i - 1];
+ }
+ sForcibleKeyboardCache[0] = keyboard;
+ if (DEBUG_CACHE) {
+ Log.d(TAG, "forcing caching of keyboard with id=" + id);
+ }
+ }
if (DEBUG_CACHE) {
Log.d(TAG, "keyboard cache size=" + sKeyboardCache.size() + ": "
+ ((ref == null) ? "LOAD" : "GCed") + " id=" + id);
@@ -272,6 +292,11 @@ public final class KeyboardLayoutSet {
return this;
}
+ public Builder setIsSpellChecker(final boolean isSpellChecker) {
+ mParams.mIsSpellChecker = true;
+ return this;
+ }
+
public Builder setOptions(final boolean voiceKeyEnabled, final boolean voiceKeyOnMain,
final boolean languageSwitchKeyEnabled) {
@SuppressWarnings("deprecation")
@@ -422,7 +447,8 @@ public final class KeyboardLayoutSet {
final InputMethodSubtype subtype =
AdditionalSubtype.createAdditionalSubtype(locale, layout, null);
return createKeyboardSet(context, subtype, SPELLCHECKER_DUMMY_KEYBOARD_WIDTH,
- SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT, false);
+ SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT, false /* testCasesHaveTouchCoordinates */,
+ true /* isSpellChecker */);
}
@UsedForTesting
@@ -442,18 +468,20 @@ public final class KeyboardLayoutSet {
throw new RuntimeException("Orientation should be ORIENTATION_LANDSCAPE or "
+ "ORIENTATION_PORTRAIT: orientation=" + orientation);
}
- return createKeyboardSet(context, subtype, width, height, testCasesHaveTouchCoordinates);
+ return createKeyboardSet(context, subtype, width, height, testCasesHaveTouchCoordinates,
+ false /* isSpellChecker */);
}
private static KeyboardLayoutSet createKeyboardSet(final Context context,
final InputMethodSubtype subtype, final int width, final int height,
- final boolean testCasesHaveTouchCoordinates) {
+ final boolean testCasesHaveTouchCoordinates, final boolean isSpellChecker) {
final EditorInfo editorInfo = new EditorInfo();
editorInfo.inputType = InputType.TYPE_CLASS_TEXT;
final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(
context, editorInfo);
builder.setScreenGeometry(width, height);
builder.setSubtype(subtype);
+ builder.setIsSpellChecker(isSpellChecker);
if (!testCasesHaveTouchCoordinates) {
// For spell checker and tests
builder.disableTouchPositionCorrectionData();
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureTrail.java b/java/src/com/android/inputmethod/keyboard/internal/GestureTrail.java
index 0f3cd7887..fb69e22e7 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureTrail.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureTrail.java
@@ -245,7 +245,7 @@ final class GestureTrail {
final float body1 = r1 * params.mTrailBodyRatio;
final float body2 = r2 * params.mTrailBodyRatio;
final Path path = roundedLine.makePath(p1x, p1y, body1, p2x, p2y, body2);
- if (path != null) {
+ if (!path.isEmpty()) {
roundedLine.getBounds(mRoundedLineBounds);
if (params.mTrailShadowEnabled) {
final float shadow2 = r2 * params.mTrailShadowRatio;
diff --git a/java/src/com/android/inputmethod/keyboard/internal/RoundedLine.java b/java/src/com/android/inputmethod/keyboard/internal/RoundedLine.java
index 2eefd6ae9..211ef5f8b 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/RoundedLine.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/RoundedLine.java
@@ -37,16 +37,18 @@ public final class RoundedLine {
* @param p2x the x-coordinate of the end point.
* @param p2y the y-coordinate of the end point.
* @param r2 the radius at the end point
- * @return the path of rounded line
+ * @return an instance of {@link Path} that holds the result rounded line, or an instance of
+ * {@link Path} that holds an empty path if the start and end points are equal.
*/
public Path makePath(final float p1x, final float p1y, final float r1,
final float p2x, final float p2y, final float r2) {
+ mPath.rewind();
final double dx = p2x - p1x;
final double dy = p2y - p1y;
// Distance of the points.
final double l = Math.hypot(dx, dy);
if (Double.compare(0.0d, l) == 0) {
- return null;
+ return mPath; // Return an empty path
}
// Angle of the line p1-p2
final double a = Math.atan2(dy, dx);
@@ -86,7 +88,6 @@ public final class RoundedLine {
mArc2.set(p2x, p2y, p2x, p2y);
mArc2.inset(-r2, -r2);
- mPath.rewind();
// Trail cap at P1.
mPath.moveTo(p1x, p1y);
mPath.arcTo(mArc1, angle, a1);
diff --git a/java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java b/java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java
index df7bad8d0..9d478491a 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java
@@ -30,6 +30,7 @@ import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.Locale;
/**
@@ -301,12 +302,14 @@ public class DictionaryInfoUtils {
private static void addOrUpdateDictInfo(final ArrayList<DictionaryInfo> dictList,
final DictionaryInfo newElement) {
- for (final DictionaryInfo info : dictList) {
- if (info.mLocale.equals(newElement.mLocale)) {
- if (newElement.mVersion <= info.mVersion) {
+ final Iterator<DictionaryInfo> iter = dictList.iterator();
+ while (iter.hasNext()) {
+ final DictionaryInfo thisDictInfo = iter.next();
+ if (thisDictInfo.mLocale.equals(newElement.mLocale)) {
+ if (newElement.mVersion <= thisDictInfo.mVersion) {
return;
}
- dictList.remove(info);
+ iter.remove();
}
}
dictList.add(newElement);
diff --git a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java
index 0dd302afa..94513e635 100644
--- a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java
+++ b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java
@@ -54,13 +54,6 @@ public final class RichInputMethodManager {
return sInstance;
}
- // Caveat: This may cause IPC
- public static boolean isInputMethodManagerValidForUserOfThisProcess(final Context context) {
- // Basically called to check whether this IME has been triggered by the current user or not
- return !((InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE)).
- getInputMethodList().isEmpty();
- }
-
public static void init(final Context context) {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
sInstance.initInternal(context, prefs);
diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java
index 9fefb58a6..a6149c6ec 100644
--- a/java/src/com/android/inputmethod/latin/Settings.java
+++ b/java/src/com/android/inputmethod/latin/Settings.java
@@ -21,6 +21,7 @@ import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.res.Resources;
import android.preference.PreferenceManager;
+import android.util.Log;
import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
@@ -28,6 +29,7 @@ import java.util.HashMap;
import java.util.Locale;
public final class Settings implements SharedPreferences.OnSharedPreferenceChangeListener {
+ private static final String TAG = Settings.class.getSimpleName();
// In the same order as xml/prefs.xml
public static final String PREF_GENERAL_SETTINGS = "general_settings";
public static final String PREF_AUTO_CAP = "auto_cap";
@@ -114,6 +116,12 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
@Override
public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
+ if (mSettingsValues == null) {
+ // TODO: Introduce a static function to register this class and ensure that
+ // loadSettings must be called before "onSharedPreferenceChanged" is called.
+ Log.w(TAG, "onSharedPreferenceChanged called before loadSettings.");
+ return;
+ }
loadSettings(mCurrentLocale, mSettingsValues.mInputAttributes);
}
diff --git a/java/src/com/android/inputmethod/latin/SettingsFragment.java b/java/src/com/android/inputmethod/latin/SettingsFragment.java
index 20ce6d4e0..1fad765d7 100644
--- a/java/src/com/android/inputmethod/latin/SettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/SettingsFragment.java
@@ -32,6 +32,7 @@ import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
+import android.util.Log;
import android.view.inputmethod.InputMethodSubtype;
import java.util.TreeSet;
@@ -41,10 +42,12 @@ import com.android.inputmethod.latin.define.ProductionFlag;
import com.android.inputmethod.latin.setup.LauncherIconVisibilityManager;
import com.android.inputmethod.latin.userdictionary.UserDictionaryList;
import com.android.inputmethod.latin.userdictionary.UserDictionarySettings;
+import com.android.inputmethod.research.ResearchLogger;
import com.android.inputmethodcommon.InputMethodSettingsFragment;
public final class SettingsFragment extends InputMethodSettingsFragment
implements SharedPreferences.OnSharedPreferenceChangeListener {
+ private static final String TAG = SettingsFragment.class.getSimpleName();
private static final boolean DBG_USE_INTERNAL_USER_DICTIONARY_SETTINGS = false;
private ListPreference mVoicePreference;
@@ -128,7 +131,12 @@ public final class SettingsFragment extends InputMethodSettingsFragment
feedbackSettings.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference pref) {
- FeedbackUtils.showFeedbackForm(getActivity());
+ if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
+ // Use development-only feedback mechanism
+ ResearchLogger.getInstance().presentFeedbackDialogFromSettings();
+ } else {
+ FeedbackUtils.showFeedbackForm(getActivity());
+ }
return true;
}
});
@@ -139,6 +147,10 @@ public final class SettingsFragment extends InputMethodSettingsFragment
miscSettings.removePreference(aboutSettings);
}
}
+ if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
+ // The about screen contains items that may be confusing in development-only versions.
+ miscSettings.removePreference(aboutSettings);
+ }
final boolean showVoiceKeyOption = res.getBoolean(
R.bool.config_enable_show_voice_key_option);
@@ -244,7 +256,14 @@ public final class SettingsFragment extends InputMethodSettingsFragment
@Override
public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
- (new BackupManager(getActivity())).dataChanged();
+ final Activity activity = getActivity();
+ if (activity == null) {
+ // TODO: Introduce a static function to register this class and ensure that
+ // onCreate must be called before "onSharedPreferenceChanged" is called.
+ Log.w(TAG, "onSharedPreferenceChanged called before activity starts.");
+ return;
+ }
+ (new BackupManager(activity)).dataChanged();
final Resources res = getResources();
if (key.equals(Settings.PREF_POPUP_ON)) {
setPreferenceEnabled(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY,
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index 282b5794f..1eca68ae5 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -43,20 +43,23 @@ public final class SubtypeSwitcher {
private static final String TAG = SubtypeSwitcher.class.getSimpleName();
private static final SubtypeSwitcher sInstance = new SubtypeSwitcher();
+
private /* final */ RichInputMethodManager mRichImm;
private /* final */ Resources mResources;
private /* final */ ConnectivityManager mConnectivityManager;
- /*-----------------------------------------------------------*/
- // Variants which should be changed only by reload functions.
- private NeedsToDisplayLanguage mNeedsToDisplayLanguage = new NeedsToDisplayLanguage();
+ private final NeedsToDisplayLanguage mNeedsToDisplayLanguage = new NeedsToDisplayLanguage();
private InputMethodInfo mShortcutInputMethodInfo;
private InputMethodSubtype mShortcutSubtype;
private InputMethodSubtype mNoLanguageSubtype;
- /*-----------------------------------------------------------*/
-
private boolean mIsNetworkConnected;
+ // Dummy no language QWERTY subtype. See {@link R.xml.method}.
+ private static final InputMethodSubtype DUMMY_NO_LANGUAGE_SUBTYPE = new InputMethodSubtype(
+ R.string.subtype_no_language_qwerty, R.drawable.ic_subtype_keyboard, "zz", "keyboard",
+ "KeyboardLayoutSet=qwerty,AsciiCapable,EnabledWhenDefaultIsNotAsciiCapable",
+ false /* isAuxiliary */, false /* overridesImplicitlyEnabledSubtype */);
+
static final class NeedsToDisplayLanguage {
private int mEnabledSubtypeCount;
private boolean mIsSystemLanguageSameAsInputLanguage;
@@ -96,11 +99,6 @@ public final class SubtypeSwitcher {
mRichImm = RichInputMethodManager.getInstance();
mConnectivityManager = (ConnectivityManager) context.getSystemService(
Context.CONNECTIVITY_SERVICE);
- mNoLanguageSubtype = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
- SubtypeLocale.NO_LANGUAGE, SubtypeLocale.QWERTY);
- if (mNoLanguageSubtype == null) {
- throw new RuntimeException("Can't find no lanugage with QWERTY subtype");
- }
final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
mIsNetworkConnected = (info != null && info.isConnected());
@@ -255,10 +253,20 @@ public final class SubtypeSwitcher {
}
public InputMethodSubtype getCurrentSubtype() {
- return mRichImm.getCurrentInputMethodSubtype(mNoLanguageSubtype);
+ return mRichImm.getCurrentInputMethodSubtype(getNoLanguageSubtype());
}
public InputMethodSubtype getNoLanguageSubtype() {
- return mNoLanguageSubtype;
+ if (mNoLanguageSubtype == null) {
+ mNoLanguageSubtype = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+ SubtypeLocale.NO_LANGUAGE, SubtypeLocale.QWERTY);
+ }
+ if (mNoLanguageSubtype != null) {
+ return mNoLanguageSubtype;
+ }
+ Log.w(TAG, "Can't find no lanugage with QWERTY subtype");
+ Log.w(TAG, "No input method subtype found; return dummy subtype: "
+ + DUMMY_NO_LANGUAGE_SUBTYPE);
+ return DUMMY_NO_LANGUAGE_SUBTYPE;
}
}
diff --git a/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java b/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java
index 604ebeeb6..63d2fecd3 100644
--- a/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java
+++ b/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java
@@ -25,9 +25,9 @@ import android.content.pm.PackageManager;
import android.os.Process;
import android.preference.PreferenceManager;
import android.util.Log;
+import android.view.inputmethod.InputMethodManager;
import com.android.inputmethod.compat.IntentCompatUtils;
-import com.android.inputmethod.latin.RichInputMethodManager;
import com.android.inputmethod.latin.Settings;
/**
@@ -65,17 +65,16 @@ public final class LauncherIconVisibilityManager extends BroadcastReceiver {
}
// The process that hosts this broadcast receiver is invoked and remains alive even after
- // 1) the package has been re-installed, 2) the device has been booted,
- // 3) a multiuser has been created.
+ // 1) the package has been re-installed, 2) the device has just booted,
+ // 3) a new user has been created.
// There is no good reason to keep the process alive if this IME isn't a current IME.
- final boolean isCurrentImeOfCurrentUser;
- if (RichInputMethodManager.isInputMethodManagerValidForUserOfThisProcess(context)) {
- RichInputMethodManager.init(context);
- isCurrentImeOfCurrentUser = SetupActivity.isThisImeCurrent(context);
- } else {
- isCurrentImeOfCurrentUser = false;
- }
-
+ final InputMethodManager imm =
+ (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ // Called to check whether this IME has been triggered by the current user or not
+ final boolean isInputMethodManagerValidForUserOfThisProcess =
+ !imm.getInputMethodList().isEmpty();
+ final boolean isCurrentImeOfCurrentUser = isInputMethodManagerValidForUserOfThisProcess
+ && SetupActivity.isThisImeCurrent(context, imm);
if (!isCurrentImeOfCurrentUser) {
final int myPid = Process.myPid();
Log.i(TAG, "Killing my process: pid=" + myPid);
diff --git a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
index 8a2de887d..a68f98fe7 100644
--- a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
+++ b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
@@ -24,8 +24,6 @@ import android.provider.Settings;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
-import com.android.inputmethod.latin.RichInputMethodManager;
-
public final class SetupActivity extends Activity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
@@ -40,17 +38,24 @@ public final class SetupActivity extends Activity {
}
}
+ /*
+ * We may not be able to get our own {@link InputMethodInfo} just after this IME is installed
+ * because {@link InputMethodManagerService} may not be aware of this IME yet.
+ * Note: {@link RichInputMethodManager} has similar methods. Here in setup wizard, we can't
+ * use it for the reason above.
+ */
+
/**
* Check if the IME specified by the context is enabled.
- * Note that {@link RichInputMethodManager} must have been initialized before calling this
- * method.
+ * CAVEAT: This may cause a round trip IPC.
*
* @param context package context of the IME to be checked.
+ * @param imm the {@link InputMethodManager}.
* @return true if this IME is enabled.
*/
- public static boolean isThisImeEnabled(final Context context) {
+ /* package */ static boolean isThisImeEnabled(final Context context,
+ final InputMethodManager imm) {
final String packageName = context.getPackageName();
- final InputMethodManager imm = RichInputMethodManager.getInstance().getInputMethodManager();
for (final InputMethodInfo imi : imm.getEnabledInputMethodList()) {
if (packageName.equals(imi.getPackageName())) {
return true;
@@ -61,17 +66,36 @@ public final class SetupActivity extends Activity {
/**
* Check if the IME specified by the context is the current IME.
- * Note that {@link RichInputMethodManager} must have been initialized before calling this
- * method.
+ * CAVEAT: This may cause a round trip IPC.
*
* @param context package context of the IME to be checked.
+ * @param imm the {@link InputMethodManager}.
* @return true if this IME is the current IME.
*/
- public static boolean isThisImeCurrent(final Context context) {
- final InputMethodInfo myImi =
- RichInputMethodManager.getInstance().getInputMethodInfoOfThisIme();
+ /* package */ static boolean isThisImeCurrent(final Context context,
+ final InputMethodManager imm) {
+ final InputMethodInfo imi = getInputMethodInfoOf(context.getPackageName(), imm);
final String currentImeId = Settings.Secure.getString(
context.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
- return myImi.getId().equals(currentImeId);
+ return imi != null && imi.getId().equals(currentImeId);
+ }
+
+ /**
+ * Get {@link InputMethodInfo} of the IME specified by the package name.
+ * CAVEAT: This may cause a round trip IPC.
+ *
+ * @param packageName package name of the IME.
+ * @param imm the {@link InputMethodManager}.
+ * @return the {@link InputMethodInfo} of the IME specified by the <code>packageName</code>,
+ * or null if not found.
+ */
+ /* package */ static InputMethodInfo getInputMethodInfoOf(final String packageName,
+ final InputMethodManager imm) {
+ for (final InputMethodInfo imi : imm.getInputMethodList()) {
+ if (packageName.equals(imi.getPackageName())) {
+ return imi;
+ }
+ }
+ return null;
}
}
diff --git a/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java b/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java
index 78a6478c6..13fa9d9c8 100644
--- a/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java
+++ b/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java
@@ -28,6 +28,7 @@ import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.VideoView;
@@ -36,7 +37,6 @@ import com.android.inputmethod.compat.TextViewCompatUtils;
import com.android.inputmethod.compat.ViewCompatUtils;
import com.android.inputmethod.latin.CollectionUtils;
import com.android.inputmethod.latin.R;
-import com.android.inputmethod.latin.RichInputMethodManager;
import com.android.inputmethod.latin.SettingsActivity;
import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
@@ -48,6 +48,8 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL
private static final boolean ENABLE_WELCOME_VIDEO = true;
+ private InputMethodManager mImm;
+
private View mSetupWizard;
private View mWelcomeScreen;
private View mSetupScreen;
@@ -69,15 +71,19 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL
private static final int STEP_LAUNCHING_IME_SETTINGS = 4;
private static final int STEP_BACK_FROM_IME_SETTINGS = 5;
- final SettingsPoolingHandler mHandler = new SettingsPoolingHandler(this);
+ private SettingsPoolingHandler mHandler;
- static final class SettingsPoolingHandler
+ private static final class SettingsPoolingHandler
extends StaticInnerHandlerWrapper<SetupWizardActivity> {
private static final int MSG_POLLING_IME_SETTINGS = 0;
private static final long IME_SETTINGS_POLLING_INTERVAL = 200;
- public SettingsPoolingHandler(final SetupWizardActivity outerInstance) {
+ private final InputMethodManager mImmInHandler;
+
+ public SettingsPoolingHandler(final SetupWizardActivity outerInstance,
+ final InputMethodManager imm) {
super(outerInstance);
+ mImmInHandler = imm;
}
@Override
@@ -88,7 +94,7 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL
}
switch (msg.what) {
case MSG_POLLING_IME_SETTINGS:
- if (SetupActivity.isThisImeEnabled(setupWizardActivity)) {
+ if (SetupActivity.isThisImeEnabled(setupWizardActivity, mImmInHandler)) {
setupWizardActivity.invokeSetupWizardOfThisIme();
return;
}
@@ -112,11 +118,12 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL
setTheme(android.R.style.Theme_Translucent_NoTitleBar);
super.onCreate(savedInstanceState);
+ mImm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
+ mHandler = new SettingsPoolingHandler(this, mImm);
+
setContentView(R.layout.setup_wizard);
mSetupWizard = findViewById(R.id.setup_wizard);
- RichInputMethodManager.init(this);
-
if (savedInstanceState == null) {
mStepNumber = determineSetupStepNumberFromLauncher();
} else {
@@ -143,11 +150,12 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL
R.string.setup_step1_title, R.string.setup_step1_instruction,
R.string.setup_step1_finished_instruction, R.drawable.ic_setup_step1,
R.string.setup_step1_action);
+ final SettingsPoolingHandler handler = mHandler;
step1.setAction(new Runnable() {
@Override
public void run() {
invokeLanguageAndInputSettings();
- mHandler.startPollingImeSettings();
+ handler.startPollingImeSettings();
}
});
mSetupStepGroup.addStep(step1);
@@ -265,14 +273,15 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL
void invokeInputMethodPicker() {
// Invoke input method picker.
- RichInputMethodManager.getInstance().getInputMethodManager()
- .showInputMethodPicker();
+ mImm.showInputMethodPicker();
mNeedsToAdjustStepNumberToSystemState = true;
}
void invokeSubtypeEnablerOfThisIme() {
- final InputMethodInfo imi =
- RichInputMethodManager.getInstance().getInputMethodInfoOfThisIme();
+ final InputMethodInfo imi = SetupActivity.getInputMethodInfoOf(getPackageName(), mImm);
+ if (imi == null) {
+ return;
+ }
final Intent intent = new Intent();
intent.setAction(Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS);
intent.addCategory(Intent.CATEGORY_DEFAULT);
@@ -293,10 +302,10 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL
private int determineSetupStepNumber() {
mHandler.cancelPollingImeSettings();
- if (!SetupActivity.isThisImeEnabled(this)) {
+ if (!SetupActivity.isThisImeEnabled(this, mImm)) {
return STEP_1;
}
- if (!SetupActivity.isThisImeCurrent(this)) {
+ if (!SetupActivity.isThisImeCurrent(this, mImm)) {
return STEP_2;
}
return STEP_3;
diff --git a/java/src/com/android/inputmethod/latin/utils/Base64Reader.java b/java/src/com/android/inputmethod/latin/utils/Base64Reader.java
new file mode 100644
index 000000000..3eca6e744
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/utils/Base64Reader.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package com.android.inputmethod.latin.utils;
+
+import com.android.inputmethod.annotations.UsedForTesting;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.LineNumberReader;
+
+@UsedForTesting
+public class Base64Reader {
+ private final LineNumberReader mReader;
+
+ private String mLine;
+ private int mCharPos;
+ private int mByteCount;
+
+ @UsedForTesting
+ public Base64Reader(final LineNumberReader reader) {
+ mReader = reader;
+ reset();
+ }
+
+ @UsedForTesting
+ public void reset() {
+ mLine = null;
+ mCharPos = 0;
+ mByteCount = 0;
+ }
+
+ @UsedForTesting
+ public int getLineNumber() {
+ return mReader.getLineNumber();
+ }
+
+ @UsedForTesting
+ public int getByteCount() {
+ return mByteCount;
+ }
+
+ private void fillBuffer() throws IOException {
+ if (mLine == null || mCharPos >= mLine.length()) {
+ mLine = mReader.readLine();
+ mCharPos = 0;
+ }
+ if (mLine == null) {
+ throw new EOFException();
+ }
+ }
+
+ private int peekUint8() throws IOException {
+ fillBuffer();
+ final char c = mLine.charAt(mCharPos);
+ if (c >= 'A' && c <= 'Z')
+ return c - 'A' + 0;
+ if (c >= 'a' && c <= 'z')
+ return c - 'a' + 26;
+ if (c >= '0' && c <= '9')
+ return c - '0' + 52;
+ if (c == '+')
+ return 62;
+ if (c == '/')
+ return 63;
+ if (c == '=')
+ return 0;
+ throw new RuntimeException("Unknown character '" + c + "' in base64 at line "
+ + mReader.getLineNumber());
+ }
+
+ private int getUint8() throws IOException {
+ final int value = peekUint8();
+ mCharPos++;
+ return value;
+ }
+
+ @UsedForTesting
+ public int readUint8() throws IOException {
+ final int value1, value2;
+ switch (mByteCount % 3) {
+ case 0:
+ value1 = getUint8() << 2;
+ value2 = value1 | (peekUint8() >> 4);
+ break;
+ case 1:
+ value1 = (getUint8() & 0x0f) << 4;
+ value2 = value1 | (peekUint8() >> 2);
+ break;
+ default:
+ value1 = (getUint8() & 0x03) << 6;
+ value2 = value1 | getUint8();
+ break;
+ }
+ mByteCount++;
+ return value2;
+ }
+
+ @UsedForTesting
+ public short readInt16() throws IOException {
+ final int data = readUint8() << 8;
+ return (short)(data | readUint8());
+ }
+}
diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java
index aa4a866b8..e890b74aa 100644
--- a/java/src/com/android/inputmethod/research/ResearchLogger.java
+++ b/java/src/com/android/inputmethod/research/ResearchLogger.java
@@ -429,6 +429,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
mMainResearchLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS);
resetLogBuffers();
+ cancelFeedbackDialog();
}
public void abort() {
@@ -465,6 +466,12 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
presentFeedbackDialog(latinIME);
}
+ public void presentFeedbackDialogFromSettings() {
+ if (mLatinIME != null) {
+ presentFeedbackDialog(mLatinIME);
+ }
+ }
+
public void presentFeedbackDialog(final LatinIME latinIME) {
if (isMakingUserRecording()) {
saveRecording();
@@ -701,13 +708,19 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
mInFeedbackDialog = false;
}
+ private void cancelFeedbackDialog() {
+ if (isMakingUserRecording()) {
+ cancelRecording();
+ }
+ mInFeedbackDialog = false;
+ }
+
public void initSuggest(final Suggest suggest) {
mSuggest = suggest;
// MainLogBuffer now has an out-of-date Suggest object. Close down MainLogBuffer and create
// a new one.
if (mMainLogBuffer != null) {
- stop();
- start();
+ restart();
}
}