Merge remote-tracking branch 'goog/master' into mergescriptpackage
Conflicts: java/res/values-da/strings.xml java/res/values-es-rUS/strings.xml java/res/values-fa/strings.xml java/res/values-ko/strings.xml java/res/values-pl/strings.xml java/res/values-sk/strings.xml java/res/values-sw/strings.xml Change-Id: I1d4be3df6c54c328011c448f31f163fafb2a909amain
commit
32555e832a
|
@ -24,11 +24,15 @@
|
|||
*;
|
||||
}
|
||||
|
||||
-keep class com.android.inputmethod.latin.ResizableIntArray {
|
||||
*;
|
||||
}
|
||||
|
||||
-keep class com.android.inputmethod.latin.spellcheck.SpellCheckerSettingsFragment {
|
||||
*;
|
||||
}
|
||||
|
||||
-keep class com.android.inputmethod.keyboard.LatinKeyboardView {
|
||||
-keep class com.android.inputmethod.keyboard.MainKeyboardView {
|
||||
# Keep getter/setter methods for ObjectAnimator
|
||||
int getLanguageOnSpacebarAnimAlpha();
|
||||
void setLanguageOnSpacebarAnimAlpha(int);
|
||||
|
@ -40,7 +44,7 @@
|
|||
<init>(...);
|
||||
}
|
||||
|
||||
-keep class com.android.inputmethod.latin.ResearchLogger {
|
||||
-keep class com.android.inputmethod.research.ResearchLogger {
|
||||
void flush();
|
||||
void publishCurrentLogUnit(...);
|
||||
}
|
||||
|
|
|
@ -43,20 +43,20 @@
|
|||
android:layout_width="@dimen/suggestions_strip_padding"
|
||||
android:layout_height="@dimen/suggestions_strip_height"
|
||||
style="?attr/suggestionsStripBackgroundStyle" />
|
||||
<com.android.inputmethod.latin.suggestions.SuggestionsView
|
||||
android:id="@+id/suggestions_view"
|
||||
<com.android.inputmethod.latin.suggestions.SuggestionStripView
|
||||
android:id="@+id/suggestion_strip_view"
|
||||
android:layout_weight="1.0"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/suggestions_strip_height"
|
||||
android:gravity="center_vertical"
|
||||
style="?attr/suggestionsViewStyle" />
|
||||
style="?attr/suggestionStripViewStyle" />
|
||||
<View
|
||||
android:layout_width="@dimen/suggestions_strip_padding"
|
||||
android:layout_height="@dimen/suggestions_strip_height"
|
||||
style="?attr/suggestionsStripBackgroundStyle" />
|
||||
</LinearLayout>
|
||||
|
||||
<com.android.inputmethod.keyboard.LatinKeyboardView
|
||||
<com.android.inputmethod.keyboard.MainKeyboardView
|
||||
android:id="@+id/keyboard_view"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2012 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.
|
||||
-->
|
||||
|
||||
<com.android.inputmethod.research.FeedbackLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:id="@+id/research_feedback_layout"
|
||||
>
|
||||
|
||||
<fragment
|
||||
android:id="@+id/research_feedback_fragment"
|
||||
android:name="com.android.inputmethod.research.FeedbackFragment"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
</com.android.inputmethod.research.FeedbackLayout>
|
|
@ -0,0 +1,112 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2012 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.
|
||||
-->
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
|
||||
<!-- Mimic a dialog title. Necessary since the dialog is actually an activity, so the normal
|
||||
dialog title construction code is not available. -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
<com.android.internal.widget.DialogTitle
|
||||
style="?android:attr/windowTitleStyle"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="64dip"
|
||||
android:layout_marginLeft="16dip"
|
||||
android:layout_marginRight="16dip"
|
||||
android:gravity="center_vertical|left"
|
||||
android:text="@string/research_feedback_dialog_title" />
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="2dip"
|
||||
android:background="@android:color/holo_blue_light" />
|
||||
</LinearLayout>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/research_feedback_contents"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_gravity="fill_horizontal|center_vertical"
|
||||
android:layout_marginLeft="8dip"
|
||||
android:layout_marginRight="8dip"
|
||||
android:layout_marginBottom="8dip"
|
||||
android:layout_marginTop="8dip"
|
||||
android:lines="2"
|
||||
android:hint="@string/research_feedback_hint"
|
||||
android:inputType="textMultiLine"
|
||||
android:imeOptions="flagNoFullscreen"
|
||||
>
|
||||
<requestFocus />
|
||||
</EditText>
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/research_feedback_include_history"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_marginBottom="8dip"
|
||||
android:checked="true"
|
||||
android:text="@string/research_feedback_include_history_label"
|
||||
/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:divider="?android:attr/dividerHorizontal"
|
||||
android:showDividers="beginning"
|
||||
android:dividerPadding="0dip"
|
||||
>
|
||||
<LinearLayout
|
||||
style="?android:attr/buttonBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:measureWithLargestChild="true"
|
||||
>
|
||||
<Button
|
||||
android:id="@+id/research_feedback_cancel_button"
|
||||
android:layout_width="0dip"
|
||||
android:layout_gravity="left"
|
||||
android:layout_weight="1"
|
||||
android:maxLines="2"
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:textSize="14sp"
|
||||
android:text="@string/research_feedback_cancel"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
<Button
|
||||
android:id="@+id/research_feedback_send_button"
|
||||
android:layout_width="0dip"
|
||||
android:layout_gravity="right"
|
||||
android:layout_weight="1"
|
||||
android:maxLines="2"
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:textSize="14sp"
|
||||
android:text="@string/research_feedback_send"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
|
@ -0,0 +1,50 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2012 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.
|
||||
-->
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/research_feedback_contents"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_gravity="fill_horizontal|center_vertical"
|
||||
android:layout_marginLeft="8dip"
|
||||
android:layout_marginRight="8dip"
|
||||
android:layout_marginBottom="8dip"
|
||||
android:layout_marginTop="8dip"
|
||||
android:lines="2"
|
||||
android:hint="@string/research_feedback_hint"
|
||||
android:inputType="textMultiLine"
|
||||
android:imeOptions="flagNoFullscreen"
|
||||
android:focusable="true"
|
||||
>
|
||||
<requestFocus />
|
||||
</EditText>
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/research_feedback_include_history"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_marginBottom="8dip"
|
||||
android:checked="true"
|
||||
android:text="@string/research_feedback_include_history_label"
|
||||
/>
|
||||
</LinearLayout>
|
|
@ -0,0 +1,88 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2012 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.
|
||||
-->
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:id="@+id/research_splash_screen_layout">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<com.android.internal.widget.DialogTitle
|
||||
style="?android:attr/windowTitleStyle"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="64dip"
|
||||
android:layout_marginLeft="16dip"
|
||||
android:layout_marginRight="16dip"
|
||||
android:gravity="center_vertical|left"
|
||||
android:text="@string/research_splash_title" />
|
||||
<View android:layout_width="match_parent"
|
||||
android:layout_height="2dip"
|
||||
android:background="@android:color/holo_blue_light" />
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:text="@string/research_splash_content"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_gravity="fill_horizontal|center_vertical"
|
||||
android:layout_marginLeft="16dip"
|
||||
android:layout_marginRight="16dip"
|
||||
android:layout_marginBottom="16dip"
|
||||
android:layout_marginTop="16dip"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:divider="?android:attr/dividerHorizontal"
|
||||
android:showDividers="beginning"
|
||||
android:dividerPadding="0dip">
|
||||
<LinearLayout
|
||||
style="?android:attr/buttonBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:measureWithLargestChild="true">
|
||||
<Button
|
||||
android:layout_width="0dip"
|
||||
android:layout_gravity="left"
|
||||
android:layout_weight="1"
|
||||
android:maxLines="2"
|
||||
stype="?android:attr/buttonBarButtonStyle"
|
||||
android:textSize="14sp"
|
||||
android:text="@string/research_dont_send_usage_info"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/research_do_not_log_button" />
|
||||
<Button
|
||||
android:layout_width="0dip"
|
||||
android:layout_gravity="right"
|
||||
android:layout_weight="1"
|
||||
android:maxLines="2"
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:textSize="14sp"
|
||||
android:text="@string/research_send_usage_info"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/research_do_log_button" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Baie aggressief"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Stel volgende woord voor"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Gebaseer op vorige woord"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Invoer van gebaar"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Voer \'n woord in deur die letters van \'n woord te volg"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Gestoor"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Gaan"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Volgende"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Steminvoer is gedeaktiveer"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Stel invoermetodes op"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Invoertale"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"let op die tydstempel in die loglêer"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Aangetekende tydstempel"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Moenie hierdie sessie aanteken nie"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Aktiveer sessie-rekordhouding"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Hou rekord van hele sessiegeskiedenis"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Sessie se loglêer uitgevee"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Sessie se loglêer uitgevee"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Sessie se loglêer NIE uitgevee nie"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Rekord gehou van sessiegeskiedenis"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Fout: daar is NIE rekord gehou van die sessiegeskiedenis nie"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sessie-rekordhouding geaktiveer"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Invoertale"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Raak weer om te stoor"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Woordeboek beskikbaar"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"በጣም ቁጡ"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"የቀጣይ ቃል አስተያየቶች"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"በቀዳሚው ቃል ላይ የተመሠረተ"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"የእጅ ምልክት ግብዓት"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"የአንድ ቃል ፊደሎችን በመከታተል አንድ ቃል አስገባ"</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>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"የምዝግብ ማስታወሻ ጊዜ ማህተም ማስታወሻ"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"የጊዜ ማህተም ተመዝግቧል"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"ይህን ክፍለ ጊዜ እንዳትመዘግበው"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"ክፍለ ጊዜ ምዝገባን አንቃ"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"ሙሉውን የክፍለጊዜ ታሪክ መዝግብ"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"የክፍለጊዜ ምዝግብ ማስታወሻ በመሰረዝ ላይ"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"የክፍለ ጊዜ ምዝግብ ማስታወሻ ተሰርዟል"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"የክፍለጊዜ ምዝግብ ማስታወሻ አልተሰረዘም"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"የክፍለጊዜ ታሪክ ተመዝግቧል"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"ስህተት፦ ክፍለጊዜ ታሪክ አልተመዘገበም"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"ክፍለጊዜ ምዝገባ ነቅቷል"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"ቋንቋዎች አግቤት"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"ለማስቀመጥ እንደገና ንካ"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"መዝገበ ቃላት አለ"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"شديد الصرامة"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"اقتراحات الكلمات التالية"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"استنادًا إلى الكلمة السابقة"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"إدخال الإيماءة"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"يمكنك إدخال كلمة من خلال تتبع أحرف كلمة ما"</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>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"ملاحظة طابع زمني في سجل"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"تم تسجيل الطابع الزمني"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"عدم تسجيل هذه الجلسة"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"تمكين تسجيل الجلسة"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"تسجيل سجل الجلسة بالكامل"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"جارٍ حذف سجل الجلسة"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"تم حذف سجل الجلسة"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"لم يتم حذف سجل الجلسة"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"تم تسجيل سجل الجلسة"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"الخطأ: لم يتم تسجيل سجل الجلسة"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"تم تمكين تسجيل الجلسة"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"لغات الإدخال"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"المس مرة أخرى للحفظ"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"القاموس متاح"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Вельмі агрэсіўны"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Падказкi для наступнага слова"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"На аснове папярэдняга слова"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Уваход жэстам"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Увядзiце слова, адсочваючы лiтары"</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>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"Пазначыць час у гiсторыi"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Запiсаныя пазнакі"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Не рэгістраваць гэты сеанс"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Уключыць гiсторыю сеанса"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Запiс усёй гiсторыi сеанса"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Выдаленне гiсторыi сеанса"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Гiсторыя сеанса выдалена"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Гiсторыя сеанса НЕ выдалена"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Гiсторыя сеанса запiсана"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Памылка: гiсторыя сеанса НЕ запiсана"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Уключаны запiс сеанса"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Мовы ўводу"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Дакраніцеся зноў, каб захаваць"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Слоўнік даступны"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Много агресивно"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Предложения за следващата дума"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Въз основа на предишната дума"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Въвеждане чрез жест"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Въвеждане на дума чрез проследяване на буквите й"</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>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"Отбелязване на часа в рег. файл"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Часът е записан"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Без регистр. на сесията"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Записване на сесията: Активиране"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Цялата история на сесията: Записв."</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Рег. файл на сесията се изтрива"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Рег. файл на сесията е изтрит"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Рег. файл на сесията НЕ Е изтрит"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Историята на сесията е записана"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Грешка: Ист. на сесията НЕ е записана"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Записването на сесията е активирано"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Езици за въвеждане"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Докоснете отново, за да запазите"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Има достъп до речник"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Molt agressiu"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Suggeriments de paraula següent"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"En funció de la paraula anterior"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Entrada de gestos"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Dibuixa les lletres d\'una paraula per escriure-la"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: desada"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Vés"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Següent"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. veu desactiv."</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Configura mètodes d\'entrada"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Idiomes d\'entrada"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Indica m. horària al reg."</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Marca horària enregistrada"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"No enregistris la sessió"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Activa el registre de sessió"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Registra tot l\'historial de sessió"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Suprimint registre de ses."</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Registre de ses. suprimit"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Registre de ses. NO sup."</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Historial de sessió registrat"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Error: historial de sessió NO registrat"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Registre de sessió activat"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Idiomes d\'entrada"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Torna a tocar per desar"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Diccionari disponible"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Velmi agresivní"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Návrhy dalšího slova"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Na základě předchozího slova"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Uloženo"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Přejít"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Další"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup vypnut"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Konfigurace metod zadávání"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Vstupní jazyky"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Uložit čas do protokolu"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Časové razítko vloženo"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Neprotokolovat relaci"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Povolit protokolování relace"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Protokolovat celou historii relace"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Mazání protokolu relace"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Protokol relace smazán"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Protokol relace nesmazán"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Historie relace protokolována"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Historie relace NENÍ protokolována"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Protokolování relace povoleno"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Vstupní jazyky"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Opětovným dotykem provedete uložení"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Slovník k dispozici"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Meget aggressiv"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Forslag til næste ord"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Baseret på tidligere ord"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Berøringsindtastning"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Indtast et ord ved at skrive bogstaverne for et ord med fingeren"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Gemt"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Gå"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Næste"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Stemmeinput deaktiveret"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Konfigurer inputmetoder"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Inputsprog"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Notér tidsstempel i log"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Noteret tidsstempel"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Logfør ikke denne session"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Aktivér logføring af sessioner"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Logfør hele sessionshistorikken"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Sletter sessionslogfil"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Sessionslogfil slettet"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Sessionslog IKKE slettet"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Sessionshistorikken er logført"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Fejl: sessionshistorik IKKE logført"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Logføring af sessioner er aktiveret"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Inputsprog"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Tryk igen for at gemme"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Ordbog er tilgængelig"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Sehr stark"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Vorschläge für nächstes Wort"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Auf Grundlage des vorherigen Wortes"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Bewegungseingabe"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Wort durch Nachzeichnen der Buchstaben eingeben"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: gespeichert"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Los"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Weiter"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spracheingabe deaktiviert"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Eingabemethoden konfigurieren"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Eingabesprachen"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Zeitstempel im Protokoll"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Zeitstempel aufgenommen"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Nicht protokollieren"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Sitzungsprotokoll aktivieren"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Gesamten Sitzungsverlauf speichern"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Protokoll wird gelöscht..."</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Protokoll gelöscht"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Protokoll NICHT gelöscht"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Sitzungsverlauf gespeichert"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Sitzungsverlauf NICHT gespeichert"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sitzungsprotokoll aktiviert"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Eingabesprachen"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Zum Speichern erneut berühren"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Wörterbuch verfügbar"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Πολύ επιθετική"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Προτάσεις επόμενων λέξεων"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Βάσει προηγούμενης λέξης"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Καταχώριση κίνησης"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Καταχώριση μιας λέξης με εντοπισμό των γραμμάτων μιας λέξης"</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>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"Χρόνος στο αρχείο καταγρ."</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Καταγεγραμμένος χρόνος"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Χωρίς αρχείο καταγραφής"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Ενεργοποίηση καταγραφής περιόδου"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Καταγραφή ολόκλ. ιστορικού περιόδου"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Διαγραφή αρχείου σύνδεσης"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Αρχείο καταγρ. διαγράφηκε"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Αρχείο καταγρ. ΔΕΝ διαγρ."</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Το ιστορικό περιόδου καταγράφηκε"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Σφάλμα: ΜΗ καταγραφή ιστορ. περιόδου"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Ενεργοποίηση καταγραφής περιόδου"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Γλώσσες εισόδου"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Αγγίξτε ξανά για αποθήκευση"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Λεξικό διαθέσιμο"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Very aggressive"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Next word suggestions"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Based on previous word"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Gesture input"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Input a word by tracing the letters of a word"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Saved"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Go"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Next"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Voice input is disabled"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Configure input methods"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Input languages"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Note timestamp in log"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Recorded timestamp"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Do not log this session"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Enable session logging"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Log whole session history"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Deleting session log"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Session log deleted"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Session log NOT deleted"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Session history logged"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Error: Session history NOT logged"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Session logging enabled"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Input languages"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Touch again to save"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Dictionary available"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Muy agresivo"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Sugerencias de palabra siguiente"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Según la palabra anterior"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Entrada de gestos"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Ingresa una palabra trazando sus letras."</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Siguiente"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"La entrada por voz está inhabilitada"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Marcar tiempo en registro"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Marca tiempo registrada"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"No registrar esta sesión"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Activar registro de sesión"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Registrar hist. de sesión completo"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Eliminando registro"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Registro sesión eliminado"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"NO se eliminó el registro"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Se registró el historial de sesión."</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Error al registrar hist. de sesión"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Se activó el historial de sesión."</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Vuelve a tocar para guardar."</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Diccionario disponible"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Muy agresiva"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Sugerir siguiente palabra"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Según la palabra anterior"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Entrada de gestos"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Trazar las letras de una palabra para introducirla"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Sig."</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entrada de voz inhabilitada"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Anotar marca tiempo en registro"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Marca de tiempo registrada"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"No registrar esta sesión"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Habilitar registro de sesión"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Registrar historial de sesión"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Eliminando registro..."</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Registro eliminado"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Registro no eliminado"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Historial de sesión registrado"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Error: historial NO registrado"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Registro de sesión habilitado"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Toca otra vez para guardar."</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Hay un diccionario disponible"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Väga agressiivne"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Järgmise sõna soovitused"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Eelmise sõna põhjal"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : salvestatud"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Mine"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Edasi"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Kõnesisend on keelatud"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Sisestusmeetodite seadistamine"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Sisestuskeeled"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Märgi ajatempel logisse"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Salvestatud ajatemplid"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Ära logi seda seanssi"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Luba seansi logimine"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Logi kogu seansi ajalugu"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Seansi logi kustutamine"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Seansi logi kustutatud"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Seansi logi EI kustutatud"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Seansi ajalugu on logitud"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Viga: seansi ajalugu EI logitud"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Seansi logimine on lubatud"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Sisestuskeeled"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Salvestamiseks puudutage uuesti"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Sõnastik saadaval"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"بسیار پرخاشگرانه"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"پیشنهادات کلمه بعدی"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"بر اساس کلمه قبلی"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"ورودی اشاره"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"با دنبال کردن حروف یک کلمه، کلمه را وارد کنید"</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>
|
||||
|
@ -108,17 +110,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"یادداشت مهر زمان در گزارش"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"مهر زمان ثبت شده"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"از این جلسه گزارشگیری نشود"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"تواناساختن گزارش جلسه"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"گزارش همه سابقه جلسه"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"در حال حذف گزارش جلسه"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"گزارش جلسه حذف شد"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"گزارش جلسه حذف نشد"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"سابقه جلسه گزارش شد"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"خطا: سابقه جلسه گزارش نشد"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"گزارش جلسه فعال شد"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"زبانهای ورودی"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"برای ذخیره دوباره لمس کنید"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"دیکشنری موجود است"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Hyvin aggressiivinen"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Seuraavan sanan ehdotukset"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Perustuu edelliseen sanan"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Tallennettu"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Siirry"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Seur."</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Ääniohjaus on pois käytöstä"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Määritä syöttötavat"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Syöttökielet"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Merkitse aikaleima lokiin"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Merkitty aikaleima"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Älä tallenna tätä käyttök."</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Ota käyttökertaloki käyttöön"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Kirjaa koko käyttökerran historia"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Poistetaan lokia"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Käyttökertaloki poistettu"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Lokia EI poistettu"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Käyttökerran historia kirjattu"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Virhe: käyttök. historiaa EI kirj."</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Käyttökertaloki käytössä"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Syöttökielet"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Tallenna koskettamalla uudelleen"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Sanakirja saatavilla"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Très exigeante"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Suggestions pour le mot suivant"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Suggestions basées sur le mot précédent"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Saisie gestuelle"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Saisir un mot en traçant ses lettres avec le doigt"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : enregistré"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"OK"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Suiv."</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Saisie vocale désactivée"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Configurer les modes de saisie"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Noter heure dans journal"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Heure enregistrée."</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Ne pas enregistrer session"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Activer l\'enregistrement de session"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Enregistrer historique de la session"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Suppr. journal session…"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Journal session supprimé."</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Journal session PAS suppr."</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Historique de la session enregistré."</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Historique session NON enregistré."</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Enregistrement de session activé."</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Langues de saisie"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Appuyer de nouveau pour enregistrer"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Dictionnaire disponible"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"बहुत तीव्र"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"अगले शब्द सुझाव"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"पिछले शब्द के आधार पर"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<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>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"लॉग में टाइमस्टैम्प नोट करें"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"रिकॉर्ड किया गया टाइमस्टैम्प"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"इस सत्र को लॉग न करें"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"सत्र लॉगिंग सक्षम करें"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"संपूर्ण सत्र इतिहास को लॉग करें"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"सत्र लॉग हटाया जा रहा है"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"सत्र लॉग हटाया गया"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"सत्र लॉग हटाया नहीं गया"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"सत्र इतिहास को लॉग लिया गया"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"त्रुटि: सत्र इतिहास लॉग नहीं किया"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"सत्र लॉगिंग सक्षम"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"इनपुट भाषाएं"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"सहेजने के लिए पुन: स्पर्श करें"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"शब्दकोश उपलब्ध है"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Vrlo agresivno"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Prijedlozi za sljedeću riječ"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Na temelju prethodne riječi"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Spremljeno"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Idi"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Dalje"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. unos onemog."</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Konfiguriraj načine ulaza"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Jezici unosa"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Zabilježi razdoblje u dnevniku"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Zabilježeno razdoblje"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Ne bilježi ovu sesiju"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Omogući bilježenje sesije"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Bilježi cijelu povijest sesije"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Brisanje dnevnika sesije"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Izbrisan dnevnik sesije"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Dnevnik sesije NIJE izbrisan"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Povijest sesije zabilježena je"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Pogr.: pov. sesije NIJE zabilježena"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Omogućeno je bilježenje sesije"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Jezici unosa"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Dodirnite ponovo za spremanje"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Rječnik je dostupan"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Nagyon agresszív"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Következő szóra vonatkozó javaslatok"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Az előző szó alapján"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : mentve"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Ugrás"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Tovább"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hangbevivel KI"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Beviteli módok beállítása"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Beviteli nyelvek"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Időbélyegző naplózáskor"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Rögzített időbélyegzők"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Ne naplózza"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Programfolyamat-napló engedélyezése"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Összes előzmény naplózása"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Napló törlése folyamatban"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Napló törölve"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Napló NINCS törölve"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Programfolyamatok naplózva"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Hiba: előzmények NINCSENEK naplózva"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Naplózás engedélyezve"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Beviteli nyelvek"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Érintse meg újból a mentéshez"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Van elérhető szótár"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Sangat agresif"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Saran kata berikutnya"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Berdasarkan kata sebelumnya"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Telah disimpan"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Buka"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Berikutnya"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Masukan suara dinonaktifkan"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Konfigurasikan metode masukan"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Bahasa masukan"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Catat cap waktu di log"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Cap waktu yang direkam"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Jangan simpan log sesi ini"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Aktifkan log sesi"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Catat seluruh riwayat sesi"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Menghapus log sesi"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Log sesi dihapus"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Log sesi BELUM dihapus"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Riwayat sesi dicatat"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Kesalahan: Riwayat sesi TAK dicatat"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Log sesi diaktifkan"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Bahasa masukan"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Sentuh lagi untuk menyimpan"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Kamus yang tersedia"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Massima"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Suggerimenti parola successiva"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"In base alla parola precedente"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Inserimento con gesti"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Inserisci una parola tracciandone le lettere"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : parola salvata"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Vai"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Avanti"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Comandi vocali disatt."</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Configura metodi di immissione"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Lingue comandi"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Indicazione temporale log"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Indicazione temporale registrata"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Non registrare la sessione"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Attiva registrazione sessioni"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Registra intera cronologia sessione"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Eliminazione log sessione"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Log di sessione eliminato"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Log sessione non eliminato"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Cronologia sessione registrata"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Errore: cronologia NON registrata"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Registrazione sessioni attivata"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Lingue comandi"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Tocca di nuovo per salvare"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Dizionario disponibile"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"מחמיר מאוד"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"הצעות המילה הבאה"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"בהתבסס על המילה הקודמת"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"קלט מחווה"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"הזן מילה על ידי החלקת האצבע מאות לאות"</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>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"ציין חותמת זמן ביומן"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"חותמת זמן מתועדת"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"אל תרשום הפעלה זו ביומן"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"הפעל רישום הפעלה"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"רשום את כל היסטוריית ההפעלה"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"מוחק יומן הפעלה"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"יומן הפעלה נמחק"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"יומן הפעלה לא נמחק"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"היסטוריית הפעלה נרשמה"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"שגיאה: היסטוריית ההפעלה לא נרשמה"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"רישום הפעלה הופעל"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"שפות קלט"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"גע שוב כדי לשמור"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"מילון זמין"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"最も強い"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"次の入力候補"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"前の語句に基づいた入力候補表示"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<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>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"タイムスタンプを記録"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"タイムスタンプ記録済み"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"セッションを記録しない"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"セッションログを有効にする"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"セッション履歴全体を記録する"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"セッションログ削除中"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"セッションログ削除済み"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"セッションログ未削除"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"セッション履歴が記録されました"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"エラー: 履歴が記録されていません"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"セッションログが有効になっています"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"入力言語"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"保存するにはもう一度タップ"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"辞書を利用できます"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"강"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"다음 검색어 추천"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"이전 단어에 기반한 추천"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<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>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"로그에 타임스탬프를 기록"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"타임스탬프를 기록함"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"이 세션을 로그하지 마세요."</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"세션 로깅 사용 설정"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"전체 세션 기록 로그"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"세션 로그 삭제"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"세션 로그가 삭제됨"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"세션 로그가 삭제되지 않음"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"세션 기록이 로그되었습니다."</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"오류: 세션 기록을 로그하지 못했습니다."</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"세션 로깅을 사용하고 있습니다."</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"입력 언어"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"저장하려면 다시 터치"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"사전 사용 가능"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Labai agresyviai"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Kito žodžio pasiūlymai"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Pagal ankstesnį žodį"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: išsaugota"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Pradėti"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Kitas"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balso įv. neleidž."</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Konfigūruoti įvesties metodus"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Įvesties kalbos"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Pažym. laiko žymę žurnale"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Įrašyta laiko žymė"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Neįrašyti šios sesijos"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Įgalinti sesijos įrašymą į žurnalą"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Įrašyti sesijos istoriją į žurnalą"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Ištrinam. sesijos žurnal."</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Sesijos žurnalas ištrint."</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Sesij. žurnal. NEIŠTRINT."</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Sesijos istorija įrašyta į žurnalą"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Klaida: sesijos istorija NEĮRAŠYTA"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sesijos įrašymas žurnale įgalintas"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Įvesties kalbos"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Jei norite išsaugoti, palieskite dar kartą"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Žodynas galimas"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Ļoti radikāla"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Nākamie vārdu ieteikumi"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Pamatojoties uz iepriekšējo vārdu"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: saglabāts"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Sākt"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Tālāk"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balss iev. atspējota"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Ievades metožu konfigurēšana"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Ievades valodas"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Atzīmēt laiksp. žurnālā"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Laikspied. ir reģistrēts."</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Nereģistrēt šo sesiju"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Sesijas reģistrēšanas iespējošana"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Visas sesijas vēstures reģistrēšana"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Not. sesijas žurn. dzēš."</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Sesijas žurnāls ir dzēsts"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Sesijas žurn. NAV dzēsts"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Sesijas vēsture ir reģistrēta."</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Kļūda: sesijas vēsture NAV reģistr."</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sesijas reģistrēšana ir iespējota."</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Ievades valodas"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Pieskarieties vēlreiz, lai saglabātu."</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Ir pieejama vārdnīca."</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Sangat agresif"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Cadangan perkataan seterusnya"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Berdasarkan perkataan sebelumnya"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Disimpan"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Pergi"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Seterusnya"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Input suara dilmphkn"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Konfigurasikan kaedah input"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Bahasa input"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Tanda cap waktu dalam log"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Cap waktu direkodkan"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Jangan log sesi ini"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Dayakan log sesi"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Log sejarah seluruh sesi"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Memadam log sesi"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Log sesi dipadam"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Log sesi TIDAK dipadam"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Sejarah sesi dilog"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Ralat: Sejarah sesi TIDAK dilog"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Log sesi didayakan"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Bahasa input"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Sentuh lagi untuk menyimpan"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Kamus tersedia"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Veldig aggressiv"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Forslag til neste ord"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Basert på det forrige ordet"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Bevegelseskommandoer"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Angi et ord ved å skrive bokstavene på skjermen med fingeren"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Lagret"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Utfør"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Neste"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Taleinndata er deaktiv."</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Konfigurer inndatametoder"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Inndataspråk"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Notér tidsstempel i logg"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Registrerte tidsstempel"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Ikke loggfør denne økten"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Aktiver lagring av økter"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Lagre hele øktloggen"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Sletter øktloggen"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Øktloggen ble slettet"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Øktloggen ble IKKE slettet"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Øktloggen er lagret"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Feil: Øktloggen er IKKE lagret"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Øktlagring er aktivert"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Inndataspråk"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Trykk på nytt for å lagre"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Ordbok tilgjengelig"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Zeer agressief"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Suggesties voor volgend woord"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Op basis van het vorige woord"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Invoer met gebaren"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Voer een woord in door de letters van een woord te volgen"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: opgeslagen"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Start"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Verder"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spraakinvoer is uit"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Invoermethoden configureren"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Invoertalen"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Tijdstempel opnemen in logbestand"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Opgenomen tijdstempel"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Sessie niet registreren"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Sessieregistratie inschakelen"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Hele sessiegeschiedenis registreren"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Sessielogbestand verwijderen"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Sessielogbestand verwijderd"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Sessielogbestand NIET verwijderd"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Sessiegeschiedenis geregistreerd"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Fout: sessiegesch. NIET geregistr."</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sessieregistratie ingeschakeld"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Invoertalen"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Raak nogmaals aan om op te slaan"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Woordenboek beschikbaar"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Bardzo agresywna"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Sugestie kolejnych słów"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Na podstawie poprzedniego słowa"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Wprowadzanie gestem"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Podaj słowo, pisząc litery palcem"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Zapisano"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"OK"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Dalej"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Wprowadzanie głosowe jest wyłączone"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Konfiguruj metody wprowadzania"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Znacznik czasu uwagi w dzienniku"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Zapisano znacznik czasu"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Nie rejestruj tej sesji"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Włącz rejestrowanie sesji"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Rejestruj całą historię sesji"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Usuwanie dziennika sesji"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Usunięto dziennik sesji"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Dziennik sesji NIEUSUNIĘTY"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Historia sesji została zarejestrowana"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Błąd: historia sesji niezarejestrowana"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Włączono rejestrowanie sesji"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Języki wprowadzania"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Dotknij ponownie, aby zapisać"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Słownik dostępny"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Muito agressivo"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Sugestões da palavra seguinte"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Com base na palavra anterior"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Introd. por gestos"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Introduza uma palavra, desenhando as letras de uma palavra"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"OK"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Avançar"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. voz desact."</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de introdução"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Anotar car. data no reg."</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Carimbo de data gravado"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Não registar esta sessão"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Ativar registos de sessão"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Registar hist. de sessão completo"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"A eliminar reg. da sessão"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Reg. de sessão eliminado"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Reg. de sessão NÃO elim."</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Histórico de sessão registado"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Erro: hist. de sessão NÃO regist."</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Registo de sessão ativado"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Idiomas de introdução"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Toque novamente para guardar"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Muito agressivo"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Sugestões para a palavra seguinte"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Com base na palavra anterior"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Salvo"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Avançar"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Texto por voz desat."</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Indicar data/hora no reg."</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Data/hora registrada"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Não registrar esta sessão"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Ativar registro de sessão"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Regist. histórico de sessão inteiro"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Excluindo reg. de sessão"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Registro excluído"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Registro NÃO excluído"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Histórico de sessão registrado"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Histórico de sessão NÃO registrado"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Registro de sessão ativado"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Toque novamente para salvar"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string>
|
||||
|
|
|
@ -92,6 +92,10 @@
|
|||
<skip />
|
||||
<!-- no translation found for bigram_prediction_summary (3253961591626441019) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Memorisà"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Dai"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Vinavant"</string>
|
||||
|
@ -178,28 +182,6 @@
|
|||
<!-- no translation found for configure_input_method (373356270290742459) -->
|
||||
<skip />
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Linguas da cumonds vocals"</string>
|
||||
<!-- no translation found for note_timestamp_for_researchlog (1889446857977976026) -->
|
||||
<skip />
|
||||
<!-- no translation found for notify_recorded_timestamp (8036429032449612051) -->
|
||||
<skip />
|
||||
<!-- no translation found for do_not_log_this_session (413762473641146336) -->
|
||||
<skip />
|
||||
<!-- no translation found for enable_session_logging (4202559020594036225) -->
|
||||
<skip />
|
||||
<!-- no translation found for log_whole_session_history (7087712461632081351) -->
|
||||
<skip />
|
||||
<!-- no translation found for notify_session_log_deleting (3299507647764414623) -->
|
||||
<skip />
|
||||
<!-- no translation found for notify_session_log_deleted (8687927130100934686) -->
|
||||
<skip />
|
||||
<!-- no translation found for notify_session_log_not_deleted (2592908998810755970) -->
|
||||
<skip />
|
||||
<!-- no translation found for notify_session_history_logged (7723983399468056391) -->
|
||||
<skip />
|
||||
<!-- no translation found for notify_session_history_not_logged (6597910011368015361) -->
|
||||
<skip />
|
||||
<!-- no translation found for notify_session_logging_enabled (8549561596936177661) -->
|
||||
<skip />
|
||||
<!-- no translation found for select_language (3693815588777926848) -->
|
||||
<skip />
|
||||
<!-- no translation found for hint_add_to_dictionary (573678656946085380) -->
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Foarte exigentă"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Sugestii pentru cuvântul următor"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Bazate pe cuvântul precedent"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: salvat"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"OK"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Înainte"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Intr. vocală dezact."</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Configuraţi metodele de intrare"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Selectaţi limba"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Înreg. marc. temp. jurnal"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Marcaj temporal înregis."</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Nu înregistraţi sesiunea"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Activaţi înregistrarea sesiunii"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Înregistraţi istoric sesiune întreg"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Se șterge jurnal sesiune"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Jurnal de sesiune șters"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Jurnal sesiune neşters"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Istoric sesiune înregistrat"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Eroare: istoric sesiune neînregis."</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Înregistrare sesiune activată"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Limbi de intrare"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Atingeţi din nou pentru a salva"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Dicţionar disponibil"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Очень активно"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Подсказка для следующего слова"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Подсказки, основанные на предыдущих словах"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<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>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"Закладка в журнале"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Закладка сохранена"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Не сохранять этот сеанс"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Включить ведение журнала сеансов"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Записать всю историю сеанса"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Удаление…"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Запись сеанса удалена"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Запись сеанса НЕ удалена"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"История сеанса записана"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Не удалось записать историю сеанса"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Ведение журнала включено"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Языки ввода"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Нажмите, чтобы сохранить"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Доступен словарь"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Veľmi agresívne"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Návrhy ďalšieho slova"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Na základe predchádzajúceho slova"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Uložené"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Hľadať"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Ďalej"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup je zakázaný"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Konfigurovať metódy vstupu"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Jazyky vstupu"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Časová pečiatka denníka"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Časová pečiatka zaznamenaná"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Neukl. reláciu do denníka"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Povoliť zápis relácií do denníkov"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Celá história relácií v denníkoch"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Odstraň. denníka relácie"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Denník relácie odstránený"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Denník relácie NIE JE odstr."</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Hist. relácií zapísaná do denníkov"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Chyba: Hist. relácií NIE JE zapísaná"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Zápis relácií do denníkov povolený"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Jazyky vstupu"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Opätovným dotykom uložíte"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"K dispozícii je slovník"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Zelo strogo"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Predlogi za naslednjo besedo"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Na podlagi prejšnje besede"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: shranjeno"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Pojdi"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Naprej"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. vnos je onem."</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Nastavitev načinov vnosa"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Jeziki vnosa"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"V dnev. zabeleži čas. žig"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Časovni žig zabeležen"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Brez dnevnika za to sejo"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Omogoči zapisovanje seje v dnevnik"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Zapiši celotno zgodovino seje v dnevnik"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Brisanje seje dnevnika"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Dnevnik seje izbrisan"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Dnevnik seje NI izbrisan"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Zgodovina seje zapisana v dnevnik"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Napaka: zgodovina seje NI zapisana v dnevnik"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Zapisovanje seje v dnevnik omogočeno"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Jeziki vnosa"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Dotaknite se še enkrat, da shranite"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Slovar je na voljo"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Веома агресивно"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Предлози за следећу реч"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"На основу претходне речи"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<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>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"Наведи временску ознаку у евиденцији"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Снимљена временска ознака"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Не евидентирај ову сесију"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Омогући евидентирање сесија"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Евидентирај целу историју сесија"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Брисање евиденције сесије"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Евиденција сесије је обрисана"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Евиденција сесије НИЈЕ избрисана"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Историја сесија је евидентирана"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Грешка: Историја сесија НИЈЕ евидентирана"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Евидентирање сесија је омогућено"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Језици уноса"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Поново додирните да бисте сачували"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Речник је доступан"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Mycket aggressivt"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Föreslå nästa ord"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Baserat på föregående ord"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Gestinmatning"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Skriv ett ord för hand genom att rita bokstäverna i ordet"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: sparat"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Kör"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Nästa"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Röstinmatning inaktiv"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Konfigurera inmatningsmetoder"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Inmatningsspråk"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Markera tidpunkt i loggen"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Tidpunkten har sparats"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Logga inte detta besök"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Aktivera sessionsloggning"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Logga hela sessionshistoriken"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Besöksloggen tas bort"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Besöksloggen togs bort"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Besöksloggen togs EJ bort"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Sessionshistoriken har loggats"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Fel: historiken har INTE loggats"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Sessionsloggning är aktiverat"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Inmatningsspråk"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Spara genom att trycka igen"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"En ordlista är tillgänglig"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Changamfu zaidi"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Mapendekezo ya neno lifuatalo"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Kulingana na neno la awali"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Imehifadhiwa"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Nenda"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Ifuatayo"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Uingizaji sauti umelemazwa"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Sanidi mbinu za uingizaji"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Lugha za uingizaji"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Dokeza mhuri wa muda kwenye kumbukumbu"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Mhuri wa muda uliorekodiwa"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Usihifadhi kumbukumbu za kipindi hiki"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Wezesha kuingia kwenye kipindi"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Ingia kwenye historia ya kipindi kizima"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Inafuta kumbukumbu za kipindi"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Kumbukumbu za kipindi zimefutwa"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Kumbukumbu za kipindi HAZIJAFUTWA"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Historia ya kipindi imeingia"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Hitilafu: Historia ya kipindi HAIJAINGIWA"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Kuingia katika kipindi kumewezeshwa"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Lugha zinazoruhusiwa"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Gusa tena ili kuhifadhi"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Kamusi inapatikana"</string>
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
<string name="config_default_keyboard_theme_index" translatable="false">5</string>
|
||||
<integer name="config_max_more_keys_column">5</integer>
|
||||
<!--
|
||||
Configuration for LatinKeyboardView
|
||||
Configuration for MainKeyboardView
|
||||
-->
|
||||
<dimen name="config_key_hysteresis_distance">40.0dp</dimen>
|
||||
<bool name="config_sliding_key_input_enabled">false</bool>
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
<string name="config_default_keyboard_theme_index" translatable="false">5</string>
|
||||
<integer name="config_max_more_keys_column">5</integer>
|
||||
<!--
|
||||
Configuration for LatinKeyboardView
|
||||
Configuration for MainKeyboardView
|
||||
-->
|
||||
<bool name="config_sliding_key_input_enabled">false</bool>
|
||||
<!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"เข้มงวดมาก"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"คำแนะนำสำหรับคำถัดไป"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"ตามคำก่อนหน้า"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"ป้อนท่าทางสัมผัส"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"ป้อนคำโดยลากนิ้วเป็นรูปตัวอักษรที่อยู่ในคำ โดยไม่ยกนิ้วขึ้น"</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>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"จดเวลาบันทึกไว้ในบันทึก"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"บันทึกเวลาบันทึกแล้ว"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"อย่าบันทึกเซสชันนี้"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"เปิดใช้งานการบันทึกเซสชัน"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"บันทึกประวัติเซสชันทั้งหมด"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"กำลังลบบันทึกเซสชัน"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"ลบบันทึกเซสชันแล้ว"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"บันทึกเซสชันไม่ถูกลบ"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"บันทึกประวัติเซสชันแล้ว"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"ข้อผิดพลาด: ไม่ได้บันทึกประวัติเซสชัน"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"เปิดใช้งานการบันทึกเซสชันแล้ว"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"ภาษาสำหรับการป้อนข้อมูล"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"แตะอีกครั้งเพื่อบันทึก"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"มีพจนานุกรมให้ใช้งาน"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Napaka-agresibo"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Mga suhestiyon sa susunod na salita"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Batay sa nakaraang salita"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Pagpasok ng galaw"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Magpasok ng salita sa gamit ang pagsulat sa mga titik ng salita"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Na-save"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Punta"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Susunod"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hindi pinagana ang voice input"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"I-configure ang mga pamamaraan ng pag-input"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Mag-input ng mga wika"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Tandaan timestamp sa log"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Na-record na timestamp"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Huwag i-log ang session"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Paganahin ang pag-log in sa session"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"I-log buong kasaysayan ng session"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Tinatanggl log ng session"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Tinanggal log ng session"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"HND ntnggl log ng session"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Na-log ang kasaysayan ng session"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Error: DI na-log kasaysayan session"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Pinapagana ang pag-log ng session"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Mga wika ng input"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Pinduting muli upang i-save"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Available ang diksyunaryo"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Çok geniş ölçekte"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Sonraki kelime önerileri"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Önceki kelimeye dayanarak"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kaydedildi"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Git"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"İleri"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Sesle grş devre dışı"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Giriş yöntemlerini yapılandır"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Giriş dilleri"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Günlüğe zaman damgası koy"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Zaman damgası kaydedildi"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Bu oturumu günlüğe kaydetme"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Oturumun günlüğe kaydını etkinleştir"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Tüm oturum geçmişini günlüğe kaydet"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Oturum günlüğü siliniyor"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Oturum günlüğü silindi"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Oturum günlüğü SİLİNMEDİ"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Oturum geçmişi günlüğe kaydedildi"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Hata: Oturum geçmişi KAYDEDİLMEDİ"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Oturumu günlüğe kaydetme etkinleştirildi"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Giriş dilleri"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Kaydetmek için tekrar dokunun"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Sözlük kullanılabilir"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Дуже активне"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Пропозиції наступного слова"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"На основі попереднього слова"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Введення жестами"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Введіть слово, малюючи літери, з яких воно складається"</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>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"Мітка часу в журналі"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Записана мітка часу"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Не реєструвати цю сесію"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Увімкнути запис журналу сеансу"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Записувати історію всього сеансу"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Видалення журналу сесії"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Журнал сесії видалено"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Журнал сесії НЕ видалено"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Історію сеансу записано"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Помилка. Історію сеансу НЕ записано"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Запис журналу сеансу ввімкнено"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Мови введення"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Торкніться знову, щоб зберегти"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Словник доступний"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Rất linh hoạt"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Đề xuất từ tiếp theo"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Dựa trên từ trước đó"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Đã lưu"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Tìm"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Tiếp theo"</string>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Nhập liệu bằng giọng nói đã bị tắt"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Định cấu hình phương thức nhập"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Ngôn ngữ nhập"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Dấu thời gian ghi chú trong nhật ký"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Dấu thời gian đã ghi"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Không ghi nhật ký phiên này"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Bật ghi nhật ký phiên"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Ghi nhật ký toàn bộ lịch sử phiên"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Đang xóa nhật ký phiên"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Đã xóa nhật ký phiên"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Nhật ký phiên KHÔNG bị xóa"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Lịch sử phiên đã được ghi nhật ký"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Lỗi: Lịch sử phiên CHƯA được ghi"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Ghi nhật ký phiên đã được bật"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Ngôn ngữ nhập"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Chạm lại để lưu"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Có sẵn từ điển"</string>
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"改动极大"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"下一字词建议"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"根据上一个字词提供建议"</string>
|
||||
<!-- no translation found for gesture_input (3310827802759290774) -->
|
||||
<skip />
|
||||
<!-- no translation found for gesture_input_summary (7019742443455085809) -->
|
||||
<skip />
|
||||
<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>
|
||||
|
@ -104,17 +108,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"标记记录中的时间"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"已标记时间"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"不记录本次会话"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"启用会话记录"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"保存整个会话历史记录"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"正在删除会话记录"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"会话记录已删除"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"未能删除会话记录"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"会话历史记录已保存"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"错误:会话历史记录未保存"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"会话记录已启用"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"输入语言"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"再次触摸即可保存"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"有可用词典"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"更正範圍極大"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"下一個字詞建議"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"根據上一個字詞產生"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"手勢輸入"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"透過追蹤字詞中的字母來輸入字詞"</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>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<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="note_timestamp_for_researchlog" msgid="1889446857977976026">"在紀錄中加註時間戳記"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"已記錄時間戳記"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"不要記錄這個工作階段"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"啟用工作階段記錄功能"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"記錄完整工作階段紀錄"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"正在刪除工作階段紀錄"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"已刪除工作階段紀錄"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"「未」刪除工作階段紀錄"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"已記錄工作階段紀錄"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"錯誤:「未」記錄工作階段紀錄"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"已啟用工作階段記錄功能"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"輸入語言"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"再次輕觸即可儲存"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"可使用字典"</string>
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
<string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Nobudlova kakhulu"</string>
|
||||
<string name="bigram_prediction" msgid="5809665643352206540">"Iziphakamiso zegama elilandelayo"</string>
|
||||
<string name="bigram_prediction_summary" msgid="3253961591626441019">"Ngokususela egameni langaphambilini"</string>
|
||||
<string name="gesture_input" msgid="3310827802759290774">"Okokufaka kokuthinta"</string>
|
||||
<string name="gesture_input_summary" msgid="7019742443455085809">"Faka igama ngokulandela ngomkhondo izinhlamvu zegama"</string>
|
||||
<string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kulondoloziwe"</string>
|
||||
<string name="label_go_key" msgid="1635148082137219148">"Iya"</string>
|
||||
<string name="label_next_key" msgid="362972844525672568">"Okulandelayo"</string>
|
||||
|
@ -104,17 +106,6 @@
|
|||
<string name="voice_input_modes_summary_off" msgid="63875609591897607">"Okufakwayo ngezwi kuvinjelwe"</string>
|
||||
<string name="configure_input_method" msgid="373356270290742459">"Misa izindlela zokufakwayo"</string>
|
||||
<string name="language_selection_title" msgid="1651299598555326750">"Izilimi zokufakwayo"</string>
|
||||
<string name="note_timestamp_for_researchlog" msgid="1889446857977976026">"Qaphela isitembu sesikhathi efayeleni lokungena"</string>
|
||||
<string name="notify_recorded_timestamp" msgid="8036429032449612051">"Isitembu sesikhathi esirekhodiwe"</string>
|
||||
<string name="do_not_log_this_session" msgid="413762473641146336">"Ungenzi ifayela lokungena lalesi sikhathi"</string>
|
||||
<string name="enable_session_logging" msgid="4202559020594036225">"Nika amandla ukungena ngemvume kwesikhathi"</string>
|
||||
<string name="log_whole_session_history" msgid="7087712461632081351">"Umlando wesikhathi sonke sefayela lokungena"</string>
|
||||
<string name="notify_session_log_deleting" msgid="3299507647764414623">"Isusa ifayela lokungena lesikhathi"</string>
|
||||
<string name="notify_session_log_deleted" msgid="8687927130100934686">"Ifayela lokungena lesikhathi lisusiwe"</string>
|
||||
<string name="notify_session_log_not_deleted" msgid="2592908998810755970">"Ifayela lokungena lesikhathi alisusiwe"</string>
|
||||
<string name="notify_session_history_logged" msgid="7723983399468056391">"Umlando wesikhathi ukufayela lokungena"</string>
|
||||
<string name="notify_session_history_not_logged" msgid="6597910011368015361">"Iphutha: Umlando wesikhathi awufakwanga kufayela lokungena"</string>
|
||||
<string name="notify_session_logging_enabled" msgid="8549561596936177661">"Ukungena kwesikhathi kunikwe amandla"</string>
|
||||
<string name="select_language" msgid="3693815588777926848">"Izilimi zokufakwayo"</string>
|
||||
<string name="hint_add_to_dictionary" msgid="573678656946085380">"Thinta futhi ukuze ulondoloze"</string>
|
||||
<string name="has_dictionary" msgid="6071847973466625007">"Isichazamazwi siyatholakala"</string>
|
||||
|
|
|
@ -18,13 +18,10 @@
|
|||
<declare-styleable name="KeyboardTheme">
|
||||
<!-- Keyboard style -->
|
||||
<attr name="keyboardStyle" format="reference" />
|
||||
<!-- TODO: Get rid of latinKeyboardStyle -->
|
||||
<!-- LatinKeyboard style -->
|
||||
<attr name="latinKeyboardStyle" format="reference" />
|
||||
<!-- KeyboardView style -->
|
||||
<attr name="keyboardViewStyle" format="reference" />
|
||||
<!-- LatinKeyboardView style -->
|
||||
<attr name="latinKeyboardViewStyle" format="reference" />
|
||||
<!-- MainKeyboardView style -->
|
||||
<attr name="mainKeyboardViewStyle" format="reference" />
|
||||
<!-- MoreKeysKeyboard style -->
|
||||
<attr name="moreKeysKeyboardStyle" format="reference" />
|
||||
<!-- MoreKeysKeyboardView style -->
|
||||
|
@ -32,7 +29,7 @@
|
|||
<attr name="moreKeysKeyboardPanelStyle" format="reference" />
|
||||
<!-- Suggestions strip style -->
|
||||
<attr name="suggestionsStripBackgroundStyle" format="reference" />
|
||||
<attr name="suggestionsViewStyle" format="reference" />
|
||||
<attr name="suggestionStripViewStyle" format="reference" />
|
||||
<attr name="moreSuggestionsViewStyle" format="reference" />
|
||||
<attr name="suggestionBackgroundStyle" format="reference" />
|
||||
<attr name="suggestionPreviewBackgroundStyle" format="reference" />
|
||||
|
@ -123,7 +120,7 @@
|
|||
</attr>
|
||||
</declare-styleable>
|
||||
|
||||
<declare-styleable name="LatinKeyboardView">
|
||||
<declare-styleable name="MainKeyboardView">
|
||||
<attr name="autoCorrectionSpacebarLedEnabled" format="boolean" />
|
||||
<attr name="autoCorrectionSpacebarLedIcon" format="reference" />
|
||||
<!-- Size of the text for spacebar language label, in the proportion of key height. -->
|
||||
|
@ -158,9 +155,9 @@
|
|||
<attr name="showMoreKeysKeyboardAtTouchedPoint" format="boolean" />
|
||||
</declare-styleable>
|
||||
|
||||
<declare-styleable name="SuggestionsView">
|
||||
<declare-styleable name="SuggestionStripView">
|
||||
<attr name="suggestionStripOption" format="integer">
|
||||
<!-- This should be aligned with SuggestionsViewParams.AUTO_CORRECT_* and etc. -->
|
||||
<!-- This should be aligned with SuggestionStripViewParams.AUTO_CORRECT_* and etc. -->
|
||||
<flag name="autoCorrectBold" value="0x01" />
|
||||
<flag name="autoCorrectUnderline" value="0x02" />
|
||||
<flag name="validTypedWordBold" value="0x04" />
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
-->
|
||||
<integer name="config_key_preview_linger_timeout">70</integer>
|
||||
<!--
|
||||
Configuration for LatinKeyboardView
|
||||
Configuration for MainKeyboardView
|
||||
-->
|
||||
<dimen name="config_key_hysteresis_distance">8.0dp</dimen>
|
||||
<integer name="config_touch_noise_threshold_time">40</integer>
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/*
|
||||
**
|
||||
** Copyright 2012, 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>
|
||||
<bool name="config_gesture_input_enabled_by_build_config">false</bool>
|
||||
</resources>
|
|
@ -111,6 +111,11 @@
|
|||
<!-- Description for "next word suggestion" option. This displays suggestions even when there is no input, based on the previous word. -->
|
||||
<string name="bigram_prediction_summary">Based on previous word</string>
|
||||
|
||||
<!-- Option to enable gesture input. The user can input a word by tracing the letters of a word without releasing the finger from the screen. [CHAR LIMIT=20]-->
|
||||
<string name="gesture_input">Gesture input</string>
|
||||
<!-- Description for "gesture_input" option. The user can input a word by tracing the letters of a word without releasing the finger from the screen. [CHAR LIMIT=65]-->
|
||||
<string name="gesture_input_summary">Input a word by tracing the letters of a word</string>
|
||||
|
||||
<!-- Indicates that a word has been added to the dictionary -->
|
||||
<string name="added_word"><xliff:g id="word">%s</xliff:g> : Saved</string>
|
||||
|
||||
|
@ -217,29 +222,59 @@
|
|||
<!-- Title for input language selection screen -->
|
||||
<string name="language_selection_title">Input languages</string>
|
||||
|
||||
<!-- Title for dialog option that lets user mark a particular time in the log for later review by experts [CHAR LIMIT=38] -->
|
||||
<string name="note_timestamp_for_researchlog">Note timestamp in log</string>
|
||||
<!-- Toast notification message that the time has been marked for later review. [CHAR LIMIT=25] -->
|
||||
<string name="notify_recorded_timestamp">Recorded timestamp</string>
|
||||
|
||||
<!-- Title for dialog option to let users cancel logging and delete log for this session [CHAR LIMIT=35] -->
|
||||
<string name="do_not_log_this_session">Do not log this session</string>
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_do_not_log_this_session" translatable="false">Suspend logging</string>
|
||||
<!-- Title for dialog option to let users reenable logging [CHAR LIMIT=35] -->
|
||||
<string name="enable_session_logging">Enable session logging</string>
|
||||
<!-- Title for dialog option to let users log all events in this session [CHAR LIMIT=35] -->
|
||||
<string name="log_whole_session_history">Log whole session history</string>
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_enable_session_logging" translatable="false">Enable logging</string>
|
||||
<!-- Toast notification that the system is processing the request to delete the log for this session [CHAR LIMIT=35] -->
|
||||
<string name="notify_session_log_deleting">Deleting session log</string>
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_notify_session_log_deleting" translatable="false">Deleting session log</string>
|
||||
<!-- Toast notification that the system has successfully deleted the log for this session [CHAR LIMIT=35] -->
|
||||
<string name="notify_session_log_deleted">Session log deleted</string>
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_notify_logging_suspended" translatable="false">Logging temporarily suspended. To disable permanently, go to Android Keyboard Settings</string>
|
||||
<!-- Toast notification that the system has failed to delete the log for this session [CHAR LIMIT=35] -->
|
||||
<string name="notify_session_log_not_deleted">Session log NOT deleted</string>
|
||||
<!-- Toast notification that the system has recorded the whole session history [CHAR LIMIT=35] -->
|
||||
<string name="notify_session_history_logged">Session history logged</string>
|
||||
<!-- Toast notification that the system has failed to record the whole session history [CHAR LIMIT=35] -->
|
||||
<string name="notify_session_history_not_logged">Error: Session history NOT logged</string>
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_notify_session_log_not_deleted" translatable="false">Session log NOT deleted</string>
|
||||
<!-- Toast notification that the system is enabling logging [CHAR LIMIT=35] -->
|
||||
<string name="notify_session_logging_enabled">Session logging enabled</string>
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_notify_session_logging_enabled" translatable="false">Session logging enabled</string>
|
||||
|
||||
<!-- Menu option that lets user send feedback for research purposes about the IME [CHAR LIMIT=38] -->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_feedback_menu_option" translatable="false">Send feedback</string>
|
||||
<!-- Dialog box title that lets user send feedback for research purposes about the IME [CHAR LIMIT=38] -->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_feedback_dialog_title" translatable="false">Send feedback</string>
|
||||
<!-- Text for checkbox option to include user data in feedback for research purposes [CHAR LIMIT=50] -->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_feedback_include_history_label" translatable="false">Include last 5 words entered</string>
|
||||
<!-- Hint to user about the text entry field where they should enter research feedback [CHAR LIMIT=40] -->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_feedback_hint" translatable="false">Enter your feedback here.</string>
|
||||
<!-- Dialog button choice to send research feedback [CHAR LIMIT=35] -->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_feedback_send" translatable="false">Send</string>
|
||||
<!-- Dialog button choice to cancel sending research feedback [CHAR LIMIT=35] -->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_feedback_cancel" translatable="false">Cancel</string>
|
||||
<!-- Toast notification to ask user to quit the research feedback dialog to perform this operation [CHAR LIMIT=100] -->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_please_exit_feedback_form" translatable="false">Please exit the feedback dialog to access the research log menu</string>
|
||||
|
||||
<!-- Title of dialog shown at start informing users about contributing research usage data-->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_splash_title" translatable="false">Usage Participation</string>
|
||||
<!-- Contents of note explaining what data is collected and how. -->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_splash_content" translatable="false">Thank you for dogfooding this keyboard.\n\nIf you like it, please help us make it better by sending us usage information. When enabled, the keyboard uploads general statistics, such as how fast you type, and also occasional samples of how you type words.\n\nNo passwords or non-dictionary words are ever automatically uploaded, and words are sampled infrequently enough so that reconstructing the meaning of what you typed is highly unlikely.\n\nYou can disable and reenable logging through the RLog menu by long-pressing on the microphone or settings key.\n</string>
|
||||
<!-- Button label text for opting out of research usage data collection [CHAR LIMIT=50] -->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_dont_send_usage_info" translatable="false">Do not send\nusage info</string>
|
||||
<!-- Button label text for opting into research usage data collection [CHAR LIMIT=50] -->
|
||||
<!-- TODO: remove translatable=false attribute once text is stable -->
|
||||
<string name="research_send_usage_info" translatable="false">Send usage info</string>
|
||||
|
||||
<!-- Preference for input language selection -->
|
||||
<string name="select_language">Input languages</string>
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
<item name="shadowColor">#BB000000</item>
|
||||
<item name="shadowRadius">2.75</item>
|
||||
<item name="backgroundDimAlpha">128</item>
|
||||
<!-- Common attributes of LatinKeyboardView -->
|
||||
<!-- Common attributes of MainKeyboardView -->
|
||||
<item name="keyHysteresisDistance">@dimen/config_key_hysteresis_distance</item>
|
||||
<item name="touchNoiseThresholdTime">@integer/config_touch_noise_threshold_time</item>
|
||||
<item name="touchNoiseThresholdDistance">@dimen/config_touch_noise_threshold_distance</item>
|
||||
|
@ -84,7 +84,7 @@
|
|||
<item name="altCodeKeyWhileTypingFadeinAnimator">@anim/alt_code_key_while_typing_fadein</item>
|
||||
</style>
|
||||
<style
|
||||
name="LatinKeyboardView"
|
||||
name="MainKeyboardView"
|
||||
parent="KeyboardView">
|
||||
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
||||
<item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led</item>
|
||||
|
@ -114,7 +114,7 @@
|
|||
<item name="android:background">@drawable/keyboard_suggest_strip</item>
|
||||
</style>
|
||||
<style
|
||||
name="SuggestionsViewStyle"
|
||||
name="SuggestionStripViewStyle"
|
||||
parent="SuggestionsStripBackgroundStyle"
|
||||
>
|
||||
<item name="suggestionStripOption">autoCorrectBold|validTypedWordBold</item>
|
||||
|
@ -155,7 +155,7 @@
|
|||
<item name="keyBackground">@drawable/btn_keyboard_key3</item>
|
||||
</style>
|
||||
<style
|
||||
name="LatinKeyboardView.HighContrast"
|
||||
name="MainKeyboardView.HighContrast"
|
||||
parent="KeyboardView.HighContrast"
|
||||
>
|
||||
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
||||
|
@ -190,7 +190,7 @@
|
|||
<item name="shadowColor">#FFFFFFFF</item>
|
||||
</style>
|
||||
<style
|
||||
name="LatinKeyboardView.Stone"
|
||||
name="MainKeyboardView.Stone"
|
||||
parent="KeyboardView.Stone"
|
||||
>
|
||||
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
||||
|
@ -230,7 +230,7 @@
|
|||
<item name="keyTextStyle">bold</item>
|
||||
</style>
|
||||
<style
|
||||
name="LatinKeyboardView.Stone.Bold"
|
||||
name="MainKeyboardView.Stone.Bold"
|
||||
parent="KeyboardView.Stone.Bold"
|
||||
>
|
||||
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
||||
|
@ -259,7 +259,7 @@
|
|||
<item name="keyTextStyle">bold</item>
|
||||
</style>
|
||||
<style
|
||||
name="LatinKeyboardView.Gingerbread"
|
||||
name="MainKeyboardView.Gingerbread"
|
||||
parent="KeyboardView.Gingerbread"
|
||||
>
|
||||
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
||||
|
@ -316,7 +316,7 @@
|
|||
<item name="shadowRadius">0.0</item>
|
||||
</style>
|
||||
<style
|
||||
name="LatinKeyboardView.IceCreamSandwich"
|
||||
name="MainKeyboardView.IceCreamSandwich"
|
||||
parent="KeyboardView.IceCreamSandwich"
|
||||
>
|
||||
<item name="autoCorrectionSpacebarLedEnabled">false</item>
|
||||
|
@ -348,7 +348,7 @@
|
|||
<item name="android:background">@drawable/keyboard_suggest_strip_holo</item>
|
||||
</style>
|
||||
<style
|
||||
name="SuggestionsViewStyle.IceCreamSandwich"
|
||||
name="SuggestionStripViewStyle.IceCreamSandwich"
|
||||
parent="SuggestionsStripBackgroundStyle.IceCreamSandwich"
|
||||
>
|
||||
<item name="suggestionStripOption">autoCorrectBold|validTypedWordBold</item>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<style name="KeyboardTheme.HighContrast" parent="KeyboardIcons">
|
||||
<item name="keyboardStyle">@style/Keyboard.HighContrast</item>
|
||||
<item name="keyboardViewStyle">@style/KeyboardView.HighContrast</item>
|
||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.HighContrast</item>
|
||||
<item name="mainKeyboardViewStyle">@style/MainKeyboardView.HighContrast</item>
|
||||
<item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard</item>
|
||||
<item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView</item>
|
||||
<item name="moreKeysKeyboardPanelStyle">@style/MoreKeysKeyboardPanelStyle</item>
|
||||
<item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
|
||||
<item name="suggestionsViewStyle">@style/SuggestionsViewStyle</item>
|
||||
<item name="suggestionStripViewStyle">@style/SuggestionStripViewStyle</item>
|
||||
<item name="moreSuggestionsViewStyle">@style/MoreSuggestionsViewStyle</item>
|
||||
<item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
|
||||
<item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<style name="KeyboardTheme" parent="KeyboardIcons">
|
||||
<item name="keyboardStyle">@style/Keyboard</item>
|
||||
<item name="keyboardViewStyle">@style/KeyboardView</item>
|
||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView</item>
|
||||
<item name="mainKeyboardViewStyle">@style/MainKeyboardView</item>
|
||||
<item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard</item>
|
||||
<item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView</item>
|
||||
<item name="moreKeysKeyboardPanelStyle">@style/MoreKeysKeyboardPanelStyle</item>
|
||||
<item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
|
||||
<item name="suggestionsViewStyle">@style/SuggestionsViewStyle</item>
|
||||
<item name="suggestionStripViewStyle">@style/SuggestionStripViewStyle</item>
|
||||
<item name="moreSuggestionsViewStyle">@style/MoreSuggestionsViewStyle</item>
|
||||
<item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
|
||||
<item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<style name="KeyboardTheme.Gingerbread" parent="KeyboardIcons">
|
||||
<item name="keyboardStyle">@style/Keyboard.Gingerbread</item>
|
||||
<item name="keyboardViewStyle">@style/KeyboardView.Gingerbread</item>
|
||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.Gingerbread</item>
|
||||
<item name="mainKeyboardViewStyle">@style/MainKeyboardView.Gingerbread</item>
|
||||
<item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.Gingerbread</item>
|
||||
<item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.Gingerbread</item>
|
||||
<item name="moreKeysKeyboardPanelStyle">@style/MoreKeysKeyboardPanelStyle</item>
|
||||
<item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
|
||||
<item name="suggestionsViewStyle">@style/SuggestionsViewStyle</item>
|
||||
<item name="suggestionStripViewStyle">@style/SuggestionStripViewStyle</item>
|
||||
<item name="moreSuggestionsViewStyle">@style/MoreSuggestionsViewStyle</item>
|
||||
<item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
|
||||
<item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<style name="KeyboardTheme.IceCreamSandwich" parent="KeyboardIcons.IceCreamSandwich">
|
||||
<item name="keyboardStyle">@style/Keyboard.IceCreamSandwich</item>
|
||||
<item name="keyboardViewStyle">@style/KeyboardView.IceCreamSandwich</item>
|
||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.IceCreamSandwich</item>
|
||||
<item name="mainKeyboardViewStyle">@style/MainKeyboardView.IceCreamSandwich</item>
|
||||
<item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.IceCreamSandwich</item>
|
||||
<item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.IceCreamSandwich</item>
|
||||
<item name="moreKeysKeyboardPanelStyle">@style/MoreKeysKeyboardPanelStyle.IceCreamSandwich</item>
|
||||
<item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle.IceCreamSandwich</item>
|
||||
<item name="suggestionsViewStyle">@style/SuggestionsViewStyle.IceCreamSandwich</item>
|
||||
<item name="suggestionStripViewStyle">@style/SuggestionStripViewStyle.IceCreamSandwich</item>
|
||||
<item name="moreSuggestionsViewStyle">@style/MoreSuggestionsViewStyle.IceCreamSandwich</item>
|
||||
<item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle.IceCreamSandwich</item>
|
||||
<item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle.IceCreamSandwich</item>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<style name="KeyboardTheme.Stone.Bold" parent="KeyboardIcons.Black">
|
||||
<item name="keyboardStyle">@style/Keyboard.Stone.Bold</item>
|
||||
<item name="keyboardViewStyle">@style/KeyboardView.Stone.Bold</item>
|
||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.Stone.Bold</item>
|
||||
<item name="mainKeyboardViewStyle">@style/MainKeyboardView.Stone.Bold</item>
|
||||
<item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.Stone</item>
|
||||
<item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.Stone</item>
|
||||
<item name="moreKeysKeyboardPanelStyle">@style/MoreKeysKeyboardPanelStyle</item>
|
||||
<item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
|
||||
<item name="suggestionsViewStyle">@style/SuggestionsViewStyle</item>
|
||||
<item name="suggestionStripViewStyle">@style/SuggestionStripViewStyle</item>
|
||||
<item name="moreSuggestionsViewStyle">@style/MoreSuggestionsViewStyle</item>
|
||||
<item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
|
||||
<item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<style name="KeyboardTheme.Stone" parent="KeyboardIcons.Black">
|
||||
<item name="keyboardStyle">@style/Keyboard.Stone</item>
|
||||
<item name="keyboardViewStyle">@style/KeyboardView.Stone</item>
|
||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.Stone</item>
|
||||
<item name="mainKeyboardViewStyle">@style/MainKeyboardView.Stone</item>
|
||||
<item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.Stone</item>
|
||||
<item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.Stone</item>
|
||||
<item name="moreKeysKeyboardPanelStyle">@style/MoreKeysKeyboardPanelStyle</item>
|
||||
<item name="suggestionsStripBackgroundStyle">@style/SuggestionsStripBackgroundStyle</item>
|
||||
<item name="suggestionsViewStyle">@style/SuggestionsViewStyle</item>
|
||||
<item name="suggestionStripViewStyle">@style/SuggestionStripViewStyle</item>
|
||||
<item name="moreSuggestionsViewStyle">@style/MoreSuggestionsViewStyle</item>
|
||||
<item name="suggestionBackgroundStyle">@style/SuggestionBackgroundStyle</item>
|
||||
<item name="suggestionPreviewBackgroundStyle">@style/SuggestionPreviewBackgroundStyle</item>
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/*
|
||||
**
|
||||
** Copyright 2012, 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>
|
||||
<string name="research_logger_upload_url" translatable="false"></string>
|
||||
</resources>
|
|
@ -86,6 +86,12 @@
|
|||
android:summary="@string/bigram_prediction_summary"
|
||||
android:persistent="true"
|
||||
android:defaultValue="true" />
|
||||
<CheckBoxPreference
|
||||
android:key="gesture_input"
|
||||
android:title="@string/gesture_input"
|
||||
android:summary="@string/gesture_input_summary"
|
||||
android:persistent="true"
|
||||
android:defaultValue="true" />
|
||||
<CheckBoxPreference
|
||||
android:key="usability_study_mode"
|
||||
android:title="@string/prefs_usability_study_mode"
|
||||
|
|
|
@ -29,7 +29,7 @@ import android.view.ViewConfiguration;
|
|||
import com.android.inputmethod.keyboard.Key;
|
||||
import com.android.inputmethod.keyboard.Keyboard;
|
||||
import com.android.inputmethod.keyboard.KeyboardId;
|
||||
import com.android.inputmethod.keyboard.LatinKeyboardView;
|
||||
import com.android.inputmethod.keyboard.MainKeyboardView;
|
||||
import com.android.inputmethod.keyboard.PointerTracker;
|
||||
import com.android.inputmethod.latin.R;
|
||||
|
||||
|
@ -37,7 +37,7 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat {
|
|||
private static final AccessibleKeyboardViewProxy sInstance = new AccessibleKeyboardViewProxy();
|
||||
|
||||
private InputMethodService mInputMethod;
|
||||
private LatinKeyboardView mView;
|
||||
private MainKeyboardView mView;
|
||||
private AccessibilityEntityProvider mAccessibilityNodeProvider;
|
||||
|
||||
private Key mLastHoverKey = null;
|
||||
|
@ -70,7 +70,7 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat {
|
|||
*
|
||||
* @param view The view to wrap.
|
||||
*/
|
||||
public void setView(LatinKeyboardView view) {
|
||||
public void setView(MainKeyboardView view) {
|
||||
if (view == null) {
|
||||
// Ignore null views.
|
||||
return;
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
package com.android.inputmethod.keyboard;
|
||||
|
||||
import com.android.inputmethod.latin.InputPointers;
|
||||
import com.android.inputmethod.latin.SuggestedWords;
|
||||
|
||||
public interface KeyboardActionListener {
|
||||
|
||||
|
@ -73,18 +72,17 @@ public interface KeyboardActionListener {
|
|||
public void onStartBatchInput();
|
||||
|
||||
/**
|
||||
* Sends the batch input points data to get updated suggestions
|
||||
* Sends the ongoing batch input points data.
|
||||
* @param batchPointers the batch input points representing the user input
|
||||
* @return updated suggestions that reflects the user input
|
||||
*/
|
||||
public SuggestedWords onUpdateBatchInput(InputPointers batchPointers);
|
||||
public void onUpdateBatchInput(InputPointers batchPointers);
|
||||
|
||||
/**
|
||||
* Sends a sequence of characters to the listener as batch input.
|
||||
* Sends the final batch input points data.
|
||||
*
|
||||
* @param text the sequence of characters to be displayed as composing text.
|
||||
* @param batchPointers the batch input points representing the user input
|
||||
*/
|
||||
public void onEndBatchInput(CharSequence text);
|
||||
public void onEndBatchInput(InputPointers batchPointers);
|
||||
|
||||
/**
|
||||
* Called when user released a finger outside any key.
|
||||
|
@ -109,9 +107,9 @@ public interface KeyboardActionListener {
|
|||
@Override
|
||||
public void onStartBatchInput() {}
|
||||
@Override
|
||||
public SuggestedWords onUpdateBatchInput(InputPointers batchPointers) { return null; }
|
||||
public void onUpdateBatchInput(InputPointers batchPointers) {}
|
||||
@Override
|
||||
public void onEndBatchInput(CharSequence text) {}
|
||||
public void onEndBatchInput(InputPointers batchPointers) {}
|
||||
@Override
|
||||
public void onCancelInput() {}
|
||||
@Override
|
||||
|
|
|
@ -61,7 +61,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
new KeyboardTheme("Basic", 0, R.style.KeyboardTheme),
|
||||
new KeyboardTheme("HighContrast", 1, R.style.KeyboardTheme_HighContrast),
|
||||
new KeyboardTheme("Stone", 6, R.style.KeyboardTheme_Stone),
|
||||
new KeyboardTheme("Stne.Bold", 7, R.style.KeyboardTheme_Stone_Bold),
|
||||
new KeyboardTheme("Stone.Bold", 7, R.style.KeyboardTheme_Stone_Bold),
|
||||
new KeyboardTheme("GingerBread", 8, R.style.KeyboardTheme_Gingerbread),
|
||||
new KeyboardTheme("IceCreamSandwich", 5, R.style.KeyboardTheme_IceCreamSandwich),
|
||||
};
|
||||
|
@ -71,9 +71,10 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
private boolean mForceNonDistinctMultitouch;
|
||||
|
||||
private InputView mCurrentInputView;
|
||||
private LatinKeyboardView mKeyboardView;
|
||||
private MainKeyboardView mKeyboardView;
|
||||
private LatinIME mLatinIME;
|
||||
private Resources mResources;
|
||||
private SettingsValues mCurrentSettingsValues;
|
||||
|
||||
private KeyboardState mState;
|
||||
|
||||
|
@ -135,6 +136,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
}
|
||||
|
||||
public void loadKeyboard(EditorInfo editorInfo, SettingsValues settingsValues) {
|
||||
mCurrentSettingsValues = settingsValues;
|
||||
final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(
|
||||
mThemeContext, editorInfo);
|
||||
builder.setScreenGeometry(mThemeContext.getResources().getConfiguration().orientation,
|
||||
|
@ -170,6 +172,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
|
||||
private void setKeyboard(final Keyboard keyboard) {
|
||||
final Keyboard oldKeyboard = mKeyboardView.getKeyboard();
|
||||
mKeyboardView.setGestureInputEnabled(mCurrentSettingsValues.mGestureInputEnabled);
|
||||
mKeyboardView.setKeyboard(keyboard);
|
||||
mCurrentInputView.setKeyboardGeometry(keyboard.mTopPadding);
|
||||
mKeyboardView.setKeyPreviewPopupEnabled(
|
||||
|
@ -265,7 +268,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
// Implements {@link KeyboardState.SwitchActions}.
|
||||
@Override
|
||||
public void startDoubleTapTimer() {
|
||||
final LatinKeyboardView keyboardView = getKeyboardView();
|
||||
final MainKeyboardView keyboardView = getKeyboardView();
|
||||
if (keyboardView != null) {
|
||||
final TimerProxy timer = keyboardView.getTimerProxy();
|
||||
timer.startDoubleTapTimer();
|
||||
|
@ -275,7 +278,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
// Implements {@link KeyboardState.SwitchActions}.
|
||||
@Override
|
||||
public void cancelDoubleTapTimer() {
|
||||
final LatinKeyboardView keyboardView = getKeyboardView();
|
||||
final MainKeyboardView keyboardView = getKeyboardView();
|
||||
if (keyboardView != null) {
|
||||
final TimerProxy timer = keyboardView.getTimerProxy();
|
||||
timer.cancelDoubleTapTimer();
|
||||
|
@ -285,7 +288,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
// Implements {@link KeyboardState.SwitchActions}.
|
||||
@Override
|
||||
public boolean isInDoubleTapTimeout() {
|
||||
final LatinKeyboardView keyboardView = getKeyboardView();
|
||||
final MainKeyboardView keyboardView = getKeyboardView();
|
||||
return (keyboardView != null)
|
||||
? keyboardView.getTimerProxy().isInDoubleTapTimeout() : false;
|
||||
}
|
||||
|
@ -293,7 +296,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
// Implements {@link KeyboardState.SwitchActions}.
|
||||
@Override
|
||||
public void startLongPressTimer(int code) {
|
||||
final LatinKeyboardView keyboardView = getKeyboardView();
|
||||
final MainKeyboardView keyboardView = getKeyboardView();
|
||||
if (keyboardView != null) {
|
||||
final TimerProxy timer = keyboardView.getTimerProxy();
|
||||
timer.startLongPressTimer(code);
|
||||
|
@ -303,7 +306,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
// Implements {@link KeyboardState.SwitchActions}.
|
||||
@Override
|
||||
public void cancelLongPressTimer() {
|
||||
final LatinKeyboardView keyboardView = getKeyboardView();
|
||||
final MainKeyboardView keyboardView = getKeyboardView();
|
||||
if (keyboardView != null) {
|
||||
final TimerProxy timer = keyboardView.getTimerProxy();
|
||||
timer.cancelLongPressTimer();
|
||||
|
@ -343,7 +346,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
mState.onCodeInput(code, isSinglePointer(), mLatinIME.getCurrentAutoCapsState());
|
||||
}
|
||||
|
||||
public LatinKeyboardView getKeyboardView() {
|
||||
public MainKeyboardView getKeyboardView() {
|
||||
return mKeyboardView;
|
||||
}
|
||||
|
||||
|
@ -369,7 +372,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
}
|
||||
}
|
||||
|
||||
mKeyboardView = (LatinKeyboardView) mCurrentInputView.findViewById(R.id.keyboard_view);
|
||||
mKeyboardView = (MainKeyboardView) mCurrentInputView.findViewById(R.id.keyboard_view);
|
||||
mKeyboardView.setKeyboardActionListener(mLatinIME);
|
||||
if (mForceNonDistinctMultitouch) {
|
||||
mKeyboardView.setDistinctMultitouch(false);
|
||||
|
|
|
@ -38,10 +38,13 @@ import android.view.ViewGroup;
|
|||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.inputmethod.latin.Constants;
|
||||
import com.android.inputmethod.latin.LatinImeLogger;
|
||||
import com.android.inputmethod.latin.R;
|
||||
import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
|
||||
import com.android.inputmethod.latin.StringUtils;
|
||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.research.ResearchLogger;
|
||||
|
||||
import java.util.HashSet;
|
||||
|
||||
|
@ -94,7 +97,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
|
|||
// The maximum key label width in the proportion to the key width.
|
||||
private static final float MAX_LABEL_RATIO = 0.90f;
|
||||
|
||||
private final static int ALPHA_OPAQUE = 255;
|
||||
private final static int GESTURE_DRAWING_WIDTH = 5;
|
||||
private final static int GESTURE_DRAWING_COLOR = 0xff33b5e5;
|
||||
|
||||
// Main keyboard
|
||||
private Keyboard mKeyboard;
|
||||
|
@ -107,6 +111,9 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
|
|||
private int mDelayAfterPreview;
|
||||
private ViewGroup mPreviewPlacer;
|
||||
|
||||
/** True if the gesture input is enabled. */
|
||||
protected boolean mGestureInputEnabled;
|
||||
|
||||
// Drawing
|
||||
/** True if the entire keyboard needs to be dimmed. */
|
||||
private boolean mNeedsToDimEntireKeyboard;
|
||||
|
@ -118,11 +125,14 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
|
|||
private final HashSet<Key> mInvalidatedKeys = new HashSet<Key>();
|
||||
/** The region of invalidated keys */
|
||||
private final Rect mInvalidatedKeysRect = new Rect();
|
||||
/** The region of invalidated gestures */
|
||||
private final Rect mInvalidatedGesturesRect = new Rect();
|
||||
/** The keyboard bitmap buffer for faster updates */
|
||||
private Bitmap mBuffer;
|
||||
/** The canvas for the above mutable keyboard bitmap */
|
||||
private Canvas mCanvas;
|
||||
private final Paint mPaint = new Paint();
|
||||
private final Paint mGesturePaint = new Paint();
|
||||
private final Paint.FontMetrics mFontMetrics = new Paint.FontMetrics();
|
||||
// This sparse array caches key label text height in pixel indexed by key label text size.
|
||||
private static final SparseArray<Float> sTextHeightCache = new SparseArray<Float>();
|
||||
|
@ -264,7 +274,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
|
|||
|
||||
public void blendAlpha(Paint paint) {
|
||||
final int color = paint.getColor();
|
||||
paint.setARGB((paint.getAlpha() * mAnimAlpha) / ALPHA_OPAQUE,
|
||||
paint.setARGB((paint.getAlpha() * mAnimAlpha) / Constants.Color.ALPHA_OPAQUE,
|
||||
Color.red(color), Color.green(color), Color.blue(color));
|
||||
}
|
||||
}
|
||||
|
@ -372,6 +382,13 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
|
|||
mDelayAfterPreview = mKeyPreviewDrawParams.mLingerTimeout;
|
||||
|
||||
mPaint.setAntiAlias(true);
|
||||
|
||||
// TODO: These paint parameters should be specified via attribute of the view and styleable.
|
||||
mGesturePaint.setAntiAlias(true);
|
||||
mGesturePaint.setStyle(Paint.Style.STROKE);
|
||||
mGesturePaint.setStrokeJoin(Paint.Join.ROUND);
|
||||
mGesturePaint.setColor(GESTURE_DRAWING_COLOR);
|
||||
mGesturePaint.setStrokeWidth(GESTURE_DRAWING_WIDTH);
|
||||
}
|
||||
|
||||
// Read fraction value in TypedArray as float.
|
||||
|
@ -426,6 +443,10 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
|
|||
return mShowKeyPreviewPopup;
|
||||
}
|
||||
|
||||
public void setGestureInputEnabled(boolean gestureInputEnabled) {
|
||||
mGestureInputEnabled = gestureInputEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
if (mKeyboard != null) {
|
||||
|
@ -499,6 +520,13 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
|
|||
}
|
||||
}
|
||||
|
||||
// ResearchLogging indicator.
|
||||
// TODO: Reimplement using a keyboard background image specific to the ResearchLogger,
|
||||
// and remove this call.
|
||||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
ResearchLogger.getInstance().paintIndicator(this, paint, canvas, width, height);
|
||||
}
|
||||
|
||||
mInvalidatedKeys.clear();
|
||||
mInvalidatedKeysRect.setEmpty();
|
||||
mInvalidateAllKeys = false;
|
||||
|
@ -517,7 +545,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
|
|||
final int keyDrawY = key.mY + getPaddingTop();
|
||||
canvas.translate(keyDrawX, keyDrawY);
|
||||
|
||||
params.mAnimAlpha = ALPHA_OPAQUE;
|
||||
params.mAnimAlpha = Constants.Color.ALPHA_OPAQUE;
|
||||
if (!key.isSpacer()) {
|
||||
onDrawKeyBackground(key, canvas, params);
|
||||
}
|
||||
|
@ -860,17 +888,60 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
|
|||
mDrawingHandler.dismissKeyPreview(mDelayAfterPreview, tracker);
|
||||
}
|
||||
|
||||
private static class PreviewView extends RelativeLayout {
|
||||
KeyPreviewDrawParams mParams;
|
||||
Paint mGesturePaint;
|
||||
|
||||
public PreviewView(Context context, KeyPreviewDrawParams params, Paint gesturePaint) {
|
||||
super(context);
|
||||
setWillNotDraw(false);
|
||||
mParams = params;
|
||||
mGesturePaint = gesturePaint;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDraw(Canvas canvas) {
|
||||
super.onDraw(canvas);
|
||||
canvas.translate(mParams.mCoordinates[0], mParams.mCoordinates[1]);
|
||||
PointerTracker.drawGestureTrailForAllPointerTrackers(canvas, mGesturePaint);
|
||||
canvas.translate(-mParams.mCoordinates[0], -mParams.mCoordinates[1]);
|
||||
}
|
||||
}
|
||||
|
||||
private void addKeyPreview(TextView keyPreview) {
|
||||
if (mPreviewPlacer == null) {
|
||||
mPreviewPlacer = new RelativeLayout(getContext());
|
||||
final ViewGroup windowContentView =
|
||||
(ViewGroup)getRootView().findViewById(android.R.id.content);
|
||||
windowContentView.addView(mPreviewPlacer);
|
||||
createPreviewPlacer();
|
||||
}
|
||||
mPreviewPlacer.addView(
|
||||
keyPreview, ViewLayoutUtils.newLayoutParam(mPreviewPlacer, 0, 0));
|
||||
}
|
||||
|
||||
private void createPreviewPlacer() {
|
||||
mPreviewPlacer = new PreviewView(getContext(), mKeyPreviewDrawParams, mGesturePaint);
|
||||
final ViewGroup windowContentView =
|
||||
(ViewGroup)getRootView().findViewById(android.R.id.content);
|
||||
windowContentView.addView(mPreviewPlacer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showGestureTrail(PointerTracker tracker) {
|
||||
if (mPreviewPlacer == null) {
|
||||
createPreviewPlacer();
|
||||
}
|
||||
final Rect r = tracker.getBoundingBox();
|
||||
if (!r.isEmpty()) {
|
||||
// Invalidate the rectangular region encompassing the gesture. This is needed because
|
||||
// past points along the gesture will fade and gradually disappear.
|
||||
final KeyPreviewDrawParams params = mKeyPreviewDrawParams;
|
||||
mInvalidatedGesturesRect.set(r);
|
||||
mInvalidatedGesturesRect.offset(params.mCoordinates[0], params.mCoordinates[1]);
|
||||
mInvalidatedGesturesRect.inset(-GESTURE_DRAWING_WIDTH, -GESTURE_DRAWING_WIDTH);
|
||||
mPreviewPlacer.invalidate(mInvalidatedGesturesRect);
|
||||
} else {
|
||||
mPreviewPlacer.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation") // setBackgroundDrawable is replaced by setBackground in API16
|
||||
@Override
|
||||
public void showKeyPreview(PointerTracker tracker) {
|
||||
|
|
|
@ -43,16 +43,17 @@ import com.android.inputmethod.accessibility.AccessibilityUtils;
|
|||
import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
|
||||
import com.android.inputmethod.keyboard.PointerTracker.DrawingProxy;
|
||||
import com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
|
||||
import com.android.inputmethod.latin.Constants;
|
||||
import com.android.inputmethod.latin.LatinIME;
|
||||
import com.android.inputmethod.latin.LatinImeLogger;
|
||||
import com.android.inputmethod.latin.R;
|
||||
import com.android.inputmethod.latin.ResearchLogger;
|
||||
import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
|
||||
import com.android.inputmethod.latin.StringUtils;
|
||||
import com.android.inputmethod.latin.SubtypeLocale;
|
||||
import com.android.inputmethod.latin.Utils;
|
||||
import com.android.inputmethod.latin.Utils.UsabilityStudyLogUtils;
|
||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.research.ResearchLogger;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.WeakHashMap;
|
||||
|
@ -64,9 +65,9 @@ import java.util.WeakHashMap;
|
|||
* @attr ref R.styleable#KeyboardView_verticalCorrection
|
||||
* @attr ref R.styleable#KeyboardView_popupLayout
|
||||
*/
|
||||
public class LatinKeyboardView extends KeyboardView implements PointerTracker.KeyEventHandler,
|
||||
public class MainKeyboardView extends KeyboardView implements PointerTracker.KeyEventHandler,
|
||||
SuddenJumpingTouchEventHandler.ProcessMotionEvent {
|
||||
private static final String TAG = LatinKeyboardView.class.getSimpleName();
|
||||
private static final String TAG = MainKeyboardView.class.getSimpleName();
|
||||
|
||||
// TODO: Kill process when the usability study mode was changed.
|
||||
private static final boolean ENABLE_USABILITY_STUDY_LOG = LatinImeLogger.sUsabilityStudy;
|
||||
|
@ -80,10 +81,9 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
// Stuff to draw language name on spacebar.
|
||||
private final int mLanguageOnSpacebarFinalAlpha;
|
||||
private ObjectAnimator mLanguageOnSpacebarFadeoutAnimator;
|
||||
private static final int ALPHA_OPAQUE = 255;
|
||||
private boolean mNeedsToDisplayLanguage;
|
||||
private boolean mHasMultipleEnabledIMEsOrSubtypes;
|
||||
private int mLanguageOnSpacebarAnimAlpha = ALPHA_OPAQUE;
|
||||
private int mLanguageOnSpacebarAnimAlpha = Constants.Color.ALPHA_OPAQUE;
|
||||
private final float mSpacebarTextRatio;
|
||||
private float mSpacebarTextSize;
|
||||
private final int mSpacebarTextColor;
|
||||
|
@ -99,7 +99,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
// Stuff to draw altCodeWhileTyping keys.
|
||||
private ObjectAnimator mAltCodeKeyWhileTypingFadeoutAnimator;
|
||||
private ObjectAnimator mAltCodeKeyWhileTypingFadeinAnimator;
|
||||
private int mAltCodeKeyWhileTypingAnimAlpha = ALPHA_OPAQUE;
|
||||
private int mAltCodeKeyWhileTypingAnimAlpha = Constants.Color.ALPHA_OPAQUE;
|
||||
|
||||
// More keys keyboard
|
||||
private PopupWindow mMoreKeysWindow;
|
||||
|
@ -119,7 +119,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
|
||||
private final KeyTimerHandler mKeyTimerHandler;
|
||||
|
||||
private static class KeyTimerHandler extends StaticInnerHandlerWrapper<LatinKeyboardView>
|
||||
private static class KeyTimerHandler extends StaticInnerHandlerWrapper<MainKeyboardView>
|
||||
implements TimerProxy {
|
||||
private static final int MSG_REPEAT_KEY = 1;
|
||||
private static final int MSG_LONGPRESS_KEY = 2;
|
||||
|
@ -128,14 +128,14 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
|
||||
private final KeyTimerParams mParams;
|
||||
|
||||
public KeyTimerHandler(LatinKeyboardView outerInstance, KeyTimerParams params) {
|
||||
public KeyTimerHandler(MainKeyboardView outerInstance, KeyTimerParams params) {
|
||||
super(outerInstance);
|
||||
mParams = params;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
final LatinKeyboardView keyboardView = getOuterInstance();
|
||||
final MainKeyboardView keyboardView = getOuterInstance();
|
||||
final PointerTracker tracker = (PointerTracker) msg.obj;
|
||||
switch (msg.what) {
|
||||
case MSG_REPEAT_KEY:
|
||||
|
@ -249,7 +249,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
if (isTyping) {
|
||||
return;
|
||||
}
|
||||
final LatinKeyboardView keyboardView = getOuterInstance();
|
||||
final MainKeyboardView keyboardView = getOuterInstance();
|
||||
cancelAndStartAnimators(keyboardView.mAltCodeKeyWhileTypingFadeinAnimator,
|
||||
keyboardView.mAltCodeKeyWhileTypingFadeoutAnimator);
|
||||
}
|
||||
|
@ -299,13 +299,13 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
mTouchNoiseThresholdDistance = 0;
|
||||
}
|
||||
|
||||
public PointerTrackerParams(TypedArray latinKeyboardViewAttr) {
|
||||
mSlidingKeyInputEnabled = latinKeyboardViewAttr.getBoolean(
|
||||
R.styleable.LatinKeyboardView_slidingKeyInputEnable, false);
|
||||
mTouchNoiseThresholdTime = latinKeyboardViewAttr.getInt(
|
||||
R.styleable.LatinKeyboardView_touchNoiseThresholdTime, 0);
|
||||
mTouchNoiseThresholdDistance = latinKeyboardViewAttr.getDimension(
|
||||
R.styleable.LatinKeyboardView_touchNoiseThresholdDistance, 0);
|
||||
public PointerTrackerParams(TypedArray mainKeyboardViewAttr) {
|
||||
mSlidingKeyInputEnabled = mainKeyboardViewAttr.getBoolean(
|
||||
R.styleable.MainKeyboardView_slidingKeyInputEnable, false);
|
||||
mTouchNoiseThresholdTime = mainKeyboardViewAttr.getInt(
|
||||
R.styleable.MainKeyboardView_touchNoiseThresholdTime, 0);
|
||||
mTouchNoiseThresholdDistance = mainKeyboardViewAttr.getDimension(
|
||||
R.styleable.MainKeyboardView_touchNoiseThresholdDistance, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -316,65 +316,67 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
public final int mLongPressShiftKeyTimeout;
|
||||
public final int mIgnoreAltCodeKeyTimeout;
|
||||
|
||||
public KeyTimerParams(TypedArray latinKeyboardViewAttr) {
|
||||
mKeyRepeatStartTimeout = latinKeyboardViewAttr.getInt(
|
||||
R.styleable.LatinKeyboardView_keyRepeatStartTimeout, 0);
|
||||
mKeyRepeatInterval = latinKeyboardViewAttr.getInt(
|
||||
R.styleable.LatinKeyboardView_keyRepeatInterval, 0);
|
||||
mLongPressKeyTimeout = latinKeyboardViewAttr.getInt(
|
||||
R.styleable.LatinKeyboardView_longPressKeyTimeout, 0);
|
||||
mLongPressShiftKeyTimeout = latinKeyboardViewAttr.getInt(
|
||||
R.styleable.LatinKeyboardView_longPressShiftKeyTimeout, 0);
|
||||
mIgnoreAltCodeKeyTimeout = latinKeyboardViewAttr.getInt(
|
||||
R.styleable.LatinKeyboardView_ignoreAltCodeKeyTimeout, 0);
|
||||
public KeyTimerParams(TypedArray mainKeyboardViewAttr) {
|
||||
mKeyRepeatStartTimeout = mainKeyboardViewAttr.getInt(
|
||||
R.styleable.MainKeyboardView_keyRepeatStartTimeout, 0);
|
||||
mKeyRepeatInterval = mainKeyboardViewAttr.getInt(
|
||||
R.styleable.MainKeyboardView_keyRepeatInterval, 0);
|
||||
mLongPressKeyTimeout = mainKeyboardViewAttr.getInt(
|
||||
R.styleable.MainKeyboardView_longPressKeyTimeout, 0);
|
||||
mLongPressShiftKeyTimeout = mainKeyboardViewAttr.getInt(
|
||||
R.styleable.MainKeyboardView_longPressShiftKeyTimeout, 0);
|
||||
mIgnoreAltCodeKeyTimeout = mainKeyboardViewAttr.getInt(
|
||||
R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public LatinKeyboardView(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, R.attr.latinKeyboardViewStyle);
|
||||
public MainKeyboardView(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, R.attr.mainKeyboardViewStyle);
|
||||
}
|
||||
|
||||
public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) {
|
||||
public MainKeyboardView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
|
||||
mTouchScreenRegulator = new SuddenJumpingTouchEventHandler(getContext(), this);
|
||||
|
||||
mHasDistinctMultitouch = context.getPackageManager()
|
||||
.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT);
|
||||
final Resources res = getResources();
|
||||
final boolean needsPhantomSuddenMoveEventHack = Boolean.parseBoolean(
|
||||
Utils.getDeviceOverrideValue(context.getResources(),
|
||||
Utils.getDeviceOverrideValue(res,
|
||||
R.array.phantom_sudden_move_event_device_list, "false"));
|
||||
PointerTracker.init(mHasDistinctMultitouch, needsPhantomSuddenMoveEventHack);
|
||||
|
||||
final TypedArray a = context.obtainStyledAttributes(
|
||||
attrs, R.styleable.LatinKeyboardView, defStyle, R.style.LatinKeyboardView);
|
||||
attrs, R.styleable.MainKeyboardView, defStyle, R.style.MainKeyboardView);
|
||||
mAutoCorrectionSpacebarLedEnabled = a.getBoolean(
|
||||
R.styleable.LatinKeyboardView_autoCorrectionSpacebarLedEnabled, false);
|
||||
R.styleable.MainKeyboardView_autoCorrectionSpacebarLedEnabled, false);
|
||||
mAutoCorrectionSpacebarLedIcon = a.getDrawable(
|
||||
R.styleable.LatinKeyboardView_autoCorrectionSpacebarLedIcon);
|
||||
mSpacebarTextRatio = a.getFraction(R.styleable.LatinKeyboardView_spacebarTextRatio,
|
||||
R.styleable.MainKeyboardView_autoCorrectionSpacebarLedIcon);
|
||||
mSpacebarTextRatio = a.getFraction(R.styleable.MainKeyboardView_spacebarTextRatio,
|
||||
1000, 1000, 1) / 1000.0f;
|
||||
mSpacebarTextColor = a.getColor(R.styleable.LatinKeyboardView_spacebarTextColor, 0);
|
||||
mSpacebarTextColor = a.getColor(R.styleable.MainKeyboardView_spacebarTextColor, 0);
|
||||
mSpacebarTextShadowColor = a.getColor(
|
||||
R.styleable.LatinKeyboardView_spacebarTextShadowColor, 0);
|
||||
R.styleable.MainKeyboardView_spacebarTextShadowColor, 0);
|
||||
mLanguageOnSpacebarFinalAlpha = a.getInt(
|
||||
R.styleable.LatinKeyboardView_languageOnSpacebarFinalAlpha, ALPHA_OPAQUE);
|
||||
R.styleable.MainKeyboardView_languageOnSpacebarFinalAlpha,
|
||||
Constants.Color.ALPHA_OPAQUE);
|
||||
final int languageOnSpacebarFadeoutAnimatorResId = a.getResourceId(
|
||||
R.styleable.LatinKeyboardView_languageOnSpacebarFadeoutAnimator, 0);
|
||||
R.styleable.MainKeyboardView_languageOnSpacebarFadeoutAnimator, 0);
|
||||
final int altCodeKeyWhileTypingFadeoutAnimatorResId = a.getResourceId(
|
||||
R.styleable.LatinKeyboardView_altCodeKeyWhileTypingFadeoutAnimator, 0);
|
||||
R.styleable.MainKeyboardView_altCodeKeyWhileTypingFadeoutAnimator, 0);
|
||||
final int altCodeKeyWhileTypingFadeinAnimatorResId = a.getResourceId(
|
||||
R.styleable.LatinKeyboardView_altCodeKeyWhileTypingFadeinAnimator, 0);
|
||||
R.styleable.MainKeyboardView_altCodeKeyWhileTypingFadeinAnimator, 0);
|
||||
|
||||
final KeyTimerParams keyTimerParams = new KeyTimerParams(a);
|
||||
mPointerTrackerParams = new PointerTrackerParams(a);
|
||||
|
||||
final float keyHysteresisDistance = a.getDimension(
|
||||
R.styleable.LatinKeyboardView_keyHysteresisDistance, 0);
|
||||
R.styleable.MainKeyboardView_keyHysteresisDistance, 0);
|
||||
mKeyDetector = new KeyDetector(keyHysteresisDistance);
|
||||
mKeyTimerHandler = new KeyTimerHandler(this, keyTimerParams);
|
||||
mConfigShowMoreKeysKeyboardAtTouchedPoint = a.getBoolean(
|
||||
R.styleable.LatinKeyboardView_showMoreKeysKeyboardAtTouchedPoint, false);
|
||||
R.styleable.MainKeyboardView_showMoreKeysKeyboardAtTouchedPoint, false);
|
||||
a.recycle();
|
||||
|
||||
PointerTracker.setParameters(mPointerTrackerParams);
|
||||
|
@ -459,17 +461,17 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
super.setKeyboard(keyboard);
|
||||
mKeyDetector.setKeyboard(
|
||||
keyboard, -getPaddingLeft(), -getPaddingTop() + mVerticalCorrection);
|
||||
PointerTracker.setKeyDetector(mKeyDetector);
|
||||
PointerTracker.setKeyDetector(mKeyDetector, mGestureInputEnabled);
|
||||
mTouchScreenRegulator.setKeyboard(keyboard);
|
||||
mMoreKeysPanelCache.clear();
|
||||
|
||||
mSpaceKey = keyboard.getKey(Keyboard.CODE_SPACE);
|
||||
mSpaceIcon = (mSpaceKey != null)
|
||||
? mSpaceKey.getIcon(keyboard.mIconsSet, ALPHA_OPAQUE) : null;
|
||||
? mSpaceKey.getIcon(keyboard.mIconsSet, Constants.Color.ALPHA_OPAQUE) : null;
|
||||
final int keyHeight = keyboard.mMostCommonKeyHeight - keyboard.mVerticalGap;
|
||||
mSpacebarTextSize = keyHeight * mSpacebarTextRatio;
|
||||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
ResearchLogger.latinKeyboardView_setKeyboard(keyboard);
|
||||
ResearchLogger.mainKeyboardView_setKeyboard(keyboard);
|
||||
}
|
||||
|
||||
// This always needs to be set since the accessibility state can
|
||||
|
@ -506,6 +508,17 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
return mKeyDetector.isProximityCorrectionEnabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
// Notify the research logger that the keyboard view has been attached. This is needed
|
||||
// to properly show the splash screen, which requires that the window token of the
|
||||
// KeyboardView be non-null.
|
||||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
ResearchLogger.getInstance().mainKeyboardView_onAttachedToWindow();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelAllMessages() {
|
||||
mKeyTimerHandler.cancelAllMessages();
|
||||
|
@ -555,7 +568,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
*/
|
||||
protected boolean onLongPress(Key parentKey, PointerTracker tracker) {
|
||||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
ResearchLogger.latinKeyboardView_onLongPress();
|
||||
ResearchLogger.mainKeyboardView_onLongPress();
|
||||
}
|
||||
final int primaryCode = parentKey.mCode;
|
||||
if (parentKey.hasEmbeddedMoreKey()) {
|
||||
|
@ -706,7 +719,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
}
|
||||
}
|
||||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
ResearchLogger.latinKeyboardView_processMotionEvent(me, action, eventTime, index, id,
|
||||
ResearchLogger.mainKeyboardView_processMotionEvent(me, action, eventTime, index, id,
|
||||
x, y);
|
||||
}
|
||||
|
||||
|
@ -778,7 +791,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
+ pointerSize + "," + pointerPressure);
|
||||
}
|
||||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
ResearchLogger.latinKeyboardView_processMotionEvent(me, action, eventTime,
|
||||
ResearchLogger.mainKeyboardView_processMotionEvent(me, action, eventTime,
|
||||
i, pointerId, px, py);
|
||||
}
|
||||
}
|
||||
|
@ -867,7 +880,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
|||
mNeedsToDisplayLanguage = false;
|
||||
} else {
|
||||
if (subtypeChanged && needsToDisplayLanguage) {
|
||||
setLanguageOnSpacebarAnimAlpha(ALPHA_OPAQUE);
|
||||
setLanguageOnSpacebarAnimAlpha(Constants.Color.ALPHA_OPAQUE);
|
||||
if (animator.isStarted()) {
|
||||
animator.cancel();
|
||||
}
|
|
@ -25,6 +25,7 @@ import android.widget.PopupWindow;
|
|||
|
||||
import com.android.inputmethod.keyboard.PointerTracker.DrawingProxy;
|
||||
import com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
|
||||
import com.android.inputmethod.latin.InputPointers;
|
||||
import com.android.inputmethod.latin.R;
|
||||
|
||||
/**
|
||||
|
@ -63,8 +64,13 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onEndBatchInput(CharSequence text) {
|
||||
mListener.onEndBatchInput(text);
|
||||
public void onUpdateBatchInput(InputPointers batchPointers) {
|
||||
mListener.onUpdateBatchInput(batchPointers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEndBatchInput(InputPointers batchPointers) {
|
||||
mListener.onEndBatchInput(batchPointers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -16,17 +16,22 @@
|
|||
|
||||
package com.android.inputmethod.keyboard;
|
||||
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.os.SystemClock;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.inputmethod.keyboard.internal.GestureTracker;
|
||||
import com.android.inputmethod.accessibility.AccessibilityUtils;
|
||||
import com.android.inputmethod.keyboard.internal.GestureStroke;
|
||||
import com.android.inputmethod.keyboard.internal.PointerTrackerQueue;
|
||||
import com.android.inputmethod.latin.InputPointers;
|
||||
import com.android.inputmethod.latin.LatinImeLogger;
|
||||
import com.android.inputmethod.latin.ResearchLogger;
|
||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.research.ResearchLogger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
@ -37,6 +42,11 @@ public class PointerTracker {
|
|||
private static final boolean DEBUG_LISTENER = false;
|
||||
private static boolean DEBUG_MODE = LatinImeLogger.sDBG;
|
||||
|
||||
// TODO: There should be an option to turn on/off the gesture input.
|
||||
private static boolean sIsGestureEnabled = true;
|
||||
|
||||
private static final int MIN_GESTURE_RECOGNITION_TIME = 100; // msec
|
||||
|
||||
public interface KeyEventHandler {
|
||||
/**
|
||||
* Get KeyDetector object that is used for this PointerTracker.
|
||||
|
@ -69,6 +79,7 @@ public class PointerTracker {
|
|||
public TextView inflateKeyPreviewText();
|
||||
public void showKeyPreview(PointerTracker tracker);
|
||||
public void dismissKeyPreview(PointerTracker tracker);
|
||||
public void showGestureTrail(PointerTracker tracker);
|
||||
}
|
||||
|
||||
public interface TimerProxy {
|
||||
|
@ -108,12 +119,18 @@ public class PointerTracker {
|
|||
}
|
||||
|
||||
// Parameters for pointer handling.
|
||||
private static LatinKeyboardView.PointerTrackerParams sParams;
|
||||
private static MainKeyboardView.PointerTrackerParams sParams;
|
||||
private static int sTouchNoiseThresholdDistanceSquared;
|
||||
private static boolean sNeedsPhantomSuddenMoveEventHack;
|
||||
|
||||
private static final ArrayList<PointerTracker> sTrackers = new ArrayList<PointerTracker>();
|
||||
private static final InputPointers sAggregratedPointers = new InputPointers(
|
||||
GestureStroke.DEFAULT_CAPACITY);
|
||||
private static PointerTrackerQueue sPointerTrackerQueue;
|
||||
// HACK: Change gesture detection criteria depending on this variable.
|
||||
// TODO: Find more comprehensive ways to detect a gesture start.
|
||||
// True when the previous user input was a gesture input, not a typing input.
|
||||
private static boolean sWasInGesture;
|
||||
|
||||
public final int mPointerId;
|
||||
|
||||
|
@ -126,6 +143,14 @@ public class PointerTracker {
|
|||
private int mKeyQuarterWidthSquared;
|
||||
private final TextView mKeyPreviewText;
|
||||
|
||||
private boolean mIsAlphabetKeyboard;
|
||||
private boolean mIsPossibleGesture = false;
|
||||
private boolean mInGesture = false;
|
||||
|
||||
// TODO: Remove these variables
|
||||
private int mLastRecognitionPointSize = 0;
|
||||
private long mLastRecognitionTime = 0;
|
||||
|
||||
// The position and time at which first down event occurred.
|
||||
private long mDownTime;
|
||||
private long mUpTime;
|
||||
|
@ -162,8 +187,7 @@ public class PointerTracker {
|
|||
private static final KeyboardActionListener EMPTY_LISTENER =
|
||||
new KeyboardActionListener.Adapter();
|
||||
|
||||
// Gesture tracker singleton instance
|
||||
private static final GestureTracker sGestureTracker = GestureTracker.getInstance();
|
||||
private final GestureStroke mGestureStroke;
|
||||
|
||||
public static void init(boolean hasDistinctMultitouch,
|
||||
boolean needsPhantomSuddenMoveEventHack) {
|
||||
|
@ -174,15 +198,27 @@ public class PointerTracker {
|
|||
}
|
||||
sNeedsPhantomSuddenMoveEventHack = needsPhantomSuddenMoveEventHack;
|
||||
|
||||
setParameters(LatinKeyboardView.PointerTrackerParams.DEFAULT);
|
||||
setParameters(MainKeyboardView.PointerTrackerParams.DEFAULT);
|
||||
updateGestureInputEnabledState(null, false /* gestureInputEnabled */);
|
||||
}
|
||||
|
||||
public static void setParameters(LatinKeyboardView.PointerTrackerParams params) {
|
||||
public static void setParameters(MainKeyboardView.PointerTrackerParams params) {
|
||||
sParams = params;
|
||||
sTouchNoiseThresholdDistanceSquared = (int)(
|
||||
params.mTouchNoiseThresholdDistance * params.mTouchNoiseThresholdDistance);
|
||||
}
|
||||
|
||||
private static void updateGestureInputEnabledState(Keyboard keyboard,
|
||||
boolean gestureInputEnabled) {
|
||||
if (!gestureInputEnabled
|
||||
|| AccessibilityUtils.getInstance().isTouchExplorationEnabled()
|
||||
|| (keyboard != null && keyboard.mId.passwordInput())) {
|
||||
sIsGestureEnabled = false;
|
||||
} else {
|
||||
sIsGestureEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
public static PointerTracker getPointerTracker(final int id, KeyEventHandler handler) {
|
||||
final ArrayList<PointerTracker> trackers = sTrackers;
|
||||
|
||||
|
@ -200,32 +236,83 @@ public class PointerTracker {
|
|||
}
|
||||
|
||||
public static void setKeyboardActionListener(KeyboardActionListener listener) {
|
||||
for (final PointerTracker tracker : sTrackers) {
|
||||
final int trackersSize = sTrackers.size();
|
||||
for (int i = 0; i < trackersSize; ++i) {
|
||||
final PointerTracker tracker = sTrackers.get(i);
|
||||
tracker.mListener = listener;
|
||||
}
|
||||
GestureTracker.init(listener);
|
||||
}
|
||||
|
||||
public static void setKeyDetector(KeyDetector keyDetector) {
|
||||
for (final PointerTracker tracker : sTrackers) {
|
||||
public static void setKeyDetector(KeyDetector keyDetector, boolean gestureInputEnabledByUser) {
|
||||
final int trackersSize = sTrackers.size();
|
||||
for (int i = 0; i < trackersSize; ++i) {
|
||||
final PointerTracker tracker = sTrackers.get(i);
|
||||
tracker.setKeyDetectorInner(keyDetector);
|
||||
// Mark that keyboard layout has been changed.
|
||||
tracker.mKeyboardLayoutHasBeenChanged = true;
|
||||
}
|
||||
sGestureTracker.setKeyboard(keyDetector.getKeyboard());
|
||||
final Keyboard keyboard = keyDetector.getKeyboard();
|
||||
updateGestureInputEnabledState(keyboard, gestureInputEnabledByUser);
|
||||
}
|
||||
|
||||
public static void dismissAllKeyPreviews() {
|
||||
for (final PointerTracker tracker : sTrackers) {
|
||||
final int trackersSize = sTrackers.size();
|
||||
for (int i = 0; i < trackersSize; ++i) {
|
||||
final PointerTracker tracker = sTrackers.get(i);
|
||||
tracker.getKeyPreviewText().setVisibility(View.INVISIBLE);
|
||||
tracker.setReleasedKeyGraphics(tracker.mCurrentKey);
|
||||
}
|
||||
}
|
||||
|
||||
public PointerTracker(int id, KeyEventHandler handler) {
|
||||
// TODO: To handle multi-touch gestures we may want to move this method to
|
||||
// {@link PointerTrackerQueue}.
|
||||
private static InputPointers getIncrementalBatchPoints() {
|
||||
final int trackersSize = sTrackers.size();
|
||||
for (int i = 0; i < trackersSize; ++i) {
|
||||
final PointerTracker tracker = sTrackers.get(i);
|
||||
tracker.mGestureStroke.appendIncrementalBatchPoints(sAggregratedPointers);
|
||||
}
|
||||
return sAggregratedPointers;
|
||||
}
|
||||
|
||||
// TODO: To handle multi-touch gestures we may want to move this method to
|
||||
// {@link PointerTrackerQueue}.
|
||||
private static InputPointers getAllBatchPoints() {
|
||||
final int trackersSize = sTrackers.size();
|
||||
for (int i = 0; i < trackersSize; ++i) {
|
||||
final PointerTracker tracker = sTrackers.get(i);
|
||||
tracker.mGestureStroke.appendAllBatchPoints(sAggregratedPointers);
|
||||
}
|
||||
return sAggregratedPointers;
|
||||
}
|
||||
|
||||
// TODO: To handle multi-touch gestures we may want to move this method to
|
||||
// {@link PointerTrackerQueue}.
|
||||
public static void clearBatchInputPointsOfAllPointerTrackers() {
|
||||
final int trackersSize = sTrackers.size();
|
||||
for (int i = 0; i < trackersSize; ++i) {
|
||||
final PointerTracker tracker = sTrackers.get(i);
|
||||
tracker.mGestureStroke.reset();
|
||||
}
|
||||
sAggregratedPointers.reset();
|
||||
}
|
||||
|
||||
// TODO: To handle multi-touch gestures we may want to move this method to
|
||||
// {@link PointerTrackerQueue}.
|
||||
public static void drawGestureTrailForAllPointerTrackers(Canvas canvas, Paint paint) {
|
||||
final int trackersSize = sTrackers.size();
|
||||
for (int i = 0; i < trackersSize; ++i) {
|
||||
final PointerTracker tracker = sTrackers.get(i);
|
||||
tracker.mGestureStroke.drawGestureTrail(canvas, paint, tracker.getLastX(),
|
||||
tracker.getLastY());
|
||||
}
|
||||
}
|
||||
|
||||
private PointerTracker(int id, KeyEventHandler handler) {
|
||||
if (handler == null)
|
||||
throw new NullPointerException();
|
||||
mPointerId = id;
|
||||
mGestureStroke = new GestureStroke(id);
|
||||
setKeyDetectorInner(handler.getKeyDetector());
|
||||
mListener = handler.getKeyboardActionListener();
|
||||
mDrawingProxy = handler.getDrawingProxy();
|
||||
|
@ -239,7 +326,7 @@ public class PointerTracker {
|
|||
|
||||
// Returns true if keyboard has been changed by this callback.
|
||||
private boolean callListenerOnPressAndCheckKeyboardLayoutChange(Key key) {
|
||||
if (sGestureTracker.isInGesture()) {
|
||||
if (mInGesture) {
|
||||
return false;
|
||||
}
|
||||
final boolean ignoreModifierKey = mIgnoreModifierKey && key.isModifier();
|
||||
|
@ -295,7 +382,7 @@ public class PointerTracker {
|
|||
// Note that we need primaryCode argument because the keyboard may in shifted state and the
|
||||
// primaryCode is different from {@link Key#mCode}.
|
||||
private void callListenerOnRelease(Key key, int primaryCode, boolean withSliding) {
|
||||
if (sGestureTracker.isInGesture()) {
|
||||
if (mInGesture) {
|
||||
return;
|
||||
}
|
||||
final boolean ignoreModifierKey = mIgnoreModifierKey && key.isModifier();
|
||||
|
@ -328,6 +415,9 @@ public class PointerTracker {
|
|||
private void setKeyDetectorInner(KeyDetector keyDetector) {
|
||||
mKeyDetector = keyDetector;
|
||||
mKeyboard = keyDetector.getKeyboard();
|
||||
mIsAlphabetKeyboard = mKeyboard.mId.isAlphabetKeyboard();
|
||||
mGestureStroke.setGestureSampleLength(
|
||||
mKeyboard.mMostCommonKeyWidth, mKeyboard.mMostCommonKeyHeight);
|
||||
final Key newKey = mKeyDetector.detectHitKey(mKeyX, mKeyY);
|
||||
if (newKey != mCurrentKey) {
|
||||
if (mDrawingProxy != null) {
|
||||
|
@ -398,7 +488,7 @@ public class PointerTracker {
|
|||
return;
|
||||
}
|
||||
|
||||
if (!key.noKeyPreview() && !sGestureTracker.isInGesture()) {
|
||||
if (!key.noKeyPreview() && !mInGesture) {
|
||||
mDrawingProxy.showKeyPreview(this);
|
||||
}
|
||||
updatePressKeyGraphics(key);
|
||||
|
@ -446,6 +536,9 @@ public class PointerTracker {
|
|||
public long getDownTime() {
|
||||
return mDownTime;
|
||||
}
|
||||
public Rect getBoundingBox() {
|
||||
return mGestureStroke.getBoundingBox();
|
||||
}
|
||||
|
||||
private Key onDownKey(int x, int y, long eventTime) {
|
||||
mDownTime = eventTime;
|
||||
|
@ -469,6 +562,53 @@ public class PointerTracker {
|
|||
return newKey;
|
||||
}
|
||||
|
||||
private void startBatchInput() {
|
||||
if (DEBUG_LISTENER) {
|
||||
Log.d(TAG, "onStartBatchInput");
|
||||
}
|
||||
mInGesture = true;
|
||||
mListener.onStartBatchInput();
|
||||
}
|
||||
|
||||
private void updateBatchInput(InputPointers batchPoints) {
|
||||
if (DEBUG_LISTENER) {
|
||||
Log.d(TAG, "onUpdateBatchInput: batchPoints=" + batchPoints.getPointerSize());
|
||||
}
|
||||
mListener.onUpdateBatchInput(batchPoints);
|
||||
}
|
||||
|
||||
private void endBatchInput(InputPointers batchPoints) {
|
||||
if (DEBUG_LISTENER) {
|
||||
Log.d(TAG, "onEndBatchInput: batchPoints=" + batchPoints.getPointerSize());
|
||||
}
|
||||
mListener.onEndBatchInput(batchPoints);
|
||||
clearBatchInputRecognitionStateOfThisPointerTracker();
|
||||
clearBatchInputPointsOfAllPointerTrackers();
|
||||
sWasInGesture = true;
|
||||
}
|
||||
|
||||
private void abortBatchInput() {
|
||||
clearBatchInputRecognitionStateOfThisPointerTracker();
|
||||
clearBatchInputPointsOfAllPointerTrackers();
|
||||
}
|
||||
|
||||
private void clearBatchInputRecognitionStateOfThisPointerTracker() {
|
||||
mIsPossibleGesture = false;
|
||||
mInGesture = false;
|
||||
mLastRecognitionPointSize = 0;
|
||||
mLastRecognitionTime = 0;
|
||||
}
|
||||
|
||||
private boolean updateBatchInputRecognitionState(long eventTime, int size) {
|
||||
if (size > mLastRecognitionPointSize
|
||||
&& eventTime > mLastRecognitionTime + MIN_GESTURE_RECOGNITION_TIME) {
|
||||
mLastRecognitionPointSize = size;
|
||||
mLastRecognitionTime = eventTime;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void processMotionEvent(int action, int x, int y, long eventTime,
|
||||
KeyEventHandler handler) {
|
||||
switch (action) {
|
||||
|
@ -527,7 +667,15 @@ public class PointerTracker {
|
|||
}
|
||||
onDownEventInternal(x, y, eventTime);
|
||||
if (queue != null && queue.size() == 1) {
|
||||
sGestureTracker.onDownEvent(this, x, y, eventTime, key);
|
||||
mIsPossibleGesture = false;
|
||||
// A gesture should start only from the letter key.
|
||||
if (sIsGestureEnabled && mIsAlphabetKeyboard && !mIsShowingMoreKeysPanel && key != null
|
||||
&& Keyboard.isLetterCode(key.mCode)) {
|
||||
mIsPossibleGesture = true;
|
||||
// TODO: pointer times should be relative to first down even in entire batch input
|
||||
// instead of resetting to 0 for each new down event.
|
||||
mGestureStroke.addPoint(x, y, 0, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -563,6 +711,26 @@ public class PointerTracker {
|
|||
mIsInSlidingKeyInput = true;
|
||||
}
|
||||
|
||||
private void onGestureMoveEvent(PointerTracker tracker, int x, int y, long eventTime,
|
||||
boolean isHistorical, Key key) {
|
||||
final int gestureTime = (int)(eventTime - tracker.getDownTime());
|
||||
if (sIsGestureEnabled && mIsPossibleGesture) {
|
||||
final GestureStroke stroke = mGestureStroke;
|
||||
stroke.addPoint(x, y, gestureTime, isHistorical);
|
||||
if (!mInGesture && stroke.isStartOfAGesture(gestureTime, sWasInGesture)) {
|
||||
startBatchInput();
|
||||
}
|
||||
}
|
||||
|
||||
if (key != null && mInGesture) {
|
||||
final InputPointers batchPoints = getIncrementalBatchPoints();
|
||||
mDrawingProxy.showGestureTrail(this);
|
||||
if (updateBatchInputRecognitionState(eventTime, batchPoints.getPointerSize())) {
|
||||
updateBatchInput(batchPoints);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onMoveEvent(int x, int y, long eventTime, MotionEvent me) {
|
||||
if (DEBUG_MOVE_EVENT)
|
||||
printTouchEvent("onMoveEvent:", x, y, eventTime);
|
||||
|
@ -577,7 +745,7 @@ public class PointerTracker {
|
|||
final int historicalX = (int)me.getHistoricalX(pointerIndex, h);
|
||||
final int historicalY = (int)me.getHistoricalY(pointerIndex, h);
|
||||
final long historicalTime = me.getHistoricalEventTime(h);
|
||||
sGestureTracker.onMoveEvent(this, historicalX, historicalY, historicalTime,
|
||||
onGestureMoveEvent(this, historicalX, historicalY, historicalTime,
|
||||
true /* isHistorical */, null);
|
||||
}
|
||||
}
|
||||
|
@ -588,8 +756,8 @@ public class PointerTracker {
|
|||
Key key = onMoveKey(x, y);
|
||||
|
||||
// Register move event on gesture tracker.
|
||||
sGestureTracker.onMoveEvent(this, x, y, eventTime, false, key);
|
||||
if (sGestureTracker.isInGesture()) {
|
||||
onGestureMoveEvent(this, x, y, eventTime, false /* isHistorical */, key);
|
||||
if (mInGesture) {
|
||||
mIgnoreModifierKey = true;
|
||||
mTimerProxy.cancelLongPressTimer();
|
||||
mIsInSlidingKeyInput = true;
|
||||
|
@ -686,7 +854,7 @@ public class PointerTracker {
|
|||
|
||||
final PointerTrackerQueue queue = sPointerTrackerQueue;
|
||||
if (queue != null) {
|
||||
if (!sGestureTracker.isInGesture()) {
|
||||
if (!mInGesture) {
|
||||
if (mCurrentKey != null && mCurrentKey.isModifier()) {
|
||||
// Before processing an up event of modifier key, all pointers already being
|
||||
// tracked should be released.
|
||||
|
@ -720,23 +888,21 @@ public class PointerTracker {
|
|||
mIsShowingMoreKeysPanel = false;
|
||||
}
|
||||
|
||||
if (sGestureTracker.isInGesture()) {
|
||||
if (mInGesture) {
|
||||
// Register up event on gesture tracker.
|
||||
sGestureTracker.onUpEvent(this, x, y, eventTime);
|
||||
if (!sPointerTrackerQueue.isAnyInSlidingKeyInput()) {
|
||||
// TODO: Calls to beginBatchInput() is missing in this class. Reorganize the code.
|
||||
sGestureTracker.endBatchInput();
|
||||
}
|
||||
// TODO: Figure out how to deal with multiple fingers that are in gesture, sliding,
|
||||
// and/or tapping mode?
|
||||
endBatchInput(getAllBatchPoints());
|
||||
if (mCurrentKey != null) {
|
||||
callListenerOnRelease(mCurrentKey, mCurrentKey.mCode, true);
|
||||
mCurrentKey = null;
|
||||
}
|
||||
mCurrentKey = null;
|
||||
mDrawingProxy.showGestureTrail(this);
|
||||
return;
|
||||
} else {
|
||||
// TODO: Calls to beginBatchInput() is missing in this class. Reorganize the code.
|
||||
sGestureTracker.endBatchInput();
|
||||
}
|
||||
|
||||
// This event will be recognized as a regular code input. Clear unused batch points so they
|
||||
// are not mistakenly included in the next batch event.
|
||||
clearBatchInputPointsOfAllPointerTrackers();
|
||||
if (mKeyAlreadyProcessed)
|
||||
return;
|
||||
if (mCurrentKey != null && !mCurrentKey.isRepeatable()) {
|
||||
|
@ -745,11 +911,10 @@ public class PointerTracker {
|
|||
}
|
||||
|
||||
public void onShowMoreKeysPanel(int x, int y, KeyEventHandler handler) {
|
||||
abortBatchInput();
|
||||
onLongPressed();
|
||||
onDownEvent(x, y, SystemClock.uptimeMillis(), handler);
|
||||
mIsShowingMoreKeysPanel = true;
|
||||
// TODO: Calls to beginBatchInput() is missing in this class. Reorganize the code.
|
||||
sGestureTracker.abortBatchInput();
|
||||
onDownEvent(x, y, SystemClock.uptimeMillis(), handler);
|
||||
}
|
||||
|
||||
public void onLongPressed() {
|
||||
|
@ -784,7 +949,7 @@ public class PointerTracker {
|
|||
}
|
||||
|
||||
private void startRepeatKey(Key key) {
|
||||
if (key != null && key.isRepeatable() && !sGestureTracker.isInGesture()) {
|
||||
if (key != null && key.isRepeatable() && !mInGesture) {
|
||||
onRegisterKey(key);
|
||||
mTimerProxy.startKeyRepeatTimer(this);
|
||||
}
|
||||
|
@ -814,7 +979,7 @@ public class PointerTracker {
|
|||
}
|
||||
|
||||
private void startLongPressTimer(Key key) {
|
||||
if (key != null && key.isLongPressEnabled() && !sGestureTracker.isInGesture()) {
|
||||
if (key != null && key.isLongPressEnabled() && !mInGesture) {
|
||||
mTimerProxy.startLongPressTimer(this);
|
||||
}
|
||||
}
|
||||
|
@ -828,6 +993,7 @@ public class PointerTracker {
|
|||
int code = key.mCode;
|
||||
callListenerOnCodeInput(key, code, x, y);
|
||||
callListenerOnRelease(key, code, false);
|
||||
sWasInGesture = false;
|
||||
}
|
||||
|
||||
private void printTouchEvent(String title, int x, int y, long eventTime) {
|
||||
|
|
|
@ -22,9 +22,9 @@ import android.view.MotionEvent;
|
|||
|
||||
import com.android.inputmethod.latin.LatinImeLogger;
|
||||
import com.android.inputmethod.latin.R;
|
||||
import com.android.inputmethod.latin.ResearchLogger;
|
||||
import com.android.inputmethod.latin.Utils;
|
||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.research.ResearchLogger;
|
||||
|
||||
public class SuddenJumpingTouchEventHandler {
|
||||
private static final String TAG = SuddenJumpingTouchEventHandler.class.getSimpleName();
|
||||
|
@ -70,7 +70,7 @@ public class SuddenJumpingTouchEventHandler {
|
|||
* the sudden moves subside, a DOWN event is simulated for the second key.
|
||||
* @param me the motion event
|
||||
* @return true if the event was consumed, so that it doesn't continue to be handled by
|
||||
* {@link LatinKeyboardView}.
|
||||
* {@link MainKeyboardView}.
|
||||
*/
|
||||
private boolean handleSuddenJumping(MotionEvent me) {
|
||||
if (!mNeedsSuddenJumpingHack)
|
||||
|
|
|
@ -0,0 +1,205 @@
|
|||
/*
|
||||
* Copyright (C) 2012 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.keyboard.internal;
|
||||
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.util.FloatMath;
|
||||
|
||||
import com.android.inputmethod.latin.Constants;
|
||||
import com.android.inputmethod.latin.InputPointers;
|
||||
import com.android.inputmethod.latin.ResizableIntArray;
|
||||
|
||||
public class GestureStroke {
|
||||
public static final int DEFAULT_CAPACITY = 128;
|
||||
|
||||
private final int mPointerId;
|
||||
private final ResizableIntArray mEventTimes = new ResizableIntArray(DEFAULT_CAPACITY);
|
||||
private final ResizableIntArray mXCoordinates = new ResizableIntArray(DEFAULT_CAPACITY);
|
||||
private final ResizableIntArray mYCoordinates = new ResizableIntArray(DEFAULT_CAPACITY);
|
||||
private float mLength;
|
||||
private float mAngle;
|
||||
private int mIncrementalRecognitionSize;
|
||||
private int mLastIncrementalBatchSize;
|
||||
private long mLastPointTime;
|
||||
private int mLastPointX;
|
||||
private int mLastPointY;
|
||||
|
||||
private int mMinGestureLength;
|
||||
private int mMinGestureLengthWhileInGesture;
|
||||
private int mMinGestureSampleLength;
|
||||
private final Rect mDrawingRect = new Rect();
|
||||
|
||||
// TODO: Move some of these to resource.
|
||||
private static final float MIN_GESTURE_LENGTH_RATIO_TO_KEY_WIDTH = 1.0f;
|
||||
private static final float MIN_GESTURE_LENGTH_RATIO_TO_KEY_WIDTH_WHILE_IN_GESTURE = 0.5f;
|
||||
private static final int MIN_GESTURE_DURATION = 150; // msec
|
||||
private static final int MIN_GESTURE_DURATION_WHILE_IN_GESTURE = 75; // msec
|
||||
private static final float MIN_GESTURE_SAMPLING_RATIO_TO_KEY_HEIGHT = 1.0f / 6.0f;
|
||||
private static final float GESTURE_RECOG_SPEED_THRESHOLD = 0.4f; // dip/msec
|
||||
private static final float GESTURE_RECOG_CURVATURE_THRESHOLD = (float)(Math.PI / 4.0f);
|
||||
|
||||
private static final float DOUBLE_PI = (float)(2 * Math.PI);
|
||||
|
||||
// Fade based on number of gesture samples, see MIN_GESTURE_SAMPLING_RATIO_TO_KEY_HEIGHT
|
||||
private static final int DRAWING_GESTURE_FADE_START = 10;
|
||||
private static final int DRAWING_GESTURE_FADE_RATE = 6;
|
||||
|
||||
public GestureStroke(int pointerId) {
|
||||
mPointerId = pointerId;
|
||||
reset();
|
||||
}
|
||||
|
||||
public void setGestureSampleLength(final int keyWidth, final int keyHeight) {
|
||||
// TODO: Find an appropriate base metric for these length. Maybe diagonal length of the key?
|
||||
mMinGestureLength = (int)(keyWidth * MIN_GESTURE_LENGTH_RATIO_TO_KEY_WIDTH);
|
||||
mMinGestureLengthWhileInGesture = (int)(
|
||||
keyWidth * MIN_GESTURE_LENGTH_RATIO_TO_KEY_WIDTH_WHILE_IN_GESTURE);
|
||||
mMinGestureSampleLength = (int)(keyHeight * MIN_GESTURE_SAMPLING_RATIO_TO_KEY_HEIGHT);
|
||||
}
|
||||
|
||||
public boolean isStartOfAGesture(final int downDuration, final boolean wasInGesture) {
|
||||
// The tolerance of the time duration and the stroke length to detect the start of a
|
||||
// gesture stroke should be eased when the previous input was a gesture input.
|
||||
if (wasInGesture) {
|
||||
return downDuration > MIN_GESTURE_DURATION_WHILE_IN_GESTURE
|
||||
&& mLength > mMinGestureLengthWhileInGesture;
|
||||
}
|
||||
return downDuration > MIN_GESTURE_DURATION && mLength > mMinGestureLength;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
mLength = 0;
|
||||
mAngle = 0;
|
||||
mIncrementalRecognitionSize = 0;
|
||||
mLastIncrementalBatchSize = 0;
|
||||
mLastPointTime = 0;
|
||||
mEventTimes.setLength(0);
|
||||
mXCoordinates.setLength(0);
|
||||
mYCoordinates.setLength(0);
|
||||
mDrawingRect.setEmpty();
|
||||
}
|
||||
|
||||
private void updateLastPoint(final int x, final int y, final int time) {
|
||||
mLastPointTime = time;
|
||||
mLastPointX = x;
|
||||
mLastPointY = y;
|
||||
}
|
||||
|
||||
public void addPoint(final int x, final int y, final int time, final boolean isHistorical) {
|
||||
final int size = mEventTimes.getLength();
|
||||
if (size == 0) {
|
||||
mEventTimes.add(time);
|
||||
mXCoordinates.add(x);
|
||||
mYCoordinates.add(y);
|
||||
if (!isHistorical) {
|
||||
updateLastPoint(x, y, time);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
final int lastX = mXCoordinates.get(size - 1);
|
||||
final int lastY = mYCoordinates.get(size - 1);
|
||||
final float dist = getDistance(lastX, lastY, x, y);
|
||||
if (dist > mMinGestureSampleLength) {
|
||||
mEventTimes.add(time);
|
||||
mXCoordinates.add(x);
|
||||
mYCoordinates.add(y);
|
||||
mLength += dist;
|
||||
final float angle = getAngle(lastX, lastY, x, y);
|
||||
if (size > 1) {
|
||||
final float curvature = getAngleDiff(angle, mAngle);
|
||||
if (curvature > GESTURE_RECOG_CURVATURE_THRESHOLD) {
|
||||
if (size > mIncrementalRecognitionSize) {
|
||||
mIncrementalRecognitionSize = size;
|
||||
}
|
||||
}
|
||||
}
|
||||
mAngle = angle;
|
||||
}
|
||||
|
||||
if (!isHistorical) {
|
||||
final int duration = (int)(time - mLastPointTime);
|
||||
if (mLastPointTime != 0 && duration > 0) {
|
||||
final float speed = getDistance(mLastPointX, mLastPointY, x, y) / duration;
|
||||
if (speed < GESTURE_RECOG_SPEED_THRESHOLD) {
|
||||
mIncrementalRecognitionSize = size;
|
||||
}
|
||||
}
|
||||
updateLastPoint(x, y, time);
|
||||
}
|
||||
}
|
||||
|
||||
public void appendAllBatchPoints(final InputPointers out) {
|
||||
appendBatchPoints(out, mEventTimes.getLength());
|
||||
}
|
||||
|
||||
public void appendIncrementalBatchPoints(final InputPointers out) {
|
||||
appendBatchPoints(out, mIncrementalRecognitionSize);
|
||||
}
|
||||
|
||||
private void appendBatchPoints(final InputPointers out, final int size) {
|
||||
out.append(mPointerId, mEventTimes, mXCoordinates, mYCoordinates,
|
||||
mLastIncrementalBatchSize, size - mLastIncrementalBatchSize);
|
||||
mLastIncrementalBatchSize = size;
|
||||
}
|
||||
|
||||
private static float getDistance(final int p1x, final int p1y,
|
||||
final int p2x, final int p2y) {
|
||||
final float dx = p1x - p2x;
|
||||
final float dy = p1y - p2y;
|
||||
// TODO: Optimize out this {@link FloatMath#sqrt(float)} call.
|
||||
return FloatMath.sqrt(dx * dx + dy * dy);
|
||||
}
|
||||
|
||||
private static float getAngle(final int p1x, final int p1y, final int p2x, final int p2y) {
|
||||
final int dx = p1x - p2x;
|
||||
final int dy = p1y - p2y;
|
||||
if (dx == 0 && dy == 0) return 0;
|
||||
return (float)Math.atan2(dy, dx);
|
||||
}
|
||||
|
||||
private static float getAngleDiff(final float a1, final float a2) {
|
||||
final float diff = Math.abs(a1 - a2);
|
||||
if (diff > Math.PI) {
|
||||
return DOUBLE_PI - diff;
|
||||
}
|
||||
return diff;
|
||||
}
|
||||
|
||||
public void drawGestureTrail(Canvas canvas, Paint paint, int lastX, int lastY) {
|
||||
// TODO: These paint parameter interpolation should be tunable, possibly introduce an object
|
||||
// that implements an interface such as Paint getPaint(int step, int strokePoints)
|
||||
final int size = mXCoordinates.getLength();
|
||||
int[] xCoords = mXCoordinates.getPrimitiveArray();
|
||||
int[] yCoords = mYCoordinates.getPrimitiveArray();
|
||||
int alpha = Constants.Color.ALPHA_OPAQUE;
|
||||
for (int i = size - 1; i > 0 && alpha > 0; i--) {
|
||||
paint.setAlpha(alpha);
|
||||
if (size - i > DRAWING_GESTURE_FADE_START) {
|
||||
alpha -= DRAWING_GESTURE_FADE_RATE;
|
||||
}
|
||||
canvas.drawLine(xCoords[i - 1], yCoords[i - 1], xCoords[i], yCoords[i], paint);
|
||||
if (i == size - 1) {
|
||||
canvas.drawLine(lastX, lastY, xCoords[i], yCoords[i], paint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Rect getBoundingBox() {
|
||||
return mDrawingRect;
|
||||
}
|
||||
}
|
|
@ -1,326 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2012 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.keyboard.internal;
|
||||
|
||||
import android.util.Log;
|
||||
import android.util.SparseArray;
|
||||
|
||||
import com.android.inputmethod.keyboard.Key;
|
||||
import com.android.inputmethod.keyboard.Keyboard;
|
||||
import com.android.inputmethod.keyboard.KeyboardActionListener;
|
||||
import com.android.inputmethod.keyboard.PointerTracker;
|
||||
import com.android.inputmethod.latin.InputPointers;
|
||||
import com.android.inputmethod.latin.SuggestedWords;
|
||||
|
||||
// TODO: Remove this class by consolidating with PointerTracker
|
||||
public class GestureTracker {
|
||||
private static final String TAG = GestureTracker.class.getSimpleName();
|
||||
private static final boolean DEBUG_LISTENER = false;
|
||||
|
||||
// TODO: There should be an option to turn on/off the gesture input.
|
||||
private static final boolean GESTURE_ON = true;
|
||||
|
||||
private static final GestureTracker sInstance = new GestureTracker();
|
||||
|
||||
private static final int MIN_RECOGNITION_TIME = 100;
|
||||
private static final int MIN_GESTURE_DURATION = 200;
|
||||
|
||||
private static final float GESTURE_RECOG_SPEED_THRESHOLD = 0.4f;
|
||||
private static final float SQUARED_GESTURE_RECOG_SPEED_THRESHOLD =
|
||||
GESTURE_RECOG_SPEED_THRESHOLD * GESTURE_RECOG_SPEED_THRESHOLD;
|
||||
private static final float GESTURE_RECOG_CURVATURE_THRESHOLD = (float) (Math.PI / 4);
|
||||
|
||||
private boolean mIsAlphabetKeyboard;
|
||||
private boolean mIsPossibleGesture = false;
|
||||
private boolean mInGesture = false;
|
||||
|
||||
private KeyboardActionListener mListener;
|
||||
private SuggestedWords mSuggestions;
|
||||
|
||||
private final SparseArray<GestureStroke> mGestureStrokes = new SparseArray<GestureStroke>();
|
||||
|
||||
private int mLastRecognitionPointSize = 0;
|
||||
private long mLastRecognitionTime = 0;
|
||||
|
||||
public static void init(KeyboardActionListener listner) {
|
||||
sInstance.mListener = listner;
|
||||
}
|
||||
|
||||
public static GestureTracker getInstance() {
|
||||
return sInstance;
|
||||
}
|
||||
|
||||
private GestureTracker() {
|
||||
}
|
||||
|
||||
public void setKeyboard(Keyboard keyboard) {
|
||||
mIsAlphabetKeyboard = keyboard.mId.isAlphabetKeyboard();
|
||||
GestureStroke.setGestureSampleLength(keyboard.mMostCommonKeyWidth / 2,
|
||||
keyboard.mMostCommonKeyHeight / 6);
|
||||
}
|
||||
|
||||
private void startBatchInput() {
|
||||
if (DEBUG_LISTENER) {
|
||||
Log.d(TAG, "onStartBatchInput");
|
||||
}
|
||||
mInGesture = true;
|
||||
mListener.onStartBatchInput();
|
||||
mSuggestions = null;
|
||||
}
|
||||
|
||||
// TODO: The corresponding startBatchInput() is a private method. Reorganize the code.
|
||||
public void endBatchInput() {
|
||||
if (isInGesture() && mSuggestions != null && mSuggestions.size() > 0) {
|
||||
final CharSequence text = mSuggestions.getWord(0);
|
||||
if (DEBUG_LISTENER) {
|
||||
Log.d(TAG, "onEndBatchInput: text=" + text);
|
||||
}
|
||||
mListener.onEndBatchInput(text);
|
||||
}
|
||||
mInGesture = false;
|
||||
clearBatchInputPoints();
|
||||
}
|
||||
|
||||
public void abortBatchInput() {
|
||||
mIsPossibleGesture = false;
|
||||
mInGesture = false;
|
||||
}
|
||||
|
||||
public boolean isInGesture() {
|
||||
return mInGesture;
|
||||
}
|
||||
|
||||
public void onDownEvent(PointerTracker tracker, int x, int y, long eventTime, Key key) {
|
||||
mIsPossibleGesture = false;
|
||||
// A gesture should start only from the letter key.
|
||||
if (GESTURE_ON && mIsAlphabetKeyboard && key != null && Keyboard.isLetterCode(key.mCode)) {
|
||||
mIsPossibleGesture = true;
|
||||
addPointToStroke(x, y, 0, tracker.mPointerId, false);
|
||||
}
|
||||
}
|
||||
|
||||
public void onMoveEvent(PointerTracker tracker, int x, int y, long eventTime,
|
||||
boolean isHistorical, Key key) {
|
||||
final int gestureTime = (int)(eventTime - tracker.getDownTime());
|
||||
if (GESTURE_ON && mIsPossibleGesture) {
|
||||
final GestureStroke stroke = addPointToStroke(x, y, gestureTime, tracker.mPointerId,
|
||||
isHistorical);
|
||||
if (!isInGesture() && stroke.isStartOfAGesture(gestureTime)) {
|
||||
startBatchInput();
|
||||
}
|
||||
}
|
||||
|
||||
if (key != null && isInGesture()) {
|
||||
final InputPointers batchPoints = getIncrementalBatchPoints();
|
||||
if (updateBatchInputRecognitionState(eventTime, batchPoints.getPointerSize())) {
|
||||
if (DEBUG_LISTENER) {
|
||||
Log.d(TAG, "onUpdateBatchInput: batchPoints=" + batchPoints.getPointerSize());
|
||||
}
|
||||
mSuggestions = mListener.onUpdateBatchInput(batchPoints);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onUpEvent(PointerTracker tracker, int x, int y, long eventTime) {
|
||||
if (isInGesture()) {
|
||||
final InputPointers batchPoints = getAllBatchPoints();
|
||||
if (DEBUG_LISTENER) {
|
||||
Log.d(TAG, "onUpdateBatchInput: batchPoints=" + batchPoints.getPointerSize());
|
||||
}
|
||||
mSuggestions = mListener.onUpdateBatchInput(batchPoints);
|
||||
}
|
||||
}
|
||||
|
||||
private GestureStroke addPointToStroke(int x, int y, int time, int pointerId,
|
||||
boolean isHistorical) {
|
||||
GestureStroke stroke = mGestureStrokes.get(pointerId);
|
||||
if (stroke == null) {
|
||||
stroke = new GestureStroke(pointerId);
|
||||
mGestureStrokes.put(pointerId, stroke);
|
||||
}
|
||||
stroke.addPoint(x, y, time, isHistorical);
|
||||
return stroke;
|
||||
}
|
||||
|
||||
// The working and return object of the following methods, {@link #getIncrementalBatchPoints()}
|
||||
// and {@link #getAllBatchPoints()}.
|
||||
private final InputPointers mAggregatedPointers = new InputPointers();
|
||||
|
||||
private InputPointers getIncrementalBatchPoints() {
|
||||
final InputPointers pointers = mAggregatedPointers;
|
||||
pointers.reset();
|
||||
final int strokeSize = mGestureStrokes.size();
|
||||
for (int index = 0; index < strokeSize; index++) {
|
||||
final GestureStroke stroke = mGestureStrokes.valueAt(index);
|
||||
stroke.appendIncrementalBatchPoints(pointers);
|
||||
}
|
||||
return pointers;
|
||||
}
|
||||
|
||||
private InputPointers getAllBatchPoints() {
|
||||
final InputPointers pointers = mAggregatedPointers;
|
||||
pointers.reset();
|
||||
final int strokeSize = mGestureStrokes.size();
|
||||
for (int index = 0; index < strokeSize; index++) {
|
||||
final GestureStroke stroke = mGestureStrokes.valueAt(index);
|
||||
stroke.appendAllBatchPoints(pointers);
|
||||
}
|
||||
return pointers;
|
||||
}
|
||||
|
||||
private void clearBatchInputPoints() {
|
||||
final int strokeSize = mGestureStrokes.size();
|
||||
for (int index = 0; index < strokeSize; index++) {
|
||||
final GestureStroke stroke = mGestureStrokes.valueAt(index);
|
||||
stroke.reset();
|
||||
}
|
||||
mLastRecognitionPointSize = 0;
|
||||
mLastRecognitionTime = 0;
|
||||
}
|
||||
|
||||
private boolean updateBatchInputRecognitionState(long eventTime, int size) {
|
||||
if (size > mLastRecognitionPointSize
|
||||
&& eventTime > mLastRecognitionTime + MIN_RECOGNITION_TIME) {
|
||||
mLastRecognitionPointSize = size;
|
||||
mLastRecognitionTime = eventTime;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static class GestureStroke {
|
||||
private final int mPointerId;
|
||||
private final InputPointers mInputPointers = new InputPointers();
|
||||
private float mLength;
|
||||
private float mAngle;
|
||||
private int mIncrementalRecognitionPoint;
|
||||
private boolean mHasSharpCorner;
|
||||
private long mLastPointTime;
|
||||
private int mLastPointX;
|
||||
private int mLastPointY;
|
||||
|
||||
private static int sMinGestureLength;
|
||||
private static int sSquaredGestureSampleLength;
|
||||
|
||||
private static final float DOUBLE_PI = (float)(2 * Math.PI);
|
||||
|
||||
public static void setGestureSampleLength(final int minGestureLength,
|
||||
final int sampleLength) {
|
||||
sMinGestureLength = minGestureLength;
|
||||
sSquaredGestureSampleLength = sampleLength * sampleLength;
|
||||
}
|
||||
|
||||
public GestureStroke(int pointerId) {
|
||||
mPointerId = pointerId;
|
||||
reset();
|
||||
}
|
||||
|
||||
public boolean isStartOfAGesture(int downDuration) {
|
||||
return downDuration > MIN_GESTURE_DURATION / 2 && mLength > sMinGestureLength / 2;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
mLength = 0;
|
||||
mAngle = 0;
|
||||
mIncrementalRecognitionPoint = 0;
|
||||
mHasSharpCorner = false;
|
||||
mLastPointTime = 0;
|
||||
mInputPointers.reset();
|
||||
}
|
||||
|
||||
private void updateLastPoint(final int x, final int y, final int time) {
|
||||
mLastPointTime = time;
|
||||
mLastPointX = x;
|
||||
mLastPointY = y;
|
||||
}
|
||||
|
||||
public void addPoint(final int x, final int y, final int time, final boolean isHistorical) {
|
||||
final int size = mInputPointers.getPointerSize();
|
||||
if (size == 0) {
|
||||
mInputPointers.addPointer(x, y, mPointerId, time);
|
||||
if (!isHistorical) {
|
||||
updateLastPoint(x, y, time);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
final int[] xCoords = mInputPointers.getXCoordinates();
|
||||
final int[] yCoords = mInputPointers.getYCoordinates();
|
||||
final int lastX = xCoords[size - 1];
|
||||
final int lastY = yCoords[size - 1];
|
||||
final float dist = squaredDistance(lastX, lastY, x, y);
|
||||
if (dist > sSquaredGestureSampleLength) {
|
||||
mInputPointers.addPointer(x, y, mPointerId, time);
|
||||
mLength += dist;
|
||||
final float angle = angle(lastX, lastY, x, y);
|
||||
if (size > 1) {
|
||||
float curvature = getAngleDiff(angle, mAngle);
|
||||
if (curvature > GESTURE_RECOG_CURVATURE_THRESHOLD) {
|
||||
if (size > mIncrementalRecognitionPoint) {
|
||||
mIncrementalRecognitionPoint = size;
|
||||
}
|
||||
mHasSharpCorner = true;
|
||||
}
|
||||
if (!mHasSharpCorner) {
|
||||
mIncrementalRecognitionPoint = size;
|
||||
}
|
||||
}
|
||||
mAngle = angle;
|
||||
}
|
||||
|
||||
if (!isHistorical) {
|
||||
final int duration = (int)(time - mLastPointTime);
|
||||
if (mLastPointTime != 0 && duration > 0) {
|
||||
final int squaredDuration = duration * duration;
|
||||
final float squaredSpeed =
|
||||
squaredDistance(mLastPointX, mLastPointY, x, y) / squaredDuration;
|
||||
if (squaredSpeed < SQUARED_GESTURE_RECOG_SPEED_THRESHOLD) {
|
||||
mIncrementalRecognitionPoint = size;
|
||||
}
|
||||
}
|
||||
updateLastPoint(x, y, time);
|
||||
}
|
||||
}
|
||||
|
||||
private float getAngleDiff(float a1, float a2) {
|
||||
final float diff = Math.abs(a1 - a2);
|
||||
if (diff > Math.PI) {
|
||||
return DOUBLE_PI - diff;
|
||||
}
|
||||
return diff;
|
||||
}
|
||||
|
||||
public void appendAllBatchPoints(InputPointers out) {
|
||||
out.append(mInputPointers, 0, mInputPointers.getPointerSize());
|
||||
}
|
||||
|
||||
public void appendIncrementalBatchPoints(InputPointers out) {
|
||||
out.append(mInputPointers, 0, mIncrementalRecognitionPoint);
|
||||
}
|
||||
}
|
||||
|
||||
static float squaredDistance(int p1x, int p1y, int p2x, int p2y) {
|
||||
final float dx = p1x - p2x;
|
||||
final float dy = p1y - p2y;
|
||||
return dx * dx + dy * dy;
|
||||
}
|
||||
|
||||
static float angle(int p1x, int p1y, int p2x, int p2y) {
|
||||
final int dx = p1x - p2x;
|
||||
final int dy = p1y - p2y;
|
||||
if (dx == 0 && dy == 0) return 0;
|
||||
return (float)Math.atan2(dy, dx);
|
||||
}
|
||||
}
|
|
@ -19,6 +19,13 @@ package com.android.inputmethod.latin;
|
|||
import android.view.inputmethod.EditorInfo;
|
||||
|
||||
public final class Constants {
|
||||
public static final class Color {
|
||||
/**
|
||||
* The alpha value for fully opaque.
|
||||
*/
|
||||
public final static int ALPHA_OPAQUE = 255;
|
||||
}
|
||||
|
||||
public static final class ImeOption {
|
||||
/**
|
||||
* The private IME option used to indicate that no microphone should be shown for a given
|
||||
|
|
|
@ -90,6 +90,13 @@ public class ImfUtils {
|
|||
return false;
|
||||
}
|
||||
|
||||
public static InputMethodSubtype getCurrentInputMethodSubtype(Context context,
|
||||
InputMethodSubtype defaultSubtype) {
|
||||
final InputMethodManager imm = getInputMethodManager(context);
|
||||
final InputMethodSubtype currentSubtype = imm.getCurrentInputMethodSubtype();
|
||||
return (currentSubtype != null) ? currentSubtype : defaultSubtype;
|
||||
}
|
||||
|
||||
public static boolean hasMultipleEnabledIMEsOrSubtypes(Context context,
|
||||
final boolean shouldIncludeAuxiliarySubtypes) {
|
||||
final InputMethodManager imm = getInputMethodManager(context);
|
||||
|
|
|
@ -63,7 +63,7 @@ public class InputAttributes {
|
|||
final boolean flagAutoComplete =
|
||||
0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE);
|
||||
|
||||
// Make sure that passwords are not displayed in {@link SuggestionsView}.
|
||||
// Make sure that passwords are not displayed in {@link SuggestionStripView}.
|
||||
if (InputTypeUtils.isPasswordInputType(inputType)
|
||||
|| InputTypeUtils.isVisiblePasswordInputType(inputType)
|
||||
|| InputTypeUtils.isEmailVariation(variation)
|
||||
|
|
|
@ -16,14 +16,21 @@
|
|||
|
||||
package com.android.inputmethod.latin;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
// TODO: This class is not thread-safe.
|
||||
public class InputPointers {
|
||||
private final ScalableIntArray mXCoordinates = new ScalableIntArray();
|
||||
private final ScalableIntArray mYCoordinates = new ScalableIntArray();
|
||||
private final ScalableIntArray mPointerIds = new ScalableIntArray();
|
||||
private final ScalableIntArray mTimes = new ScalableIntArray();
|
||||
private final int mDefaultCapacity;
|
||||
private final ResizableIntArray mXCoordinates;
|
||||
private final ResizableIntArray mYCoordinates;
|
||||
private final ResizableIntArray mPointerIds;
|
||||
private final ResizableIntArray mTimes;
|
||||
|
||||
public InputPointers(int defaultCapacity) {
|
||||
mDefaultCapacity = defaultCapacity;
|
||||
mXCoordinates = new ResizableIntArray(defaultCapacity);
|
||||
mYCoordinates = new ResizableIntArray(defaultCapacity);
|
||||
mPointerIds = new ResizableIntArray(defaultCapacity);
|
||||
mTimes = new ResizableIntArray(defaultCapacity);
|
||||
}
|
||||
|
||||
public void addPointer(int index, int x, int y, int pointerId, int time) {
|
||||
mXCoordinates.add(index, x);
|
||||
|
@ -60,17 +67,42 @@ public class InputPointers {
|
|||
* @param length the number of pointers to be appended.
|
||||
*/
|
||||
public void append(InputPointers src, int startPos, int length) {
|
||||
if (length == 0) {
|
||||
return;
|
||||
}
|
||||
mXCoordinates.append(src.mXCoordinates, startPos, length);
|
||||
mYCoordinates.append(src.mYCoordinates, startPos, length);
|
||||
mPointerIds.append(src.mPointerIds, startPos, length);
|
||||
mTimes.append(src.mTimes, startPos, length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Append the times, x-coordinates and y-coordinates in the specified {@link ResizableIntArray}
|
||||
* to the end of this.
|
||||
* @param pointerId the pointer id of the source.
|
||||
* @param times the source {@link ResizableIntArray} to read the event times from.
|
||||
* @param xCoordinates the source {@link ResizableIntArray} to read the x-coordinates from.
|
||||
* @param yCoordinates the source {@link ResizableIntArray} to read the y-coordinates from.
|
||||
* @param startPos the starting index of the data in {@code times} and etc.
|
||||
* @param length the number of data to be appended.
|
||||
*/
|
||||
public void append(int pointerId, ResizableIntArray times, ResizableIntArray xCoordinates,
|
||||
ResizableIntArray yCoordinates, int startPos, int length) {
|
||||
if (length == 0) {
|
||||
return;
|
||||
}
|
||||
mXCoordinates.append(xCoordinates, startPos, length);
|
||||
mYCoordinates.append(yCoordinates, startPos, length);
|
||||
mPointerIds.fill(pointerId, startPos, length);
|
||||
mTimes.append(times, startPos, length);
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
mXCoordinates.reset();
|
||||
mYCoordinates.reset();
|
||||
mPointerIds.reset();
|
||||
mTimes.reset();
|
||||
final int defaultCapacity = mDefaultCapacity;
|
||||
mXCoordinates.reset(defaultCapacity);
|
||||
mYCoordinates.reset(defaultCapacity);
|
||||
mPointerIds.reset(defaultCapacity);
|
||||
mTimes.reset(defaultCapacity);
|
||||
}
|
||||
|
||||
public int getPointerSize() {
|
||||
|
@ -92,73 +124,4 @@ public class InputPointers {
|
|||
public int[] getTimes() {
|
||||
return mTimes.getPrimitiveArray();
|
||||
}
|
||||
|
||||
private static class ScalableIntArray {
|
||||
private static final int DEFAULT_SIZE = BinaryDictionary.MAX_WORD_LENGTH;
|
||||
private int[] mArray;
|
||||
private int mLength;
|
||||
|
||||
public ScalableIntArray() {
|
||||
reset();
|
||||
}
|
||||
|
||||
public void add(int index, int val) {
|
||||
if (mLength < index + 1) {
|
||||
mLength = index;
|
||||
add(val);
|
||||
} else {
|
||||
mArray[index] = val;
|
||||
}
|
||||
}
|
||||
|
||||
public void add(int val) {
|
||||
final int nextLength = mLength + 1;
|
||||
ensureCapacity(nextLength);
|
||||
mArray[mLength] = val;
|
||||
mLength = nextLength;
|
||||
}
|
||||
|
||||
private void ensureCapacity(int minimumCapacity) {
|
||||
if (mArray.length < minimumCapacity) {
|
||||
final int nextCapacity = mArray.length * 2;
|
||||
// The following is the same as newLength = Math.max(minimumCapacity, nextCapacity);
|
||||
final int newLength = minimumCapacity > nextCapacity
|
||||
? minimumCapacity
|
||||
: nextCapacity;
|
||||
mArray = Arrays.copyOf(mArray, newLength);
|
||||
}
|
||||
}
|
||||
|
||||
public int getLength() {
|
||||
return mLength;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
mArray = new int[DEFAULT_SIZE];
|
||||
mLength = 0;
|
||||
}
|
||||
|
||||
public int[] getPrimitiveArray() {
|
||||
return mArray;
|
||||
}
|
||||
|
||||
public void set(ScalableIntArray ip) {
|
||||
mArray = ip.mArray;
|
||||
mLength = ip.mLength;
|
||||
}
|
||||
|
||||
public void copy(ScalableIntArray ip) {
|
||||
ensureCapacity(ip.mLength);
|
||||
System.arraycopy(ip.mArray, 0, mArray, 0, ip.mLength);
|
||||
mLength = ip.mLength;
|
||||
}
|
||||
|
||||
public void append(ScalableIntArray src, int startPos, int length) {
|
||||
final int currentLength = mLength;
|
||||
final int newLength = currentLength + length;
|
||||
ensureCapacity(newLength);
|
||||
System.arraycopy(src.mArray, startPos, mArray, currentLength, length);
|
||||
mLength = newLength;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ import android.view.View;
|
|||
import android.widget.LinearLayout;
|
||||
|
||||
public class InputView extends LinearLayout {
|
||||
private View mSuggestionsContainer;
|
||||
private View mSuggestionStripContainer;
|
||||
private View mKeyboardView;
|
||||
private int mKeyboardTopPadding;
|
||||
|
||||
|
@ -43,13 +43,13 @@ public class InputView extends LinearLayout {
|
|||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
mSuggestionsContainer = findViewById(R.id.suggestions_container);
|
||||
mSuggestionStripContainer = findViewById(R.id.suggestions_container);
|
||||
mKeyboardView = findViewById(R.id.keyboard_view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchTouchEvent(MotionEvent me) {
|
||||
if (mSuggestionsContainer.getVisibility() == VISIBLE
|
||||
if (mSuggestionStripContainer.getVisibility() == VISIBLE
|
||||
&& mKeyboardView.getVisibility() == VISIBLE
|
||||
&& forwardTouchEvent(me)) {
|
||||
return true;
|
||||
|
@ -57,7 +57,8 @@ public class InputView extends LinearLayout {
|
|||
return super.dispatchTouchEvent(me);
|
||||
}
|
||||
|
||||
// The touch events that hit the top padding of keyboard should be forwarded to SuggestionsView.
|
||||
// The touch events that hit the top padding of keyboard should be forwarded to
|
||||
// {@link SuggestionStripView}.
|
||||
private boolean forwardTouchEvent(MotionEvent me) {
|
||||
final Rect rect = mInputViewRect;
|
||||
this.getGlobalVisibleRect(rect);
|
||||
|
@ -96,7 +97,7 @@ public class InputView extends LinearLayout {
|
|||
}
|
||||
|
||||
final Rect receivingRect = mEventReceivingRect;
|
||||
mSuggestionsContainer.getGlobalVisibleRect(receivingRect);
|
||||
mSuggestionStripContainer.getGlobalVisibleRect(receivingRect);
|
||||
final int translatedX = x - receivingRect.left;
|
||||
final int translatedY;
|
||||
if (y < forwardingLimitY) {
|
||||
|
@ -106,7 +107,7 @@ public class InputView extends LinearLayout {
|
|||
translatedY = y - receivingRect.top;
|
||||
}
|
||||
me.setLocation(translatedX, translatedY);
|
||||
mSuggestionsContainer.dispatchTouchEvent(me);
|
||||
mSuggestionStripContainer.dispatchTouchEvent(me);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ public class LastComposedWord {
|
|||
public final String mCommittedWord;
|
||||
public final int mSeparatorCode;
|
||||
public final CharSequence mPrevWord;
|
||||
public final InputPointers mInputPointers = new InputPointers();
|
||||
public final InputPointers mInputPointers = new InputPointers(BinaryDictionary.MAX_WORD_LENGTH);
|
||||
|
||||
private boolean mActive;
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ import static com.android.inputmethod.latin.Constants.ImeOption.FORCE_ASCII;
|
|||
import static com.android.inputmethod.latin.Constants.ImeOption.NO_MICROPHONE;
|
||||
import static com.android.inputmethod.latin.Constants.ImeOption.NO_MICROPHONE_COMPAT;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
|
@ -38,7 +39,6 @@ import android.os.Debug;
|
|||
import android.os.IBinder;
|
||||
import android.os.Message;
|
||||
import android.os.SystemClock;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.text.InputType;
|
||||
import android.text.TextUtils;
|
||||
|
@ -67,10 +67,11 @@ import com.android.inputmethod.keyboard.KeyboardActionListener;
|
|||
import com.android.inputmethod.keyboard.KeyboardId;
|
||||
import com.android.inputmethod.keyboard.KeyboardSwitcher;
|
||||
import com.android.inputmethod.keyboard.KeyboardView;
|
||||
import com.android.inputmethod.keyboard.LatinKeyboardView;
|
||||
import com.android.inputmethod.keyboard.MainKeyboardView;
|
||||
import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
|
||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.latin.suggestions.SuggestionsView;
|
||||
import com.android.inputmethod.latin.suggestions.SuggestionStripView;
|
||||
import com.android.inputmethod.research.ResearchLogger;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
|
@ -81,7 +82,7 @@ import java.util.Locale;
|
|||
* Input method implementation for Qwerty'ish keyboard.
|
||||
*/
|
||||
public class LatinIME extends InputMethodService implements KeyboardActionListener,
|
||||
SuggestionsView.Listener, TargetApplicationGetter.OnTargetApplicationKnownListener {
|
||||
SuggestionStripView.Listener, TargetApplicationGetter.OnTargetApplicationKnownListener {
|
||||
private static final String TAG = LatinIME.class.getSimpleName();
|
||||
private static final boolean TRACE = false;
|
||||
private static boolean DEBUG;
|
||||
|
@ -125,7 +126,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
private View mExtractArea;
|
||||
private View mKeyPreviewBackingView;
|
||||
private View mSuggestionsContainer;
|
||||
private SuggestionsView mSuggestionsView;
|
||||
private SuggestionStripView mSuggestionStripView;
|
||||
/* package for tests */ Suggest mSuggest;
|
||||
private CompletionInfo[] mApplicationSpecifiedCompletions;
|
||||
private ApplicationInfo mTargetApplicationInfo;
|
||||
|
@ -205,7 +206,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
final KeyboardSwitcher switcher = latinIme.mKeyboardSwitcher;
|
||||
switch (msg.what) {
|
||||
case MSG_UPDATE_SUGGESTION_STRIP:
|
||||
latinIme.updateSuggestionsOrPredictions();
|
||||
latinIme.updateSuggestionStrip();
|
||||
break;
|
||||
case MSG_UPDATE_SHIFT_STATE:
|
||||
switcher.updateShiftState();
|
||||
|
@ -548,9 +549,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
.findViewById(android.R.id.extractArea);
|
||||
mKeyPreviewBackingView = view.findViewById(R.id.key_preview_backing);
|
||||
mSuggestionsContainer = view.findViewById(R.id.suggestions_container);
|
||||
mSuggestionsView = (SuggestionsView) view.findViewById(R.id.suggestions_view);
|
||||
if (mSuggestionsView != null)
|
||||
mSuggestionsView.setListener(this, view);
|
||||
mSuggestionStripView = (SuggestionStripView)view.findViewById(R.id.suggestion_strip_view);
|
||||
if (mSuggestionStripView != null)
|
||||
mSuggestionStripView.setListener(this, view);
|
||||
if (LatinImeLogger.sVISUALDEBUG) {
|
||||
mKeyPreviewBackingView.setBackgroundColor(0x10FF0000);
|
||||
}
|
||||
|
@ -597,7 +598,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
private void onStartInputViewInternal(EditorInfo editorInfo, boolean restarting) {
|
||||
super.onStartInputView(editorInfo, restarting);
|
||||
final KeyboardSwitcher switcher = mKeyboardSwitcher;
|
||||
LatinKeyboardView inputView = switcher.getKeyboardView();
|
||||
MainKeyboardView inputView = switcher.getKeyboardView();
|
||||
|
||||
if (editorInfo == null) {
|
||||
Log.e(TAG, "Null EditorInfo in onStartInputView()");
|
||||
|
@ -618,7 +619,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
+ ((editorInfo.inputType & InputType.TYPE_TEXT_FLAG_CAP_WORDS) != 0));
|
||||
}
|
||||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
ResearchLogger.getInstance().start();
|
||||
ResearchLogger.latinIME_onStartInputViewInternal(editorInfo, mPrefs);
|
||||
}
|
||||
if (InputAttributes.inPrivateImeOptions(null, NO_MICROPHONE_COMPAT, editorInfo)) {
|
||||
|
@ -674,8 +674,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
|
||||
switcher.loadKeyboard(editorInfo, mCurrentSettings);
|
||||
|
||||
if (mSuggestionsView != null)
|
||||
mSuggestionsView.clear();
|
||||
if (mSuggestionStripView != null)
|
||||
mSuggestionStripView.clear();
|
||||
setSuggestionStripShownInternal(
|
||||
isSuggestionsStripVisible(), /* needsInputViewShown */ false);
|
||||
|
||||
|
@ -711,7 +711,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
|
||||
LatinImeLogger.commit();
|
||||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
ResearchLogger.getInstance().stop();
|
||||
ResearchLogger.getInstance().latinIME_onFinishInputInternal();
|
||||
}
|
||||
|
||||
KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
|
||||
|
@ -862,7 +862,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
if (!mCurrentSettings.isApplicationSpecifiedCompletionsOn()) return;
|
||||
mApplicationSpecifiedCompletions = applicationSpecifiedCompletions;
|
||||
if (applicationSpecifiedCompletions == null) {
|
||||
clearSuggestions();
|
||||
clearSuggestionStrip();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -878,7 +878,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
false /* isPrediction */);
|
||||
// When in fullscreen mode, show completions generated by the application
|
||||
final boolean isAutoCorrection = false;
|
||||
setSuggestions(suggestedWords, isAutoCorrection);
|
||||
setSuggestionStrip(suggestedWords, isAutoCorrection);
|
||||
setAutoCorrectionIndicator(isAutoCorrection);
|
||||
// TODO: is this the right thing to do? What should we auto-correct to in
|
||||
// this case? This says to keep whatever the user typed.
|
||||
|
@ -889,7 +889,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
private void setSuggestionStripShownInternal(boolean shown, boolean needsInputViewShown) {
|
||||
// TODO: Modify this if we support suggestions with hard keyboard
|
||||
if (onEvaluateInputViewShown() && mSuggestionsContainer != null) {
|
||||
final LatinKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
|
||||
final MainKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
|
||||
final boolean inputViewShown = (keyboardView != null) ? keyboardView.isShown() : false;
|
||||
final boolean shouldShowSuggestions = shown
|
||||
&& (needsInputViewShown ? inputViewShown : true);
|
||||
|
@ -927,7 +927,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
- keyboardHeight;
|
||||
|
||||
final LayoutParams params = mKeyPreviewBackingView.getLayoutParams();
|
||||
params.height = mSuggestionsView.setMoreSuggestionsHeight(remainingHeight);
|
||||
params.height = mSuggestionStripView.setMoreSuggestionsHeight(remainingHeight);
|
||||
mKeyPreviewBackingView.setLayoutParams(params);
|
||||
return params.height;
|
||||
}
|
||||
|
@ -950,7 +950,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
final int extraHeight = extractHeight + backingHeight + suggestionsHeight;
|
||||
int touchY = extraHeight;
|
||||
// Need to set touchable region only if input view is being shown
|
||||
final LatinKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
|
||||
final MainKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
|
||||
if (keyboardView != null && keyboardView.isShown()) {
|
||||
if (mSuggestionsContainer.getVisibility() == View.VISIBLE) {
|
||||
touchY -= suggestionsHeight;
|
||||
|
@ -988,7 +988,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
// the composing word, reset the last composed word, tell the inputconnection about it.
|
||||
private void resetEntireInputState() {
|
||||
resetComposingState(true /* alsoResetLastComposedWord */);
|
||||
clearSuggestions();
|
||||
clearSuggestionStrip();
|
||||
mConnection.finishComposingText();
|
||||
}
|
||||
|
||||
|
@ -1011,7 +1011,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
LastComposedWord.COMMIT_TYPE_USER_TYPED_WORD, typedWord.toString(),
|
||||
separatorCode, prevWord);
|
||||
}
|
||||
updateSuggestionsOrPredictions();
|
||||
updateSuggestionStrip();
|
||||
}
|
||||
|
||||
// Called from the KeyboardSwitcher which needs to know auto caps state to display
|
||||
|
@ -1091,7 +1091,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
|| codePoint == Keyboard.CODE_CLOSING_ANGLE_BRACKET;
|
||||
}
|
||||
|
||||
// Callback for the SuggestionsView, to call when the "add to dictionary" hint is pressed.
|
||||
// Callback for the {@link SuggestionStripView}, to call when the "add to dictionary" hint is
|
||||
// pressed.
|
||||
@Override
|
||||
public boolean addWordToUserDictionary(String word) {
|
||||
mUserDictionary.addWordToUserDictionary(word, 128);
|
||||
|
@ -1329,13 +1330,24 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
}
|
||||
|
||||
@Override
|
||||
public SuggestedWords onUpdateBatchInput(InputPointers batchPointers) {
|
||||
public void onUpdateBatchInput(InputPointers batchPointers) {
|
||||
mWordComposer.setBatchInputPointers(batchPointers);
|
||||
return updateSuggestionsOrPredictions();
|
||||
final SuggestedWords suggestedWords = getSuggestedWords();
|
||||
showSuggestionStrip(suggestedWords, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEndBatchInput(CharSequence text) {
|
||||
public void onEndBatchInput(InputPointers batchPointers) {
|
||||
mWordComposer.setBatchInputPointers(batchPointers);
|
||||
final SuggestedWords suggestedWords = getSuggestedWords();
|
||||
showSuggestionStrip(suggestedWords, null);
|
||||
if (suggestedWords == null || suggestedWords.size() == 0) {
|
||||
return;
|
||||
}
|
||||
final CharSequence text = suggestedWords.getWord(0);
|
||||
if (TextUtils.isEmpty(text)) {
|
||||
return;
|
||||
}
|
||||
mWordComposer.setBatchInputWord(text);
|
||||
mConnection.beginBatchEdit();
|
||||
if (SPACE_STATE_PHANTOM == mSpaceState) {
|
||||
|
@ -1555,7 +1567,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
mSpaceState = SPACE_STATE_WEAK;
|
||||
}
|
||||
// In case the "add to dictionary" hint was still displayed.
|
||||
if (null != mSuggestionsView) mSuggestionsView.dismissAddToDictionaryHint();
|
||||
if (null != mSuggestionStripView) mSuggestionStripView.dismissAddToDictionaryHint();
|
||||
}
|
||||
mHandler.postUpdateSuggestionStrip();
|
||||
Utils.Stats.onNonSeparator((char)primaryCode, x, y);
|
||||
|
@ -1634,7 +1646,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
private void handleClose() {
|
||||
commitTyped(LastComposedWord.NOT_A_SEPARATOR);
|
||||
requestHideSelf(0);
|
||||
LatinKeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
|
||||
MainKeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
|
||||
if (inputView != null)
|
||||
inputView.closing();
|
||||
}
|
||||
|
@ -1642,14 +1654,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
// TODO: make this private
|
||||
// Outside LatinIME, only used by the test suite.
|
||||
/* package for tests */ boolean isShowingPunctuationList() {
|
||||
if (mSuggestionsView == null) return false;
|
||||
return mCurrentSettings.mSuggestPuncList == mSuggestionsView.getSuggestions();
|
||||
if (mSuggestionStripView == null) return false;
|
||||
return mCurrentSettings.mSuggestPuncList == mSuggestionStripView.getSuggestions();
|
||||
}
|
||||
|
||||
private boolean isSuggestionsStripVisible() {
|
||||
if (mSuggestionsView == null)
|
||||
if (mSuggestionStripView == null)
|
||||
return false;
|
||||
if (mSuggestionsView.isShowingAddToDictionaryHint())
|
||||
if (mSuggestionStripView.isShowingAddToDictionaryHint())
|
||||
return true;
|
||||
if (!mCurrentSettings.isSuggestionStripVisibleInOrientation(mDisplayOrientation))
|
||||
return false;
|
||||
|
@ -1658,14 +1670,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
return mCurrentSettings.isSuggestionsRequested(mDisplayOrientation);
|
||||
}
|
||||
|
||||
private void clearSuggestions() {
|
||||
setSuggestions(SuggestedWords.EMPTY, false);
|
||||
private void clearSuggestionStrip() {
|
||||
setSuggestionStrip(SuggestedWords.EMPTY, false);
|
||||
setAutoCorrectionIndicator(false);
|
||||
}
|
||||
|
||||
private void setSuggestions(final SuggestedWords words, final boolean isAutoCorrection) {
|
||||
if (mSuggestionsView != null) {
|
||||
mSuggestionsView.setSuggestions(words);
|
||||
private void setSuggestionStrip(final SuggestedWords words, final boolean isAutoCorrection) {
|
||||
if (mSuggestionStripView != null) {
|
||||
mSuggestionStripView.setSuggestions(words);
|
||||
mKeyboardSwitcher.onAutoCorrectionStateChanged(isAutoCorrection);
|
||||
}
|
||||
}
|
||||
|
@ -1681,8 +1693,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: rename this method to updateSuggestionStrip or simply updateSuggestions
|
||||
private SuggestedWords updateSuggestionsOrPredictions() {
|
||||
private void updateSuggestionStrip() {
|
||||
mHandler.cancelUpdateSuggestionStrip();
|
||||
|
||||
// Check if we have a suggestion engine attached.
|
||||
|
@ -1692,15 +1703,21 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
+ "requested!");
|
||||
mWordComposer.setAutoCorrection(mWordComposer.getTypedWord());
|
||||
}
|
||||
return null;
|
||||
return;
|
||||
}
|
||||
|
||||
final String typedWord = mWordComposer.getTypedWord();
|
||||
if (!mWordComposer.isComposingWord() && !mCurrentSettings.mBigramPredictionEnabled) {
|
||||
setPunctuationSuggestions();
|
||||
return null;
|
||||
return;
|
||||
}
|
||||
|
||||
final SuggestedWords suggestedWords = getSuggestedWords();
|
||||
final String typedWord = mWordComposer.getTypedWord();
|
||||
showSuggestionStrip(suggestedWords, typedWord);
|
||||
}
|
||||
|
||||
private SuggestedWords getSuggestedWords() {
|
||||
final String typedWord = mWordComposer.getTypedWord();
|
||||
// Get the word on which we should search the bigrams. If we are composing a word, it's
|
||||
// whatever is *before* the half-committed word in the buffer, hence 2; if we aren't, we
|
||||
// should just skip whitespace if any, so 1.
|
||||
|
@ -1708,13 +1725,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
final CharSequence prevWord =
|
||||
mConnection.getNthPreviousWord(mCurrentSettings.mWordSeparators,
|
||||
mWordComposer.isComposingWord() ? 2 : 1);
|
||||
SuggestedWords suggestedWords = mSuggest.getSuggestedWords(mWordComposer,
|
||||
final SuggestedWords suggestedWords = mSuggest.getSuggestedWords(mWordComposer,
|
||||
prevWord, mKeyboardSwitcher.getKeyboard().getProximityInfo(),
|
||||
mCurrentSettings.mCorrectionEnabled);
|
||||
suggestedWords = maybeRetrieveOlderSuggestions(typedWord, suggestedWords);
|
||||
|
||||
showSuggestions(suggestedWords, typedWord);
|
||||
return suggestedWords;
|
||||
return maybeRetrieveOlderSuggestions(typedWord, suggestedWords);
|
||||
}
|
||||
|
||||
private SuggestedWords maybeRetrieveOlderSuggestions(final CharSequence typedWord,
|
||||
|
@ -1728,10 +1742,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
// revert to suggestions - although it is unclear how we can come here if it's displayed.
|
||||
if (suggestedWords.size() > 1 || typedWord.length() <= 1
|
||||
|| !suggestedWords.mTypedWordValid
|
||||
|| mSuggestionsView.isShowingAddToDictionaryHint()) {
|
||||
|| mSuggestionStripView.isShowingAddToDictionaryHint()) {
|
||||
return suggestedWords;
|
||||
} else {
|
||||
SuggestedWords previousSuggestions = mSuggestionsView.getSuggestions();
|
||||
SuggestedWords previousSuggestions = mSuggestionStripView.getSuggestions();
|
||||
if (previousSuggestions == mCurrentSettings.mSuggestPuncList) {
|
||||
previousSuggestions = SuggestedWords.EMPTY;
|
||||
}
|
||||
|
@ -1747,10 +1761,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
}
|
||||
}
|
||||
|
||||
private void showSuggestions(final SuggestedWords suggestedWords,
|
||||
private void showSuggestionStrip(final SuggestedWords suggestedWords,
|
||||
final CharSequence typedWord) {
|
||||
if (null == suggestedWords || suggestedWords.size() <= 0) {
|
||||
clearSuggestions();
|
||||
clearSuggestionStrip();
|
||||
return;
|
||||
}
|
||||
final CharSequence autoCorrection;
|
||||
|
@ -1765,7 +1779,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
}
|
||||
mWordComposer.setAutoCorrection(autoCorrection);
|
||||
final boolean isAutoCorrection = suggestedWords.willAutoCorrect();
|
||||
setSuggestions(suggestedWords, isAutoCorrection);
|
||||
setSuggestionStrip(suggestedWords, isAutoCorrection);
|
||||
setAutoCorrectionIndicator(isAutoCorrection);
|
||||
setSuggestionStripShown(isSuggestionsStripVisible());
|
||||
}
|
||||
|
@ -1773,7 +1787,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
private void commitCurrentAutoCorrection(final int separatorCodePoint) {
|
||||
// Complete any pending suggestions query first
|
||||
if (mHandler.hasPendingUpdateSuggestions()) {
|
||||
updateSuggestionsOrPredictions();
|
||||
updateSuggestionStrip();
|
||||
}
|
||||
final CharSequence typedAutoCorrection = mWordComposer.getAutoCorrectionOrNull();
|
||||
final String typedWord = mWordComposer.getTypedWord();
|
||||
|
@ -1802,11 +1816,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
}
|
||||
}
|
||||
|
||||
// Called from SuggestionsView through the SuggestionsView.Listener interface
|
||||
// Called from {@link SuggestionStripView} through the {@link SuggestionStripView#Listener}
|
||||
// interface
|
||||
@Override
|
||||
public void pickSuggestionManually(final int index, final CharSequence suggestion,
|
||||
final int x, final int y) {
|
||||
final SuggestedWords suggestedWords = mSuggestionsView.getSuggestions();
|
||||
final SuggestedWords suggestedWords = mSuggestionStripView.getSuggestions();
|
||||
// If this is a punctuation picked from the suggestion strip, pass it to onCodeInput
|
||||
if (suggestion.length() == 1 && isShowingPunctuationList()) {
|
||||
// Word separators are suggested before the user inputs something.
|
||||
|
@ -1838,8 +1853,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
if (mCurrentSettings.isApplicationSpecifiedCompletionsOn()
|
||||
&& mApplicationSpecifiedCompletions != null
|
||||
&& index >= 0 && index < mApplicationSpecifiedCompletions.length) {
|
||||
if (mSuggestionsView != null) {
|
||||
mSuggestionsView.clear();
|
||||
if (mSuggestionStripView != null) {
|
||||
mSuggestionStripView.clear();
|
||||
}
|
||||
mKeyboardSwitcher.updateShiftState();
|
||||
resetComposingState(true /* alsoResetLastComposedWord */);
|
||||
|
@ -1872,23 +1887,18 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
mKeyboardSwitcher.updateShiftState();
|
||||
|
||||
// We should show the "Touch again to save" hint if the user pressed the first entry
|
||||
// AND either:
|
||||
// - There is no dictionary (we know that because we tried to load it => null != mSuggest
|
||||
// AND mSuggest.hasMainDictionary() is false)
|
||||
// - There is a dictionary and the word is not in it
|
||||
// AND it's in none of our current dictionaries (main, user or otherwise).
|
||||
// Please note that if mSuggest is null, it means that everything is off: suggestion
|
||||
// and correction, so we shouldn't try to show the hint
|
||||
final boolean showingAddToDictionaryHint = index == 0 && mSuggest != null
|
||||
// If there is no dictionary the hint should be shown.
|
||||
&& (!mSuggest.hasMainDictionary()
|
||||
// If "suggestion" is not in the dictionary, the hint should be shown.
|
||||
|| !AutoCorrection.isValidWord(
|
||||
mSuggest.getUnigramDictionaries(), suggestion, true));
|
||||
// If the suggestion is not in the dictionary, the hint should be shown.
|
||||
&& !AutoCorrection.isValidWord(mSuggest.getUnigramDictionaries(), suggestion, true);
|
||||
|
||||
Utils.Stats.onSeparator((char)Keyboard.CODE_SPACE, WordComposer.NOT_A_COORDINATE,
|
||||
WordComposer.NOT_A_COORDINATE);
|
||||
if (showingAddToDictionaryHint && mIsUserDictionaryAvailable) {
|
||||
mSuggestionsView.showAddToDictionaryHint(suggestion, mCurrentSettings.mHintToSaveText);
|
||||
mSuggestionStripView.showAddToDictionaryHint(
|
||||
suggestion, mCurrentSettings.mHintToSaveText);
|
||||
} else {
|
||||
// If we're not showing the "Touch again to save", then update the suggestion strip.
|
||||
mHandler.postUpdateSuggestionStrip();
|
||||
|
@ -1900,7 +1910,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
*/
|
||||
private void commitChosenWord(final CharSequence chosenWord, final int commitType,
|
||||
final int separatorCode) {
|
||||
final SuggestedWords suggestedWords = mSuggestionsView.getSuggestions();
|
||||
final SuggestedWords suggestedWords = mSuggestionStripView.getSuggestions();
|
||||
mConnection.commitText(SuggestionSpanUtils.getTextWithSuggestionSpan(
|
||||
this, chosenWord, suggestedWords, mIsMainDictionaryAvailable), 1);
|
||||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
|
@ -1918,9 +1928,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
|
||||
private void setPunctuationSuggestions() {
|
||||
if (mCurrentSettings.mBigramPredictionEnabled) {
|
||||
clearSuggestions();
|
||||
clearSuggestionStrip();
|
||||
} else {
|
||||
setSuggestions(mCurrentSettings.mSuggestPuncList, false);
|
||||
setSuggestionStrip(mCurrentSettings.mSuggestPuncList, false);
|
||||
}
|
||||
setAutoCorrectionIndicator(false);
|
||||
setSuggestionStripShown(isSuggestionsStripVisible());
|
||||
|
@ -2102,18 +2112,26 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
};
|
||||
|
||||
private void launchSettings() {
|
||||
launchSettingsClass(SettingsActivity.class);
|
||||
handleClose();
|
||||
launchSubActivity(SettingsActivity.class);
|
||||
}
|
||||
|
||||
// Called from debug code only
|
||||
public void launchDebugSettings() {
|
||||
launchSettingsClass(DebugSettingsActivity.class);
|
||||
handleClose();
|
||||
launchSubActivity(DebugSettingsActivity.class);
|
||||
}
|
||||
|
||||
private void launchSettingsClass(Class<? extends PreferenceActivity> settingsClass) {
|
||||
handleClose();
|
||||
public void launchKeyboardedDialogActivity(Class<? extends Activity> activityClass) {
|
||||
// Put the text in the attached EditText into a safe, saved state before switching to a
|
||||
// new activity that will also use the soft keyboard.
|
||||
commitTyped(LastComposedWord.NOT_A_SEPARATOR);
|
||||
launchSubActivity(activityClass);
|
||||
}
|
||||
|
||||
private void launchSubActivity(Class<? extends Activity> activityClass) {
|
||||
Intent intent = new Intent();
|
||||
intent.setClass(LatinIME.this, settingsClass);
|
||||
intent.setClass(LatinIME.this, activityClass);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
@ -2151,7 +2169,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
showOptionDialog(builder.create());
|
||||
}
|
||||
|
||||
/* package */ void showOptionDialog(AlertDialog dialog) {
|
||||
public void showOptionDialog(AlertDialog dialog) {
|
||||
final IBinder windowToken = mKeyboardSwitcher.getKeyboardView().getWindowToken();
|
||||
if (windowToken == null) return;
|
||||
|
||||
|
|
|
@ -0,0 +1,134 @@
|
|||
/*
|
||||
* Copyright (C) 2012 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;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
// TODO: This class is not thread-safe.
|
||||
public class ResizableIntArray {
|
||||
private int[] mArray;
|
||||
private int mLength;
|
||||
|
||||
public ResizableIntArray(final int capacity) {
|
||||
reset(capacity);
|
||||
}
|
||||
|
||||
public int get(final int index) {
|
||||
if (index < mLength) {
|
||||
return mArray[index];
|
||||
}
|
||||
throw new ArrayIndexOutOfBoundsException("length=" + mLength + "; index=" + index);
|
||||
}
|
||||
|
||||
public void add(final int index, final int val) {
|
||||
if (index < mLength) {
|
||||
mArray[index] = val;
|
||||
} else {
|
||||
mLength = index;
|
||||
add(val);
|
||||
}
|
||||
}
|
||||
|
||||
public void add(final int val) {
|
||||
final int currentLength = mLength;
|
||||
ensureCapacity(currentLength + 1);
|
||||
mArray[currentLength] = val;
|
||||
mLength = currentLength + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the new capacity of {@code mArray}.
|
||||
* @param minimumCapacity the minimum capacity that the {@code mArray} should have.
|
||||
* @return the new capacity that the {@code mArray} should have. Returns zero when there is no
|
||||
* need to expand {@code mArray}.
|
||||
*/
|
||||
private int calculateCapacity(final int minimumCapacity) {
|
||||
final int currentCapcity = mArray.length;
|
||||
if (currentCapcity < minimumCapacity) {
|
||||
final int nextCapacity = currentCapcity * 2;
|
||||
// The following is the same as return Math.max(minimumCapacity, nextCapacity);
|
||||
return minimumCapacity > nextCapacity ? minimumCapacity : nextCapacity;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private void ensureCapacity(final int minimumCapacity) {
|
||||
final int newCapacity = calculateCapacity(minimumCapacity);
|
||||
if (newCapacity > 0) {
|
||||
// TODO: Implement primitive array pool.
|
||||
mArray = Arrays.copyOf(mArray, newCapacity);
|
||||
}
|
||||
}
|
||||
|
||||
public int getLength() {
|
||||
return mLength;
|
||||
}
|
||||
|
||||
public void setLength(final int newLength) {
|
||||
ensureCapacity(newLength);
|
||||
mLength = newLength;
|
||||
}
|
||||
|
||||
public void reset(final int capacity) {
|
||||
// TODO: Implement primitive array pool.
|
||||
mArray = new int[capacity];
|
||||
mLength = 0;
|
||||
}
|
||||
|
||||
public int[] getPrimitiveArray() {
|
||||
return mArray;
|
||||
}
|
||||
|
||||
public void set(final ResizableIntArray ip) {
|
||||
// TODO: Implement primitive array pool.
|
||||
mArray = ip.mArray;
|
||||
mLength = ip.mLength;
|
||||
}
|
||||
|
||||
public void copy(final ResizableIntArray ip) {
|
||||
final int newCapacity = calculateCapacity(ip.mLength);
|
||||
if (newCapacity > 0) {
|
||||
// TODO: Implement primitive array pool.
|
||||
mArray = new int[newCapacity];
|
||||
}
|
||||
System.arraycopy(ip.mArray, 0, mArray, 0, ip.mLength);
|
||||
mLength = ip.mLength;
|
||||
}
|
||||
|
||||
public void append(final ResizableIntArray src, final int startPos, final int length) {
|
||||
if (length == 0) {
|
||||
return;
|
||||
}
|
||||
final int currentLength = mLength;
|
||||
final int newLength = currentLength + length;
|
||||
ensureCapacity(newLength);
|
||||
System.arraycopy(src.mArray, startPos, mArray, currentLength, length);
|
||||
mLength = newLength;
|
||||
}
|
||||
|
||||
public void fill(final int value, final int startPos, final int length) {
|
||||
if (startPos < 0 || length < 0) {
|
||||
throw new IllegalArgumentException("startPos=" + startPos + "; length=" + length);
|
||||
}
|
||||
final int endPos = startPos + length;
|
||||
ensureCapacity(endPos);
|
||||
Arrays.fill(mArray, startPos, endPos, value);
|
||||
if (mLength < endPos) {
|
||||
mLength = endPos;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,6 +28,7 @@ import android.view.inputmethod.InputConnection;
|
|||
|
||||
import com.android.inputmethod.keyboard.Keyboard;
|
||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.research.ResearchLogger;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ import android.widget.SeekBar.OnSeekBarChangeListener;
|
|||
import android.widget.TextView;
|
||||
|
||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.research.ResearchLogger;
|
||||
import com.android.inputmethodcommon.InputMethodSettingsFragment;
|
||||
|
||||
public class Settings extends InputMethodSettingsFragment
|
||||
|
@ -70,6 +71,7 @@ public class Settings extends InputMethodSettingsFragment
|
|||
"pref_key_preview_popup_dismiss_delay";
|
||||
public static final String PREF_KEY_USE_CONTACTS_DICT = "pref_key_use_contacts_dict";
|
||||
public static final String PREF_BIGRAM_PREDICTIONS = "next_word_prediction";
|
||||
public static final String PREF_GESTURE_INPUT = "gesture_input";
|
||||
public static final String PREF_VIBRATION_DURATION_SETTINGS =
|
||||
"pref_vibration_duration_settings";
|
||||
public static final String PREF_KEYPRESS_SOUND_VOLUME =
|
||||
|
@ -196,6 +198,12 @@ public class Settings extends InputMethodSettingsFragment
|
|||
textCorrectionGroup.removePreference(dictionaryLink);
|
||||
}
|
||||
|
||||
final boolean gestureInputEnabledByBuildConfig = res.getBoolean(
|
||||
R.bool.config_gesture_input_enabled_by_build_config);
|
||||
if (!gestureInputEnabledByBuildConfig) {
|
||||
final Preference gestureInputPref = findPreference(PREF_GESTURE_INPUT);
|
||||
miscSettings.removePreference(gestureInputPref);
|
||||
}
|
||||
final boolean showUsabilityStudyModeOption =
|
||||
res.getBoolean(R.bool.config_enable_usability_study_mode_option)
|
||||
|| ProductionFlag.IS_EXPERIMENTAL || ENABLE_EXPERIMENTAL_SETTINGS;
|
||||
|
@ -208,7 +216,8 @@ public class Settings extends InputMethodSettingsFragment
|
|||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
if (usabilityStudyPref instanceof CheckBoxPreference) {
|
||||
CheckBoxPreference checkbox = (CheckBoxPreference)usabilityStudyPref;
|
||||
checkbox.setChecked(prefs.getBoolean(PREF_USABILITY_STUDY_MODE, true));
|
||||
checkbox.setChecked(prefs.getBoolean(PREF_USABILITY_STUDY_MODE,
|
||||
ResearchLogger.DEFAULT_USABILITY_STUDY_MODE));
|
||||
checkbox.setSummary(R.string.settings_warning_researcher_mode);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -83,6 +83,7 @@ public class SettingsValues {
|
|||
@SuppressWarnings("unused") // TODO: Use this
|
||||
private final float mKeypressSoundVolumeRawValue;
|
||||
private final InputMethodSubtype[] mAdditionalSubtypes;
|
||||
public final boolean mGestureInputEnabled;
|
||||
|
||||
// From the input box
|
||||
private final InputAttributes mInputAttributes;
|
||||
|
@ -169,6 +170,10 @@ public class SettingsValues {
|
|||
mVoiceKeyOnMain = mVoiceMode != null && mVoiceMode.equals(voiceModeMain);
|
||||
mAdditionalSubtypes = AdditionalSubtype.createAdditionalSubtypesArray(
|
||||
getPrefAdditionalSubtypes(prefs, res));
|
||||
final boolean gestureInputEnabledByBuildConfig = res.getBoolean(
|
||||
R.bool.config_gesture_input_enabled_by_build_config);
|
||||
mGestureInputEnabled = gestureInputEnabledByBuildConfig
|
||||
&& prefs.getBoolean(Settings.PREF_GESTURE_INPUT, true);
|
||||
mCorrectionEnabled = mAutoCorrectEnabled && !mInputAttributes.mInputTypeNoAutoCorrect;
|
||||
mSuggestionVisibility = createSuggestionVisibility(res);
|
||||
}
|
||||
|
|
|
@ -98,9 +98,9 @@ public class SubtypeSwitcher {
|
|||
mConnectivityManager = (ConnectivityManager) service.getSystemService(
|
||||
Context.CONNECTIVITY_SERVICE);
|
||||
mCurrentSystemLocale = mResources.getConfiguration().locale;
|
||||
mCurrentSubtype = mImm.getCurrentInputMethodSubtype();
|
||||
mNoLanguageSubtype = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
|
||||
service, SubtypeLocale.NO_LANGUAGE, SubtypeLocale.QWERTY);
|
||||
mCurrentSubtype = ImfUtils.getCurrentInputMethodSubtype(service, mNoLanguageSubtype);
|
||||
if (mNoLanguageSubtype == null) {
|
||||
throw new RuntimeException("Can't find no lanugage with QWERTY subtype");
|
||||
}
|
||||
|
@ -113,7 +113,7 @@ public class SubtypeSwitcher {
|
|||
// Only configuration changed event is allowed to call this because this is heavy.
|
||||
private void updateAllParameters() {
|
||||
mCurrentSystemLocale = mResources.getConfiguration().locale;
|
||||
updateSubtype(mImm.getCurrentInputMethodSubtype());
|
||||
updateSubtype(ImfUtils.getCurrentInputMethodSubtype(mService, mNoLanguageSubtype));
|
||||
updateParametersOnStartInputView();
|
||||
}
|
||||
|
||||
|
@ -142,7 +142,7 @@ public class SubtypeSwitcher {
|
|||
+ currentSubtype.getLocale() + "/" + currentSubtype.getExtraValue());
|
||||
Log.w(TAG, "Last subtype was disabled. Update to the current one.");
|
||||
}
|
||||
updateSubtype(mImm.getCurrentInputMethodSubtype());
|
||||
updateSubtype(ImfUtils.getCurrentInputMethodSubtype(mService, mNoLanguageSubtype));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ public class WordComposer {
|
|||
private static final int N = BinaryDictionary.MAX_WORD_LENGTH;
|
||||
|
||||
private int[] mPrimaryKeyCodes;
|
||||
private final InputPointers mInputPointers = new InputPointers();
|
||||
private final InputPointers mInputPointers = new InputPointers(N);
|
||||
private final StringBuilder mTypedWord;
|
||||
private CharSequence mAutoCorrection;
|
||||
private boolean mIsResumed;
|
||||
|
|
|
@ -42,10 +42,10 @@ public class MoreSuggestions extends Keyboard {
|
|||
private int mToPos;
|
||||
|
||||
public static class MoreSuggestionsParam extends Keyboard.Params {
|
||||
private final int[] mWidths = new int[SuggestionsView.MAX_SUGGESTIONS];
|
||||
private final int[] mRowNumbers = new int[SuggestionsView.MAX_SUGGESTIONS];
|
||||
private final int[] mColumnOrders = new int[SuggestionsView.MAX_SUGGESTIONS];
|
||||
private final int[] mNumColumnsInRow = new int[SuggestionsView.MAX_SUGGESTIONS];
|
||||
private final int[] mWidths = new int[SuggestionStripView.MAX_SUGGESTIONS];
|
||||
private final int[] mRowNumbers = new int[SuggestionStripView.MAX_SUGGESTIONS];
|
||||
private final int[] mColumnOrders = new int[SuggestionStripView.MAX_SUGGESTIONS];
|
||||
private final int[] mNumColumnsInRow = new int[SuggestionStripView.MAX_SUGGESTIONS];
|
||||
private static final int MAX_COLUMNS_IN_ROW = 3;
|
||||
private int mNumRows;
|
||||
public Drawable mDivider;
|
||||
|
@ -63,7 +63,7 @@ public class MoreSuggestions extends Keyboard {
|
|||
|
||||
int row = 0;
|
||||
int pos = fromPos, rowStartPos = fromPos;
|
||||
final int size = Math.min(suggestions.size(), SuggestionsView.MAX_SUGGESTIONS);
|
||||
final int size = Math.min(suggestions.size(), SuggestionStripView.MAX_SUGGESTIONS);
|
||||
while (pos < size) {
|
||||
final String word = suggestions.getWord(pos).toString();
|
||||
// TODO: Should take care of text x-scaling.
|
||||
|
|
|
@ -68,7 +68,7 @@ public class MoreSuggestionsView extends KeyboardView implements MoreKeysPanel {
|
|||
@Override
|
||||
public void onCodeInput(int primaryCode, int x, int y) {
|
||||
final int index = primaryCode - MoreSuggestions.SUGGESTION_CODE_BASE;
|
||||
if (index >= 0 && index < SuggestionsView.MAX_SUGGESTIONS) {
|
||||
if (index >= 0 && index < SuggestionStripView.MAX_SUGGESTIONS) {
|
||||
mListener.onCustomRequest(index);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,15 +60,15 @@ import com.android.inputmethod.keyboard.ViewLayoutUtils;
|
|||
import com.android.inputmethod.latin.AutoCorrection;
|
||||
import com.android.inputmethod.latin.LatinImeLogger;
|
||||
import com.android.inputmethod.latin.R;
|
||||
import com.android.inputmethod.latin.ResearchLogger;
|
||||
import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
|
||||
import com.android.inputmethod.latin.SuggestedWords;
|
||||
import com.android.inputmethod.latin.Utils;
|
||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.research.ResearchLogger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class SuggestionsView extends RelativeLayout implements OnClickListener,
|
||||
public class SuggestionStripView extends RelativeLayout implements OnClickListener,
|
||||
OnLongClickListener {
|
||||
public interface Listener {
|
||||
public boolean addWordToUserDictionary(String word);
|
||||
|
@ -98,24 +98,24 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
|
|||
private Listener mListener;
|
||||
private SuggestedWords mSuggestedWords = SuggestedWords.EMPTY;
|
||||
|
||||
private final SuggestionsViewParams mParams;
|
||||
private final SuggestionStripViewParams mParams;
|
||||
private static final float MIN_TEXT_XSCALE = 0.70f;
|
||||
|
||||
private final UiHandler mHandler = new UiHandler(this);
|
||||
|
||||
private static class UiHandler extends StaticInnerHandlerWrapper<SuggestionsView> {
|
||||
private static class UiHandler extends StaticInnerHandlerWrapper<SuggestionStripView> {
|
||||
private static final int MSG_HIDE_PREVIEW = 0;
|
||||
|
||||
public UiHandler(SuggestionsView outerInstance) {
|
||||
public UiHandler(SuggestionStripView outerInstance) {
|
||||
super(outerInstance);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispatchMessage(Message msg) {
|
||||
final SuggestionsView suggestionsView = getOuterInstance();
|
||||
final SuggestionStripView suggestionStripView = getOuterInstance();
|
||||
switch (msg.what) {
|
||||
case MSG_HIDE_PREVIEW:
|
||||
suggestionsView.hidePreview();
|
||||
suggestionStripView.hidePreview();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -129,7 +129,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
|
|||
}
|
||||
}
|
||||
|
||||
private static class SuggestionsViewParams {
|
||||
private static class SuggestionStripViewParams {
|
||||
private static final int DEFAULT_SUGGESTIONS_COUNT_IN_STRIP = 3;
|
||||
private static final int DEFAULT_CENTER_SUGGESTION_PERCENTILE = 40;
|
||||
private static final int DEFAULT_MAX_MORE_SUGGESTIONS_ROW = 2;
|
||||
|
@ -175,7 +175,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
|
|||
private final TextView mLeftwardsArrowView;
|
||||
private final TextView mHintToSaveView;
|
||||
|
||||
public SuggestionsViewParams(Context context, AttributeSet attrs, int defStyle,
|
||||
public SuggestionStripViewParams(Context context, AttributeSet attrs, int defStyle,
|
||||
ArrayList<TextView> words, ArrayList<View> dividers, ArrayList<TextView> infos) {
|
||||
mWords = words;
|
||||
mDividers = dividers;
|
||||
|
@ -191,38 +191,39 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
|
|||
final Resources res = word.getResources();
|
||||
mSuggestionsStripHeight = res.getDimensionPixelSize(R.dimen.suggestions_strip_height);
|
||||
|
||||
final TypedArray a = context.obtainStyledAttributes(
|
||||
attrs, R.styleable.SuggestionsView, defStyle, R.style.SuggestionsViewStyle);
|
||||
mSuggestionStripOption = a.getInt(R.styleable.SuggestionsView_suggestionStripOption, 0);
|
||||
final TypedArray a = context.obtainStyledAttributes(attrs,
|
||||
R.styleable.SuggestionStripView, defStyle, R.style.SuggestionStripViewStyle);
|
||||
mSuggestionStripOption = a.getInt(
|
||||
R.styleable.SuggestionStripView_suggestionStripOption, 0);
|
||||
final float alphaValidTypedWord = getPercent(a,
|
||||
R.styleable.SuggestionsView_alphaValidTypedWord, 100);
|
||||
R.styleable.SuggestionStripView_alphaValidTypedWord, 100);
|
||||
final float alphaTypedWord = getPercent(a,
|
||||
R.styleable.SuggestionsView_alphaTypedWord, 100);
|
||||
R.styleable.SuggestionStripView_alphaTypedWord, 100);
|
||||
final float alphaAutoCorrect = getPercent(a,
|
||||
R.styleable.SuggestionsView_alphaAutoCorrect, 100);
|
||||
R.styleable.SuggestionStripView_alphaAutoCorrect, 100);
|
||||
final float alphaSuggested = getPercent(a,
|
||||
R.styleable.SuggestionsView_alphaSuggested, 100);
|
||||
mAlphaObsoleted = getPercent(a, R.styleable.SuggestionsView_alphaSuggested, 100);
|
||||
mColorValidTypedWord = applyAlpha(
|
||||
a.getColor(R.styleable.SuggestionsView_colorValidTypedWord, 0),
|
||||
alphaValidTypedWord);
|
||||
mColorTypedWord = applyAlpha(
|
||||
a.getColor(R.styleable.SuggestionsView_colorTypedWord, 0), alphaTypedWord);
|
||||
mColorAutoCorrect = applyAlpha(
|
||||
a.getColor(R.styleable.SuggestionsView_colorAutoCorrect, 0), alphaAutoCorrect);
|
||||
mColorSuggested = applyAlpha(
|
||||
a.getColor(R.styleable.SuggestionsView_colorSuggested, 0), alphaSuggested);
|
||||
R.styleable.SuggestionStripView_alphaSuggested, 100);
|
||||
mAlphaObsoleted = getPercent(a,
|
||||
R.styleable.SuggestionStripView_alphaSuggested, 100);
|
||||
mColorValidTypedWord = applyAlpha(a.getColor(
|
||||
R.styleable.SuggestionStripView_colorValidTypedWord, 0), alphaValidTypedWord);
|
||||
mColorTypedWord = applyAlpha(a.getColor(
|
||||
R.styleable.SuggestionStripView_colorTypedWord, 0), alphaTypedWord);
|
||||
mColorAutoCorrect = applyAlpha(a.getColor(
|
||||
R.styleable.SuggestionStripView_colorAutoCorrect, 0), alphaAutoCorrect);
|
||||
mColorSuggested = applyAlpha(a.getColor(
|
||||
R.styleable.SuggestionStripView_colorSuggested, 0), alphaSuggested);
|
||||
mSuggestionsCountInStrip = a.getInt(
|
||||
R.styleable.SuggestionsView_suggestionsCountInStrip,
|
||||
R.styleable.SuggestionStripView_suggestionsCountInStrip,
|
||||
DEFAULT_SUGGESTIONS_COUNT_IN_STRIP);
|
||||
mCenterSuggestionWeight = getPercent(a,
|
||||
R.styleable.SuggestionsView_centerSuggestionPercentile,
|
||||
R.styleable.SuggestionStripView_centerSuggestionPercentile,
|
||||
DEFAULT_CENTER_SUGGESTION_PERCENTILE);
|
||||
mMaxMoreSuggestionsRow = a.getInt(
|
||||
R.styleable.SuggestionsView_maxMoreSuggestionsRow,
|
||||
R.styleable.SuggestionStripView_maxMoreSuggestionsRow,
|
||||
DEFAULT_MAX_MORE_SUGGESTIONS_ROW);
|
||||
mMinMoreSuggestionsWidth = getRatio(a,
|
||||
R.styleable.SuggestionsView_minMoreSuggestionsWidth);
|
||||
R.styleable.SuggestionStripView_minMoreSuggestionsWidth);
|
||||
a.recycle();
|
||||
|
||||
mMoreSuggestionsHint = getMoreSuggestionsHint(res,
|
||||
|
@ -596,15 +597,15 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
|
|||
}
|
||||
|
||||
/**
|
||||
* Construct a {@link SuggestionsView} for showing suggestions to be picked by the user.
|
||||
* Construct a {@link SuggestionStripView} for showing suggestions to be picked by the user.
|
||||
* @param context
|
||||
* @param attrs
|
||||
*/
|
||||
public SuggestionsView(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, R.attr.suggestionsViewStyle);
|
||||
public SuggestionStripView(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, R.attr.suggestionStripViewStyle);
|
||||
}
|
||||
|
||||
public SuggestionsView(Context context, AttributeSet attrs, int defStyle) {
|
||||
public SuggestionStripView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
|
||||
final LayoutInflater inflater = LayoutInflater.from(context);
|
||||
|
@ -631,7 +632,8 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
|
|||
mInfos.add((TextView)inflater.inflate(R.layout.suggestion_info, null));
|
||||
}
|
||||
|
||||
mParams = new SuggestionsViewParams(context, attrs, defStyle, mWords, mDividers, mInfos);
|
||||
mParams = new SuggestionStripViewParams(
|
||||
context, attrs, defStyle, mWords, mDividers, mInfos);
|
||||
|
||||
mMoreSuggestionsContainer = inflater.inflate(R.layout.more_suggestions, null);
|
||||
mMoreSuggestionsView = (MoreSuggestionsView)mMoreSuggestionsContainer
|
||||
|
@ -677,7 +679,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
|
|||
mSuggestedWords = suggestedWords;
|
||||
mParams.layout(mSuggestedWords, mSuggestionsStrip, this, getWidth());
|
||||
if (ProductionFlag.IS_EXPERIMENTAL) {
|
||||
ResearchLogger.suggestionsView_setSuggestions(mSuggestedWords);
|
||||
ResearchLogger.suggestionStripView_setSuggestions(mSuggestedWords);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -759,7 +761,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
|
|||
}
|
||||
|
||||
private boolean showMoreSuggestions() {
|
||||
final SuggestionsViewParams params = mParams;
|
||||
final SuggestionStripViewParams params = mParams;
|
||||
if (params.mMoreSuggestionsAvailable) {
|
||||
final int stripWidth = getWidth();
|
||||
final View container = mMoreSuggestionsContainer;
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* Copyright (C) 2012 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.research;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.view.View;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.EditText;
|
||||
|
||||
import com.android.inputmethod.latin.R;
|
||||
|
||||
public class FeedbackActivity extends Activity {
|
||||
@Override
|
||||
protected void onCreate(final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.research_feedback_activity);
|
||||
final FeedbackLayout layout = (FeedbackLayout) findViewById(R.id.research_feedback_layout);
|
||||
layout.setActivity(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
ResearchLogger.getInstance().onLeavingSendFeedbackDialog();
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* Copyright (C) 2012 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.research;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Fragment;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.EditText;
|
||||
|
||||
import com.android.inputmethod.latin.R;
|
||||
|
||||
public class FeedbackFragment extends Fragment {
|
||||
private EditText mEditText;
|
||||
private CheckBox mCheckBox;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
final View view = inflater.inflate(R.layout.research_feedback_fragment_layout, container,
|
||||
false);
|
||||
mEditText = (EditText) view.findViewById(R.id.research_feedback_contents);
|
||||
mCheckBox = (CheckBox) view.findViewById(R.id.research_feedback_include_history);
|
||||
|
||||
final Button sendButton = (Button) view.findViewById(
|
||||
R.id.research_feedback_send_button);
|
||||
sendButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
final Editable editable = mEditText.getText();
|
||||
final String feedbackContents = editable.toString();
|
||||
final boolean includeHistory = mCheckBox.isChecked();
|
||||
ResearchLogger.getInstance().sendFeedback(feedbackContents, includeHistory);
|
||||
final Activity activity = FeedbackFragment.this.getActivity();
|
||||
activity.finish();
|
||||
ResearchLogger.getInstance().onLeavingSendFeedbackDialog();
|
||||
}
|
||||
});
|
||||
|
||||
final Button cancelButton = (Button) view.findViewById(
|
||||
R.id.research_feedback_cancel_button);
|
||||
cancelButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
final Activity activity = FeedbackFragment.this.getActivity();
|
||||
activity.finish();
|
||||
ResearchLogger.getInstance().onLeavingSendFeedbackDialog();
|
||||
}
|
||||
});
|
||||
|
||||
return view;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* Copyright (C) 2012 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.research;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.KeyEvent;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
public class FeedbackLayout extends LinearLayout {
|
||||
private Activity mActivity;
|
||||
|
||||
public FeedbackLayout(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public FeedbackLayout(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public FeedbackLayout(Context context, AttributeSet attrs, int defstyle) {
|
||||
super(context, attrs, defstyle);
|
||||
}
|
||||
|
||||
public void setActivity(Activity activity) {
|
||||
mActivity = activity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchKeyEventPreIme(KeyEvent event) {
|
||||
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
|
||||
KeyEvent.DispatcherState state = getKeyDispatcherState();
|
||||
if (state != null) {
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN
|
||||
&& event.getRepeatCount() == 0) {
|
||||
state.startTracking(event, this);
|
||||
return true;
|
||||
} else if (event.getAction() == KeyEvent.ACTION_UP
|
||||
&& !event.isCanceled() && state.isTracking(event)) {
|
||||
mActivity.onBackPressed();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return super.dispatchKeyEventPreIme(event);
|
||||
}
|
||||
}
|
|
@ -14,7 +14,7 @@
|
|||
* the License.
|
||||
*/
|
||||
|
||||
package com.android.inputmethod.latin;
|
||||
package com.android.inputmethod.research;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.SystemClock;
|
||||
|
@ -23,9 +23,10 @@ import android.util.Log;
|
|||
import android.view.inputmethod.CompletionInfo;
|
||||
|
||||
import com.android.inputmethod.keyboard.Key;
|
||||
import com.android.inputmethod.latin.ResearchLogger.LogUnit;
|
||||
import com.android.inputmethod.latin.SuggestedWords;
|
||||
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
|
||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.research.ResearchLogger.LogUnit;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
|
@ -55,13 +56,14 @@ public class ResearchLog {
|
|||
|
||||
final ScheduledExecutorService mExecutor;
|
||||
/* package */ final File mFile;
|
||||
private JsonWriter mJsonWriter = NULL_JSON_WRITER; // should never be null
|
||||
private JsonWriter mJsonWriter = NULL_JSON_WRITER;
|
||||
|
||||
private int mLoggingState;
|
||||
private static final int LOGGING_STATE_UNSTARTED = 0;
|
||||
private static final int LOGGING_STATE_RUNNING = 1;
|
||||
private static final int LOGGING_STATE_STOPPING = 2;
|
||||
private static final int LOGGING_STATE_STOPPED = 3;
|
||||
private static final int LOGGING_STATE_READY = 1; // don't create file until necessary
|
||||
private static final int LOGGING_STATE_RUNNING = 2;
|
||||
private static final int LOGGING_STATE_STOPPING = 3;
|
||||
private static final int LOGGING_STATE_STOPPED = 4;
|
||||
private static final long FLUSH_DELAY_IN_MS = 1000 * 5;
|
||||
|
||||
private static class NullOutputStream extends OutputStream {
|
||||
|
@ -94,11 +96,9 @@ public class ResearchLog {
|
|||
public synchronized void start() throws IOException {
|
||||
switch (mLoggingState) {
|
||||
case LOGGING_STATE_UNSTARTED:
|
||||
mJsonWriter = new JsonWriter(new BufferedWriter(new FileWriter(mFile)));
|
||||
mJsonWriter.setLenient(true);
|
||||
mJsonWriter.beginArray();
|
||||
mLoggingState = LOGGING_STATE_RUNNING;
|
||||
mLoggingState = LOGGING_STATE_READY;
|
||||
break;
|
||||
case LOGGING_STATE_READY:
|
||||
case LOGGING_STATE_RUNNING:
|
||||
case LOGGING_STATE_STOPPING:
|
||||
case LOGGING_STATE_STOPPED:
|
||||
|
@ -111,6 +111,7 @@ public class ResearchLog {
|
|||
case LOGGING_STATE_UNSTARTED:
|
||||
mLoggingState = LOGGING_STATE_STOPPED;
|
||||
break;
|
||||
case LOGGING_STATE_READY:
|
||||
case LOGGING_STATE_RUNNING:
|
||||
mExecutor.submit(new Callable<Object>() {
|
||||
@Override
|
||||
|
@ -120,14 +121,13 @@ public class ResearchLog {
|
|||
mJsonWriter.flush();
|
||||
mJsonWriter.close();
|
||||
} finally {
|
||||
// the contentprovider only exports data if the writable
|
||||
// bit is cleared.
|
||||
boolean success = mFile.setWritable(false, false);
|
||||
mLoggingState = LOGGING_STATE_STOPPED;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
removeAnyScheduledFlush();
|
||||
mExecutor.shutdown();
|
||||
mLoggingState = LOGGING_STATE_STOPPING;
|
||||
break;
|
||||
|
@ -139,27 +139,26 @@ public class ResearchLog {
|
|||
public boolean isAlive() {
|
||||
switch (mLoggingState) {
|
||||
case LOGGING_STATE_UNSTARTED:
|
||||
case LOGGING_STATE_READY:
|
||||
case LOGGING_STATE_RUNNING:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void waitUntilStopped(int timeoutInMs) throws InterruptedException {
|
||||
public void waitUntilStopped(final int timeoutInMs) throws InterruptedException {
|
||||
removeAnyScheduledFlush();
|
||||
mExecutor.shutdown();
|
||||
mExecutor.awaitTermination(timeoutInMs, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
private boolean isAbortSuccessful;
|
||||
public boolean isAbortSuccessful() {
|
||||
return isAbortSuccessful;
|
||||
}
|
||||
|
||||
public synchronized void abort() {
|
||||
switch (mLoggingState) {
|
||||
case LOGGING_STATE_UNSTARTED:
|
||||
mLoggingState = LOGGING_STATE_STOPPED;
|
||||
isAbortSuccessful = true;
|
||||
break;
|
||||
case LOGGING_STATE_READY:
|
||||
case LOGGING_STATE_RUNNING:
|
||||
mExecutor.submit(new Callable<Object>() {
|
||||
@Override
|
||||
|
@ -173,6 +172,7 @@ public class ResearchLog {
|
|||
return null;
|
||||
}
|
||||
});
|
||||
removeAnyScheduledFlush();
|
||||
mExecutor.shutdown();
|
||||
mLoggingState = LOGGING_STATE_STOPPING;
|
||||
break;
|
||||
|
@ -181,10 +181,16 @@ public class ResearchLog {
|
|||
}
|
||||
}
|
||||
|
||||
private boolean isAbortSuccessful;
|
||||
public boolean isAbortSuccessful() {
|
||||
return isAbortSuccessful;
|
||||
}
|
||||
|
||||
/* package */ synchronized void flush() {
|
||||
switch (mLoggingState) {
|
||||
case LOGGING_STATE_UNSTARTED:
|
||||
break;
|
||||
case LOGGING_STATE_READY:
|
||||
case LOGGING_STATE_RUNNING:
|
||||
removeAnyScheduledFlush();
|
||||
mExecutor.submit(mFlushCallable);
|
||||
|
@ -197,7 +203,9 @@ public class ResearchLog {
|
|||
private Callable<Object> mFlushCallable = new Callable<Object>() {
|
||||
@Override
|
||||
public Object call() throws Exception {
|
||||
mJsonWriter.flush();
|
||||
if (mLoggingState == LOGGING_STATE_RUNNING) {
|
||||
mJsonWriter.flush();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
@ -220,6 +228,7 @@ public class ResearchLog {
|
|||
switch (mLoggingState) {
|
||||
case LOGGING_STATE_UNSTARTED:
|
||||
break;
|
||||
case LOGGING_STATE_READY:
|
||||
case LOGGING_STATE_RUNNING:
|
||||
mExecutor.submit(new Callable<Object>() {
|
||||
@Override
|
||||
|
@ -239,6 +248,7 @@ public class ResearchLog {
|
|||
switch (mLoggingState) {
|
||||
case LOGGING_STATE_UNSTARTED:
|
||||
break;
|
||||
case LOGGING_STATE_READY:
|
||||
case LOGGING_STATE_RUNNING:
|
||||
mExecutor.submit(new Callable<Object>() {
|
||||
@Override
|
||||
|
@ -260,6 +270,11 @@ public class ResearchLog {
|
|||
void outputEvent(final String[] keys, final Object[] values) {
|
||||
// not thread safe.
|
||||
try {
|
||||
if (mJsonWriter == NULL_JSON_WRITER) {
|
||||
mJsonWriter = new JsonWriter(new BufferedWriter(new FileWriter(mFile)));
|
||||
mJsonWriter.setLenient(true);
|
||||
mJsonWriter.beginArray();
|
||||
}
|
||||
mJsonWriter.beginObject();
|
||||
mJsonWriter.name(CURRENT_TIME_KEY).value(System.currentTimeMillis());
|
||||
mJsonWriter.name(UPTIME_KEY).value(SystemClock.uptimeMillis());
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue