From 68eb1b1932f77a34d13d0ec0ab2d76cd50fdda92 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Queru Date: Thu, 12 Nov 2009 18:46:12 -0800 Subject: [PATCH] eclair snapshot --- AndroidManifest.xml | 4 +- ...oid_inputmethod_latin_BinaryDictionary.cpp | 36 +- dictionary/src/dictionary.cpp | 58 ++- dictionary/src/dictionary.h | 8 +- res/drawable-en-hdpi/sym_keyboard_delete.png | Bin 0 -> 2315 bytes .../sym_keyboard_feedback_delete.png | Bin 0 -> 1278 bytes .../sym_keyboard_delete.png | Bin .../sym_keyboard_feedback_delete.png | Bin .../btn_keyboard_key_normal.9.png | Bin 0 -> 696 bytes .../btn_keyboard_key_normal_off.9.png | Bin 0 -> 941 bytes .../btn_keyboard_key_normal_on.9.png | Bin 0 -> 1076 bytes .../btn_keyboard_key_pressed.9.png | Bin 0 -> 696 bytes .../btn_keyboard_key_pressed_off.9.png | Bin 0 -> 964 bytes .../btn_keyboard_key_pressed_on.9.png | Bin 0 -> 1055 bytes res/drawable-hdpi/cancel.png | Bin 0 -> 1811 bytes .../candidate_feedback_background.9.png | Bin 0 -> 833 bytes res/drawable-hdpi/caution.png | Bin 0 -> 1641 bytes res/drawable-hdpi/dialog_bubble_step02.9.png | Bin 0 -> 1475 bytes res/drawable-hdpi/dialog_bubble_step07.9.png | Bin 0 -> 6012 bytes .../dialog_top_dark_bottom_medium.png | Bin 0 -> 1976 bytes res/drawable-hdpi/highlight_pressed.png | Bin 0 -> 1527 bytes res/drawable-hdpi/ic_dialog_alert_large.png | Bin 0 -> 4918 bytes res/drawable-hdpi/ic_dialog_keyboard.png | Bin 0 -> 807 bytes res/drawable-hdpi/ic_dialog_voice_input.png | Bin 0 -> 1931 bytes res/drawable-hdpi/ic_dialog_wave_0_0.png | Bin 0 -> 15673 bytes res/drawable-hdpi/ic_dialog_wave_1_3.png | Bin 0 -> 15823 bytes res/drawable-hdpi/ic_dialog_wave_2_3.png | Bin 0 -> 16009 bytes res/drawable-hdpi/ic_dialog_wave_3_3.png | Bin 0 -> 16022 bytes res/drawable-hdpi/ic_dialog_wave_4_3.png | Bin 0 -> 15910 bytes .../ic_suggest_strip_scroll_left_arrow.png | Bin 0 -> 619 bytes .../ic_suggest_strip_scroll_right_arrow.png | Bin 0 -> 619 bytes res/drawable-hdpi/keyboard_background.9.png | Bin 0 -> 200 bytes .../keyboard_suggest_strip.9.png | Bin 0 -> 1577 bytes .../keyboard_suggest_strip_divider.png | Bin 0 -> 172 bytes res/drawable-hdpi/mic_slash.png | Bin 0 -> 3095 bytes res/drawable-hdpi/ok_cancel.png | Bin 0 -> 442 bytes res/drawable-hdpi/speak_now_level0.png | Bin 0 -> 1508 bytes res/drawable-hdpi/speak_now_level1.png | Bin 0 -> 1587 bytes res/drawable-hdpi/speak_now_level2.png | Bin 0 -> 1687 bytes res/drawable-hdpi/speak_now_level3.png | Bin 0 -> 1636 bytes res/drawable-hdpi/speak_now_level4.png | Bin 0 -> 1635 bytes res/drawable-hdpi/speak_now_level5.png | Bin 0 -> 1706 bytes res/drawable-hdpi/sym_keyboard_delete.png | Bin 0 -> 2282 bytes res/drawable-hdpi/sym_keyboard_done.png | Bin 0 -> 1593 bytes .../sym_keyboard_feedback_delete.png | Bin 0 -> 1278 bytes .../sym_keyboard_feedback_done.png | Bin 0 -> 1068 bytes .../sym_keyboard_feedback_numalt.png | Bin 0 -> 1336 bytes .../sym_keyboard_feedback_return.png | Bin 0 -> 838 bytes .../sym_keyboard_feedback_search.png | Bin 0 -> 1209 bytes .../sym_keyboard_feedback_shift.png | Bin 0 -> 885 bytes .../sym_keyboard_feedback_shift_locked.png | Bin 0 -> 700 bytes .../sym_keyboard_feedback_space.png | Bin 0 -> 287 bytes res/drawable-hdpi/sym_keyboard_num0.png | Bin 0 -> 1931 bytes res/drawable-hdpi/sym_keyboard_num1.png | Bin 0 -> 809 bytes res/drawable-hdpi/sym_keyboard_num2.png | Bin 0 -> 3214 bytes res/drawable-hdpi/sym_keyboard_num3.png | Bin 0 -> 2805 bytes res/drawable-hdpi/sym_keyboard_num4.png | Bin 0 -> 2647 bytes res/drawable-hdpi/sym_keyboard_num5.png | Bin 0 -> 2536 bytes res/drawable-hdpi/sym_keyboard_num6.png | Bin 0 -> 3573 bytes res/drawable-hdpi/sym_keyboard_num7.png | Bin 0 -> 3664 bytes res/drawable-hdpi/sym_keyboard_num8.png | Bin 0 -> 2904 bytes res/drawable-hdpi/sym_keyboard_num9.png | Bin 0 -> 3860 bytes res/drawable-hdpi/sym_keyboard_numalt.png | Bin 0 -> 2919 bytes res/drawable-hdpi/sym_keyboard_numpound.png | Bin 0 -> 1600 bytes res/drawable-hdpi/sym_keyboard_numstar.png | Bin 0 -> 1749 bytes res/drawable-hdpi/sym_keyboard_return.png | Bin 0 -> 1123 bytes res/drawable-hdpi/sym_keyboard_search.png | Bin 0 -> 1623 bytes res/drawable-hdpi/sym_keyboard_shift.png | Bin 0 -> 1495 bytes .../sym_keyboard_shift_locked.png | Bin 0 -> 1119 bytes res/drawable-hdpi/sym_keyboard_space.png | Bin 0 -> 371 bytes res/drawable-hdpi/voice_background.9.png | Bin 0 -> 2349 bytes res/drawable-hdpi/working.png | Bin 0 -> 8636 bytes .../btn_keyboard_key_normal.9.png | Bin 0 -> 737 bytes .../btn_keyboard_key_normal_off.9.png | Bin 0 -> 941 bytes .../btn_keyboard_key_normal_on.9.png | Bin 0 -> 1076 bytes .../btn_keyboard_key_pressed.9.png | Bin 0 -> 733 bytes .../btn_keyboard_key_pressed_off.9.png | Bin 0 -> 964 bytes .../btn_keyboard_key_pressed_on.9.png | Bin 0 -> 1055 bytes .../keyboard_suggest_strip_divider.png | Bin 0 -> 172 bytes .../btn_keyboard_key_normal.9.png | Bin 0 -> 818 bytes .../btn_keyboard_key_normal_off.9.png | Bin 0 -> 860 bytes .../btn_keyboard_key_normal_on.9.png | Bin 0 -> 926 bytes .../btn_keyboard_key_pressed.9.png | Bin 0 -> 740 bytes .../btn_keyboard_key_pressed_off.9.png | Bin 0 -> 836 bytes .../btn_keyboard_key_pressed_on.9.png | Bin 0 -> 886 bytes .../keyboard_suggest_strip_divider.png | Bin res/drawable-land/btn_keyboard_key.xml | 38 ++ .../btn_keyboard_key_normal.9.png | Bin 0 -> 809 bytes .../btn_keyboard_key_normal_off.9.png | Bin 0 -> 860 bytes .../btn_keyboard_key_normal_on.9.png | Bin 0 -> 926 bytes .../btn_keyboard_key_pressed.9.png | Bin 0 -> 736 bytes .../btn_keyboard_key_pressed_off.9.png | Bin 0 -> 836 bytes .../btn_keyboard_key_pressed_on.9.png | Bin 0 -> 886 bytes .../candidate_feedback_background.9.png | Bin .../dialog_bubble_step02.9.png | Bin .../dialog_bubble_step07.9.png | Bin .../highlight_pressed.png | Bin .../ic_dialog_keyboard.png | Bin .../ic_suggest_strip_scroll_left_arrow.png | Bin .../ic_suggest_strip_scroll_right_arrow.png | Bin res/drawable-mdpi/keyboard_background.9.png | Bin 0 -> 214 bytes .../keyboard_suggest_strip.9.png | Bin .../keyboard_suggest_strip_divider.png | Bin 0 -> 2846 bytes .../sym_keyboard_delete.png | Bin .../sym_keyboard_done.png | Bin .../sym_keyboard_feedback_delete.png | Bin .../sym_keyboard_feedback_done.png | Bin .../sym_keyboard_feedback_numalt.png | Bin .../sym_keyboard_feedback_return.png | Bin .../sym_keyboard_feedback_search.png | Bin .../sym_keyboard_feedback_shift.png | Bin .../sym_keyboard_feedback_shift_locked.png | Bin .../sym_keyboard_feedback_space.png | Bin .../sym_keyboard_num0.png | Bin .../sym_keyboard_num1.png | Bin .../sym_keyboard_num2.png | Bin .../sym_keyboard_num3.png | Bin .../sym_keyboard_num4.png | Bin .../sym_keyboard_num5.png | Bin .../sym_keyboard_num6.png | Bin .../sym_keyboard_num7.png | Bin .../sym_keyboard_num8.png | Bin .../sym_keyboard_num9.png | Bin .../sym_keyboard_numalt.png | Bin .../sym_keyboard_numpound.png | Bin .../sym_keyboard_numstar.png | Bin .../sym_keyboard_return.png | Bin .../sym_keyboard_search.png | Bin .../sym_keyboard_shift.png | Bin .../sym_keyboard_shift_locked.png | Bin .../sym_keyboard_space.png | Bin res/drawable/btn_keyboard_key.xml | 38 ++ .../keyboard_suggest_strip_divider.png | Bin 166 -> 0 bytes res/layout/candidates.xml | 2 +- res/layout/input.xml | 2 + res/values-cs/strings.xml | 6 + res/values-da/strings.xml | 18 +- res/values-de/strings.xml | 6 + res/values-el/strings.xml | 18 +- res/values-es-rUS/strings.xml | 18 +- res/values-es/strings.xml | 6 + res/values-fr/strings.xml | 6 + res/values-it/strings.xml | 6 + res/values-ja/strings.xml | 6 + res/values-ko/strings.xml | 18 +- res/values-land/dimens.xml | 2 + res/values-nb/strings.xml | 19 +- res/values-nl/strings.xml | 6 + res/values-pl/strings.xml | 6 + res/values-pt-rPT/strings.xml | 18 +- res/values-pt/strings.xml | 28 +- res/values-ru/strings.xml | 18 +- res/values-sv/strings.xml | 18 +- res/values-tr/donottranslate.xml | 23 + res/values-tr/strings.xml | 22 +- res/values-zh-rCN/strings.xml | 26 +- res/values-zh-rTW/strings.xml | 6 + res/values/bools.xml | 2 +- res/values/dimens.xml | 4 +- res/values/donottranslate.xml | 2 + res/values/strings.xml | 16 +- res/xml-de/kbd_qwerty.xml | 55 ++- res/xml-fr/kbd_qwerty.xml | 30 +- res/xml/kbd_phone.xml | 2 +- res/xml/kbd_phone_symbols.xml | 6 +- res/xml/kbd_qwerty.xml | 65 +-- res/xml/kbd_symbols.xml | 17 +- res/xml/kbd_symbols_shift.xml | 14 +- res/xml/popup_domains.xml | 12 +- res/xml/popup_punctuation.xml | 11 +- .../inputmethod/latin/BinaryDictionary.java | 27 +- .../inputmethod/latin/ContactsDictionary.java | 130 +++++ .../latin/ExpandableDictionary.java | 457 ++++++++++++++++++ .../inputmethod/latin/KeyboardSwitcher.java | 41 +- .../android/inputmethod/latin/LatinIME.java | 143 +++++- .../inputmethod/latin/LatinKeyboard.java | 15 +- .../android/inputmethod/latin/Suggest.java | 103 +++- .../inputmethod/latin/UserDictionary.java | 381 +-------------- .../inputmethod/latin/WordComposer.java | 18 +- 179 files changed, 1373 insertions(+), 664 deletions(-) create mode 100755 res/drawable-en-hdpi/sym_keyboard_delete.png create mode 100755 res/drawable-en-hdpi/sym_keyboard_feedback_delete.png rename res/{drawable-en => drawable-en-mdpi}/sym_keyboard_delete.png (100%) rename res/{drawable-en => drawable-en-mdpi}/sym_keyboard_feedback_delete.png (100%) create mode 100755 res/drawable-hdpi/btn_keyboard_key_normal.9.png create mode 100755 res/drawable-hdpi/btn_keyboard_key_normal_off.9.png create mode 100755 res/drawable-hdpi/btn_keyboard_key_normal_on.9.png create mode 100755 res/drawable-hdpi/btn_keyboard_key_pressed.9.png create mode 100755 res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png create mode 100755 res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png create mode 100755 res/drawable-hdpi/cancel.png create mode 100755 res/drawable-hdpi/candidate_feedback_background.9.png create mode 100755 res/drawable-hdpi/caution.png create mode 100755 res/drawable-hdpi/dialog_bubble_step02.9.png create mode 100755 res/drawable-hdpi/dialog_bubble_step07.9.png create mode 100755 res/drawable-hdpi/dialog_top_dark_bottom_medium.png create mode 100755 res/drawable-hdpi/highlight_pressed.png create mode 100755 res/drawable-hdpi/ic_dialog_alert_large.png create mode 100755 res/drawable-hdpi/ic_dialog_keyboard.png create mode 100755 res/drawable-hdpi/ic_dialog_voice_input.png create mode 100755 res/drawable-hdpi/ic_dialog_wave_0_0.png create mode 100755 res/drawable-hdpi/ic_dialog_wave_1_3.png create mode 100755 res/drawable-hdpi/ic_dialog_wave_2_3.png create mode 100755 res/drawable-hdpi/ic_dialog_wave_3_3.png create mode 100755 res/drawable-hdpi/ic_dialog_wave_4_3.png create mode 100755 res/drawable-hdpi/ic_suggest_strip_scroll_left_arrow.png create mode 100755 res/drawable-hdpi/ic_suggest_strip_scroll_right_arrow.png create mode 100755 res/drawable-hdpi/keyboard_background.9.png create mode 100755 res/drawable-hdpi/keyboard_suggest_strip.9.png create mode 100755 res/drawable-hdpi/keyboard_suggest_strip_divider.png create mode 100755 res/drawable-hdpi/mic_slash.png create mode 100755 res/drawable-hdpi/ok_cancel.png create mode 100755 res/drawable-hdpi/speak_now_level0.png create mode 100755 res/drawable-hdpi/speak_now_level1.png create mode 100755 res/drawable-hdpi/speak_now_level2.png create mode 100755 res/drawable-hdpi/speak_now_level3.png create mode 100755 res/drawable-hdpi/speak_now_level4.png create mode 100755 res/drawable-hdpi/speak_now_level5.png create mode 100755 res/drawable-hdpi/sym_keyboard_delete.png create mode 100755 res/drawable-hdpi/sym_keyboard_done.png create mode 100755 res/drawable-hdpi/sym_keyboard_feedback_delete.png create mode 100755 res/drawable-hdpi/sym_keyboard_feedback_done.png create mode 100755 res/drawable-hdpi/sym_keyboard_feedback_numalt.png create mode 100755 res/drawable-hdpi/sym_keyboard_feedback_return.png create mode 100755 res/drawable-hdpi/sym_keyboard_feedback_search.png create mode 100755 res/drawable-hdpi/sym_keyboard_feedback_shift.png create mode 100755 res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png create mode 100755 res/drawable-hdpi/sym_keyboard_feedback_space.png create mode 100755 res/drawable-hdpi/sym_keyboard_num0.png create mode 100755 res/drawable-hdpi/sym_keyboard_num1.png create mode 100755 res/drawable-hdpi/sym_keyboard_num2.png create mode 100755 res/drawable-hdpi/sym_keyboard_num3.png create mode 100755 res/drawable-hdpi/sym_keyboard_num4.png create mode 100755 res/drawable-hdpi/sym_keyboard_num5.png create mode 100755 res/drawable-hdpi/sym_keyboard_num6.png create mode 100755 res/drawable-hdpi/sym_keyboard_num7.png create mode 100755 res/drawable-hdpi/sym_keyboard_num8.png create mode 100755 res/drawable-hdpi/sym_keyboard_num9.png create mode 100755 res/drawable-hdpi/sym_keyboard_numalt.png create mode 100755 res/drawable-hdpi/sym_keyboard_numpound.png create mode 100755 res/drawable-hdpi/sym_keyboard_numstar.png create mode 100755 res/drawable-hdpi/sym_keyboard_return.png create mode 100755 res/drawable-hdpi/sym_keyboard_search.png create mode 100755 res/drawable-hdpi/sym_keyboard_shift.png create mode 100755 res/drawable-hdpi/sym_keyboard_shift_locked.png create mode 100755 res/drawable-hdpi/sym_keyboard_space.png create mode 100755 res/drawable-hdpi/voice_background.9.png create mode 100755 res/drawable-hdpi/working.png create mode 100755 res/drawable-land-hdpi/btn_keyboard_key_normal.9.png create mode 100755 res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png create mode 100755 res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png create mode 100755 res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png create mode 100755 res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png create mode 100755 res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png create mode 100755 res/drawable-land-hdpi/keyboard_suggest_strip_divider.png create mode 100644 res/drawable-land-mdpi/btn_keyboard_key_normal.9.png create mode 100644 res/drawable-land-mdpi/btn_keyboard_key_normal_off.9.png create mode 100644 res/drawable-land-mdpi/btn_keyboard_key_normal_on.9.png create mode 100755 res/drawable-land-mdpi/btn_keyboard_key_pressed.9.png create mode 100644 res/drawable-land-mdpi/btn_keyboard_key_pressed_off.9.png create mode 100644 res/drawable-land-mdpi/btn_keyboard_key_pressed_on.9.png rename res/{drawable-land => drawable-land-mdpi}/keyboard_suggest_strip_divider.png (100%) create mode 100644 res/drawable-land/btn_keyboard_key.xml create mode 100644 res/drawable-mdpi/btn_keyboard_key_normal.9.png create mode 100644 res/drawable-mdpi/btn_keyboard_key_normal_off.9.png create mode 100644 res/drawable-mdpi/btn_keyboard_key_normal_on.9.png create mode 100755 res/drawable-mdpi/btn_keyboard_key_pressed.9.png create mode 100644 res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png create mode 100644 res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png rename res/{drawable => drawable-mdpi}/candidate_feedback_background.9.png (100%) rename res/{drawable => drawable-mdpi}/dialog_bubble_step02.9.png (100%) rename res/{drawable => drawable-mdpi}/dialog_bubble_step07.9.png (100%) rename res/{drawable => drawable-mdpi}/highlight_pressed.png (100%) rename res/{drawable => drawable-mdpi}/ic_dialog_keyboard.png (100%) rename res/{drawable => drawable-mdpi}/ic_suggest_strip_scroll_left_arrow.png (100%) rename res/{drawable => drawable-mdpi}/ic_suggest_strip_scroll_right_arrow.png (100%) create mode 100644 res/drawable-mdpi/keyboard_background.9.png rename res/{drawable => drawable-mdpi}/keyboard_suggest_strip.9.png (100%) create mode 100644 res/drawable-mdpi/keyboard_suggest_strip_divider.png rename res/{drawable => drawable-mdpi}/sym_keyboard_delete.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_done.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_feedback_delete.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_feedback_done.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_feedback_numalt.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_feedback_return.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_feedback_search.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_feedback_shift.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_feedback_shift_locked.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_feedback_space.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_num0.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_num1.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_num2.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_num3.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_num4.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_num5.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_num6.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_num7.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_num8.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_num9.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_numalt.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_numpound.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_numstar.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_return.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_search.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_shift.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_shift_locked.png (100%) rename res/{drawable => drawable-mdpi}/sym_keyboard_space.png (100%) create mode 100644 res/drawable/btn_keyboard_key.xml delete mode 100644 res/drawable/keyboard_suggest_strip_divider.png create mode 100644 res/values-tr/donottranslate.xml create mode 100644 src/com/android/inputmethod/latin/ContactsDictionary.java create mode 100644 src/com/android/inputmethod/latin/ExpandableDictionary.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 5222ba5f4..697dce28a 100755 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -4,9 +4,11 @@ + + android:backupAgent="LatinIMEBackupAgent" + android:killAfterRestore="false"> FindClass(ex)) { char msg[1000]; @@ -66,7 +66,7 @@ static jint latinime_BinaryDictionary_open Asset *dictAsset = am->openNonAsset(resourcePath, Asset::ACCESS_BUFFER); if (dictAsset == NULL) { - LOGE("DICT: Couldn't get asset %s\n", resourcePath); + LOGE("DICT: Couldn't get asset %s\n", resourcePath); env->ReleaseStringUTFChars(resourceString, resourcePath); return 0; } @@ -79,15 +79,15 @@ static jint latinime_BinaryDictionary_open } Dictionary *dictionary = new Dictionary(dict, typedLetterMultiplier, fullWordMultiplier); dictionary->setAsset(dictAsset); - + env->ReleaseStringUTFChars(resourceString, resourcePath); - return (jint) dictionary; + return (jint) dictionary; } static int latinime_BinaryDictionary_getSuggestions( - JNIEnv *env, jobject object, jint dict, jintArray inputArray, jint arraySize, - jcharArray outputArray, jintArray frequencyArray, jint maxWordLength, jint maxWords, - jint maxAlternatives) + JNIEnv *env, jobject object, jint dict, jintArray inputArray, jint arraySize, + jcharArray outputArray, jintArray frequencyArray, jint maxWordLength, jint maxWords, + jint maxAlternatives, jint skipPos) { Dictionary *dictionary = (Dictionary*) dict; if (dictionary == NULL) @@ -96,9 +96,9 @@ static int latinime_BinaryDictionary_getSuggestions( int *frequencies = env->GetIntArrayElements(frequencyArray, NULL); int *inputCodes = env->GetIntArrayElements(inputArray, NULL); jchar *outputChars = env->GetCharArrayElements(outputArray, NULL); - + int count = dictionary->getSuggestions(inputCodes, arraySize, (unsigned short*) outputChars, frequencies, - maxWordLength, maxWords, maxAlternatives); + maxWordLength, maxWords, maxAlternatives, skipPos); env->ReleaseIntArrayElements(frequencyArray, frequencies, 0); env->ReleaseIntArrayElements(inputArray, inputCodes, JNI_ABORT); @@ -112,16 +112,16 @@ static jboolean latinime_BinaryDictionary_isValidWord { Dictionary *dictionary = (Dictionary*) dict; if (dictionary == NULL) return (jboolean) false; - + jchar *word = env->GetCharArrayElements(wordArray, NULL); jboolean result = dictionary->isValidWord((unsigned short*) word, wordLength); env->ReleaseCharArrayElements(wordArray, word, JNI_ABORT); - + return result; } static void latinime_BinaryDictionary_close - (JNIEnv *env, jobject object, jint dict) + (JNIEnv *env, jobject object, jint dict) { Dictionary *dictionary = (Dictionary*) dict; ((Asset*) dictionary->getAsset())->close(); @@ -131,10 +131,10 @@ static void latinime_BinaryDictionary_close // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { - {"openNative", "(Landroid/content/res/AssetManager;Ljava/lang/String;II)I", + {"openNative", "(Landroid/content/res/AssetManager;Ljava/lang/String;II)I", (void*)latinime_BinaryDictionary_open}, {"closeNative", "(I)V", (void*)latinime_BinaryDictionary_close}, - {"getSuggestionsNative", "(I[II[C[IIII)I", (void*)latinime_BinaryDictionary_getSuggestions}, + {"getSuggestionsNative", "(I[II[C[IIIII)I", (void*)latinime_BinaryDictionary_getSuggestions}, {"isValidWordNative", "(I[CI)Z", (void*)latinime_BinaryDictionary_isValidWord} }; @@ -153,7 +153,7 @@ static int registerNativeMethods(JNIEnv* env, const char* className, fprintf(stderr, "RegisterNatives failed for '%s'\n", className); return JNI_FALSE; } - + return JNI_TRUE; } @@ -161,21 +161,21 @@ static int registerNatives(JNIEnv *env) { const char* const kClassPathName = "com/android/inputmethod/latin/BinaryDictionary"; jclass clazz; - + clazz = env->FindClass("java/io/FileDescriptor"); if (clazz == NULL) { LOGE("Can't find %s", "java/io/FileDescriptor"); return -1; } sDescriptorField = env->GetFieldID(clazz, "descriptor", "I"); - + clazz = env->FindClass("android/content/res/AssetManager"); if (clazz == NULL) { LOGE("Can't find %s", "java/io/FileDescriptor"); return -1; } sAssetManagerNativeField = env->GetFieldID(clazz, "mObject", "I"); - + return registerNativeMethods(env, kClassPathName, gMethods, sizeof(gMethods) / sizeof(gMethods[0])); } diff --git a/dictionary/src/dictionary.cpp b/dictionary/src/dictionary.cpp index b37f4c926..cc711f419 100644 --- a/dictionary/src/dictionary.cpp +++ b/dictionary/src/dictionary.cpp @@ -49,11 +49,8 @@ Dictionary::~Dictionary() } int Dictionary::getSuggestions(int *codes, int codesSize, unsigned short *outWords, int *frequencies, - int maxWordLength, int maxWords, int maxAlternatives) + int maxWordLength, int maxWords, int maxAlternatives, int skipPos) { - memset(frequencies, 0, maxWords * sizeof(*frequencies)); - memset(outWords, 0, maxWords * maxWordLength * sizeof(*outWords)); - mFrequencies = frequencies; mOutputChars = outWords; mInputCodes = codes; @@ -62,8 +59,10 @@ int Dictionary::getSuggestions(int *codes, int codesSize, unsigned short *outWor mMaxWordLength = maxWordLength; mMaxWords = maxWords; mWords = 0; + mSkipPos = skipPos; + mMaxEditDistance = mInputLength < 5 ? 2 : mInputLength / 2; - getWordsRec(0, 0, mInputLength * 3, false, 1, 0); + getWordsRec(0, 0, mInputLength * 3, false, 1, 0, 0); if (DEBUG_DICT) LOGI("Returning %d words", mWords); return mWords; @@ -110,7 +109,11 @@ bool Dictionary::addWord(unsigned short *word, int length, int frequency) { word[length] = 0; - if (DEBUG_DICT) LOGI("Found word = %s, freq = %d : \n", word, frequency); + if (DEBUG_DICT) { + char s[length + 1]; + for (int i = 0; i <= length; i++) s[i] = word[i]; + LOGI("Found word = %s, freq = %d : \n", s, frequency); + } // Find the right insertion point int insertAt = 0; @@ -144,16 +147,14 @@ Dictionary::addWord(unsigned short *word, int length, int frequency) } unsigned short -Dictionary::toLowerCase(unsigned short c, const int depth) { +Dictionary::toLowerCase(unsigned short c) { if (c < sizeof(BASE_CHARS) / sizeof(BASE_CHARS[0])) { c = BASE_CHARS[c]; } - if (depth == 0) { - if (c >='A' && c <= 'Z') { - c |= 32; - } else if (c > 127) { - c = u_tolower(c); - } + if (c >='A' && c <= 'Z') { + c |= 32; + } else if (c > 127) { + c = u_tolower(c); } return c; } @@ -178,12 +179,16 @@ Dictionary::sameAsTyped(unsigned short *word, int length) static char QUOTE = '\''; void -Dictionary::getWordsRec(int pos, int depth, int maxDepth, bool completion, int snr, int inputIndex) +Dictionary::getWordsRec(int pos, int depth, int maxDepth, bool completion, int snr, int inputIndex, + int diffs) { // Optimization: Prune out words that are too long compared to how much was typed. if (depth > maxDepth) { return; } + if (diffs > mMaxEditDistance) { + return; + } int count = getCount(&pos); int *currentChars = NULL; if (mInputLength <= inputIndex) { @@ -194,7 +199,7 @@ Dictionary::getWordsRec(int pos, int depth, int maxDepth, bool completion, int s for (int i = 0; i < count; i++) { unsigned short c = getChar(&pos); - unsigned short lowerC = toLowerCase(c, depth); + unsigned short lowerC = toLowerCase(c); bool terminal = getTerminal(&pos); int childrenAddress = getAddress(&pos); int freq = 1; @@ -207,38 +212,41 @@ Dictionary::getWordsRec(int pos, int depth, int maxDepth, bool completion, int s } if (childrenAddress != 0) { getWordsRec(childrenAddress, depth + 1, maxDepth, - completion, snr, inputIndex); + completion, snr, inputIndex, diffs); } - } else if (c == QUOTE && currentChars[0] != QUOTE) { - // Skip the ' and continue deeper - mWord[depth] = QUOTE; + } else if (c == QUOTE && currentChars[0] != QUOTE || mSkipPos == depth) { + // Skip the ' or other letter and continue deeper + mWord[depth] = c; if (childrenAddress != 0) { - getWordsRec(childrenAddress, depth + 1, maxDepth, false, snr, inputIndex); + getWordsRec(childrenAddress, depth + 1, maxDepth, false, snr, inputIndex, diffs); } } else { int j = 0; while (currentChars[j] > 0) { - int addedWeight = j == 0 ? mTypedLetterMultiplier : 1; if (currentChars[j] == lowerC || currentChars[j] == c) { + int addedWeight = j == 0 ? mTypedLetterMultiplier : 1; mWord[depth] = c; if (mInputLength == inputIndex + 1) { if (terminal) { if (//INCLUDE_TYPED_WORD_IF_VALID || !sameAsTyped(mWord, depth + 1)) { - addWord(mWord, depth + 1, - (freq * snr * addedWeight * mFullWordMultiplier)); + int finalFreq = freq * snr * addedWeight; + if (mSkipPos < 0) finalFreq *= mFullWordMultiplier; + addWord(mWord, depth + 1, finalFreq); } } if (childrenAddress != 0) { getWordsRec(childrenAddress, depth + 1, - maxDepth, true, snr * addedWeight, inputIndex + 1); + maxDepth, true, snr * addedWeight, inputIndex + 1, + diffs + (j > 0)); } } else if (childrenAddress != 0) { getWordsRec(childrenAddress, depth + 1, maxDepth, - false, snr * addedWeight, inputIndex + 1); + false, snr * addedWeight, inputIndex + 1, diffs + (j > 0)); } } j++; + if (mSkipPos >= 0) break; } } } diff --git a/dictionary/src/dictionary.h b/dictionary/src/dictionary.h index b13e97795..8f195ca9a 100644 --- a/dictionary/src/dictionary.h +++ b/dictionary/src/dictionary.h @@ -32,7 +32,7 @@ class Dictionary { public: Dictionary(void *dict, int typedLetterMultipler, int fullWordMultiplier); int getSuggestions(int *codes, int codesSize, unsigned short *outWords, int *frequencies, - int maxWordLength, int maxWords, int maxAlternatives); + int maxWordLength, int maxWords, int maxAlternatives, int skipPos); bool isValidWord(unsigned short *word, int length); void setAsset(void *asset) { mAsset = asset; } void *getAsset() { return mAsset; } @@ -49,9 +49,9 @@ private: bool sameAsTyped(unsigned short *word, int length); bool addWord(unsigned short *word, int length, int frequency); - unsigned short toLowerCase(unsigned short c, int depth); + unsigned short toLowerCase(unsigned short c); void getWordsRec(int pos, int depth, int maxDepth, bool completion, int frequency, - int inputIndex); + int inputIndex, int diffs); bool isValidWordRec(int pos, unsigned short *word, int offset, int length); unsigned char *mDict; @@ -66,6 +66,8 @@ private: int mInputLength; int mMaxAlternatives; unsigned short mWord[128]; + int mSkipPos; + int mMaxEditDistance; int mFullWordMultiplier; int mTypedLetterMultiplier; diff --git a/res/drawable-en-hdpi/sym_keyboard_delete.png b/res/drawable-en-hdpi/sym_keyboard_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..569369e79927ae1eb3ca3728fc567c1f5586070b GIT binary patch literal 2315 zcmV+m3H0`fP)TNc zm^N)%WLsOC0vpT9$~4*8*~M3{UM+*$2Oy0ER=IZV+K`x-n76U7!C(+OIXUTETwJsb z4Go1WR;)OWzx}g*l z6y%K^J9Yu|83!^1>pgq+d}TCK%FD}7!}HM~V?ski<5)Y6jqjj$*)(UVjfCUe+S;mQ z4Lf)4yb>H7JS;3M%pWEgo|BU^V#<^$YoHIVhN7jVWf1GTZQHiYJ9qB<gLkk-adr&p|PExhumznF=+FAu=*D z8mgg09=sZfY0{1ytG-;i?{yHVR7C$OXp*Y;Xe?J?lEPDhB{RK?KsaMaK zK|iw@qK_uB-G|ij-HQDUL3H_&Q7!^LvnI*7%(FGB?oZSIpn0RRx_RSiE@gF9foy@3ZX3$OCq+Ge18c z$sin~36Q~-B9D9b?p=oGV?n(5$b&CUO-<-Nyoq7$8hN0;w-go@;-tDkZR8LsbfEvr z%gei4R8({i+Utn^afMrM-MaP1>C>lwVzDCbAh4#kxw*N7$fFwwMU#<{u@iRD1s%FX zBGD@pigw5-s;H0NDmD|Q0F;_M%c-;I-i0&#PAs z(Z*b$Ti*j+bhRP*lLyVY=8$pz8RX2m{$LUtMl zIAT;PRSpnBtMLUFAgFu_%Z4&@dJ2aXz<5w`*P$3+Vp+0e$pHvly; zH#heiaK<6{;PU0m>hFMb!u>lfO zCE2*hRvTlWMwkJW7aJS<9b9UNlDh?ymJ+$hxkDOe^lV%O(K{oB4l_OrZP&e|q(mu* zC&jiVnood&ls}b$%FfQt1yEbyvJ?bU{7O)PYLFVZuAu{+W*lS3jvX-{RV(|f`l2e z7uyXpW8f}$Y~8x`Q;7a`_`3@iE?k7RSdc)FkU4Yatgfr8tH)!24_tkg$G22SyTW$fH+K5VfnIJ%(aDxjEzIfQ>$L=FE@0(VsngHW%7I3<(KI zsjaPj$l4M7h7B8*Q~F~UU?xx?^UQ#XwFHU-CZS1&LY#Pp2M5V!NmW%ZED#+CN# zah#demXb=$Jap(#8e5_I`uayvQBiBi4hFNR{uwrg{rn+g{#Za1dVc3JGc)lRA&S&i zW-nD_UsFbbyb0>_8yl>;y86M)nKKiieIf&A0ayL{|69C{xa6O6amnEpE5y6KKAKn-Ph5Vzk7aQ{e5{vIIV0^rYs~nY; zm34^?URYRoQ!baki<6@r@TAFlQ0+x38%Q#N+D4He5I>M0atYovhKE3~E!4-yC#kQ% z`V!q6xPwdlsPHXB^-`e!$f;AO212yI1;V5&`}glxgE~DHr0OC;Z4}hzo*R2v+~M%f z8GJTv@oT4*iKd)ZJQ@I9d6|hOuiRwZL>!M z&vUMbpH|%{&{g!~mz!suQnk_1Im`ES{dKO$pA|ZD;n0itGmMdvQ5|cO*QE^n lmudjm0I&gIHkJPb7yynfmsOamWq<$x002ovPDHLkV1iL0O0WO` literal 0 HcmV?d00001 diff --git a/res/drawable-en-hdpi/sym_keyboard_feedback_delete.png b/res/drawable-en-hdpi/sym_keyboard_feedback_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..ca7637552b5e256f445fc8dd497811ab7518f489 GIT binary patch literal 1278 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 Z0{{<_AlR|X^KAeC002ovPDHLkV1g0P?MDCr literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/cancel.png b/res/drawable-hdpi/cancel.png new file mode 100755 index 0000000000000000000000000000000000000000..6585bde17996f0306a5499f33cf0e9ddbd2fcc48 GIT binary patch literal 1811 zcmX|?c{tnY7RTREt|HTp;*Nb8?HKDY6_=`QYTBr!Dk)dpvBpw+h#-oZn=y4OS_W0O zqR}b|LK}%v4egLti8Z!JZ&OQd?3&uQ`FT3e{Bhp*eV%ta=RDu@IX5qPoQKP+%L4%5 z$P4E#0|1+V*5~A8q4CtgCqrmbOLFl|@{S8j!Uth7z$r8?7^91f2@1zt#sr0?CcMGe z0U+CiJm-W;nOK-~zkrI;YbR>o zEIW{Bn*M)b;qF0_4VKnkqpkfNZ5y*5SU|;PqWpIPbykkCa%yv&hd=Dx3nxsI3N;b62*fj z6W15U-8C#x3@Ac_s+vI2yEekj?2yRFH;Qn$OyAq?ZZ{kyeA&&^`;hxW@md! z%mXq~=!qikc*7`y$ck+rlze@jbY#blu-?P$?CiWXb(y^K6^h8tJa}i9_Q~)`epkJ{ zZCFZ=ZI!n7fYcGw+b3iS6i&(rp>Pt@bllI7|B;}N>F)`&Nonwlc{!;dKx{p21T4%f&rh`4dLVnzvwo#sPns!zQx&7XaV zuE?&fsd;mS8ry9{bsbJ7)@J+i9xH^d;q|B+UMs}D2Xwl5oe`c#+ctd2Gk4=)^=Ny% z$>v>)fEVfG^~i8qGz?P0ouabJYlzW4&a0ebA*{Cat-%*`sf(PUv<7Dzs=lVCrW=2D zn-*M8r?ZM`w08pJcjbLE%ctXplv!QtpTypTbi7GhewopWR7sUU+rDaq5+`U;al`D0 zUaOlzs=T>*aNGI8Z}h$#=eGl7Sr@JIPV}s|BLN}FeS(Pw1wy6+nY%d0qje+_nbp@a zK29S;$)05U@qQm1EpmQ!b@lZgq@d#r$J!N9&{=yOI2`Vzt8JTP_#~G^lba$fd-AvU zR2af;o1>%4i+q;aj$!np=H`^%5Lr1t5NYioetKtK^n(yTH(c{NFi(D?dCDMFu)OSf z-B`KsR=@-Cf9+BSnFb=(h=nvH_%n~@BIMV5%dBnM`kJCfd${+{{4ByRzk^fVh|gXw zt}pWEwHX-^+oA&G=7F`yZ|?-d(XAhQH0xk1>RxN|Vz>A#s|EYh zA*v}>z#}G_u}?tN_aP=>$m6v7B7v~--f0CE85`>{d>;P=J~?@Uvu|6|nrK7a>QG)w z8)ioDt+{j@+cgLo{pw$A>A!t3ozz=ED*cgvE3e|wfb-(&6eqHy&@|f0y|x?e@G3~O z#D(WzuU@^{74NF#>$Mji9{#iZ+9&Z)$6ZR-dumLRSS${FKF;-lWe8sqe-F@%VD!Gb zYb&eo&(07iDk|QEQeM{8_2W~*Myy8rHPTPC+S=1rR#qL#wf3G8iG-P-gu|5zg+kr* zCOT7m{Z+?rF|LRqRNcWYl-iD#25wMvv`L-o=xV<9*?S0gJ1Z-UG)h#t=tmxTX4I^e zC%FGKR%t5CP*?zIGK?8&xDHDLV%tWo)tPrbhdVSSRGn#;hgM;BeOcvj zaWDnP6-szp5Ue_vJoBNlFI7RI(R*dvTN)6ifsr2okPN|!K-CPQIs_na2xVO@Z_Z~9 zA96eEcohlu8P63m0O+}CNq@%iA%y>;_Tf{9kZ%9w3d7hRYGWUL29h661o%TeZiM&0 kni21Ib?E$-#61fJIBD=PM*}4-sLKJQi^sWo=fLbg01T&i8UO$Q literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/candidate_feedback_background.9.png b/res/drawable-hdpi/candidate_feedback_background.9.png new file mode 100755 index 0000000000000000000000000000000000000000..203c4e640d8369111e7e09102e1ef502d60fcff8 GIT binary patch literal 833 zcmV-H1HSx;P)V-Cu$HxIEp6v7C|bq)2MU6Lfou`}4gw)uL}DO{i6A@(f?!}o2*R{; z9S5#=B6_~@dV=qPFPC>jy?*@O<9&Lb)@(Kt9Ky1!(}`GI=HwH6!V=8lfXI(}#1}TX_AHpvhgQ;W_CR zqc{B}=`le%-WVJLBc1Ysbcx}r_)2<2fGWn}5STq0-jFUbFCF&@&}(CG2+R%*pGezk zKAB94cswq`;jnQ6olZy8>vhrV_4J#5$f*&awyA>rOb3(AW<@HM+L%2ek;q)NT1^xR z1@$IB=?UrX+MTl~z#TQ0$z()2oo2I+q=WMLyq=cs`MBWSq0H9$8S4VG}4&8D7uZ^AjR)b%?Y4n?_KW(B5Fsfc#_O!MgB+Tqx?{e^}DH7DT| zi$ykIN~O{nFf{MaZXavawyb?|a*e~~(?qpe6^`S~8x>{CSs)NF24plEiGIH?TCLWf z9CN&wuj}yA!7f`!<$Bs;{E04?|1P=aozZ;`J)tacw@F7#!5n!3<9QQEPh6+r#-d1b z3R!#;Uch*%Ir{$LA?c|&X@r(N{#Qv?48r)fn1^)p!7A4|tP761IovmG5nRT&p|J3~ z6`TV&fCD&y12}*KIDmry9KZn_z}Zk3zwTN2v&5C|Zt`1%-vSH(*kja>F`B{A00000 LNkvXXu0mjfD}Q=1 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/caution.png b/res/drawable-hdpi/caution.png new file mode 100755 index 0000000000000000000000000000000000000000..5cb6c54b93459214c352dde5285d29647173d680 GIT binary patch literal 1641 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/dialog_bubble_step07.9.png b/res/drawable-hdpi/dialog_bubble_step07.9.png new file mode 100755 index 0000000000000000000000000000000000000000..94b915432d34e3acdd8b6130e42718ed7eda1d8e GIT binary patch literal 6012 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 LHPo)ZgL(cxaPK}a literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_dialog_keyboard.png b/res/drawable-hdpi/ic_dialog_keyboard.png new file mode 100755 index 0000000000000000000000000000000000000000..c7729566c241f096bde71b5da5f46453e9507f53 GIT binary patch literal 807 zcmV+?1K9kDP)(RCwC#Sxu`FQ5c@las1#$;75WX z;x!d7wCjIdgrX=4qE)M;Mavd#+XU@`y9%UeaiP_Pe#2e3Fi}(_6|Uc27!^lHd)~Qd zYI;H4oWq?151x5O=e*CEbKdtkC{CwSf#+rtIB$jkL%>ZJAZ0QcAruNdMgJ9Wo0GUN zfn=djI1v>^d1J9yKJhsFgTWvn4u``!`W{YKP@V)#jZJI_xXEdBm6%K>LaWu%`);>e z5JizmexrbNI<0m(ol|tp9*-v;i^a?=^7AD`c6tV6B%$4IAEW;ScvP>~pJ|%L9KRUz zk^o7PF05AT+3eckaD2xrQ(5B|V-``(7VCi4>-7%*pwU_j1Oi8PyFJYyKW}2c-(M|c zzkv^c47>;KG0I;FfI_Y-vBdkC_&)*I=|Zts)cfIZSa7*qO!8~f=x8(&a=BbmRaF;o zC!5Xwq(Z_Pzmz#w-oPck@DiV@o{}`}1@2QBR2bvu#mq#CWyWOsCU*W&wkx0aR9iK|21XT0$9VSmkPQM?G zMt2%_tpLiq@ZQJhp3!xq(RdsRg}#x6UB}bxVD=w?+C>08^C8CnvF*6@_SP0M?D7j) zmgn{r&QG_mn|OdW*ZJZzwgCe9wad6mcDh=vF4<|g)5A)oqT5%$-+yGY+0xhW1C;t( zwOUQv)>F|e`h32-Sl5*u#{HLtaC2WfeFA);!M0pMcHk`#-^)&y%VoaPD5@N-K`w)* z*d^?2#q0GR@F)O9xM3=lN=b+icskfntQ0e1Kcz~X$mjDi@O;sxGTta*d<7Ds@i(g> lzz|>vFa#I^cy50M7y$d=)#7A2T_ykk002ovPDHLkV1nlod^`XE literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_dialog_voice_input.png b/res/drawable-hdpi/ic_dialog_voice_input.png new file mode 100755 index 0000000000000000000000000000000000000000..11a3cfe77321318d0e563df5cdd42eb06a49ef1f GIT binary patch literal 1931 zcmV;62Xy#}P)LV;{7Z2xQ&1l1q0v9f|}tZXP+ zQfVKK`B772Q>is&P3`aZx^J0W(|7NTE*&_$`}Dng&$;(}{LXn}Yieo|Iy8U&e36}< zEtV`ar^fS2u~^pw{Z=w#WjI_7K<*ZKn{Ta%xkucrWC^msfC7# zAAOgbn|o|3C7d5K8@`BPwa%(<-@X;Y!^7g`%a`KSt5;&df(0TqHB~HLyjW+tYRJNQ z_6`gTOs@c)XT^#YwYtJTc1Cv{@+FK|jj8q+%{8~njFsS`890vi0F8*OO! zfCF_F9*w{h8g--7(xpoqDC>U|@Or)LaoMRGE^xf#xO7>vg;=aTfyh)TWqoh<@7}#L zfElpOL5_6^?}n_tkLSh`S&OnFs%;?vG)@3vDj-w&r$XgY=JyH!5?66YW{c%1B*a-+ zSyhGth{^Qst>P1-IdkSzP-`|IQ`)aK;mr0MSB-Me?YfH02(A8i2Ku0(WE!beV>qXZNU?7{##<(m-Mn7%QQm;DA#@iwD4V(Lo%*1t z7X?2TzJ&X23}`$RgyAEQ!J{ewWN&d|2QRbrLEBU%M4k(QK;ZN4?(QJxfe>qu;A+6N zz*qq&5HNiLi?Pje1GfjjRDgoBaaM`{?^9iyC(AW$=g*&a`2GGtOs0!SLokJ};E-1a z2M3KTEonns*E$An0pF1rhJw>^*}7@aNv24A;ojcf9Oi)-ZqCAqsx=jGBmDgdv-v(d zJG<`DqeoG;S70tJQt0=^H$pW|#efSapz`rfgQn@43NV?*Z0F9g|0Dvi=WCjsvky=P z_$2rg9JsTiqr=P_qPVy?Rh|kP2U~SpH>4*|p0NK^#3q87!Mb3#7n1Jlc;ib zDk8!Uh!Kquf^5!BxWarvVoOnXe$I(7dgiWe*QzptL1I3gdIGODtH(r}J3BkW{8_+E6W2h* z3USTpgf~vW;=E1Rl{E-s$I{Z$D)-6-hE%(R5dlacw^m06h# zGvTJ3WlKfo3S~+}fq$`@M46?MS)LkSrp?+I(As>K^#C*VWy#HnF8+@I0|4zTW}pNS R7g7KK002ovPDHLkV1j9npK|~J literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_dialog_wave_0_0.png b/res/drawable-hdpi/ic_dialog_wave_0_0.png new file mode 100755 index 0000000000000000000000000000000000000000..33023c3f78b520a4d0c6ab9dd832855b39622a54 GIT binary patch literal 15673 zcmWlgb3mP49LI0AwQ9BOZmwmlTDEQ5_Off)Hka*MEpu_%Hs9y{qx$nc-RGS1`+RXC z6y(06AQB*gKp+%J2~j2B?-KA63J(kXmaF}80Q|vs5z}x{wl{NeH*_)u37gm(nUYA_ z8k(CbnHrjSI*yt0fk1q#lA^*Y9)C}D5zWW`p&X@R6*nD3$cUC_1-?& zE+oeNewFWDJ-7r5A~}tJi#={sA*n;((&&fig6m>}a=222R__Xuge6EFo(l2Kr3rw` zjw-IxqPx5dD}P*30@Ydki`=67B(rVg4pIALp1SM1vKg<*t~*W%g#%0WzLNZ!`N$MLpJq$-0CJ8TH8aaVq|f^6dM3E8Ys;Vj- z%I5_`sf~f&Fs&wI7z@^M*NGr$ho?a?xHc!&X^*;th6dItdH-i+x7MkzJIIx;CyTVt z3}7Lm7AY=E1&ab07yXCRm7S;SaVFhLwd(6C?UqTM4maE5BzXbJ2Dk^J#Qw%do?;L& zb`KGj&`TTy9{RTkmRM~Fs<=y@19)i29JVRGIq&-wbMG=7G9n%qi5$1TmI#LRV{Xpb zRatVJazA}oC^92si|?!Sy8aG;zB7K#pBno~uTE7kW3lfo0tYLCVS{V1604O*G`A&^ zh`CL+jTetBr1#GK8TF;z?dW1~myes`+z9M}eI6qInPZNiAGZbX$86+Y4_3|D@S|H6i~ z?YnS3UT>y$AV*zlD&c>TZ)6Z*Z9xjbFoH&T_5vdKmEET{OXa^@a4hK<>v$a%JI0L+ zY(9oSE0C2jNSd7*^qSznSBNkW*x#W@X3;^ST*Egkd5@Yx z^Nw$MAt82{+ZKLhRhhpF+9=Q4e0z-Q)BO8_V7h?^&_cokN0(eEW_icbSFK<`G!#PW zpbGEpqH-9!1;yf8ArgKUsQDQv=0=YO;R z=lvkZd-4W&Mc>Ogc7$=E_+rQrO}?|YQbZum++kHG3;IG^FyOTArD#Xz@Ov*>p86Tt zB38D{hncdn`*WghcORniE}E~ENYx93anB2 zbrm*@s=;75#yhZBsWaFu$yQhLnklAZNbXi~NTuON-`5dFnH9M4Gbkb-5Mi?9kO=l! zpF_NfA1?>cpdQxUbDKP_jLgPZ7a1aLihS0xl;iDa;)z(cAh+r2#bE;J;$cZvGGsy2k(mivBa(7*S41wzB1(Fwv;lu?yEVteHmehxWY@UH{I zeY=hhoKP4vW?hnprCCX?pHyi`lEYe{GPOun7n=GJX!H7brS?}h+Ua}NIN~=FYjpLi zx}c~=wdvTQ3l+Z&rFyuSQW5tJPxH?ZsydCh1zMo?JECkozI7-lLTJ|a&!*>jNs8~m z+|1L*?Fpu{04?STtqe{R=GbX9rSrfDHWlyX0(CDSqp!YKr7I4E=xrM(! zSz`KX*bmJ~s7l`oQW&P8lq|$Uq)}z7oTO;bh7j7xwC{GjSgs!!s#$1vJ<*8}?H}b+ ztJWH#ij28!nqUY$^-N7pj!%-~q3w_$O9)?Rw$)DR5_o^y`Gd=-RfKI2^h`dKFLC;j zp7=?Pi#tS?trcEx?lvOxaw45A*mxvX*6;0ZDZNQ4j6y(2{mKBsO`@-O6w-@XdPvB1 z7~dTF<8ef=9o)JVG+{^K3{m`MPQW!Ult@=G>9B(BG+A#r06W#~`=WEQRO^26w`n|2 zhzuBvQZo-SoM{rfz7cY6{?qIKk1^g)$nBFnCk%KnxmQWKuOaNVf9H$7N4{%Ewy$ls zBD)CHG}{p5#WPe@*<(X$#^O|#mm}~$9~K6Neer9J?cQIKQ_;*B6$43q!4$ljCJ{eLgBJ)oQY$G}C-CUl47uTH8F@ zr-n+m7z&#A`r-G`vDsECpR1P%tC5YKG-O)-A_8)g=>0LMmJV~c-|niK!&6i*X>c6-OMkER!VeeIOl zoag&;ZwK2tnaxW*7cej^Mshhe{5C{oz7T3b!#duHgH*Cpe>s{!u6)})4^NWR771gD zO^B@%KEooJ6$A2lbxCbD~VV@ zU|?cVodFj~;CA|3pWy31G>#dIUvi-I2|_ZtDvfVJ;|han+clU)xO6_i_J{L(8rNTR z&~KI-fSHH+Sq1a`a~^c2)X|^I?wd*8_lHgY%_fVPg5ALbvHEFX&Wp5cc+o!{ z7RIrjRI54Q3_<=P=c*^|{jpH}$dmy^=XQI(&U^j16IXgDH=1cpV;DH3%7eEqgbR;I zr&QB3`GJZXq-bcl$&$XS` zQjNe|L$H%WC5R4LleA!)g}`52NirX@kolbP)sZafM6x57zjd0Yz z4RisirlJz^{(2zTC_FSV83>a>JE(PZZc>o|=jSo&_qLyD5Bq+d+S7XIoYn5lLiS}X zc+|oLu~w8#GtkxOGh*FQYs{=8Cg;EP!tZEPO-p*xpG+a&G;hVX351l}qSI2zq_ci3 z^Q^Tx8hbom{#%6m;-f&W85Tbh0$C-{_k)s=uQ#@@TcJ$7R_|YFju+iRr{|5Om^hM9dJHc~1 zuB3-WN5mZr7|Ic9NH@qg0)4%ypFItE!|&zn6|4w%iYbYLr+~98l2pqrn+FhVpk|}l zQ;z38eu|irQnsgbP!xz%kcwFP=oZvY4| z+BhX(o#phKb~<8wq841H6Y!A>N8{!L@LC|Pa>*mWCb-fazAU}6GwFA%l;uvr-c&_( zb{<64U}_SlzxeV27oyk^WT{Z`EBuA(I*wunms@?fcNTeWoT_lBu&lcDDaN2fFL;(| zWu_9IE;(xqsQ8;FNO%9ft)Ku(Dn`i9b^V3nF^I}ZgoS}MzfokkTQy+&5G=1jLz5B1 z3VpyH`KwW90I`@sH->THSnF`Q2@Fu`A{d!t0}@RDC~gA*Pfjvp)p*WiD_ut~F5=yu@CNSR-uVKDVOZ zMMfpfJLyQtJBS;)g~IEo?Ac6iJh|3gurj^EXIga@^B9NsX=9v&t2FdJ4@X0~Vv#TD z`}-OJPzZN8#Ub>Yn2tx<*s8GiF;cKz;s2=tpr~pgFq7aw28NPIGn9_3DTzzH+`iAZ zB$+zJc@^Zxnzcm*iy{<^;&QI-Cc0M@lO9AZ(~|0ZAN;Nqfi4kVCjWwwB>Z**qh*Eb z#;)~0o|htkVJWP8&LZoM(eBU6#e!5<+w;!jwC=i;us5E10}9?|?%sigNy|rIsGaUk zW+^vR>+t&b0}m5GKC(I$yS&&Q214n2CS<6EFYlLd&O5^~uA?<@Fk=e3V$|damiBEN zdh~tb?hfuR_h%^kmUTO=JF&)H{$=LETo`OWr8Mz5iKYZ4nf{ULP zKVU1?BrE$tI|_BO;e8Pk{Y9`_T*#9s9>t}h<1o4ydVex|eBYA+q{5Oog$s?MAi`T) zWf$7U`y17>-5{+qK5Q8G982zN9{>{8!FJ-!a(IL&`4`$5UGBeE8sAYv5DEtWL&*$mq@I6DJ5ODvgAr)R6W~RoyFA zQbY@5g?h@UELs~(erC7RWt#PPlRxX|VWE`uMs_48*-&+W7z%|$Bi6x-5l4duMIC`; znn#Boe>bbSz%}pCx4%RlNn82~4dA837Taug^Sb~C3mc}S%_4nlt3R$%bc(B+g(PzQ z_ZGYLSDD8e04b<^&8l^Ih^{NV@D(XkU7q2y%hEh7I{R*0*MM`@RS}O(jH^~uRTXCu zg^4c3;-(YnfMKV2LK6yGqwnRsV~WdUG+v7!XTdUPLd3{2+ehSU_90E%aYf~)TqBeN zs>ldbbc0aXIuU$>yTh5n%Hi%vy=Xns2IC+4k(hpg+YiYWrAz4qcxgpWAf@pPrm2EhcK3ClI19z`Qc^jX zm;hvu4E8Bw!8-{b(P)u)=Elmr0v8fm4({=ng4XB1VNuC2Ki{3G58T0toRF4FcpMTW z!#AB%R%KfQTfH+A9)bZT5a~I9By4LmhHFFP`gTs9t*ZhmU`WIoB4d&6f~s2;&Z z4G0CyaEyXdDypj1rZnrc(xc#uX`fCJpwz~I?@{^-Ai6!C<|2uqyvG)2e_xl}-4Ie1jVhc->eB`jJwRkVbu7*f?&qDd=*Kb)tK8XO~2R<+YF zK-24Ub1=na_9tVAAjkEmv{Iyu_HbewWkmHU?1WY2&Pd$D+tkOaJmWgFDq$T%2lY0{ z34>hU@5z)FOSEVTKj6w(`SoBofZmzqN$`_luh;b$^|*b<8Rxz9LjRX!7}s`7g?cmG zEPijd$JCxz)5MG|o&v#?0?40g-|Rcw&LDxq<#yd+0L4)lL#*_HSrrZU*r4N|>x!SL zkhApmG@pBVdt7(V`(5pOoAZGda5Q>#mXyF+nJ3czzFd-V!K>$?zW4{t>vsC7fUq9e zf94UHj`PC%89k^97A8A^TBnIoOx>+!fCg5zl({6<3DQq8Vx%{2>es7n2|1SFGhY5O zUv246Me#LYx#V}8w^vf3!;iMFn_A;SrsX#3QJ&@z`iFaQc&h`3p8DmklM|{Df7Dxk z{L}%xW~av$f^NGDLXo@-G@iapu+kdzRenC{?@K^_;hSY$9HE-7h)I(1W*<6Lj8eYI zX0RJZ()c~M;nVMlVu+=xol4A~IMMl)(pSU}98Fo2l`k0s`l>Wmi%X)70#(PDg$j!w zV`aCVNQs&Lemjaut2Em!qhgh49PQFNf=TSh++t-iu_>?nIR&1MLtitn&d;!r zLorpAB!uopHb%fHTmjR*ZcJcT01+ZZO008qEw&9D7O#;4_s*cnVcmkg2Kh?>teJFw zStue!`q@8++?S$Z=tx57XuOfwGnlToyH>@GHvw+wdOh~3NC&#Yp2`b8_4bAThc{=U z-uGK_MN?HE-KQ7BSFkQfSh!J>I70^4zAl~yV=SkA6 zz3sR0uaIC(xQ6V&qCR_%(RfnH<3i&u?djCTs{t_u82{IuFKl*>OqIW^U35;Ovp*x} zA%_W861Zn~yVo658UM+%v1xXXr})PZwD)LGJT{zE*+ zp6{e`-?`QxV$4VEu1Igp9NWjv#GQf@;)dQ0Pqfi!E-%^R_XY_Jb1da&R|(7U04T!s zrV?}jZ2>)&VkFzkIeO?TndN=nR-XSY?D>!krCOuDUp9ALhzr3b_ES?J0z?dd3Zu3- zAnTJP;)waz@)h8ned{yq-H4RcnO)ABmWcC~d#!Xzs=fuwCz<2g(CStR6V#rmQPs3-Zqo#-p9svy(#(q=H+{4H8$TSxg8ot&$sRrbJ;e^|gt)au(F zw8lDKd|aZy=t5)*PAW6+I&Rb!EwLcCc1Ehw?-3B?5^HcdQnJ7r{F}j0G%yf6X!sAX z<-eCnn*#=-+ULk!-S&yif4U+m!c1p#rD&NNHR2BOm{Ft45qqs#fkJsEz=TLI0cHullUf0m(2zZiH`7~xw8i}Ka=mdrBx-w10}qTQ(GiI* zKB?+NG23h{+t-!pYau(aZCXNVmIX`#9*XYgV|pAM4mH?*v*rdnUBJ0DdA>c$(d+V3 zMKTmgJn@~-0DHdy8tsL0zO|0*$uE&N6jLnv+ajZiS)oOzXj<(`jc&*27zq`tIQ8H58yh5QuCTKb)r@+&m%>uEgM0GvS9|;#r#cU!RiC^VXekjG< z8rKjHWA!n8W*O@@mwW1y7eGfN`GD=3`jGu{c^XU*kMV%%L~WX3*p4qtTsEuOaDTR1 z3X4X3T4<;4@pQch>jd5|8Q2s|>iq?`Voq?O9bMTVnM8#_aQ!LKC-4l>@AYbg5+GE$ z)6Je9f;u+@vZKhbS2?b2GFBv9Luc>=pVOE4ZMkXrz)_loS0GaPl_n96>BAs)$~fTl z+a_q_q_#)k6*$JI$H&K?&JRB&Iu44XGr-x!$}#0kl4eSowd>e5C$t>~XZHfz@S@<{ z<$ll)a89-CT6m@7`-y=;!b(p^_rJ;dEs@R^ybvC36O752E+tQLyQpnn?@2ezh(K9j zLWCD;!gw&K0FaVF(_-1y5Bzjztrk1o!-6PqMd5?6&iL!*%tfF zqAgsn!TxC%a z#hw1goxT|$zm#tI%Vxfodo1qts}EVE5p$-zHE}5+R!zr~e&Yi&Cn|9t=$Tu?Y$5^D z6|>p{z#9He?DuFGJpN^wct!BzN&W#Cyy}g{Bd8XP^s67pV~|Pt0uo>HR~pSzm3kJk zpZ5O#)vDC*@pA=S_ucA<-zXsgKiv~ngg@L4%S&^N{*Jniin-BkDM;kcS0}9(cDFqY zpb6eKFf0RB4?{at2~8cMZQ*Qv%_l5XH|5bo$84|Ta`1B&&%>JYN-{eqRnQo8ITa{N z&$@*IE34}v`aQbsXlQbANETT#M#W@s(5I3FOQfd0)VYTP-tYtF;c=V}< zx#c)G6{1VeGU_6wiC)D1`_u=ou5K74+~h_}9YlsCNLzicSAm@zL;Ver=hnQE4RqJH zetEvD5dYo)hz36vYDm zYh?YIHz64B9W?_!Vy?#&d&MbqZdhV+*h~AZwq-*@Y0j1aJilSo>s*#Lh9a+C-Al&R zUXVnCkZHMUCh2y!TJVt}E(1ar+VtK{4=#Z)FL*7oBrlp4TP< zFFMi&elqX|;N6_Rga`J1H<_3O55q@qRXd#63_GW3TCy?^Ma~6#&Z^ivII%YBm!A3pBq`tzmy*oHgmp!r%eu+J{5af zhk2NB@Q@;x;`R$#p^3(`1bNCl)>UW2=yZ3qkW)wDL?Z?Rreb1ZX<$7;S7qizMcO64 zovZO0sqsWh55qz%?(eMWx5^J(%*MmW!CK|eTi0!aUcvWuE}O4k;(rMSuA7OEZinUgU_xOZ#dEW zX)m=gWCkL?m2jthJ_-233rRnQ%cQR8WzcOeyM_;+O9!#WT?ZCbb8vXiuQ!J%YMwM6%c@c%>hmtNfhoLgM8eWED zoX%M(pDVCT6Gt9T3JMkpXXq`fBrd6`G(VaxUJ!Z^m3g$0uCGzmW&TT;r?`cRz(0-& z54-)%JOC%1*-*sfbh*B1bg0h?pVgX@UPI)~HX4r11xWmo0Q}=o6`#qLQnNJT?&3-b z&NcNiY)=}oBf&7xAHb65OE}W$2ty?z*b7x~Rh4Fd88u;O;Ii(@+2;k5nzYFRQlF-7P7x(bNKDo9qMdKC*I&0oRi4Z4)k^j;LYncu z=)!wFv-h|50b@@mDQGW=)g5{>QRMFw$x zbO{CF6i?*{!*E9pIc4x_(MU8tmd9a!*dwenelNox4&7-5tNfrHxiyJy4{FFLlx(qO z3;40p3Xv6W4jmzx5S~&j@4eqYtC(gqS{?Eu`|zM}sFuw!T$egx;fdYiR6w)b@QzeJ zp-n#xO;|PCsp#oVGNfPJuiD3z2vZdjt7CXzN=hfiIb+y{QXw)6!Ym8e$u7kE(2`{T zxy*x@j`t_r4s2u+0VrPzk3mCWv0RzDxiMUMk}O7uxQ?Q)R@+1R>@u`)h!cCdfqX2KVap#_pr;NcV^dA>L9)KeB7>v@Zj!& zeuG}Uk(f@sFz06wDDb-fL!&07xV2+htrBQan9ifTD4r}|{=H zzN)FJ){BZc%oa&15PuCxg}g5MC9ZJ{0N`R0!`yXmyc z0f;%6DtTs4z)Op=wP7Xonvk6+gpsi?iWV(l|0xA?4w!`%V@cE(Qnf68?{sm=B?9#h zG<~M}Tf;GgsX#%ZeF1?wYfJVcmkvV5hf$hgaZF`3e+IiFL(qPsbF>yf*m=NIjbW*$ zqL9S;Y1BCxj$lH2yj$Vu=a&(gxeijh11KVG*gttPskGE|Hx zLgnnOb@fBGRhn>zKWr%^FTT2w1$ZHdPIc2-)df1Rw=p8c&$U}Xk2wZK?6KRfCW*zCs zV_{ZyssaS+j`G2$9+D4FpU&(;$6f}!CapmI*KNF)9ANaXk7Q`WE2^0G@aewd0M3;Q z!dCxRjQm{*y+$U&Dnb?`(NKHhOr0Ot@N7uV?ZXpKCC@sp6D*lAcMo5d9~wO&ze{LE_ajU zsb=+wm80ugCrU=aKhLi71YCCk`jsvD-p|tg1YK8#GRXQnS+SuOz>Sj&0M#EN>1zy9 zB(r|ZI@Xd9nPg+vOQ{GCCmaUO9?n-h>G{98E&=8V)_nFZeq&ya)Iu4;?$BsMyNnDe zyV*n<$(@zeY@$&7Biq`kluDlQi4G?)R0Rc==`p0Co&qNxM1r9Z*Gw_2+M_EmS~>k7-}=ajnC^SWvONn zT$7@z*W<^31JYn*&VePEXDTbyAj6$!IghT=mS+^4TZ^4LiM~UK-1Bt%YW8y)>c(T>-fLj7j$xJ4}kOIftj+^$q-%7PW z90I-uaIcv}bfxNR>tcKRNx$>Ak^~4>_;U8bqJI9A4`D%eW`DD_ElCjku;I-_kI1%8 zoluBQhQ@-ixye|s1aWVW*AC>w=~AH@yU|$uZ{YNwWJQLz9WLe_E*35MELiDA2-rI! zbI55pP;DPazTwl$o#1r=n4pvYgRb{u^`778ZbsEEw3;&B>_JFSpNe`u7u3rj+_glk zp5Zd$724jQ5pqu40Tnl66?OD=ocV0Di0u^wOfM*?c`{bnePl*A86_7vE3NY92Dv+w zuRn#LvE!~HDFgBJeG**rM`i)6FZ#rgblgW#>QoY2+kRYu-gN=)+01Pl(R5IZ8{u#{ zRB%kGoJ6RLHFG#>4NpfJgBK+K{{RWl8?_PYbidFm1X4G}W7Noo8lws|8Ox}2x-SYI z&4Rh@etm$l%KX2>BpyLTUFV0Fa>uJ<;DpEtMVn?Ffv6;n>$4p}?SpMHQ&B-zFZbi9 znmb>xk#^ea{&Z}&bh&*r=Oc^TIT71KwLc?3N7%IR9N4fpy-r@!v+U{^R(;V#yl!cL z0@?gHD$R|&5oUp`)X~CJPnM5d=BfqM*+0NKjRN!r#L2FL;~zZs@`|>{rgr_~qno@O zVZ6Q(8K)|Nn6V(>u!svAHsuhlv1V*EVtr=w2Tt8j`uk`a-pjMa(#E$37g!OZIu5cs zA|f)CQ12FSsmKPee;Rb-SM55gT>vcj-y~eU8^Y5!nXPk#j4BfTWvev%0VL63)bcr} z9j6WBE;WDC7pI3 z(%?14^9A|7{ zK5hnDZTR95)yIiUqIz)8?+TIfMP4fqNqR3W8@-m{>A;SD-ZNIC5zgRB&Y#7+}oP5FScj?nM8yp#{{b0Me{3y%}s z$+k%(2*huKheEafmVHfXr=*y))55Bxf`kd;}fv8{TTtFml=_LrQLzg)Tb&?y1B6<0A@&^IjNV3 z#8c;nQR|n1k$HFS$LoQSF0%EZSlb;tsJI|u*l!UgZPKDgN)Dd)SHN%}@^;fDd_=en zk1qgH|1#~`%Q+cKNbDTQ&ba+Ib)ieIl{NQ2EF8vkXl+_J0|sHrl4OE66M?NWV>4S6 zQMFYyw1E^LRbo?1P%>DOm|yRn4MR!THv&s#8r_gGVP$=Z7^ks9g5HDO}riuf-ix%j#^@xe!#uDI1oT7-MbH)ZW@2ohpgKsNFpAGRb? z^4%=q-@kuLef+YV^Kmifw9Lx4y8Q_uji*ylpLpu|^5!@7bO5OOt1?HxdmWjJ8H?wO zKkigzpI4wp6`a?Qg1{{TRThB8Wsq;K@QM_apw*#*$0;}JVu^TD{^SaNh(2Ey;fdma zYC7woP!!t2edxGX-xO6<_j1|HW9l*VEl z`@c1s*`POg8#5LVwTWVC^2*9$W3w^t_XnPdwruT|d(zUq99vPPDP1ILfz{T;qKKkH zQz2@<15lf9K>RDKG!DzM6G<2f9wDF7rwxiy%){?+zmVg!-|#_#`3sRK=xW1B0Z(A_ zhq!nP^6A*FZ7+oi;5~-YD2fOTaI~Os$tKLCcYS)v|Ke0gaB8i=G)f9X%$HzUQ+uslmhGC@y;p0WEL*$GP11WErGw;YK|KvM)gI z<-v)J6#9w}GpI796^<)86kc zid+fU=(fl$D-VYVjv8cJLS+IQcISN=bpnG0iHuaZRGFjobJ=L|!akro3w{Nn6^ds2 zO>k_d5I8RuTn7&euM%325`5%;WQLnB8guv#JH>sF)oUEbpCW~1E((z+e5$2%Uu)m< z*8B_TWpM!by$WX&WYJs)UlR(2M_QLGg9hE0~JjWMDU(y;ikHDK>DBk~^p^^&wZ zkl6(UvHKV>v9b!5ej%1Qk1e-HZt*~GVUDO?OW1qe9xC#fPkvr3%Z%t6WM}FDU6<&W zuZ~b9Y1;gdU8+dNBwhMbo)wR*BbVuF3c~Y5$#=wjX=k@vON*fW1OSt);_(5=3^@=8OaB4_kj~~32itG@ z0Mm!qx#7YwsLt78=!7BY@PNi6H?#fUpD2OMxm{69E5lJx>2s^i(gC1ptsR!@3=v=` z-7w34Mu5LikW!UXexuaW(<3f8=OPsP@knKx5CVKT zuz&*kJ+Fou|7xadYk5eEUrZZ5e_s_h--(QwH?=x|Jy9H4{IW{u{a?x!43vd_j*4;M~{!fk; z1EJumIII^b{_mL-p=HCaV+XdKnzBkMklVo;2p{8wlmgYUXjuN92@~eDt+MiUb~e5E+BX!kl|VOcH7IHiU;n!j|jg1D<*OF2SO3f<->m5 zAyN;dDyu)+)s&)&)J{pzB|veN)u1<^>YVV+=j8w7K`v=w9wQB3lTbsag8d)zH3dXlO|nG|p{H$c~d~nhG?5)Z^P#swVq8B)3T$)f6}xYh@#SCjmtj z1K15CbK58g6hCUWMN|T%S3HG#YIB1o{$Ps&iC1M=UAoY2soWzB+fDK3Yv>9<%V8P>>YVBERhEuTi}#iXsTN6uKM0-C$SWvh_n z;?c~2zb_i@ic9`!K{a*owv_}^-Xi!)*?Qmn7LKXw7IW|p^$0Vn7?x{nFEpgae!oMg zUSIhCw|e=%=or)#rm(cxAacUULg6HIX1;>qybrWdMU7Ng(g&oEu9sjM(#R-tGy_hwp_eca!7Kg2k&O+I^n)OJ#AX;^ zl1%Q}tpV464pysFvOi1hQw}`@2b2_$T|(Ad7y$lZAdB&E+R-y{E@KR2X7H!52q7%m zD~1?ZV5b+t>ogGMpmVF@@5AoTG%MmUzXC1V&`@N2NXJ5Bo{9F~iE=%KsH1!m4I|Cn zK-CH*nwY=6rlJCoOm@hnChtTh;6#fl>ls)#_*-Oy+z&iGUrE{u8KPzYV};NUh%fl5 zbA4Dh|B!OlQ@LQ_qGOZ>!@&8<<82dvBf4DazXT%EZ$OKm_x~+P^30}cT%82=Q-WTa zK>;g~w2DUk+}kMp9x|*-2{dHnpWgfu&@kwDg11rNps3&sl33Iu?2J%HwvuU;ePk9` z2x5-uIIOa@_R9q>lo?f3&yto1xVv&IkwvR)92|4j?H$x0#9vFCCFp zB?PRaaFpT%UJbG#B+EmVBUP=HNVWvm&9KAgM?e^Q4P6Q>4qOnoWvK z4lrt*OnmjTe7*!S(ap}QVZxTlTtR;z+An(ajXF900GnOqJG5B{O%eFW?tYBTj`QI2 zrB}sEg$JVhTx)QAmZb2<@~LfZUVH{VO=jo<`-|8(Ws{DlUH;TT)IqHvMoG9K*64tPMHFc43 z3uUrQj3jghp#z4g8d4GhW`v}eY3c;jZ`{8_*Kq>RG#)FasjABE3JfHfqWb!6@HN}y z_7FG5H}%LM3x$i=ksV6lzzD7q(s4i`<)r)qF>FwFvZvea)Aj%$lH=TCC`FQFgWub8 zr(+za?cY}5>P6pfo7~rb&?ocC^0L{^liXuK>q|K3G`>s(HsqBDy;{vi?Hx7mtLAKQbZa89-3)k5izW3AEd; zt2F9^5@IUE&xf2R9Jzp_^Y~~w9|}uNLJ^73ex?A1s)ED`Y2Q(BGLtJ#7JCU|9bb_s z0B1=RLkGPzZ-~BKMl+_II>&>|>E)~?Dk26N4y>5_y9Z#kt-%N^DChkN$zdaw`W-&8 zt$I8pkf3;|vGxFfbZmE+Nm|Q)zr1e2kxlVJgI95~fU8{yO_NRYP9nDQulori4Mk!O zIDJ2YqR@Sk^`SM=ASski=pZO{wtD9lJdKX()VbEu{d38n`861+}hoIzvq%5g|@opNEkw*%|H)| zS`P#jri@SN%>Ek)>)>vQ=L0r*M7{Bd*{=x`aw;hRFMzEMZdC#82=Ds?9{>1Zzo}pn zz@&@qyNS{jOSSq_^aVo3AFNTuEp z;1gOB6rlS5L(293pyc)-Xgclp1=>ZwUv7`E&gaYLCjVq|-OP=W#o#A*IwX~ouW|0O2!5LE%mMdB<)VJ3*OD*z$S{l za1xC>7jpD?;eNDqawvl6Z{2w!j*hxGyzGdcmtDTE-uPSLzii_*L~=sa`6nwQ?24Cd z$?h33A-O)Zik1Tvp_dF{KlON+o_=R-E)C`TP8I-@fj^fHM=t;n^e%|pGAiJY{t+@G zam5XG2OqqXT-fvHs4Y5yUwAc>AG|sT2-%gzSG+@E10x@Z%%G;|68W#AVxVxwXt?Tg$e&+~P7?_pC{bqx8A*`W+F3SoGHB@b@9Ay#lyZ7hq|8SoXgD*@GDLnX zNi{6kRvPMtHW}yOx>lM@Ms@W;#>i-D3^+C1t1pB+pCmo-vG5brCF0G4GLE}?D&FpG zD=ROnE0!ngil2XYwwIce81-oPv_E$tjEQ3$nox>Qfq3 zM~|U-pY71vwS|R35;p58d}76iLx%hD)k)$~@^S)dTKw7x%%aR?Wk({8d*NRIg(;Nw zRm!G(d*^%W?%`LM-p;QR11a3fyQVGBwU3rrd;Y6i@d`W!V|1Y?p^<@cN^dGJq|Rf9 z2PT!OtvFGC?)6CiQ6(sI1(`);Ka+RBh+Q?hL1_k?v%d+zfXE(K$Eia3{*d90+`!D~ zOCR+JzLk0;PO?yGo>S@!<~~{qUpvlTGKd!z6%8(xsnh6-P_!&ofG4b0>hjr|h|p`7 zZF#Kcze=DkykMlHr0kv6_E?BBtn_WJ*O^HF=+3QMwYzF)Xc)XZUpN0a6rT&8NzGHr zcH9kw{`oFARt%+xkYoTg0^RBOxr^h?$oE%?3i<8natpVW-cKtN*N%-Vt!lj?CV{Ji zsjLZF2`SAXjn&|>%TH8|?=Lqq&Gzffs~(q|_Rl*JA8>>{&LRVE7qzdZviL{FCnmly zIf3LL*AxgJm={&?X3Y{$zlJHPJr2qumb-9Sk*&C@t0(;V9{55dd}f*Lu2tatXPEPe zm0g0oNpaaazOoP=WORSAak|oA9%B!@~-1JY;Ul?%`M{3FW#vUbNY^@g6c z;KKZTCvJrzRs89EhLTR!e;PaR=SpC$+5S}I@P{iI2qj^uT3=4T*^U^SAj^(_`D*;w z>knv}P`aV~NZw}TWU-PQO@Mg^$v>_J(#C~@hA?%BOiuKb+74NwfxIOzd)A3c713t6ee?AJGu^-qJNTf36=US4skcr z!W^4zu7@9+QYPVXaS6~$V21E(>{3vL^PRd#N#e=l+RI?r{Qd4$Eo)?B2v)`49{#K( z(kb;bfw`#3MBHY12Ny>ENM&ZLIZ-v^(dR4I{eV(tzk_IK?4Hc#hgK@3u{YNkbbJEd zHQ^_ZZN`S1VXW^zYEHBbpmn98v#5{-%lgqZMpxWfIXFDo3_DjI#~5;nKKT8W^a94i z1ez=RlsUv>QmGLah8>F83R+^G36}m&c~SH}MceSW^KQ-d+XP3C$eEMC1L=nZC_1T> zc&}j$#1fe}wSDS2uX0EEGY~e9JdM23B`_%+ib_i4jyUA~_8i`qu^g~nkq(a}=TS+RnQACGA**hfKKG;IQCD#)c8Yrx0xS;zuuPg9m852x7b4nK3z!SwOx$hnT^mvaLQzEziQt@cIRpggfZdA zy*J#K!&C+L@vcff@p?|Ln6%G)x6b+8S%9Sch@VR ztSC#dV3qE~`#K;@it7G%o2x+*!)MjWEPjskb~%#^!K!$R5je9EcnCqhi}Q@bO`G+v zlAOL!#Ez%iQ$l8Tb`0xH#*7igefC=9rfMOIs6wc$No4BA;0>d|*CyZbWTrT6BY$4` zVq#2Pq**P4jb)Y>$3n;JCv9fP=py5Paq%0 zpY9_9VXe}QQkTa{N>_>d#)5)=ZvQ8@<-sUin$x9fRF|Og3(GSrL9sZ6R-SwpC=F)s zhu471DgLdqw%5D$j1z6T-%#qF->r`>B51Nf4o+57<8R+Dy5_3IQt?42LDu+uqM8?ete1U8{9%XYk{|c*`hRjL16E#!TAEh0_EU=3{g^8;PH#NMosCh{^cH-=in9? z4c9V94{i<=k-R@PD4O9b3#E*xu@RM*d>f6oVoHCyJfOT0dpasK+vyJjGqr|{4wIzF zH`qj+l?{Z+v%K{SK_kLrreuXOmm%X{O3gGShhlX-V5aUH%ja;8qJ@dlYrdLEj8(+C zS0q-OWtQDD&?8h?WEnubqw+dLppXOel z^P3JveuM$*a1#{hLA76zXG26bU_;SEV#Vb$gsh5_-<>ef^bB}4O8CYpU2kmn{(Kj| zQy(=2PP%zK*!hI|rE(=tYeI{Z`r)A~nOjb^E8XTa+dC%m#+K#>k!)N4=cVECdthRGrtU&siL!7e>SPw#}B z*9PPU4Ay~OxfI!lyb7<@AaeCqJVOaY`f?%=unki0F9Y8@&Ua%t_&jMcP#CAgf3@Z# z?1I$I!zU`@x#Ku`Ugqlq-vibOjr>funrzb~C8pS|U^uXcL7 zb}XMZW&7W)@}cB9KOL7QX{rj+seUJVZ6N};4Y?2>1%d2!c_r8lb#ylw;dI0CD$C0L zioX8)l~bDIQxV;Lu&k=4BdpGjhFgol0-vm7%B-cF;Ya@M6M1gnn|DKRyi^h^dr>VI^<#c~b9>5Y1uX=GvRtV>vst1- zDhE6Qdp7;%*e07r=Kr?)+{CzeC37Np|4oZuoY<@Y??&Tz-}i4H;yHl4mCDdsbSq{i z8K+`|y>Up8NPBa33Br~?MfolQWSct!5e(-Q1qB6)gQ!KjI#@^Es11KfVjnrt&0!#MzEQr~=<{CEXP@_{^de+MvqFWL@sP%b94tjmJh)y6cO24NIGmM3qb9Tv#O{Qlto zFTwup<#7(6HxbAXb(V>O7QJr}gOpLNae0}~*%fqB*O}_;E33syX=Y7)P2UF=JaD<` zy^g2}Bxo}42{rJk4$~c{GI_h#9ec9>TfPTAm3SaoPAGc?l`7=cx>o#mS?)Yjx$hLB zFf*d}kl2f_ovq2u1qj`+b(g1;NYuyfXDrd%9?iO&1(G?By9#n{7+IRv_FZDCBn_`%oI3naG!_2 zf0#M*Irv+)4OKZ`H&kR}>OK%w9{iGa^OxCJK_Tk$!}|jw3y8-PV{$f@YF^QkK{G|< z?@-d%@@3C^_hIh)OX)YUi1Kzq>g#^dGU9Kl+bLE;EOpAUG|*XbYm96RCit5M9UktG zz}MTaP0D%VF>CTVuskW_k=9IHBN^YT2Y|!>5P?RV_%IXrrb(q65kLGDMl0LNL=_dW z?n@oV-sxsn$NLbWQS4%+cCE&P6f+^yPb~K?1uV7WP(ui?qg{W16vF_3$4@HRTeKqUO)!NuA^e;%G~!m&A=lgN%1FKik0N|5gL}*Sj9wW zH>v?XAHtqFZl=43Ki_>v;>h(SjkKvTFztEk+qb!}c-4N>t)%^(Gnn}NP2n=zb93wx z2i(h!y{HBa4rc>BW+uSt85&+>aDE9t-A^;JFr;PS*WLegi0OPqPs@i*<;9-Q>a2~B zoYDrFeKfh(TRg>bK`G|_y4Gadfrw7BM4oSq3+u#8cOHUrPasw>H(?)M?!A-~6{ zCt$9jfy>$ddZn`qT)ZOAS&f2*aG%S8Bc#-ceqb!EmC+=Hsj4r7CE5NihaTBSC} z=l8c)Tu@=~{3?i8fXJ*}gH;-8_ICTrtR~xmu}!uXH4NpSo3PDS!2$SSIw3X@GMzV* zf$+!jQFL`_?P7#sRtRh8HoA2~km;d}J>#VkN0-@TwlLv@!os-_o_22$ccqeL03j7G zx0E~st|7w`eNIwEE`pZ-kFT+cA5(=-^5$t6lQF`0sA6d5bw=h=5n{<_#Gb1H{~gUu zntw-zowHL|H)-n+Th)%QKl;M%(Vo7sY~X1C--7zLo@HS_3PM(ZL{Z`?z4`idkmcxe zG^ALi+xQ6~#R0l_+FjjzM7q{|;0leJLv)Uq%8ZWNa6dl508`hHa-ojimfP&syXChF zYNZd7dIuymk8SOM^P6jEkxnW(FpXebSpH3~FJ=I^L>$fF2Tf3*2r1dy(8xVUi*p(! z(W{_r20Ysrs$}s+K-GOL4J%93VNx1X-2TC5pP2@((I~5kY+qujh-|`Ah)!4(G-#;u z0$X&(=~>aS&CC2FFH8p0Vrpj5G^Wam%9I4LSF*C z-tKO@9Zu>%nH%uLgh^x;aYf9}XdF(jqe|sJhF2ay(BX65v`jrTG(@e#%&R76l$ugZ z%YhbpQXBYc>o*XN4j!#RBpy?P$d1q;Pi;2Xc53y1@^tczAz(u*v99|A;G;!bV3~y^ ze}We)fl~TSTldTLgp91LtTJ>;iY}zxwG9VnUDG_R4Gw+qkCVV}|L40~uF*_>$LXzK zdGu!K%XluUme$7qND#s?$WJo4%u)1bBCvjaI^-@kq-G2on+Ux;d7La5`4|v zOKN5AIme`QHJKxtwRl4dRVGE-p^pWUKtAtmXeBPWVC3FA4l(%?Mz+vgm+Ny<-aPz` zl+=w|ar)S_nCjo_SBs16hP$)gVAwlA0x%pp*DL!yWp)t)N5073gA6SkgeHJ_ZAn3B! zx3E?tvE-q=dnCmoGlV%4X^@hf3|FF>eR8o>oy90tY)F7^y^rOQQib*e0F!S7I;lmW z5SK?EjZ`L%860kueJKei?S#_LiIm{|<@B4O5uKpTleIZRbJ8{9SvWt1E7 zW@8&_nBTt2M6W{EdLkGX7Z<<1y*_KhhxSRs7*mn=n#DkV)+WwJU-T+GM_+UoJZq4A zn4JwPHfI9#^VFnSP(n7VcQx?f{6|$T7Fl`TSVC z_RvIRe|bTYoRxWWROlM19YvZy@c;8wm<}Hu;4^V>j5O>FMbWMKZ-%+1-WE^lz~Zr9 zrgMIQz#^cP6&>iN(3>F-rY>DEJZQ$ng;dsdXWnX7Z7;~o%|XLhSOx8K_niO`NL4JT z2LgRfAe&Qz$qv}F5~lg}P%73b?%1n@fFGdCRhUu1+0cL|f4HPBcZQQbzX}f$ z5IhdMg}BYhHdBcD$Yk+YhkWZ7BvVLH8dG4;E_Y*4vasg^*}FAhOWqvLSdyprFO;C_ zE6;{yB1BzDRT0~1xy#lXc6I(4`To6V{v^+Ww_+C4A|g0wj&~F)1~6&Jw`p~Xm1V#F zPVT(_8VvsE_wctLV4KW8o(dzNzEfHljgism=qhr#i23}pngO&lD~m@ArEoZy{KKTA znSmdZGGDuNc)22V7DsVNh0v!adLCCScg4?kBsprj!?M?TL2aAfhvZ)XDa5*?>*=DP zykpHxmtnBGqUhMm+Wa&tjoEh5ep;j0j$FZKoZB2CaNUw)Mk{in>wo+4qP=`{~DI#-yK}F%w=;JmPF05eG`%>QBOo z`Zph4+w;~gG6YxKC;Pz5G~A$EzV9iN4ezEc)Mh!8a~6u>>e4Yp-nGb^B{t`t$t#8Zy$dV4yJN@dfp zXxQLq0qJ|93MZo)p8;?ez>m^gSvJ19kt9<_SPW^j^jMpYTe>VqX)P zU|0lNsU>n!#uXBssmf4xKJeNkJNAD?1`bY&dUSap`)IN6lCEWa6yr3hLu+tKsrG)l zua!B^>DAxab1pk`7X_|UQ{doJ_ylGHOP6Z|)&z&G00|*RV<@hQg@eV@bYn0aom30i ztRsSFK?e3?ik}Fi{I6`$myx)wUn9^M+dntx6l?a7m&!Fuod6bp%k(8r}Pnhz-1H-J0PNbx2~kCMbtj z$+$WA9QgDLqp!S=8@uHTVU!`Hnyh5xGi!aw>qjV;tH@Ul2h?%4}c?IIsn)3e)x|wBUy?VM+fUH5k`bPXq>2O z#JGY(@Bsg-2bLJp`BsOgqvYjgmniVj;2S)FX*+o65cVk7pd7I=9W@wAPCWWHJh#Zx z1zjy-PX-VT*a?$$$Y_1&(Ap)A;cTk+7=@5GlNW+t(2?X>vy9+>;LjrMvJE8$CB@G@ z;|N}M-k8E7VgRszqF-+smMyj(Y=?71R=fFf#o_7hXS9Ww1c zc2@>VZUOKS7}*d!)VkY%hQ6udz`i2YuG6((C$CDk}2-y08mv5x}7-}i(n?J2J>lqWZk0*Nu zD!)#K8hY)gXg5Ufhaw?zaz@5x>x5VAUwNTeOl9sLFIAK7B_8gKN80r~9%KctJ9Mxq zqU(vx@sDD22z~najDEhU)br7nC({ZrA8KI9+;Gj^VH$)AL)}J@%I(;*69cmQ$1*7} z&9nt_<~?w-^rTcGM(?)*Yi(q|g$37TR{zw~27&O>0V-Vxh<`+QZmRKpvCKr4wl{IW zNP}U9=)}K3jj>82Q}6@o2B9K&{(HHPPA*cwPNXWqrt3Ii zz;$>l;v@f&|C?ibkR@SqP;6ORybx0samnf2o@B~WVw2Sz^-@n@AR)Np1)%5U!9QYJ zkN@6tsBSkS9$VU6GU(Kf155|8Z0w8t3%ml@>G66WUexDbB$JtM+>Fg~MeVc5 z62_O_zvO+;rlmS685*Ci3szr!4q;?T@CTF#W^5eOaCY@Yzx z#*Yg$e0eAi(>c=gxvsPezA9f1+qofF)S;2OM8s?h7C5yXv(-NygMIN-_($k2YHB)D z$)VjA1DB(~fgmrfO-kv9oIr)w(s@{I!(5&BO8Py2TY^TNAHYPNI^W-(b^g$lseDLX-NE@`KXxku(4}6@ z&!Xl|Z=pq>?f?&Zg`@qbAUa#vQ_5C1G*<=$U!3U|3G68$;jhw}8brYC)q-MYwtb6#;=M_8`BcSe(kv^}CKr^6p!z(oM<} zHjWKRu_Z}~a~l#;FXo4LrC83e%&{(ZQd0Vlfgd_|1x=gR6eCqMN)ARL~4gyx4?V{%3gv@pGCbnkgBnlX1 z{wu!HfJ;zC+lp5nDtjyCCqf+oUS+BfGWCLso0?3$kQ5}7$Fg8-noq6tsy{}3b6Jpo zf53&A4FCOWZ}>5-=cPDkt;@tmys{M?{zgFGp}GVncB^YD%*rW;q`L*?pf$cc*zi}) z^ZM4?f#oWhL@zN4ROK1-#u%e2l{ots>3pcREr2=`HZhI8Jl;qTu0@iOTNk_dlV+AH zw8Ji_gIntAX8j-c(}ZifpKPRZr%X_=Y3Br`_EJW)!fjW~>54zd|0S{OtKBnTJ zN+?S(afPfVZ(yhQF__@zyvD*IH|W zmWE$oN6;wmC{g8c2D@=Ol;AC9a#YIL@=i9h=&JG5Obq$lCWYg`I>mdBYe_kG=pbXdp;%x zF7N+J#W^G9sHj>=cN-Q8froA@9XE8yS~|2ZB!z^^iWBufs9Dv}u4Ldk#S3lIQGcO< zh`iaQt*tlqG^G?F01S2V?PVR1z_ASCKSlLf)gLJBm#Kki8C*I!w4Q87X)~uK!m7SS zDsmoJD?z;XQ*@ZV(~V;FQsPph6M+|BLGJFXx($1j@uJu`V#4`4%N49d=jgMe&Jka8 z%rW3#=kitRU;vbqF?{OWkNQf~%GXDx=pBQ3g03sc=L zeq>bfiG#3XEsAw$If-kM9FH|?yXhwX?cQL?8YHl%je-<(MwOBSPMsPfUh96UKIB*F zXK_Ze6S#!m;%_+;%LbOXRa&i8FLBUiA?%z@v{*=Zoma!8-8rJZCl;=Qyo<=JvSV~5 zSU@;1>HGeAPx>DsU0@-mBx@)Hh7?^Bk>t_QdWWxY^S!A0vDxYsHmFbCA={ZoB`G#y zElT7Cqj1e+*${H>mjRjV9zUq(PZ4>uMib_hie!m0CMMKoA2g*bxtc`f*)5nt1rs!G|U#TJZG>K;rnh){ev zic38X)2~5!4=WNryYyEe0ojz>9#&K@$Qkfh!F*Pahin3l(Q1#=PQRXIuD=Ifef{<> zHxX+UD;XkPBq6yi>bViaVoBweK2RbcdNx|h9|2X zp0)l%(fB4q2)eFNP_W~!?_V-#Scf*~n3_m$Z3uey`-LsgJ{_sHL=+V|4}G z9Dm)qzIHh%`>UG%kxCxjNM27DtZoO#v93LJD8;>tEH(~q?sY@hlvHTp9O{t{#Let6 zSFmk;*p1Q6G5!fWYg3XeJ1o%>dW$A_W&5J4C}k5?f*Uk)p`U)cgHatCwz0K6<2H(# z*{oy=t%-yWMMU&24!+%-D*-ExIDw1f~1rW>?K}3VunY?qz(f0Ai>>;9nGG zg6JUl6FF%acU_}Fp;UFkoqSL5Qz693THnv>;G5XtKBC911?m?+x-Cgo)J^S=JX7&X zPilaO>a`gl*K2_|rkx8<>4<4H{-Di-2zX8Dv5#3PC3)zM!AlRG1LNOlNM2-zaZI$#iJuw%OZE#&3!>ds?07M8xPY~lLlaVBu{eVnECOl)pJs!SIAH1TW5 zh%4a5D+`Kn2^ZTX&W!H4p}!qa3sYzO-@!FfxJXlBXj3u$*XM&lKa6_<*u1y0q{G;TG{J1x>~{y? z0X&r|XGpEJICAj)#k+p#Kh=&I;r$+y`>xOz!~9&sLhr#M9F@6U;pU;651eP4dU|4Nn6Ji_27>}0$v)|pw zbHjbwu*-*YjCM)txJ-MN%#56{-li<1O0EFbrBJi{zz6W9>;QKbyF&GvyfN>GBDfs6 zXlS&v-7Y=E5r9*}ibYV-Cm2cBX7AhCPh9$s#SwIBb!0%Nqj@h{oMH#(i-BKKMhH*{ z!PBTWfR|Yq_+cZDB*H%?_sweww(tGE=iQ)%pQ>oMY?qH1-Lfou5QU!@G}kySq||&= zm7J|(Z=GrzQj-dL148h0gkIC&9XuNax6tk?_LnYK5?aNp;O7 zLi!1m>9}Ha|C-2d8;EFEVVdjV3hpOszASh&7dLngK9l@;Q~eY^Z1i?b_zw6g7>YQ! zrla(}kUm*jVJ!mV|Exi(#kR_$0{jS32^A85R03Ax>|h->OukXcMXQBRc-}61?T-c-anEvQxMEni=y3ycUz`P++E^&VFVXObo$`oe-$dk~=!+Q$XMZk>n*LcTWur z@mv4sC4Q=wNKqS?9aYlMJX8jZ*w!NcA!de05I^qfm5LK%wq4UM-`r+XH=CyaHNM=Y{th z2Ob?$zCXfaY($!aVG*O7AYiRtp`4w0b?hnBF_Hj;{{l$Nu6XNEFTkuFc3(CiEIP>( zSOU8(Mzh<`Y3{?o%#6*HR^)m<{N1?%+yWD}`T@9{tuXJ`I09uY6Ylt+wk0)5=CRKI zlt_#e0ZL%F^>z&Ci2&MUT(et>ObhG!v@L3p4x5Z zOt}Ww^~%<~2lVSuQZSS+BrU^C-rpwazdQ&Vv1x)i(yyjTIeKg@w+*no#-GgJ!iyu= zbQ@@80ylA^WcovFNC?PG^@#tD2t&AfAF@(Fk{7Li;`)Is6yN>gxA$_(R)B50$p9Qh zB0`gW65ngBc5O}|uo-JuYFee_iu>qQ4!Am$?k!nl{j`7@&)^IQSLwIRXuD3gpWrXC zf`2(CG@AA0`SFcREbH$L6YMu?&lP2W8Qp)a_VOIn2s&yM!du=ddPdh$i8 z%$yX@I&I2SwKBJ5(}%@&gMgixxnIw;vSH7axE9twkP(YDRQUjFu3BmdTGi7OdF3>_ zBH}H9My|c=j>=Y=JV8L%F6hfppTAf_73wP5IW7e|(nrHvtR()SU>h|u*~vtN5idUb zwS{*8MugbAA586JzA-Cpj$EI}L>V8?CkRJ$R7c_|Ou3=n~kQWt;a$e6ZfBvj%ik)#XP?CD@ z0aLF^{qA)$S0Snh2dH?|bE z&-@1$oqcuM0hRzSux}S`8fxr>_rENV?`+b2CyX%KnUgi2@VvSdI=SK-&s`(Cu~6}A zg|pO3K0FB`@xpRHl>qhp#lH-0%O}US{nYV=kMPc+xa&DL_Zy%7Y6UQly@;cyDW~*% z*upwNf?N~Juk`;uoz{*3tDFs0z}Ec|J}*(FSsP!|6g;N3+A$rHn6mu^KB*zD0Xbt~ z>4@V9?)ULqlkM`8@9oJDy&Q#%X$p3TrF*1pkq~KRPMwoU4(H_3?3nI9p!?DOcTVmD zdZ`P6c?Ox)I^U3K|C*mL?FKz}PE z&tPO`1`^JR180-M;JQ2k^?%VIkFkyVFA?t*l{L}-ZH)b!cV-2PGzhUVFHWXF!cIfQ zC#me>M78?IDUcq%f$w>fWXOH3G)p{w^}1UO;~WB~9nxk6xbg=cg|O%fR3}juqAX#y zPEZ+l8Hc|rATEA(K-m9Ga?kv1oNEVIPTa5i0-(`^weBD-_qBI%H2p-LN7z|12!7>f zBGBrh0|a81QLCIO?h48IY;pu@c+B^M(n__Mm>AS8|N9M78>0+&)6RvEPxixXQgkfK z@-rv9yIiV#Hde>;#nbtilcih-sa{^ zi@eSFE~o2J?L~tM#ho2MN$4y3Jv$RquuW6lb*2FAD>gDc!36z|B6MnA(0M`7`9V=y zdiTE`bnS0Aw=Auc5E{9-DsGRn6-^y>)05$Jr>lO&ST=vosNG}3f*$5SDSJj-BhgMA91r;@D5SH@k_YI1bvwfC$Y?Nm=-H4J2^ zg|{b*>&lYCG7Xh+e|V84zg4gP!DFv8+Nf^X)bo9LxEgXxkii}cyZszLbqRCYrK9qT z)Uk6XKbLT;)4S1zI@-ZHdJ!U92_9`os3y+(uhpjeMsd8}!tnt&nT|&~bZ2nSIzUT8 z&*k-cf+GshxEKF5h8ok%?%ihw+>^J**U*nm88bw@8**VhKAL-8q03S6a}XfGGZfTa zM-v))^#SSojEpAiRi0igQbJnE(SoloF%{gcH!WPQo~fpM{l8Bx!^D<#2ia&`oDXs4 z%@XhxrZM3>5b^hy#!^5VJZk~P?(b&&iO}{nA`o88G@?IT>&^8Fp-n*j*q*5ugWAE6 zf_=5<-ps-DBhf$A46dPfpiU$QJaMYjP6_6`X^1g40ur+{_C()7;IR(@mE5Vo#^NPrgOAXkUG5altePqx?<7Dxz}m9w0lg#r6l zdM7BPKJjThF%hRKjNHvWo0i*^{x8t=B!KuF7jyckOau$0Rq1O})X+es>C_}H{wo0x zE)0;Lrcv!B=XCAfkMQx}SH(p!t&B-Kma29wUM6gfjjA}@#6ELgU2TNcm1Qhu1_i^k zBvqj(bj^=X|BhkNS@3G@Qx}+7SXho$>S-SD)*UgiyrBehB2JI`;OWjSiX?#D+4dJ` zR&he(Zge6iiXJjq_ox7kz*}iEw)*^OjoCb?Mr%dL?$E%lTKiZ>`e1*eyF1ANmICDS zQuvx&ar%EzVhT`JiIDejl%%NnSv?dCk1jG8%?KPh8pJfZUO*2Ree}HeO{8su1GBBD zD8|Fh)Y&JBD$HQJO6MUcf~t1pzVQU*QdaZ2sN;k^+jnF={YNkld0+PNS%rlxdN{|X46zV&iV20r_JtTEN4MFbYi<%Ccr!n!@`JRH`)K%BU)sixMu z4&SWCxaS9yJ;wmjJcuDxkR^)X_2yLu@{Ta3=4dkc4anH73;?BTJ{#pK)15imEZ6vF zZa8>G#*B4hL|~AwO<=TR+gaYK18uvv@HNS-Bipj#=JY&L8Yd3lRU$e@>}9w~rI}T6 z_Y;s2u!|pqk&@-i1kLl zTO2>M?Szvuhvom#QL^JaFs1S8L3B2=eFFUa>OgM5Ctj-7YZAKo`AgMSOG9IxmEt=C zA$p)O>R2binXbU@!l&Od;B^&JKD&o##S?U(gZPF4GdW7#!}pv}Y;iS@W24S+M}MW9 z#aEpNSlh>Kj(AmrbU;(&<6>1wbZ>S-Q{VW2``(TQw1r~*UPvDQx*WLIw0(l1rv0Si z6{vTrgHPyVyxj|w1XTZ`Ksb@I50@o8A7;J}9f5bA@uX)T@sn6&9tY!tnK32UA#IUwV z;CSwJRW-D(s2|TKM@;yv^OZ64Z5UJl7_)iV{Tw%>>&2@eVm6O*U1DCW@a=>6+snjp zA%F&l8j*JOI;^P7$~MQnbW-&FLm%*d=Jo(JEm>T8<%d9!Pa1L-^1{o4VxZ*Bs(Pgs z8(~=6T|AX^Kz{B>%U}#vC-=4bDe#&sEzS07BRbvYS>@MeD*1%HIQphvD1Mq{f`FJV zCKqUA7y^~tuKsf^Zw2aH)EW*SmD^kDphI3sGE6uI$Gu>B@*3#bVYXP3FJ0fC~p%y*O0 zbZgoNw(6$G?3CCaM==H#WN_K};xzE;_-Uzq*_ zIv+pVPHQ?o`H19fWf)&om~!oKJH9>xZtv(QL{1ldV&lWO_dVDV;@g>r$6~QW{^55$)p8g{5E53WuxN`-ow49DBe5I0T*a63VNUWTlD}Mz@ljDY-TZiP-Cxvu6UHYb3x(lbg{M<;8V8&vekmG6(O}t00*VhPtRA2j7(Gl!JBum?tKl) zarbaqY&^U17LL_M&scD2gN%i~D)(#!N8vJHP;i~qs03lh2(@U;GBL6VeFeAx~p_#DVott$yno6kVuZ|xp1hjeIq z@$q-YYb)RNB_1RCk2Zl8!HDV* zBec&nK9GWIJoYEeC?HDB_w;RlB5nO-xi(M`E)*%e&B^@2=|~sxBe70FgvLH7SPWAL zGj+@v*c=!|iMFJIA#5c#PT6^C*zER}fXLnf>Jf2||9*WYF9lNO;u6nqVGa@xF{c*b@^IJsrm-Srgi-V&bXI7B9!WHhTKDfMKv`A4;L*rW5=G|*$3j+@3 z_W0d>EH8vhMy7Z2CKPftx%6MSR|0h0ez({xR%Fw<>VzCci?fq@0uy!ZBnb;QPZLdK z{NH7!RUmS%N!OGHbqu=E+!$Z}>Z!N?x zSpZlq@a~2gvfVVkpcsg5PO*1~7ZKteni{KHcfA3fGO{)Rr;Ox1W>D*YIZ$J2Q?MJf z4zfP5_5xf@uoEz>(lUagD5MSP@bU{TBLW|GB0d9E5pKuHbWU4jNEs1>k3r`AA#ks5 zSqPZ+)3r|Tn>)kWdr!ckhKm&!|D|cASPg{2H3C4b>%;FZ-J{_PXq$=s?EK<# zq1<cmmC<=U=Wal1|mY)MUE?tX1&ZHiEuBsisQ%3k5)k zQ@7`#Cs`%0H1Mx#fFou&@b1Ehx5n@AyES4sj=UqT7u?MytOTE?7;-h`op>k=%uRS8 z5Ta6G!oigOJ$wWVxX;Bnwp@=*;i#EZ)&Efl5lFjJIn*C2*IK=%6V(dp&C!5k0Ce=r zNCf-2#A35qJcs~-M74VPz zxgv@rx1bC%ceAnq&fgr+H8fhQGa2Y0G;o_k1Kxj0T^@oSK*oT7!(A3e$elnf&s2?Z|A zuFgv(w@`9hEEEeO_lNApY5#*>kYo(Ob0F}W`C*3I%a1@Ezn4I01gPl^MmT+>_z%Dh PZ72m<} zwcgs1YO3<+C?qIQP*CWK3Njkt=L+}=M?wJKRck1ZzzlLK^Azoc`ytX za0Ik0EQ<3qC@i&bxHJrdy(~;jEJ#QwOs|$HY(y9=K5%qQGz~DqbjZm<0WE(|S9ElD zP@IVNJ-^*dpB`r(2N>1_ct~%VP#=$6iLixyv$USOkf|xBQ2!m%#UO0{IwJmFoW;bo zh|<@5NW6s#DiUMuwMf~FI8n0#HuyS(~V44Z+%W_~RXCm{!$E1 z{Peo0lq7<~vxE^E_L?cW0oOC|B7RRSC@8qB-(;spn;6lgQLL1f^~PTRAbD>8%A3vO zWRZFm?oGF}iwpN!y9evDpc3Za^~0%b+DqR>yCyjl6qJGvuZy%kJc56fLfIi40bO&i z@Ut&Rbm=fm#47w4WWv|&>@PyEEzRv7r|aK!Yd#jv^4ZMxp18Kr#F7fcLA_1@jRUIKM zb?t`GMMuRIHP;w+EUN~?BFpcR>38{h)HXIQKIX1cha`Mqk5XvnC1`9Q;Rx0Y`6hD) zmjwO8WJc`UjL*V50YUwikB*_VNH~goi8N98A9VFI@7nd~YEzYy6zN(&ZMAz~Bses~ zqY}uZaT-&wv9X~I_XH*cvoQs$(#>fO@2do#Ren~cF0TAqWuY0A@>T*zaHGY^sps#> zcUs5wM&zI>3zZBm0aF3k4jP}srvs2QCSksOdcp;-qWg} z#mrJV=O5mx^S!fMVf^NAmM!+l*W}^%mWT~>pC}UY@N;9xSjzY#9m{UFj_;uOb4uA%0*>h}We4{`!ekTkV&*b=?f zN}0}gW`s60XL|^#bIn6*8A)mvP&lBq2!e~05;dSwJB)h* zs;Q;J;l68?(|lN~t)!Pc@$Vu;*tx`rvm4PnqA&e;_83Ir?q zTfI53f&;EK0^(YKEljdxMFd#>t?ESz{zUrL=}LQ3z?PYVo5D z%MB`v3NUL+JEgy1pd;m>*!&JFV+i{F5~s?R`p;cA@$W81G}-^u1Li( zMe@+>XcRPt1NhPYiFD4=gjB8*8h&xrj0$h1-Tfkb;W{pIVQ74^T;Yq(g`0j<&e_c} zGgbIr5joRH(ymU4@(?`_oxn@b zlpg;e+{@&(_6^6Rq*!lrE9KTzf{Vk{(iSo5Rb??i;mk9nD`(P5Hx6jCK3lC@KCS85 zhQwO1M{btk_x1%}s#2t|C8&&{Du(2VOCeR_i3Qibd;(!d3%g_~oZ)!_2=dWWEEZ&OQ` zLLv)AjmomJ(WjH|HSHrY#F{WOYi*k2Q#n`-=(y!b%%1bRI0~$ZhN(d(oj21rab$w? zYhb*Zsm7;8dK;Ea(y2wkXv&VI)E(ukjdp_%f`m{@;3{)`KB_<_(pLDerDCCtRjr0% z?7bJ(T=Fh^J)6(g%n?kdR+od}Juu_1jCAfR#}#ynpRx`AStML(Ov27jJS}RzUjwh! zAw#VE+%N{iv+~IYN|@Oh*@4v@Mko`X5ju72;{zHo51o~+rKKf4YNrGXrkWNH^hB~m zq@yRpGurN3ooa()6N!1`LX>Q0yiuLMQA#)RBUHk|!aB`)lA#FvD4R_yMx;@&j7o%k zyUE2*Hd1jDvl zF_{4yA{b3?CgS~7E%RNTOfnNH3JTdo8oS$%pFb0emD3TxL}!|4)Gk-T-}}USu(lYc zl2P?(PL@z`z0ubE3+;Nlhy96(nJI5_7+bQ971cowh3fKv%8{;~UgpuybmRNZ$Ngy8 z;^Ja@G7BEZh>S!tMjVdl{^osMd`tzV9o`v{gMhQTk*EyL4+Z%!CsOpNeS5e}b9oxA z#Bub>X|3Haf9+5E!%(IF{P_bNV!b$C@N3G7R#%ImK9dh;TeFlU5{s0#HkRCRqdC^n zKJ*hA)JAN4hDknZ7F4Xwwy}!#;8*i)P~$$7zQ3ripC5KeZ>lmh@&BOPXxi;Z1}Qf> z4F$~6mHnElGnan_&$GW4r+%Nr4H9w2k|WuI#1MhS;2T7JW>9Mq?DqHec$u^N5r&|f z$020YwTnecN!z{i8?h~eatt1a3P<|HT(zO_ilNsQzU@x;r-ZTO0UTOx51bD%?o_z4 z_eBcawUJ#;omU7=r{x2M5zv(~0|dzxk@)E83g{L+U$eEL-CSKeoqC@6-)ZsbU?k=f z6DY85rK+S}_cFX6&Yk%tzVm!s`b~e249cS>W)%0K){IYxv_@t@k2-4bEphE}S?s(! zPS##dcDDV+W*culJ?^fx5h=1wP>BYytbWv_%VF`2^UdK@clW0!xt{0y4Vp2LK|Tg* z6MW?KQCm}a9kjn;o#aC9m+vyTsQvfC2npPb6@JnTF%(n_Aj7h_^zODFP3N3KF>C8U zAVdk3^)%WHD&x9=YKRED4|4d&A0>x5EApjIv?A(pMNHrDA5!%hv~0RY!_w*F(dn0O zoTt&th12yxwI@Up_%e3PYBJydyP5Hmi>EMzn~8?Uz;t|5SFl@;v?vjfnrGaP`aKOZ zMsbEVUZlSohkld=dtMD%JDff3PZl1W@8hNEL#1BBS6oKbA|pCp0llAc)|dg;a`gPz z)cX)Az1?awCf-kNwWqjS_S#j_lgufzSQT33`zKo+Ee*OgM$lZy-ZeQ)yqzKmksw=HpV>c+{^~ zW{Ej-uvdPAZ6sK#lBq$U`!tUAMwW4fmBuCYLk2JP&*<=#<0VT3nuf$HxId~gdrb9N zL2LxPz9Zybt$w$^u;F77P^~p(cO$44Qq2@$pbkURr7-m;=N?7a36O${W{&J0(n&ec z*tTu=ta`7}DMVHgX}Drp_k= zg0A;)Do^?8M|fXU^@kQ!gw&5P#nY{21qXFU^@rXBH19>{Y^g06c#M7~B*uPWSu@X` z*2rGhP<@K(;&RFn^57ABc{EpED0vr8Z4&vFpi{|=ft{W{$PM%)imWyiwNxyRYF&l8 z6)8GuIjbl4v4VZ=#491Y{LC`%d%u%LxOw(PT3*V^h#OjXo-BAt-U&o>61+<7?*s%t zjY`Tn%pTsCFfc%EfI;`#{q&obRkzv#df<$Ue_swMLl&0}k+9n$LW^>%0S67EXr)C-%w0~+Vz}e8WOcxYHA9QTlFf?p; zzfv1LS*e-XUeI_qDr2NMY5A=nxR2;BK)AoYiumy4%#6U5#7uK`Vu$hx^&bOQFb!SEsX<-SC{p;AC-WEB>MIL63V%*Ff z{5K*1Pdu~n|44{@=n2{Xg<}iefBFho*(_4tZXb3SNm(EM7d zHasO3@vg;px0nk;Y~!MzL}I|%P+c-pAV{|X_~?dgDqEl>G|ItowbryzHkyDsYhUtm zlW8l~I#IK4l0tjGqc6k)akY{wE$v&tU*_wBcyW@eB*<+C3yaZm1k48_t)-+tSQJBL`WuvNxkCqhAy`)Jgf6$ zcgRw@m$A|VBA>gdt^Rnfs9)!d$PF4h4fFUN3esXvnF+5x!CL;3S%erU*MoxCi!44{ zoM2w`^ZCdG-Sc$pFily;xLFlKT;WyHM#^-@=f8J4YTN_0-td@|Vr)_2N5W|~D?Ufn zdOGPmwir;5TmYX1{qE27&<^z?87$O;*{crTUk;Iz6N8;naEBL7^d`~EJugU)ulJh7 zF^7Wb%BAU9-e$ZL-ES6Zugdgh6WZ4Rc7m4)rQA*rS z%V_zLRU&`EV5wpdLA<`}R8^7-d!j9sYsxR89C_1e`)H_+Yi267G+2zA!P*suHY4e` zI#XBm;z4C|nD9stvXTs55JpAym00L*x{Q$L3T%7R5@CKHh*~OZ4v_IALLr)zM1i#C zWUnbTQ&p#sH#Y5l76+fEBo49wD!0VLV1gU(lGcI{haCn|2e7r4;%O zczD)uJ#xxe$s%okXa?5G1ZXuyi|1l3HEo&i%Vkz*1*#{J+5@;O(XA2WP#HH3Ghz*s zS#P2dL{2?9kXc0>!|56n$v#BFXZ)@b1G{({8WsU>fTm18$Z}gW7gj~~_F}b;Hkn`M za|1L{Hvdq7DvrUhNxjprQj@N`4_B(VnZItSnX)6rf;+5RMsm@bsuvPMEKJy7rS^V_t zQ_rj0R3?%7@bxO;G9U%7yB}h2>o4SX~U@}CtwyEq1tSio|uQ) z)sobkf{Uo@)8AW{sT|>SkK>y-95!}Y`E$H*rM{@6v(2`K4yT>&A6fR*+zZ&UI`(2T zkv9vGRy9bylM4KXwpN5Po$<1q&%4%!t&@0$6TBRC1p7@a-qei zAIa|t+O|IGHFh{mn+3HI9j8iSLLR&FmdNxQtfr_{la;RpFQ4>oV>?w#dClhvWC&@8&~=I^3e0+?`h4>^9`Ub$9OCm}865VqRkXw6sCQg7 zB79qsI=G}F-p<@O=SC&@4Ek7_V-x-OJKadz&I9N@eFsRe&i%jl>2=RwfWEXj8HP%z zgZP*H3RMV4+`CnZ%%I>oG^H^G^#0km9H*dQJQg%$U>)%#QX4nk+tY|WY`XE$cYXfl zF^R;?@AsZh<)>nr2*9{S*+uRp`RBpgfv=xdfLN%3K!QS`T^OQrxaDTjhas@#p6mpK zC&^irIOIc!8di)loUb(_49!uJv6AdZ@ zh_QO;{-*nJrMQ$7JV~$%F+E_?e=9qi*EigAM#!Czi@4m?n_bvC1&AUlVvBzGy94xvw z>p4w7ecT4deP+;`5<*fHa|BwpJU1w&%lmk+>mm`55&HP;m)YhEWKlU))M${MsJ}Ad zhb2EsK1>sFo5>9K2E!`vKF8aAR+YteKIhS1Sk;@Eo}MNX^=%~7nV3!0H5v=I&D`Q; zbsF!kJcv~FanP1E{=RFSW8`2 zSdJ2iDU4t$Tpt}Cu6G*MDBR(n|6w@fE(_V7&Jm`B<(Kg@z}EYWaLORS;J~1wgSpBo zpU_oJMO*Ka9-xxcd-9{_>37FiP0veI*t=9yQs*eDi4-no-|(eb<>>3sq9L=HkSL~; z2;`>sEz~V4uH^;HTDXR#0=l2e+`3qJ^ktUkcg6OZzmTh0wDTo-$F4d$HO*99a;*x8}7IB01 zjAx6}4u#uTgERfPLm*hTmw@NLVZC{lu%DEP_kBhpMgwqlF2XofP-Eq?`5pDQ5ir_= z>xD?`g{nf`H;~F5IC4?~at6n6wLyRKDy2)>*gzhrEI-iBh@5Te?N5VgZyhdMS_pM4Knh zjx!$5-7^^MlfdgSMqbLme^*H+T%%4B=`_LJL|PbqP(#~2KxZQ6wVKQudQje{$ft=U zXS|Ur*Z3=2kz1w;C+yx#OI7*Rk z*~8-5afecdP(;Kodtti)L=UTPXjuF8izj$QJtYL|P5$Ap!Tn>h`bvxS^a(ja9#)ZG z@MLeDdr?l@_xr0`_oK?Dtd#K-^5cP0BfR71k zeBS`7Cdx6BEyU+G^B%6 z&_7l%;s}E%oum~+YJsR`Go3=7yKv}b0R(JpZ;A;#hW#SNR9t$`DlUG4ghT$IDU^!% zCNKo%Vq#)0i_?ur$~8+>iHrtdVx^-RKC=6##xk6IVZVMECeVPI*l4hR|Mc(Ajciza zEzhTdQ4Gc-hv=yzfR`SDIA?D950N|8;pzUoS*J=LA1IZC+5g>6v_;5R*+cKZ(-`A7 zi;!(Q-j}x4*0;V#IbLaOklLVB29`Hiu&kB|$Iut&Ib5bN=dlJfL>3L`WaAC$b_-X( zgFpU${M~UuwusvNajTuFGRPF_d#9iQo4KEb`8!$D{1G z*5(;;mIZVNKA##_KV9?~6L4CU1c%zWMk$4w@~3h0-~XIQ7q$)An=e)#fYR}S36S-` znX0H>f3sujM+M0_2jW&Sxw6#NTjg%igbM1girnz&)o6`GoS;6MpRiR-?Y0XHY^7Md z0!Y@b5hByvPmMs}2;j1;#~>HN>pCvUzV8cx^nbQZRigPa`(!cK>QeA`gIjv-*nM66 z_1{g;yDYwAqOZ{hl#_B2H!cS1GOq;7$*?BRN%}XIB;2-Eq~EUuh?NUsM0dLUTHF8% z!l*@OyXrQynlSrLbIjfA4(l|beL-H7mE4Tje!p%%z|{wHWrZTyhfQ-LbWu@FUw}ug zE>aQrYc_xS>R_Z{`^YS0Wn>Vl0p+)?!`{Cm@z+dfPba9~*2oQc;QC9Hzn4Rq>pGd! z=o7t1|L{TbM{7cPFvUQ%-*IueKVKH?n)5J!khW*)M{7JpLdx{UJSd6k8L_8HWPW-i0L~&iR$9<{*8I1=l8-=aw+a8$ZRjQah%C z)BbBZTVQ4f_%db;pD{M}_o%64$bMC2O=P&Kv?JOye{Etq8}2_}{DPcYIv`J02n|TN zpjbvHhnl90tXy%^p)GmOU}cP)rD&&2Ij*8S6P|1E-_u;NPwntUS_z6si-vtuTD~mr ztrZjTXp`PK@SX>M&C6Oib2w2b_|&R&?%Bcg9u*cn46W@wflPmd#)Y{Zje%xHxnuC! zBTsMT=zS=BBwr+!5A(UJyiqhsoL)i~;#xQz_NuPG2lMM!K{upTn2M7w=6NOP)Uv3W z+DO=U=}>nAcVI^#prE44;xboKm%AIR;^SjElu)KC84fO*tv3xSJ{0`DKmXu)HAL93 zK`Eq|h&^Y<1VNI$_jc%>WoZMrgw%tG{D9wUB7^A;tA3A-MVe#%8!tJ5?lyr`L98qd z_N#w{wvtDA$3^!BW;1COhet}p_lFZDR=qACTih?8t{482H?K8Vr*lUJ{IlZwc2n%C zRmPK4__LGK>coDOE=yH9EF}!7i0H0S)~V}GN1Y{}c@!?lltBiDOKs^>Ui*4F`v*_F z$XuoaG2x1gl?o=JbNE?}X?z^v2{I&tU<}8gpMgNB{5S9glal}~&W2N(p~`|Z4dPE) z1-nNs3T8!5K-bzdQ@h?+MJ~kZ;@#rlOnrc9d*%rLAT}210LdG>S+SL7;QyuaD3-Mw zDi@%PT4=kP2c@Q_{-N~0lst+d=8bbr6e=`s@_RaOIhAvh;afshk4Q?!q}H!93ptKo#|n!MXJ1Bj(^;Nndg%$#P~$Kx`hre+81Uz3`WloQ zv5ESWpkZ~<;x#{+K%rcHwwDNm?|AaPrnG`xIg9C?5jwuw;%6ad9KXAhB|eV1dXqjF zZFpmBt%C4R>IHGWE4Cqw?eZ)^?if;&O-lVDF`d?L>YP$?a^BHr-XzLXFvm(Wu!>f* z>?+bxzf+ZyjnTG&={0~_{WkfPg{HhJ$em!|0AW|ATR;bqgC8lCMSFa5Vq(H>t^nRp z?~%>AJ4ONpf^)FKkf>E>4rJzS;3`e?yB(^q+1AIDZJW+tGM{L2M&B( zktWHsZIi^-yE&BZ2t0h*spx>2S5D8j5hBO)49=3~6uiqixbTS4?M1U%g_mF$WB&ol zw5>r|DJYCp{y1$nb!^Al(p76<(KS5n_JuYBXv3Wcp?XgSr4V|3-J|D5E`0R_w-p?|iwyH>5`(Cvkabd2jpQOlffWbK6?#$kySwtan$4 zr*qNdMto=+XUI?;5N7+uU->9{p9^_q*VG>XnCtxkoHWRF91g5n#Qu`CGgH#*eUws) z9<>M`Fns`o05hIayqimGWcAX4o}A_RF2kO?APo8GJ`WC zf*w7_)AhLGl0na#|HOPsJ{vV}@JoSGrDWuS%o4W|;}Bdj9WSL)cSXorWH`*r@wL1EIy2^3NC~>);V=ZEUT<8Xj!=r&- z9kX2?lsL0gf6F0iS;<`PG7yIO&&Mi*-NlieMZ~fWE7Qq^50*+X3RxP75UnxlYH#s- z_}v7+uCHw@*v%pN#%rf{hZa^=%Xtrdt%U#d_?OQzDdgiR*pc91IX8> znL)ezv1cvkE7ksD5*By5Yr(?lWXU{}gkQd(Puk|@ra4?qJzMnP-kvK@5-T*}dG}gR z;Au2Pwb*E* zA@dhS_6D^upRwGc-EUd4e`t1qqcTL%=t$eS=t+nZP+&0Y9i(VCDTf-s$gtqUa2f%+ zp$+zgF(Ae*7(q{%*e%fgG`rGpn5R)nR0A4M$&IMB!M2PeI1mTON?Tbs)sqj~prR-S zlL1xJCZ_nm%WoIJujp=g$3Cc}Mc*x=^70iZTLa^L^c9g2g7O+6pKQ$xdjg(gd~XUS zwJTxsq4AeFmGGQKoD_tAw;sgZ{P*vNfSo%4l-4B2pUoZ`V$n+%5(OXCL-}uJlZa6= zOtchvYS@0*&9_9}*7mr2tHbN42Dpk#x5o=BoO<;ZoY?X`r!r5t1su|`avdv`dJ6(R z*B0}@G3*Xv47`Y$F(ceasc5auu(&^7C_Mw_oOtgfXFw0DFT+6C(x&Q}d{C>{QB}(} z%5YC-nYm2LmBaN?F^)P#p5_y<^YYb1=nb@-#3EL)2!btAJmeHbF6N6TWC79MeV1}c&JcjXdn3ZUdaobNvj7bt0r1a+rWEr}{klTI~#*3{hYS8X_oc=P$ zpi0$E=hwW%AmyKg)qkhnNsqN`ogF({m-Is;AkqpMD(!j8Yv;|+C~@4q{fG8d8eU>i zzxzqJI>V5&GDM=K1guV{Bmq2>IT9qX+Mn+BxMp@Sb~_B^yDFeOr{O!eTL68if-X}= z3u4mBDAFho<|(Uv8c^mWw)i(gWO6I0utql<6%~c@pC?`;{ON+IfN zp_;`P`H|4&sd)|on`86a2=0AVMD818^TqeD`P=?5gu_2gD{M$Z$ zDq3H7@*{)v&tW&#NaDBmF6=XWz7-+G2EN>U>(({$`B_HCMa>4Wm|<#-uozN;t^_?Y zGtVs@%EZ3`u~MPX3n0rz9;~UK*l%3b@JX6*WWSOb-L}#xEPAZ~!z92e9nHs4R%KOP3J8Yt#}B#VC>peQ44zx@&O1r-+Ube#|u?Tk?T*Hd3>_f-E7f$gox z(^-SNX2$)eeS18!A!!HIIQ1O96L6 z<1S+=$w#8m&yxPXW~nDYYxsb2LbbD;>a}#82-jIU9_b)5A{ICtLwx?R^J;jSBL2vq zfW^>OJF$5&(tEThYm~!$rW39Z5k6L_9yAqy1YH01<*E;uIGqai5;Q}P=a`icZ1!T+ zjrVgtiH|fu=fHsW{?aBGTpltmvBgWwfp4P7ZF9w=8_*h@25dpO^=3yuIxyU4Fj;85 z(arj1H=K+E0TlB>EY}W|Duz*B$>HcQB{8Re7S4IH8n#-foAB07gpZ-% zQvE`}X(aL=LVo!=`lLTmlu`LFlT|<8^qgsp7v zw`1oqD09XD701(^p1?zZ0~$b=*L(!d7tzO6sJ`qXQ_GDa*;iBgO0kcdts_8qTAzf9 zLR2n-$%0mDys|&E-Wtn86?kgru;F30f|82|T7&~Bh;IG@>6#aY+DKVLX>MyxrN&qG zmd$;HCl*wK!A~P`I;|&)6Bs+{FZJ`uLP_ZWR<-{pv}WH$HbS83rOV8=HZ!NpDb{kB?7BM6155 z!T`nrFEUae>3P_cQe^`+heILpgvS=oorSKS9tUasOe6l;9;$uYSg#?v~QPKp;a|NgE0oTGu6l2<3_yMtHaIBk1`QrN=e) z7jZQUl)`4C@FZs0^vcc*4GjtZeYkjC1QgB_>7FH2hHR;CCNYYw(s#LEHlp(Yh1wfB zP;Zi^YT?Qxnt;6>Mn(rE4H^VSelS*WXcd@1JnJLx;~pOh#^NsjSUMZ#1Gn^U#6@OQghEXj&`9!#(V8p~gUV!*10VCkZ!1~4A~ z6@I}W|LX|6f*uFZXGVr&NxeWD4%kVeSH?(KRDfAJ$*GkGMAJ`QPA>fEKc5(`+wX21 z;8XFVuWokUBDv!tA{C*Cs)Rf$QN%&S&U3H<82&)qECiZj%V)X~m}}xu#zrYk5)LvB zPXY17uyqg(W&xE|^L*|UXfKstfXLbOs94lM6HSLn88{+diiqwF@W{n5Xf~CZZ|s-b zL6q#A;rb&L5UMWFG(Lb z3+3E4Va1H_iu&F{BnJQZC-NDTB2*X22y&&(d=v6G+0fI|ODD#OPBrL^rO&3SPlezu zj;qo=PQw1Dy`m&r|M`rJ+l=cIl8?q_*s6tofkO;cd)W$>%hw0=2K~hf?Nhr1wp2*1 z_wh$hzYybu7#D6WX_PdV*}5QZ5||+NIN0HJW5|~zJ_AM~4juX!9|S}+BIhw+rk8qm zZATwd0-B1g<9gMcmYJIVp1~p%qBlUkU32>%zWxms+JMJlwO0E_%_y`(sOD0`gu{kT z4wRJ;cvK;vwfU0$%NYoYrU+NES^Yp$9wz%Gy3_a{bo0Uq zc)lEgC*`F&czAeZ^uFZkT7JANGwGuPET^$C9@8ogt)Vi7OKl%pfwQn~X>GkS(BH>3 zE29yki;lh`!rI1UbMDKr0c(HuJ&AISATz_=kp!1YG8!n@WXSYBtnEef=Bz>_0&A8JfJi-`g( zi;703E%o5Vb6I;D1Yd&$9!k+&gF ziPW$$VW@6ay*m`%Ao@q~g?lUH%x$c~qj*mU+4<_2g<00A_pQ@X>HBZiklq+YlU{nB z_5-8J0kGeb51>mSo>di^G$rksj*N7n%8NV-%Nz=DZ+8MGRN;QkRCnF4+W~@h76<|? zjX$KvWt{6+sNqqIb`LXp*|#s6Sw_w)_lUCj1OvHl4w3 zF4t~QZ6{(7KJM5Hukmqb08?Bf16mosF+2Peudf&uQt)RBv_>YAnS~X-foyH$!R}s@9;C06hO6P7`R)%PrS67B@gq>=CU5o5^WJ#B+$O`9S;t@QsTwi_Wxw6& zvjjxD_{r(%kG=Nr;q1zNFz9AjL3gZ*=*vq8tpDAZGGXm19Tf7i!)%_Uxe2~UgY%r? z1JEi06SA|PxcgX@ub7Y3Lv$}v-#B4;`c@jW)uUE_HwAu|ZLOpBw;3;0pdZ;mU3v!a z5Fa=L?jL%~#KyL1sHNrZ0A93V9Qb_4e))CB_yF_34-R|R!ZGF1m$4G=Mhj4WV2(!T zg8LkP)A@sinR#smm}1Z%%5yyZR!ug7KM!7qq&gWj9fgbEWgeY>6+bU4rg+KVSiC>V z7jLn*)Wo&MtSF_7j=$%~jDFu2(|=-l@P^@C*4G7al!gHaEgzAR>nPBR-jIHpu4tUZ z7WBT{O$!MLVb2zD+U5h@wscUWZ z=3Iru`~SNd=}BIUQY-0G8t}N@(}1>8s9XIE)k`9JJxYt)+bzWJdA2(8&F^;``&IVj zio}s&KX!<~-~gxzlDD&m=s?zVG6r{S&&$KZp{||E!f4RXFA22eJ(dQe zqZ(YJ*`GG#W@Tli(K{Rh_YwJ9*VCLl<@3lF%7E7BtNJL7rzYMA(7pUyWrEhQk5@y)z&Z9AtT3a%BmOh8Wj9ir^cFSk!OwWSqTjfplyV zkiTvw+T4x^oTHID@*@7?G#ofc52xjxgE@N}2vo|Mfr2+y`-71k#LUEW`{Sdfl}ef< z)z_(x4LB~!+RdYiN`$@`Y~6ItqoD++PvD%y)){CjTXP`F*(01YJzfD3QD?X)>gOr-VkP|7A7jZEHf!}iKXC;&xQ7^6wyC${yLs4kn=|v?=6z}<;4pX# z`tV0oMc1kajlNt8aSli&jWG_V)Q{pBRom1OK7$e6=Bbb~>N+Q;4U-`jkipy#sp-5{ zismqE7g58)fAeuRN1~#{t74kop=_njd?WxG--l+^Qrvl4qg%usscyh~_A$vD z@~2^;Sp`&EDRf-(}MOY0r;U=Ak%05k!da@|Dzz>1vkXB%ZbOd-pg#CVl8 zAc}?nuezrRn8&bm9yRY5k5EXhLt^ZG=I!R4b4r}CY2x3$Z*$uG(YsDg|5r}*&yVDH z03~ouo_l`d{JzcVrk~Q%l~D20S>YC0Hk^m8$PG>_xxgY~7)TDvidZ^2*SXM-n#qCp zT60cx?H^KRlhz*!2?1wlHmg8-ZVQ@9n6k411~r=s--UA0okJa3?f|OAaU*R792{Fg zMMbp@G|f?s)psDfcu*Pe@a-=~&11?LdOy+3ZrFYs2@bwB@3{@hEEP|t3|2=(mR1CooeVrHcQZH`{Ek(cMEP!lK7E70a4pfzo)F6MuR z51n$g>f>2Rk%Y@omB-z}S*-As8$RVrIsiwqF5r{w2?ZnROTb<)R>Nj+IGW9u4hG6e ztbUto@pF0u?bD9mPxr?7vphX2+6~+J%A7|O+c85XESJZ z7U)w(ETXi{R-QP-Y1=n{`rvHw-1Kxv!QX2l8!G0Ppa+&nM%iJl z`LAEU-t@ghHlbWUJumG! zto9<3-Hj)QML=u)FIsj7b-xZkXEpk);i!OS0{(Bl{}2@z{vH9qwEY6cN;JXop1o0R z_NcXkW8Z&Zo=#JYi{J~QP>5# z#mp`_;2_=+28GDm7LdEB5~Y~=1Ih6^`}^p+07U5LD-cKXu>%~)-yH#Unb`P+4NS@~ z)a+h={SJX@n!g|pF(Ub&H0kG1gPN@G?ph6qr%nSuc?2qgOzAVzhiMBEfT z@~mR_{gD08obRaLgza- zx-JQart>kBRZ*U|ge=)C7~>slfgG%?!nfnBHM587q)53xSsNO(oXhEmK73{L?CSEp ztN1go%qe>D@btZIr44XfW~#bv`oN#gbtdprL8;-a=;<5=EWMCX13>3|;Isx2e~AO{ z&mFNWSlVhb!N3=~+UamVcI7NHds1{=qOEMlsX$0eOG9yr z+cV|(H`gw`Oc<6 zR~|cSH0ax** zKBnxLiv>~Xk+zU?ODCrJVJ&GFWR3sjqIS88@h{0A2@Aa)PCeM$TUzuLMZ_3H_)z6# z$Uhn5!mwQr1nySVp*JOaO5%-B0}NHaF2G;o)w~stg3nxk9s^;}pb~SvmbC*1Y{1!a OC`DOSnQAGMkpBTzSkj9C literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_dialog_wave_3_3.png b/res/drawable-hdpi/ic_dialog_wave_3_3.png new file mode 100755 index 0000000000000000000000000000000000000000..5fe5492ad95bfab73f6e6c424c20a14d5df54e39 GIT binary patch literal 16022 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_dialog_wave_4_3.png b/res/drawable-hdpi/ic_dialog_wave_4_3.png new file mode 100755 index 0000000000000000000000000000000000000000..81b803fd00c7ce17757553a2d82d15fdbc53bdc8 GIT binary patch literal 15910 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 AdH?_b literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_suggest_strip_scroll_left_arrow.png b/res/drawable-hdpi/ic_suggest_strip_scroll_left_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..e375f262f875012c5893a2e2e08fa6d5ab8c9a16 GIT binary patch literal 619 zcmV-x0+juUP)-Eax-EMbt z0L1qo{s{3%AP^unn~mT*84ib=cTpmdIEUDa$z+Oz!{LcI{Fkq4vC<6U@wgWPcc}W* z<#G|X+fDG9!2bzAu2u!I6cCHWqPX!Mf?LcIi^U=fE8+@Z-aD?iphJXCrz1h2Y&M&T z&*vlPmT#id)w588%msu(Avdbs(d+f{0`_{niRd&$sh+i{8h|c)eXrGO`N3dNX}8-Z z8C#Ta% zj7HoN0|&FYMb!rmhvSv)aMseApJ;_b;T`L7 z49hNp!QjsyFyFLFNs>-x$0+}w%mEz00UW>q{{i?EU;y5403`qfvlajV002ovPDHLk FV1i%mBQ*d3 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_suggest_strip_scroll_right_arrow.png b/res/drawable-hdpi/ic_suggest_strip_scroll_right_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..d38ae7562d1c2ba5a9f7a61aad1079c71410a86d GIT binary patch literal 619 zcmV-x0+juUP)r5~hWXWWbvN;1}RH;-{TZ=4767zUGES*lXForD4 zPk`K&%Vov3U4)f02(x%RZUnB|m>U9;wGBX-&~GRdVyRS$dA;5&=7yzGsl7LVi&CJ_ zU*UGUSt5~O(P&gbHg~G3J{60_@Lol>f;fyUi^XDwW!L~J?im#dg|lA)R;v{=zZi3n z8R+x*jBFG|p)K6c=kq=5nUS|;KtUi{H3{>Y@c(EI8L&(yL-Wq%a(OzPP6N2@V<&)w zc@|uZXTq<^D#{`d2u!eut4^nLZ`F}^S!9No?IK}VL-D#;EG{7a_MOgFfUfICSnJ{U z`zdr}a0^Rry4~)4lg>tfSsdOP-jm!uK;ld8k>o7rrZ!!8-` z^E}v?0ea3H#m#A&HaO&wDT(i70T2KI5C8%A3&5uU0|4hj%<6-iXMg|z002ovPDHLk FV1le=5-R`z literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/keyboard_background.9.png b/res/drawable-hdpi/keyboard_background.9.png new file mode 100755 index 0000000000000000000000000000000000000000..edffac5b8d236ab776b4f64ad80240b58a58a879 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ew!3HE54((L}l9DB^5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jin2Ui978H@y_sgn$Dqi;BJS+`qxt`T1=Caf?}R4jmT_q> zR?ZfAomX@8%)2jUHYs5)X=WTDQ-9iue!G|O(Ab3~^>b%QV-Jgp0wbqK!rz~LqKzyn vA7*71{1lzBEJRgTe~DWM4fyjw$6 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/keyboard_suggest_strip.9.png b/res/drawable-hdpi/keyboard_suggest_strip.9.png new file mode 100755 index 0000000000000000000000000000000000000000..0cbb3ed8682650355343a8aa90a483e579497eb5 GIT binary patch literal 1577 zcmV+^2G;qBP)V!7I9 zlP#|2a#Qd7nlF4$kG=bK1^3@N6ZRjted_2c76S9sAlAHL4OHvAbBoN0)vUfD%4ybu zs7~bGr{6LkS5F;>W1j1Mx}43==Xc%o(|r!}DNYVdP$yO3`7hoV$tTb<&C6+%dwjES z!9)09F#rciLpPo2ns*dekf=gL zpCvY{JKWs58oP7*PFVTn{8riL`oJhJ`$RIV1hr}Q!@?(Sok={LNeEdLrLY{G(0g}|GSMc}W5C=WAm0E3bf)pZ+e5j{NdV`XeL-|dd84!%)+ z9V~G1jK1~!)%LqjO6q3$kW|DHzh(@cr-U0bhTWV&!O%G~gq@cGWMOHzp}H_*f2)v2}xYfj6N1Z&t)IeB15S`Aee+U7=iP3dHdc{sT4=jmVz z-}^I5_XT6p$3Y1W)g7j^9nq1yy?SJDAfA?QC_JGYGlBH=DT}5b87Dp&i3h_u(NXBC zMqef4ci*jvnWnUi7K&DM_Ng&e-ayO1tZTealwW;j>v#3!5E+D2GAF2KPOp|gDIIds z`y{tNft?NE@(zI?Cwi!iGsy-mx9WQD1C)b;<^!-eV97Pf8KOF7a>pdiK#{WoJXoAO zA_*35v61Nf!xLX++qa+47bJMhrTa$6`V=tO+0-6H%UP%lm?*|#$JQmwb+>g&#zCkk zR4*WwXG*Cev)i?`Itg_~N6d;ncs3prGk zO=NW@t|N4;TM&{vx=POiGWlPaP#?YQiU_*a%}b^caeG-wkL;=3Yeut_ZrBr7=`P8b zR`?+hKo_9{BbmhNTof6;u+g1CBE{5rZsZ7Scnp^a}X#DzITw&sme^_o}3- ze&AGGhXAgJdJd%8n5K8oTJw-7?ZOqhD+svD_&4fG0(PpzSLCLRKoMF8e=2%LXW{H$+w?y5X6`5ct427Cl7))ik&bvo1x`Pw3^`L=9{54 zC{$pYblBL1Zb?X2Omt}_!fN8XDw8Y0rp=X8r^Zc8O4!m`Un*sZ5M|_qWHLxOAYg(; z1;^4jGtCuN+0mYxBwa(IC~SLVTpKGeJ~czxdRJ3&lb)6yruSF0ztQTKcM2rN-@>p-*)OkvD{ANbIS8~Vz8Y&!Oy!9%-$@|7*zvNaId z4aNNTpOn5DdsG(zK;e9ty3)CY($izl9k*nsNc+vz@<^qyM&V04Iw3d{?i zvxhA{R3D@1&^&L6AoL8|i1B5jeXFZZ=aU>GwfguvYD&)W+!L56-_2Wb($uT8e zoK|WLw+f|2T%-YNbi{-hh^DJ90WcPZ+F9j(Wff#fC+D7(4UN+0*KD(BRXH#=7Y7OV z>KxHiCO=TK)*(~wtnAK5e#v$baF{b+qH)VQso1@Lv0u`-^rPrPpkWm8_G4<2=xMS= zp9K!0X$I*}-c+D{TKOzZGn}tBr-HavOs5F(*OUF-di6hh{WkWzk2jFJA@1yAR_00000NkvXXu0mjf9^LZ@ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/keyboard_suggest_strip_divider.png b/res/drawable-hdpi/keyboard_suggest_strip_divider.png new file mode 100755 index 0000000000000000000000000000000000000000..1a03c52e64df4681aacb8bf1c15cb741eaf0b568 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bO0U{@7=E?#o$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1Gex5FlAr-fhcGUd*v_5|SjDP?CpFePbVNnA^ZxREu3D-iF zP`=d)lh_{lI%*tL_gKO!(PVMfCBvaeQZN6}7hSvCk_Q_&IUGc$urFj_;$fK5SXEbR SE_V%RGJ~h9pUXO@geCwk*Ei?@ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/mic_slash.png b/res/drawable-hdpi/mic_slash.png new file mode 100755 index 0000000000000000000000000000000000000000..87153dc336320a73e9aecadaced901f35d5e0d95 GIT binary patch literal 3095 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 Jl4j%@^M4C==)wR1 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ok_cancel.png b/res/drawable-hdpi/ok_cancel.png new file mode 100755 index 0000000000000000000000000000000000000000..6a99528ef3e6e2bbc00e516001c923b295361a0a GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0y~yV7vunyKt}pNwxo9G=P+3iEBhjaDG}zd16s2gJVj5 zQmTSyZen_BP-$-(Y0O{@L@`f>(2?d)-beeuju}xy|R} zGxYnI7*<*Ef3~q^V_4ym!RP=+3=3JIs6~un8+UHcMNNhVS8fI|U512FxWL5lzs8D+7x6vGCXQ4M8(7PBHGf$~6xBfvf_sbhK7IaFgCQaG{hvG4|1%gD%v;aE%%C=V#o7g*i&KD+!QkoY=d#Wz Gp$P!_K#6Yv literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/speak_now_level0.png b/res/drawable-hdpi/speak_now_level0.png new file mode 100755 index 0000000000000000000000000000000000000000..5c5ca309d05e05143d6a151f24fc708670705bc1 GIT binary patch literal 1508 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/speak_now_level2.png b/res/drawable-hdpi/speak_now_level2.png new file mode 100755 index 0000000000000000000000000000000000000000..be5a7d37aea56566098edd2fe31319aab7e92513 GIT binary patch literal 1687 zcmV;I259+-P)D&fy`0^qH)5M^`;}eN-=Ek&u+N7Y(FK85oENdX*((zs zcZ_|QeFnh%NkFY)H&l824Erng2!Od&Bl|9PM@r{A&K_d_jY5Zm8;rd!MOdQi*mt6o z=q?*Ew1_z)UOE$VBjE0RdY^=E>_TLkA|=Zrq%!wt#@e zg|*q`tHuYgODy&=&3gPNXTWS`Xf}lm>|%?3S`6Ey1UBOlNU?^n)&;N&7W*{DY(M7_ z*x4GxY8&U=0{hdVZgP3d_DPSxCTk39N#h)JDKV~I(n{vJ#XoxlHeuM-pkX!1>EfBb zfW<{Z5@M-g`?nr}eP`IVl;S6?pLH2HUo9O|6)Ku@)&2zS9IvqL%r5GeW~>g!;XKJ< zsMzYlVX#?|=a=At9i)-sB>mQ5eoGgnLVAQfU168QpU}bXX*z$Yi!e4*)46rjv)5GE zc$Yr9XCXBj>y(SA~|x3vt>!R zet>aSF=d&ZNlU_uFBSN}se{6!k-OX|^hboY^+aar&<}_#1t)Y$T1=uTlAaymDFV9v=zl zecgI4G0OX(-*WdMeHvyw-&l=$!}M70zk{Eyw|xXGi$ORNv7?sz-obv!;)zUC()9Ft z0$384y}kmM$(JGcDO;{D=vK=^Mzt_9<~V4bnhn}6Su5|XK7P8!e5G9`!`w82TM}e- z@=iLS?>`r6(4zZ$31CUsxA=sW88C%5%s;ym93myQ=QL5TPcbN~^k(Q!nDxHF9`>DX znGPgnXacN|@USk;PWMst9hPdAe3e4Qy$XLHB_B9bNO-daTdXgqC$;F_SH+Vdp3=J2 zi2hFKfAd>VWB}{U>eXb|)nBOr;F%0cuDJm=+j1eDoDWuUyuetio?jrK1O*!#4QRbD zGv(=%iqGnku{ovlwWb`tSF*|mbMp?XkSH6;?--6aO=_5S=OHk8oV{|0qH*}cISR|6 zyd+LuryEJuC>@I1GJ4uh>$NwQDZl`jLGNo};^jGo2-lz_Tkh3s=T0Gf$5~p!rETvm zO-QMGts%Psoi-|J_WLROGpenR4Z!AsE2yOoCEY2vvM-}(G?ffNi|ZAh(t4VVz>>k9 z@-62t*nfnQ2%&x{T@rXmJuB%MekbNQsqcMG0jr+oIR7u^YhzM6fI$ET0T_Tm00sdV zfI)s0N=ru%MQw^WVG!OEd;oJuSgawLlC~tYhq+FKMbnhED-`Q0D}Mw h0x$rBve3T*3;;JkAr7_b4xs=5002ovPDHLkV1hlq8mRyP literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/speak_now_level3.png b/res/drawable-hdpi/speak_now_level3.png new file mode 100755 index 0000000000000000000000000000000000000000..82968f4768864ac8bb93f9fd6289a2d683a60e0e GIT binary patch literal 1636 zcmV-q2AlbbP)ZI)HCmA-jGmyKQWIn|AEnw!UM+Kn4nmKHO%{9 zC8pO6wx$s8YKm- zYc&L`9oKnGYZU~m9anoy3teIYSX$7u3Mtr?p3|#?U;qSzU;qRIAQ%Kg6+kcmf&mZ= zf&mZ=fM5^|@QTcrYWGopWcY5{p1V9{nZMkxt=~y+EWSv8-|IQqJ!oN7Vw(PvZhH+n zLyTb%41iz&1cP7z1Op%#1Op%#0Ktj|Z=2Hls9%;qi%)PJvw`^?bC|^Y6pdxfZ#~z` zjfQI^UtLr>$>0KWl=;PO+CCG!U@Vpt?oDR$Q_eRa%t4*zxze7sb}ei0W7x)su$!1`0}^bl=DC`(=3g-G4wvvx zljE|sfCO{pwMokyYzu2NTobiTbtY$mS@u9*6|!K<4A--^TU?(EN8pwSt z#Ggel>s{SU-8}DUWej;TJ|vA}5#jBIcgFKY5bTuUny!ejv&_#t@pBOb z8#7$9$p3RaCC>84DpN>L9k)NHBup)9hTy*6!W;t(YiJ}9;h-t4_+{~ zn$8-mFF}u^QVuZ>rjW%0%p;D6smEerYFUGCVdSWg%e^AKhL*4|!F)+vuEq4dWb@d3 zn06)l6zs6kYq7;)F_y=(=M1k4F3Yt?<06M;xWzaIeq0#AbdJc zw+ychbA{T=++Y}Qnl&$$>7RpX&V!ZVdo#p-=7WarrA38!n4*1q@>K6pN=uM~mStw( zTKaE>;CJRZ{rxhA6}Lq5&|-89?DtWD-p{S?qyC5ZXNU1}@o+pz{y)7TV!h2=Z@hj7 zx32enWGstCI3JMxYYb9h?-~dEq|m5oTE!aCGEpI0n6@&RUjK+}o^OGy`FO_o0$vMb zCV9T;|M|M)Zf;%UzUnTMWo}x)=VRO=6*$P;O6jcssMELyDcAiy*SKKuvhxFCJ zJMyr{`DL;@Rxigo*j#0<+UKyc%c>B1rQN*df>*GftSoIKh(jy7QvdLix zg2jid;FUENK2LO$mBX?I@f^(h>LA-}N7V>Odt8w&Se9a+$!ld~vOf$cZkGr^FbD=f iFaUxxqf3l%AtYOP8oP?S*hk7`iz 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 Qu>b%707*qoM6N<$f@flaE&u=k literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_feedback_search.png b/res/drawable-hdpi/sym_keyboard_feedback_search.png new file mode 100755 index 0000000000000000000000000000000000000000..d931b39e22115c03ad18005409364d0f1290fda1 GIT binary patch literal 1209 zcmV;q1V;ObP)wB1qFF7Az!UDPlpel8}gvSYSiEnn+lP4e>}cq`E>vu|P>gLZ#lyLQ55W z+}>N~@c)v}bmo4~wqIi=`KQU;@6I>BGiT16Gq=XTz(B@mZjp>p-ZX#)&;S}h184vZ zpaFcenAl+$hSTpxNx7ta{LO+vI6Leo^^$&&ev$gnKlA`Ljp;H;V@VT9wWMlNIjIo+ z-$_Z*d(uNvBk4J*9YD!I2{@g$$_92EX$k2ZsS8$hq8Fsy0FA>C!wSIeQARpQ`sQNd zqMndyuu_rX0>~y+lCJugxK->*n@HmWfv^E!%g-R)cQCOI(nnGoHgURVd4q2w75R3j zGyoiBrjRbAnaFF>A#CO<(oC$@JkoY-;6BB7d9$w}gbeBroeGZNTcd z@m+H--BE1n`JPun0uX`4WY(|40p?}naWq>>`YIXs0E`j{KrX_Z_>#}0xxW1MuiMF1 z_5rChsAMh{;HUM&HCrS`n}*Qs8-PRN z1W7;VGd+IKO^ned`D~IG_lzj|a)ds9=}(*qep?b7S!{V;Qj3VfN(o6O8Vx9mG!RzB z*6pQckO3qRn?-<1ghIcKS9hwU-&25)0kFHgk@VM~`tn;q6~P$R){A!r0>CBUJxTux zZ0@KJ05-sC$sTL96i9)b#8pU-#RF$A(hM(qAq)A{2g$f6urh(=Ld7T>WqHdgSkiFm zI_&qCBx7=PTc+69o&k8UMabF37xHqiba8T;<>*mGYJLU=GlB##^Oj?Z6qxg(jj*aL zew(3^$5@aimFCoZv1jYs0K|||G$~%5LVmOvzFiKWGDMkLByR0#DmqT$7W%rWu&If2 zV8Irf8n+YA+$B9iZJcsgPh+~ft7r6X(mYkyyryKqAu z4NDZVD@BhW-F`{hf@Co2Hy0YN7DJ&^h~%zAyy7(U|BY$@4WI!ufCkV28sI+$_$|Ny XPUB=uW_hcZ00000NkvXXu0mjfoi{Kx literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_feedback_shift.png b/res/drawable-hdpi/sym_keyboard_feedback_shift.png new file mode 100755 index 0000000000000000000000000000000000000000..4db31c849a0885e4b8a6c66619b8b8fafea1c499 GIT binary patch literal 885 zcmV-*1B(2KP)DIkVl64OOJO6VN|jb3NJt7n%LF7?*c@V_n3(nd@V_t_ z=Jq2qd$*_a;0OCLGyDFtGw;3KAdchOAX~jQ;N}H*0bYO?;00J&Q#}cSz~$J1GC@bc zS;kb8Z?mL{5$DIiZJvJsdoD#BQv2C*|0>t?X;F%IGg+uTjywe0o zn??3%^jm<$`Ey`_4y%rCapSgm9Bbkh*tgy<0TS!afCu1*=HNEC!_Ya(<87^t^m)iJ zf?f-d2abb#paXs@j(r6)Ok{zQ)Mj{3717}s<3&Wc5RfFQUCp8IU=Ezt913`Cj&0OF zyG0Y7t$-0jq7r_Ad2qJNYzDkH&$h84(T$WXKr-n~uwe*~Pr><&O<8A~Cx$n%!Lf(S z5+KRvDp*U2?Twsa_ab-!zG>sE@fo3O0g`ksgJnnAHRO1&4dX5IUelF;BvCCIV!2Iy zBYm!EZ!}4Ssfn(LfV4y<8*kFG!c6v5p+uKgfJBW6CL2?ty6dRM&q{O?dQ{6JAT4g| ziOSX2n<>%BCcm%el`H}JfJZqJl?xHMCrtG@P-mVW_3}z@fj1yh9wO`VIap;0&~4Z6 z^Pzj%^)cpvR*DE&F0c-+@x=z>a)JX zhrlB+Ww|6;Ijl8Ik$!Al-@{V#ODbtdcWRL;-7i2LFsHp}&$ zWrvJNoh$*e)_#I7q-@*agt_^(=+L5^*WCUab!e--+8qA(`oADxzfXPtrf)+jQPi?Z zgj&IpBiA>vGXb{$RBfMW9fjaP&)-1zubY#{e3wOEA)j4r;#Qyf`Y>7vE31?+Rhc$b zYtIE(SDC&V_0^~s;H%LAtVaDF@B+L5FTe}%0=xh(;6D@aM}PqUA}hN7!tw^n00000 LNkvXXu0mjfHtd^> literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png b/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png new file mode 100755 index 0000000000000000000000000000000000000000..3fd5659fd3ac276359578bafef0f2f38abe2ff53 GIT binary patch literal 700 zcmV;t0z>_YP)48v7}Dlk9;4ThA>X% zoS8YnZ{UIa%$a$g2|4flm^hB-W_g*PoAE^jR6qq(Kn0wZs{O_o<8#}_IzSJ=TVvYg zTg~afQ1}Me=J(&htxt*nYy^+X5@>^8Oq)ORpE(DC8rT6p_=v~+dWXLYS|9>%z_}G( zIOp%8Pz5O1D{wj?yl~3vM4<^(z)NtF5MDUpb*rHWQ22FlY)zL*&^jF+Qz=`3=J_T# z0>c#Hg&~h=W+_u&0yNjJf=}RXitqxBIpl4aq6KJ&&%gn=0)I0I#60$Zw`GbHkfQ2m z3~tk(w&+|17AF*yD^hfec?(dJZh{Ms;e`v{b}cUfDxcTjEQj#I8Sf+VEkLES0lGPc z7rMN!sxJX4s!jpng~XzpMj&fZxsq6PX$5FrUgNU4D=_?c(XEYlL>d7aumV1Un-anc z*Wd$ZF=++la&R9EQl6mY$$+yoMB*_4YQ#OzD>=ALk25VjCP4G=TW}drc;S+>MM(nm zGkp#)yg=C+NdgPt9rzYl@IT-y*rkkiW@FDjW^`wZ&PASs<&>9wE$}7d)!cjVGsSvC zo{{ME`#!cqd$^?BayYVEu9uX0b5{jazbg(o2OJ1c_%Go50Y}TB$XX#3S-qsOI*qD;3aEezsDPf0hIKZo{{al0iEN!KC zJEwh4+kVbe*IC-uwC?5AnACsAGtI)}%*>AMnR1$m;q%+8Z%(q`sA8;;ewH%p;DMZ^ zXZEM}pPGH@@#m>~Z|XaTRd0S0&maK=Gx)ECHZU?YEi!+%>Wk2Epl297UHx3vIVCg! E0RCBNOaK4? literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_num0.png b/res/drawable-hdpi/sym_keyboard_num0.png new file mode 100755 index 0000000000000000000000000000000000000000..10ac70b9dfd4f8040573322add4f14a320c2e9b0 GIT binary patch literal 1931 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_num2.png b/res/drawable-hdpi/sym_keyboard_num2.png new file mode 100755 index 0000000000000000000000000000000000000000..283560b3534377e6f41fbcb5539649f70bcf525b GIT binary patch literal 3214 zcmV;93~}>`P)wWml!n~jfriIPHXBG8?A90%{atK-M5;IXk8kY#ueA9C@v%7 z5=C?XSp<={zy8ka`ON1XQ05KKPMZ5ACvUmmc7NYFzq8z{xZUm+TKnHLod$shz6QS5 zH1IX>wWfiufv+_Ud<}f9HD5D`FN&fx)<=;JN|AoM8;}n+Et_rx{6?&TL=Q2t7$j?P zK^!bLh?Dh+V?Y)%+8m#_El-+xegdivh{ z{Cwj78s>hd7i_37@Fo_qj*aKE^Sm5bN^ZQ8$79aub;{F!)Vf8$R zqdEPUBD7EWZ=mnTrysp@=guh;CQO(~*IvJVUAtk!hW(2cEjq_H5R{pjnF5D99S%4^ zo-ijT=bKrxW_^RN&)5OmKNROTkY5PkY2Hv4e+HzE=d5KQ2&iBV49pCokpXgYA1jZm zWwG))CiZWke9wX7$B$1F8h-KO#iA!qo|N)>6i~dO!@xZ_d=>4u__V7hPMo+WBO@bG zr_%+D9XmGX-o1OYk=NYEjLliMZ{MCbXU?1<@&pM932`cI^+xN3<8Qro?bc zay&=FI`yE{fVOShe%7^X*X|J!5q|;r=T!-&&otl8W@=|mSNKNlta1MQ-34&M)DspI z6cqkMuGcf=m`98l(LW?4#7Mx?Ck~-2JHtvz^Zjw%;#0 zD#LY2K#N+AC>iKwt{gmgaGE?25t4PqiWTP=7@HTR21SZKLOOTuoPqFFk3_Bz2ayD7 z2%bE7a$itSDRZzV69?7kIPtR{J9dodr3z!nLP7!JqxtjaPl9#md-m*^1n}wL42u^p zo(SNh$WoRrUAh{fG67%Cdp96*djYw;Y15|Zyq3MWOD7GPk((EBO3{MQ7Jqh7tyZsI z{ToC)?c{;boV*t=UX)6f=Nu#yv(WeFGiJ4kufcDO3QQbTw1GCI&73)NtlSBv?^w2M*?y)30lwP{%JGyoMvordi>Ri&yu2E~ zKfZSD+8uyMRF}%mGKei#k)kP)C;J~ephv$D zcG`F8(xnIfJIl28?j8^tw*?hOir;X&3PcB5DSz2{& z1$a}y7r^^5@NFQmXV0Gf6Sy*2?uba?Ih^4t=FCbd4D^Uvc zG+eoIrLa?{PSNlOsceZh)_jGP;3X*PHfcUI+W`%4g-9nEkx%@_jT`4dHo$@&I~)!@ z4nSU8X{e5)`tOrzz5w3Lz{j0Bb!u*p9zD9tohm9SD#wf&vm6>(#9HrdRPY|0uU@rk717ZvroMovsHo_b zD_72dwZuY61_AtM=ucx>P+maRfPli-k?Y<;C1p#&olGyvTE#KgoHcGh~hrw2%`obX>pgr8k;y@-PeQ9II0B5F!D z>B*f>z?Xq1UXMF^^yu$~3>nf-?o?l2Z<{u4+SlOYJDiBwBmkYNM~dzyQjSOKM~xcQ zlPCu~{R%X54V-Ny8X?U`L}emPh7(Oe7@Evu>;il$D@Xu|eYorD>a4`?m`fyx&XSUn zyEu%De*O9l%gM<(FDQ&1uR&zA2sJw(*1yhH?Xze{lyE78Bc~O6;J|@dNWlll18g>% z6C3&#?J)!E&xNUAss2$fRT4kO|DvEr^8}`+r+*$46r_Lr`0;&E$hS-(wY;|oSVAI_ zuX#j0+1c3{d-m)pz@d0JoDPWd5UX5b2InUejlt>O7cu*e9Xob{-nziKQ_eDN-MV$V zaUg*Vz9)HGvSi6H(9$G;-%F~F+IgOe(;?O`1>O zv*Qf~odjlPW<~}F2Z!|O(`O(KE3u}g#(}YCn3gR0`S~_j*T1mlFj!JgtQ&{x|9<-P zX)&zoGmQBaQ6MFGs#3MjG@mpjJU2IY3LI&cx-%T08xF7w()DC;uM-^WVpAu+b&#e);m{`+ShE zr7Eps`SRsk5CP>Opy-37tTpH?hRV^ft|xoF z?WDVR?_PsQXp0mDIX>_(MU*Z?$v`;mI_W8rU5<#D>H?)QuPDZeS6kdtjmN^4QzIRu zQ?m46X+9JG@8*7QrH3%|+m3s1`9kwWHIvNvCoKRAu{6=yisZ%4H!47ONzU7;>Q~4A zzmcBJiYUz>g@-OFM6|HxTBSXS5`vZI63>X$>)U?By?CwpLVLp40$NJi&=l$rPnT*q zLa9`nYa^PksFE6Wbya>9QBl2FpfvKmh2-p=(x>{hM)f$IDyjOx9-8x&M;UziEj9Up zvaX5XyQF8PZ>5^P<3k(&z&oNp%jPTa)$gu&^Vm#&aP4ZLdUsQMQMM8Awf5wWfiufv+_Ud<}f9Y2g2VwEqY&0B((_rI6yHng9R*07*qoM6N<$g0bEq A`~Uy| literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_num3.png b/res/drawable-hdpi/sym_keyboard_num3.png new file mode 100755 index 0000000000000000000000000000000000000000..9a3b3294b90d521f26ead3af4e1e2c6e7d1726ea GIT binary patch literal 2805 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 Hu0mjff!$wP literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_num4.png b/res/drawable-hdpi/sym_keyboard_num4.png new file mode 100755 index 0000000000000000000000000000000000000000..f13ff1ae91dbd24a1b557815d0d517e6a890be05 GIT binary patch literal 2647 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_num7.png b/res/drawable-hdpi/sym_keyboard_num7.png new file mode 100755 index 0000000000000000000000000000000000000000..2246972a87f9d5117476d36a48e1f878f9986d39 GIT binary patch literal 3664 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 ie5EMh|N6>*1Q-C`aT-$ZEbKM_00008{& literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_num8.png b/res/drawable-hdpi/sym_keyboard_num8.png new file mode 100755 index 0000000000000000000000000000000000000000..d4973fdc900ff3fd83ef267149fc58da64cec42e GIT binary patch literal 2904 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_numpound.png b/res/drawable-hdpi/sym_keyboard_numpound.png new file mode 100755 index 0000000000000000000000000000000000000000..d091339296eca631931f1004e1e46967783eb9f8 GIT binary patch literal 1600 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_search.png b/res/drawable-hdpi/sym_keyboard_search.png new file mode 100755 index 0000000000000000000000000000000000000000..e72cde3bb6b1265464a78f0deacaf2143bb526c2 GIT binary patch literal 1623 zcmV-d2B`UoP)r{N!8C{G`OtN#z`P$1zk|t^rC%JIQmwV1V-~HXkxxaH0&S*5coyOwsc1nv2 zm!_7!8X_yeULAAX9MGCl%=rj-dbK>zH6@Yump7|=JePWeGoVw^6fNW zxTl^94-d~?TwJ^(>@3v%U0YlG73{IM!R{p#e8xJ|nXtcuzR)N6b_y_DE>D6a4-E|s zupK;r(%0AbvqU0!8T1Jt5g=hC_?&>c-rn9{(3WkBzR)N6c6SCa9MN-md3hfg3kd-?q%!aRI{)`hg@(OibKlM_j2?b`Yo# z>KJFHJ?cV1(tCP(x>z6R6MfS=I7b4*C342s*EdU}(WvAG&LyZi=XvGBz*&y3c--5#G z5)%_I(2R;44NSz&7M7Kjl?~#3w$LKvhzDzHYyYs7US3`j0eN;_+T!QucNo_2fH?d6 z`}>@Pd<;ifx4F5w&Q?Z8M@Q1W@ZhY-ZO8`0zqeE>J;&>fut803;lrP^Z8AYkhWPSAa_jjUiVkiy;#wVuX2?+^T;c(p+vvKzlF2$68Jt(vnO)o)c{AgPzWv=mXZv( z--@+>AlR%{R#w(QG;K7cUs_taO_}vG6h%dj0>;i9o?+22%9j-i#n-d5vs1!ElF!*t zhc?9GG0k~xczF1xIq*3-IqwN0t+l{7Yk&ANLn`+8R;1P*5| zA|m2>+^;7c7!S^a_D^zSW8-zbUT-)Jz=YsZnwpxvF$J!xtE&<8&;B2lqNzh4xnfFt zdwT;5s=K@U2O`zMCpvgMhS4Cnix3H~O-)Vx3WvCyB4Q{J0?wYy!|kYlS+c-r#FW_j z5>UJg`Imky)IGY%GvoKD!0cFfy2c;wMxs*&YbX_Gbp1)p1Bm`aLRidc$RirAh+CAJ~Qar>P>R2&5J%NG6JlZZ)Csswq37Bn4H4H^awfCl$N zPIgzs*^8&NLP+XVMMZ^uVPWBGtJQiDuFaqtx-XCH25cKhN&N++&RQ&%TPrIoe}J8z znVI<&Y!1+u_DW6^UO9*nSPg-9xLmGrULd2Rqy1pN0(yqrlS_JH1X4|)uOJB|6NyB^ zJv}`?GjhGXyx2o^zmJf6RE zb8|~EGE#&@@;cDG?d|M#`)#nlLivt6bYcVo!JY?j

hN1_A+JRaMp7v=Vrq6HLOt zE8E!E_z_##`T6-rdcFQS*kAs?G>`~lEUf2bXJ_9;a0oIA(%jtq3D~V{@5I@QuXl8G ze9i*Q#Kgoyuw4bs-YpHtO^k(g1aWn8a&n9T?C$Qq4>lX92}#6B2`qZrhlhv1V|@n) z2fslZRx6-sJCT!<7)KAqhZhVC41CLgjgOE22(~vsPcvYJyvIc9%+}^Hh15X^$aEg&-|x2yhmy7`87gC@6UEDF}||_xm?%YHI4h zegRZ3OapQdQ_w>$)YaA12ZO<96ahn}rKMkj{asKD+c!a-6bP(DKrL9IGnA|`zulnr z*zayxS=j?f+z}jiZEeltbULfSp35Su9K>D}wk0Jcx4mBPV_t;7%s+-cuhPol7{=n_ zVh1l$Fp=ly=id-UN;!z>91e#SX7Z6(U>h47PslxuG{)(|!opHsg3Qg$Jru5*7`&3- zpc@(*a-i1x9>`^aD{7z~eBt}}e<&2vWMpKVtFErT&TKT(EC47WDQkpdj*X4|u2d@h zDwQfKIEvs=H5yGA0#cyAzu#6_S^3j}pLvi(05HBNx~TL~Zp$-xeF`@Hn~WID9!J3@ zi|(6&e5P>F+S=L&v$L}}<~q*B_Gi*j!UkwmE@Dx7NGMKKfa67AhMx*ok!nCBwTUDl z*yIR1X|-B(*S|nLJDh{?L^diHFgfxDJjN09On!o7rs6gf{ng8#p~Z9Vfy^ zdLRcp2Ys%Hpdto?!7rtgPN(ye%O(C?QKX>Dg!}sXT;OgWuCK3~At!0$HCC(D&rBxM z+Vu3aM~a&r)=4nGxVRX`h$iQ`VM34JD4>|2S}2l|r?5TMp4>rUmSe@zzzs8`bfETW z$?l2@sEgH-a>(=ciexADA1Nv-`V{tD73eMei`Pl>wPim7(GL^z8mJc+h^~)5F$np3 zdN;%88R+`x6N4i6-f{S%8G|Z4ENOP1w~r+|u?WAM=bSe;@7?#pF~%B>A~X$06sj@Rm}*QlRuObk z3vwKH&;dkZBe=fg=von^EK#}|MTG%q1nPkTFbPZ@#GK-xh@)4E^oGz>tKaXxyt=yj z%H?uhfbT6po}Md%a>5Ek%Bn9ib-Jys&9}C;7KZyQ6bgNUd%ZwMrRF5*Rl*pF+9>g3-#K8W+^ju&5V&46xEI*e*u^btgo+sce~wwsDGB$JMPepkq8s;9EwAc ztOA6?;jb2p#S876+;17Eg|Xdf{gmBqzm4M90Wdc=_a5510<@P~29!3oJFTOLtMl{o zA6OMIJw5#z+Uv$_1=v{3oRY>k>J&TgMlr047#kaV4()aUZN-)WrHt*aRoH14ieObn z7BDn4^cdQA0hxBk9=ud+FA1TTlw-_jG~z(~CRXKur`qR=C@Rz3 z+?0GQ!l<)KW5;d=!htS_DBblq#&(>$hz-TXb=8aYIg+9o9)O zi$o#<&S*-W8`kvrjV2TuWDD2itW#K?a!;;Wnw5BCjSz-rITfgUW4(u>2J&LPtTkk( zyr$lbsedD>##Cd<8p}hLF38FfcFO1L-B<>4#Vt7%sC-?gRETsa6pDtKN@mm2zLX5)O=BjW+jYqqA-_IiHUw+tmekl lSy45n8dHt^7smbwFaVu`B6+?&A=3Z=002ovPDHLkV1krb1abfX literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/sym_keyboard_space.png b/res/drawable-hdpi/sym_keyboard_space.png new file mode 100755 index 0000000000000000000000000000000000000000..3e98b3014a42d082a1af04467894cb2a01e542f4 GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^W8U}fi7AzZCsS=07#Kx8T^vIyZoQdxkn6AlPg{28$7f3~T$W2*zuWwF@S7LD zT)Q|DcQoaSU(9{_Uy&uspiat{Z7$CX7ud*w4m>w z=-D~Pw7T?dlan_EL2GK(sW%Zf*X~&8 zT{I#4l*-0e%@-5*{jF~N#=EYh^G+P^UFK-1C9^d$EAoCmOL{#~qExObRN*WCn=7jw zF5j6el5_V`&F<}A+@rNx(`y-+BSLLiB^Z|9_CE5zS!@X~6d62S{an^LB{Ts52=T*=AHLxs}+YLg?lenh}~I@g~*AluIU+%b1}FEi>v}k}b1JmU0PY zTbH$Nb5NR4F44S-ncNL6iAZiShJ6nEe%{MJzw?~u{I1{c_c`ap{= zV(S6`rVFmS z)*gNAk#R$*wBa|~kC~?mFVtEcpNFk?l<6iJsymJr?LLrtZ3NHFl|=UC%o!2gPh?T* z7gL7?f=?c$BZATq({btI)4H?ynu`T2X>~D%^Wd?{JCC-4mX7IHhx+c)!a9O6oUKkg z8Q!@}5sx+2r6!sA6gNzFtb0G$@XJC+HhC3)>FJ9l!x;!rzC7hs~H@DP0Id+wja2)%eX;ALpfmT&50# z7uc}h)@W*_6J<(kH_GNQ@J>{qP zc+&$$Mn-kj)tTGnLBv;qibn~N-d^-@#rR+<79HL%17u9P ze%;rVXy5&@lJQg@J~lvTNp{Dg?_fON#rjdyK*CUfs*4}4+R#}LjO2Tqcs3e_;d@4HJl&(bm4VR;=)d)2 zEspa(wlkPguEYa{W7j_=W<8C$qhkmN1`GvV8B)4og(Fr}*r~nfVisF6Phpwwr3iIwBbnw^3chEWHuqt5B zE{KS3NP0~o4{&$U-4#y0$CBRE8^c|-UutliDI5xxPrWZ$K)IZmQ=3fkBDySC*ZJ+|msbvBPVJNFi)NxM;RY3(58B=j8z(x5#>xAVsa~;ed z6<`gxwnG_3#~T6n03Gdd4ccR&fjm$|4LS{g^TSQ(|GEFX#t$uSR9mr@6*#b*ayv35`+`NF;>2u;79vCQ5fofi_@{06P)L}^&mEl~5 z!;loA;lJF6O2V^VDnum))$=z#Qw{K*k{RsIMUmVRm=Dj?!b&tcSGrr=qm<$bJ6fWv zSDO+bWT!pI4R(cW6aLF*CzPcuY83u0st4vVofQ+z13>jwW#g2?*v4i(Y{* zWO)xv4PE>G^lVXr;)BM=o*MTEXj!0&Ma3i=-XwN_+DJyueg}_QSbqvyvk7YIOJpvz zRna4Tc%aI9ap^M-_&e61Dzq^~#5HI7uUoXT9nq$-ZMq5Y z!}S8$HjUk57*1rdC=(vRw=AgPcbt_@n0+jZuLt|Fq>kF@FIYhNnJ4}e2QtK14rI`h zU1N}xbTUHlNDF)*dc>(}Xaw{UPq}^cM`)*%bDX3ZdA&Q6XqJ%+X4|%H^Y-!CYC>;U z#N+X4TYzPah!^0;PD^K(oV$Z$iG|HgO|=hfV${<;*wRkMB7Mlp4unQ)lh^Qw0%1|f zeg{jTUiBxm~+3K78RQC3kI=qe9B%{G1GkJ!~26N#Fd3*u{s9Atoi zHC>!LA=V`RWTY8UzU|}{ldg)GwVE&M*mGuv9#vhcXCi45{oTgK8*bm*Zgm`#wEy@b z)NERY+4;{VxkcySO5S3 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/working.png b/res/drawable-hdpi/working.png new file mode 100755 index 0000000000000000000000000000000000000000..8b51ed11662e07c6a828fd952c5c70ae4cca39a4 GIT binary patch literal 8636 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 Av;Y7A literal 0 HcmV?d00001 diff --git a/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png b/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png new file mode 100755 index 0000000000000000000000000000000000000000..603bf0e1592811519389ef0557df03047967e942 GIT binary patch literal 737 zcmV<70v`Q|P)tDd1sw%F ztDvHyWrM7RhAqGf=#W5s#5a$zFbcuWGa`8pGIt~k2^^t0x^q2&*j^Mxly`WZm;0Ao z^YC)bAq+$6bUOLd`r?>Qr=AZCZUInk)&WpZRK^h`-`H$6v|g|2a5#trQZARN(P&V; zUblly>G%6I8jb9r&gV1LYBf5YPHIR5#lZ|X_f(JK3CSU1Rl7m5vzR+tn; z={#*!WCWEQQX(y9fC8wTL78Al1Lf42Yctb^F0J9zxkFJ|DGDC-qM0ZA3kju{rYe-4 zgPNSoT*@tsRu#-VYeh*l^WSm?sCPk0_9!R{rS}h@;!UPBP-zV|`Y228=%dg_!OTC~ z%u#v{igLNIsGw{sA4(6Umu>0c`6$Og>Al+?NWO(}_9*GAp3$SW+by0kcLZ{CLKlB+N65_X<1D6XWfqGd{E*BRKR9em`y?07a zIw+^o<9%y-lb_zhCSv)&s*`;&Trq zf?@_qRXu>>W85Z_3H5qCb?S}8BS((Mqhi1;9zJIfS2I^MSV4=$g7*8ps4cQdV3kUR zTCLW-1ZT6^bLsH}Nk@&CKxtFAmY$wuFf;L?N-uf(mJVr;1eyK}zA{j+KLQK@zAaBC TLb82=00000NkvXXu0mjf_A)?` literal 0 HcmV?d00001 diff --git a/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png b/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png new file mode 100755 index 0000000000000000000000000000000000000000..6ddd516e790627b773405917a89b9da4feee36c9 GIT binary patch literal 941 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 Z0{{<_AlR|X^KAeC002ovPDHLkV1g0P?MDCr literal 0 HcmV?d00001 diff --git a/res/drawable-land-hdpi/keyboard_suggest_strip_divider.png b/res/drawable-land-hdpi/keyboard_suggest_strip_divider.png new file mode 100755 index 0000000000000000000000000000000000000000..1a03c52e64df4681aacb8bf1c15cb741eaf0b568 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bO0U{@7=E?#o$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1Gex5FlAr-fhcGUd*v_5|SjDP?CpFePbVNnA^ZxREu3D-iF zP`=d)lh_{lI%*tL_gKO!(PVMfCBvaeQZN6}7hSvCk_Q_&IUGc$urFj_;$fK5SXEbR SE_V%RGJ~h9pUXO@geCwk*Ei?@ literal 0 HcmV?d00001 diff --git a/res/drawable-land-mdpi/btn_keyboard_key_normal.9.png b/res/drawable-land-mdpi/btn_keyboard_key_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ea2506c6d6ba4fcd87dffbd091149bff561553e2 GIT binary patch literal 818 zcmV-21I_%2P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXV& z6ErSAYuLa500Oc}L_t(&-tAh=Zt^e?oQ)kP9C(g!qBq|E#DybV@*YU!&v8%A=NQ`w zqQw5HT8e~9sAoDe%X(8%O5xo_MDPC+fZqDBQVNH|;U|DZTXkJihF`LN4H2$iD5cPK z9fo1RPvqv)E6;NXAwWcPB2ClabULA`Dsav*j$?9!hzMDhfrxOuUU9ixu-onCMEbtR z@pwerws<@qkWwb81Y-<&p5yE53+MCsnFs)MU5Bpg(D!}PM3hpKrF1f88Ie+A7zXrx zk8vE6Br=X8hzOkXnf1ASlg@@FVlj`lG-x84aC)njzQGK7YJqoQd{RUyHC?G%i-;zS zUPVk2Aw@o|lFQEeXBwML=1CDPn_0ECBoiWG+AFAt>A#RFTja(BuU`|PBA+6nl%h2ma8-^^l~>I#5`jf) z*;UK&h%4&J(1p*bh!A2L%;}M7YD5@g5JEr*;kTB4Zp}GQ`eCRL0(qX#95)duiUM_A zqpB*DWjPyS#|XV|Z^jt1EW_<~Ls1m}-UEQDs#Mc7xZm$++cw!zkV&X03heiLlx2y! wuIGv{#xM-Se{qn~|2QyH#HDQFJf3iW1A+oZV>8eEQUCw|07*qoM6N<$f(}b=nE(I) literal 0 HcmV?d00001 diff --git a/res/drawable-land-mdpi/btn_keyboard_key_normal_off.9.png b/res/drawable-land-mdpi/btn_keyboard_key_normal_off.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bda9b83941ff20ac6ce4a46912dfd292957be711 GIT binary patch literal 860 zcmV-i1Ec(jP)&7NR45e0M1*^Y2E^)0ZzVl{uCiF2Spz3%5NWsDrQL2P zbb+kFf6#?VFAfmdk2WGO2EYv|ixp#%SpxvL?;}bR5FX!34La}@2B&Co*BuoE zuI$5`8g(*Cve?PLoz$peO#_H-d}r3A1;mRQ?xZ44q7nIBXGCn&Br){^ys42XN^2V+ z`?5~)x<%<*rURi}^wi&J0MYpf=#vMK9P}^a^147>ud5OfSAs#>YzRj zUHxqDg}Nx1UjCFKc@B~3(fP{wY9o$LK6yWMEl@5Rd_}3-7Fel~cT(~*{;&3nvqRJQ z4AqzAX5!ivX4|GnH@!~Za@ mE=D4vEApoaLbnY literal 0 HcmV?d00001 diff --git a/res/drawable-land-mdpi/btn_keyboard_key_normal_on.9.png b/res/drawable-land-mdpi/btn_keyboard_key_normal_on.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0c16ed5093dfcac53807d9d9663c516e52bb07ca GIT binary patch literal 926 zcmV;P17ZA$P)f`xPoyonGAWz zi+N}hP%}OV`G`E_GehzVSsoljn9(SVl35Z017=ki+}n;<;Rrj7g z=T=wsRV>RwSW^^b<;GG%`5+*LLLoew5Z3K>6%}{H?hFu}U64ex*$j)t0{h4tFN?)u zh{xlUU)w+?lL@NTDh$JbuIpGXmwN|9K~+^<_w9BYjYb2hRB9W@d_G61RKj#R#dti1 zX_}ERp=sKhjdHn+TCHXWLPpY1BT!KSA*PumZ252H2nDAcAs{3T*&#x;TjC2K59Y{K(IKD ztA-6=U=E-DK+Le|%3(1a8R0=tU#=K1^fmab<+pkJ@$1M4@;LQ~Qm%HAGCwLNjxyoqhFO-oo1*`MIL#hgv;|jPERgT|M=NgF35oJaiolpF#xO);*l8fdNSfBO&Aj& zz_&EKL{S(Y!}Ap{+m!ZYG7!>DPrQx-h%AO4MCUN8#__v`&WmC&Kg{r3xolgPjdhB% z2IBP1DmwKO&}*FAJYB|u)8t(x;@=^>JhE7--`oh2C%eqoy*4N>8T=-t>{#F`4S$m2 z@3G(FxF9DqSxjA=%r_^ky=Znj6v_PiX2dP=f&y}7#OVn{0J|`<*BlY$@XLs7tnVBN z^O_Fx+LuZr%aMHo@RUYeHDVnj?5->GFJ**kTI}@BzH9akgbFnjhnk}_thh!+lqf4k z6o<-J97tsYB#}s<*Xyl|dC6pQ!${Dib(%{+sG!&Bbk;F#jASwyG@DJ->-EUat2`hA zK{0JW=mw#s8ruIbR$bhx#Y+%JTJe<~#{LR007x($d)Rj$0{{R307*qoM6N<$f>02w ASpWb4 literal 0 HcmV?d00001 diff --git a/res/drawable-land-mdpi/btn_keyboard_key_pressed.9.png b/res/drawable-land-mdpi/btn_keyboard_key_pressed.9.png new file mode 100755 index 0000000000000000000000000000000000000000..6b5c718c71a8b38a73e5e765a9786b33bcee39d7 GIT binary patch literal 740 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXV& z6FCG?es5a<00Lx5L_t(&-tC#quCg!?hTl&4Q4_8M@4%I7cHXHQ*REW73*3hb1cshf z{n}boK0Q#(nWPDc73Rr1Go1mUl)}3vgn0iZfOzZAN-3<@>rXf`nU!TJ2w!4f0}|;A zr4;JAM%%XdMBe8q4J|L$@`S1e`@7KE80rF^c4 zF2Pen^uavL5lw2YkU`vt@rKr16zL5uGe2D7DS-M~qKAs;95Gvz(As$oMnsRRmI)Dh z)new?s@7~3ajRCy-LD?5X5Tbw|7PDbK5bFl#xc~+*Ywk?hzm1h1Rdl2aDB8C5kjau z&u>5YHjZ7r+~=8Krf=rHzc-D4Aio8oloEZ(9{PHz{Q5Re)&1({x~2E!@;hba($92D z@l!=Y1Q~RW_#Ax%F&2;+R_1k|FBHPe@rgt8P7xoBPO@k1!&vQ#&)2Ar(sbU}CQLP} zzpTiR8-5ySsM@`XxHk+TjGmQaFNhFg5X4lVrk~!>(i?mmLmI5~>J6-8G+8x)-0000X@A{( zv_L)pq}%NVM-#y2^SP$eFR@<(#Nanb(fxj>=krNn=*G$7@i-+C3FylVr^@>2x~LYPDj0+wFE>Ag&qN?RHeJ*D0Ayvj6k>JS#ao zZ?#&{F~S=Ma=BbsI>eVCG&~QYA+8VCj1-GSRz;%1@f+YEXt!T4o2Wrcjqr-W6+j@= zY&Of7z^HpX9+_Z+0KvQP=g0^z;aaW6XxwhMwBPTUMw-ngRVo!W=y}nEYmIQEVuKdS zmPC_0zHsI;T%CKw?_Ndn;dh7!zBNjg}=NDllARezu*e{;F7p6-qI{)0n~Il{W07~yI87lv4nf{78;A%Dd4%vVYN5nuqDuBQKIAT~At O0000)JiSw6o*v#l5sSFszBQ=lu46 z&Rlj>w%aX&nxZJCo2?Sa2Z5B!<=`{{tk>%)DxQcv84#U)pcE~aORU#xgi$wc7K_CY zkH@LLtRVCG9F0Z;wOS47bQ*?XM3Vwl#b&cXyWK{s)j}$jvVyEuE7a@tT_;i|N)T!k ztJ!SsgOCvf0nt?k!esPnvJ?}9rfC*mH2f_!LIA8Wkl}EM(P)IpWP)5SheDx%VzKC3 z5e7#ZzwC-~lf1>@#JAQ)0ZRNSJ72(rmvpz`h-szx#v zkS_zLZ>}-^bYXs92n^y`k!R;Wagu+#pJ(&`#=wY95!M(;x$+Wg?QYLeu5yfC-v~5v zSS(M9Z0<`)KQ|@B-=K;)89#n2?F!oK(~HLZJJtvrF?5{`k8oDXVXfX{wVfiSWT6{J z7~g8<_cPxhvL#-@qtwSoz*Qs*v(Uo$U6I-;@N#-eR!@BzN4SXjqVZa#Z{3g zKn^KZT^7g*!YdG;7XGuHFExyXEy# + + + + + + + + + + + + + + + + + diff --git a/res/drawable-mdpi/btn_keyboard_key_normal.9.png b/res/drawable-mdpi/btn_keyboard_key_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f9b7cc68907243d491edf188157a1486a8f8ce GIT binary patch literal 809 zcmV+^1J?YBP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXV& z6A3Zci=B%A00OB=L_t(o!|j-{lJX!Fh0hIy#KPym%I$pr%EnR)^B&F^lMuEdKS4qg z3IA*%GtTa;!2R}|3tS+rHDVhPX{|Ly&7rl%;c$qjiD>uxoihB9_Gdu2`9*7urfJZ1 z9k$4uxt8ZSgb*O2F-Tq4IGs+AQi5}izV9~&A|hm21|q`sdd1~(!EU!3gS2gnxJj@38hpLB^YDK^Bg}vKRBPy?;rrsG!2@jLEE-TLA2I`C1&}LazrVGuItdYE&9Gs z0@C+AhzOkXk@ei|WOBoR*yJ(I1SO&&&g7~w9qdHiI$?b=-W1VV51&-l5YZ50QV|;> zq{y5~K0D3d%-k-_n<7Rwd)2Ig2|?KQ1QoIU3#qasZ=B^h{IrvGcGW1Qpp^20EKS}i z5Ic@n5dZ@~Y7jGj&>E%GC`V$Ku?s;&LyX1NtW{yDIaV8q>)o zj>!>w?5rXoYqmJ-R$F6Rl&TDHkCDkO-ghW%)qD^DkeNiXgWHEvijN!bO_8NO$E=#r zbwW>V;~{`Gr>|X|O&u5Co8A}X3$hwy>ZQk5r~0aI-?*uMp>cd}@A#xl^qsu+{^E<3 zE!|N+*F5q{y2r+Gqd6MRwCw*rXLLkrckz)f$Q52}E3Q|gxWjT5u z`6Owl#xll`Wf^X_8;YX%_Zy&7NR45e0M1*^Y2E^)0ZzVl{uCiF2Spz3%5NWsDrQL2P zbb+kFf6#?VFAfmdk2WGO2EYv|ixp#%SpxvL?;}bR5FX!34La}@2B&Co*BuoE zuI$5`8g(*Cve?PLoz$peO#_H-d}r3A1;mRQ?xZ44q7nIBXGCn&Br){^ys42XN^2V+ z`?5~)x<%<*rURi}^wi&J0MYpf=#vMK9P}^a^147>ud5OfSAs#>YzRj zUHxqDg}Nx1UjCFKc@B~3(fP{wY9o$LK6yWMEl@5Rd_}3-7Fel~cT(~*{;&3nvqRJQ z4AqzAX5!ivX4|GnH@!~Za@ mE=D4vEApoaLbnY literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png b/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0c16ed5093dfcac53807d9d9663c516e52bb07ca GIT binary patch literal 926 zcmV;P17ZA$P)f`xPoyonGAWz zi+N}hP%}OV`G`E_GehzVSsoljn9(SVl35Z017=ki+}n;<;Rrj7g z=T=wsRV>RwSW^^b<;GG%`5+*LLLoew5Z3K>6%}{H?hFu}U64ex*$j)t0{h4tFN?)u zh{xlUU)w+?lL@NTDh$JbuIpGXmwN|9K~+^<_w9BYjYb2hRB9W@d_G61RKj#R#dti1 zX_}ERp=sKhjdHn+TCHXWLPpY1BT!KSA*PumZ252H2nDAcAs{3T*&#x;TjC2K59Y{K(IKD ztA-6=U=E-DK+Le|%3(1a8R0=tU#=K1^fmab<+pkJ@$1M4@;LQ~Qm%HAGCwLNjxyoqhFO-oo1*`MIL#hgv;|jPERgT|M=NgF35oJaiolpF#xO);*l8fdNSfBO&Aj& zz_&EKL{S(Y!}Ap{+m!ZYG7!>DPrQx-h%AO4MCUN8#__v`&WmC&Kg{r3xolgPjdhB% z2IBP1DmwKO&}*FAJYB|u)8t(x;@=^>JhE7--`oh2C%eqoy*4N>8T=-t>{#F`4S$m2 z@3G(FxF9DqSxjA=%r_^ky=Znj6v_PiX2dP=f&y}7#OVn{0J|`<*BlY$@XLs7tnVBN z^O_Fx+LuZr%aMHo@RUYeHDVnj?5->GFJ**kTI}@BzH9akgbFnjhnk}_thh!+lqf4k z6o<-J97tsYB#}s<*Xyl|dC6pQ!${Dib(%{+sG!&Bbk;F#jASwyG@DJ->-EUat2`hA zK{0JW=mw#s8ruIbR$bhx#Y+%JTJe<~#{LR007x($d)Rj$0{{R307*qoM6N<$f>02w ASpWb4 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/btn_keyboard_key_pressed.9.png b/res/drawable-mdpi/btn_keyboard_key_pressed.9.png new file mode 100755 index 0000000000000000000000000000000000000000..91809e242239d063a7ddaca169a8451d13423909 GIT binary patch literal 736 zcmV<60w4W}P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXV& z6A>SVMhG1M00Ll1L_t(o!|j;6(y}lRhTly%s54v#-hq`hop)+uZDr*p=zUlqu;j1u z{RxDFK-9v_WQHPa9^O4<2`Qy8cMy?MO3^GEN-1o&+xavz#_e_^fiD?f0}|*5r4)*y zKvh*(B5sC87>0qkIiO-x~~1WKnO51&gU~urxVuewGC31C9*67 zGovU9uOLDQWLbve@z@3d0A@y6mSAQlh?a5eaJg6r0V$N*m7711$bmiVRH0SzXE=+7Dx!gtm%^SG?} zm?F)r@p<~{=IG;xp0@w-LvOIeHxE8vC$G7WQ;{ajD=pyIma@yfAR=WNZ^F1@$F=6w z_013Z{ptNcejqP{m^VE`X}RX@A{( zv_L)pq}%NVM-#y2^SP$eFR@<(#Nanb(fxj>=krNn=*G$7@i-+C3FylVr^@>2x~LYPDj0+wFE>Ag&qN?RHeJ*D0Ayvj6k>JS#ao zZ?#&{F~S=Ma=BbsI>eVCG&~QYA+8VCj1-GSRz;%1@f+YEXt!T4o2Wrcjqr-W6+j@= zY&Of7z^HpX9+_Z+0KvQP=g0^z;aaW6XxwhMwBPTUMw-ngRVo!W=y}nEYmIQEVuKdS zmPC_0zHsI;T%CKw?_Ndn;dh7!zBNjg}=NDllARezu*e{;F7p6-qI{)0n~Il{W07~yI87lv4nf{78;A%Dd4%vVYN5nuqDuBQKIAT~At O0000)JiSw6o*v#l5sSFszBQ=lu46 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 w+sT( + + + + + + + + + + + + + + + + + diff --git a/res/drawable/keyboard_suggest_strip_divider.png b/res/drawable/keyboard_suggest_strip_divider.png deleted file mode 100644 index e54c5b099431be9853118c033e6fee440e44aa61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^OhBy00U{G$-VFv)k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XJUm?-Ln?0d^f~e|7_hKJfBb*`XD@STZt$Zdp^0}R7z7QC zJ33Z1S*_<)pAj9ID(Y6%nD%G&tkd;!!sj`ry)J!Ta$v{V2qqqeESB;(&)M-UKr diff --git a/res/layout/input.xml b/res/layout/input.xml index c4bcc91c3..f2f30ca84 100755 --- a/res/layout/input.xml +++ b/res/layout/input.xml @@ -24,4 +24,6 @@ android:layout_alignParentBottom="true" android:layout_width="fill_parent" android:layout_height="wrap_content" + android:background="@drawable/keyboard_background" + android:keyBackground="@drawable/btn_keyboard_key" /> diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 45d5464b8..29b8565ba 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -63,6 +63,7 @@ "ňñ" "čç" "ýÿ" + "i" "Podržením klávesy zobrazíte diakritiku (ž, á atd.)" "Stisknutím klávesy Zpět ↶ můžete klávesnici kdykoli zavřít" "Přístup k číslům a symbolům" @@ -87,4 +88,9 @@ "Zavřete klávesnici"\n\n"Stiskněte klávesu Zpět." "Přidržením klávesy zobrazte možnosti"\n\n"Použijte interpunkční znaménka a diakritiku." "Nastavení klávesnice"\n\n"Dotkněte se klávesy ""?123"" a přidržte ji." + ".com" + ".net" + ".org" + ".biz" + ".cz" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 60a4f5f6f..3af5e439a 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Hold en tast nede for at se accenter (ø, ö osv.)" "Tryk på tilbagetasten ↶ for når som helst at lukke for tastaturet" "Få adgang til tal og symboler" @@ -83,12 +84,13 @@ "123" "ABC" "ALT" - - - - - - - - + "Åbn tastaturet"\n\n"Tryk på et hvilket som helst tekstfelt." + "Luk tastaturet"\n\n"Tryk på Tilbagetasten." + "Tryk på og hold en tast nede for valgmuligheder"\n\n"Få adgang til tegnsætning og accenter." + "Tastaturindstillinger"\n\n"Tryk på og hold tasten ""?123"" nede." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index ca1dd626d..aa52380b6 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Zur Anzeige von Umlauten (ä, ö usw.) Taste gedrückt halten" "Zum Schließen der Tastatur ↶ drücken" "Auf Zahlen und Symbole zugreifen" @@ -87,4 +88,9 @@ "Tastatur schließen"\n\n"Drücken Sie die Taste \"Zurück\"." "Eine Taste für Optionen berühren und gedrückt halten"\n\n"Greifen Sie auf Satzzeichen und Akzente zu." "Tastatureinstellungen"\n\n"Berühren und halten Sie die Taste ""?123"" gedrückt." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 7fe65b5e0..173b384b3 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Κρατήστε πατημένο ένα πλήκτρο για να δείτε τους τονισμένους χαρακτήρες (ø, ö, κ.τ.λ.)" "Πατήστε το πλήκτρο Πίσω ↶ για να κλείσετε το πληκτρολόγιο ανά πάσα στιγμή" "Πρόσβαση σε αριθμούς και σύμβολα" @@ -83,12 +84,13 @@ "123" "ΑΒΓ" "ALT" - - - - - - - - + "Ανοίξτε το πληκτρολόγιο"\n\n"Αγγίξτε οποιοδήποτε πεδίο κειμένου." + "Κλείστε το πληκτρολόγιο"\n\n"Πατήστε το πλήκτρο Πίσω." + "Αγγίξτε και κρατήστε ένα πλήκτρο για ορισμό επιλογών"\n\n"Πρόσβαση στα σημεία στίξης και τονισμού." + "Ρυθμίσεις πληκτρολογίου"\n\n"Αγγίξτε και κρατήστε το πλήκτρο ""?123""." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index d5964940f..6dee06bff 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Mantén una tecla presionada para ver los acentos (ø, ö, etc.)" "Pulsa la tecla hacia atrás ↶ para cerrar el teclado en cualquier momento" "Acceder a números y símbolos" @@ -83,12 +84,13 @@ "123" "ABC" "ALT" - - - - - - - - + "Abrir el teclado"\n\n"Tocar cualquier campo de texto." + "Cerrar el teclado"\n\n"Presionar la tecla Atrás." + "Tocar & y mantener presionada una tecla para las opciones"\n\n"Acceder a puntuación y acentos." + "Configuración del teclado"\n\n"Tocar & y mantener presionada la tecla ""?123""." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 3873bbe8f..faedf7e03 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Mantén pulsada una tecla para ver los caracteres acentuados (ø, ö, etc.)." "Pulsa la tecla \"Atrás\" ↶ para cerrar el teclado en cualquier momento." "Acceso a números y símbolos" @@ -87,4 +88,9 @@ "Cerrar el teclado"\n\n"Pulsa la tecla \"Atrás\"." "Mantén pulsada una tecla para acceder a las opciones."\n\n"Accede a los signos de puntuación y a los acentos." "Configuración del teclado"\n\n"Mantén pulsada la tecla ""?123""." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 22952737b..226c4fb0b 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Maintenir une touche enfoncée pour afficher les accents (à, é, etc.)" "Appuyez sur la touche Retour ↶ pour fermer le clavier à tout moment." "Accéder aux chiffres et symboles" @@ -87,4 +88,9 @@ "Fermer le clavier"\n\n"Appuyez sur la touche Retour." "Appuyer sur une touche de manière prolongée pour accéder aux options"\n\n"Accédez aux signes de ponctuation et aux accents." "Paramètres du clavier"\n\n"Appuyez sur la touche ""?123"" de manière prolongée." + ".com" + ".net" + ".org" + ".gouv" + ".edu" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index fa66568fe..62128e4c5 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Tieni premuto un tasto per vedere le lettere con segni diacritici (ø, ö etc.)" "Premi il tasto Indietro ↶ per chiudere la tastiera" "Accedi a numeri e simboli" @@ -87,4 +88,9 @@ "Chiusura tastiera"\n\n"Premi il tasto Indietro." "Tocca e tieni premuto un tasto per le opzioni"\n\n"Accesso a punteggiatura e accenti." "Impostazioni tastiera"\n\n"Tocca e tieni premuto il tasto ""?123""." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 6f590de5b..d5e7f8dc8 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "キー長押しでアクセント文字を表示(ø、öなど)" "戻るキーでキーボードを閉じます" "数字と記号" @@ -87,4 +88,9 @@ "キーボードを閉じる"\n\n"[戻る]キーを押します。" "キーを長押しして選択する"\n\n"句読点キーとアクセント文字を表示します。" "キーボードの設定"\n\n"[""?123""]キーを長押しします。" + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 0c3b970d0..570780f78 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "키를 길게 누르면 악센트(ø, ö 등)가 표시됩니다." "키보드를 닫으려면 언제든지 뒤로 키(↶)를 누르세요." "숫자 및 기호 액세스" @@ -83,12 +84,13 @@ "123" "ABC" "ALT" - - - - - - - - + "키보드 열기"\n\n"아무 텍스트 입력란이나 터치하세요." + "키보드 닫기"\n\n"\'뒤로\' 키를 누르세요." + "키를 길게 터치하여 옵션 보기"\n\n"문장 부호 및 악센트 기호에 액세스하세요." + "키보드 설정"\n\n"?123"" 키를 길게 터치하세요." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml index c5c828ef6..43951552e 100644 --- a/res/values-land/dimens.xml +++ b/res/values-land/dimens.xml @@ -20,4 +20,6 @@ 47dip + 38dip + 2dip \ No newline at end of file diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index fdaf0244a..bafc613f6 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -47,12 +47,9 @@ "Grunnleggende" "Avansert" - - - - - - + "0" + "1" + "2" @@ -66,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Hold en tast nede for å se aksenterte tegn (ø, ö, osv.)" "Trykk tilbakeknappen, ↶, for å lukke tastaturet" "Få tilgang til tall og symboler" @@ -87,7 +85,12 @@ "ABC" "ALT" "Åpne tastaturet"\n\n"Trykk på et tekstfelt." - "Lukk tastaturet"\n\n"Trykk tilbake-knappen." + "Lukke tastaturet"\n\n"Trykk på tilbaketasten." "Trykk og hold nede en tast for flere valg"\n\n"Få tilgang til skilletegn og aksenter." - "Tastaturinnstillinger"\n\n"Trykk og hold nede ""?123""-knappen." + "Innstillinger for tastatur"\n\n"Trykk på & hold ""?123""-tasten." + ".no" + ".com" + ".net" + ".org" + ".info" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index ab42128c2..427dcf75c 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Houd een toets ingedrukt om diakritische tekens weer te geven (ø, ö, enzovoort)" "Druk op elk gewenst moment op de toets Terug ↶ om het toetsenbord te sluiten" "Toegang tot cijfers en symbolen" @@ -87,4 +88,9 @@ "Het toetsenbord sluiten"\n\n"Druk op de terugtoets." "Een toets blijven aanraken voor opties"\n\n"Toegang tot interpunctie en diakritische tekens." "Toetsenbordinstellingen"\n\n"Blijf de toets ""?123"" aanraken." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index bc0f7039f..663932d38 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -63,6 +63,7 @@ "ń" "ć" "ýÿ" + "i" "Przytrzymaj klawisz, aby wyświetlić znaki akcentowane (ą, ó itp.)" "Naciśnij klawisz cofania ↶, aby zamknąć klawiaturę w dowolnym momencie" "Przejdź do cyfr i symboli" @@ -87,4 +88,9 @@ "Zamknij klawiaturę"\n\n"Naciśnij klawisz Wróć." "Dotknij klawisza i przytrzymaj go, aby wyświetlić opcje"\n\n"Dostęp do znaków przestankowych i akcentowanych." "Ustawienia klawiatury"\n\n"Dotknij klawisza ""?123"" i przytrzymaj go." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 2c09a18df..da89aeca9 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Mantenha uma tecla premida para ver os acentos (ø, ö, etc.)" "Prima a tecla de retrocesso ↶ para fechar o teclado a qualquer momento" "Aceder a números e símbolos" @@ -83,12 +84,13 @@ "123" "ABC" "ALT" - - - - - - - - + "Abra o teclado"\n\n"Toque em qualquer campo de texto." + "Feche o teclado"\n\n"Prima a tecla \"Anterior\"." + "Mantenha premida uma tecla para as opções"\n\n"Aceder a pontuação e acentos." + "Definições do teclado"\n\n"Mantenha premida a tecla ""?123""." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 159f3f3df..978215ff4 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -17,8 +17,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teclado Android" "Configurações de teclado Android" - "Vibrar ao pressionar a tecla" - "Som ao pressionar a tecla" + "Vibrar ao tocar a tecla" + "Som ao tocar a tecla" "Corrigir erros de digitação" "Ativar a correção de erro de entrada" "Erros de entrada de paisagem" @@ -31,7 +31,7 @@ "Conclusão automática" "Aumentar o tamanho do arquivo de texto" "Ocultar sugestões de palavra na visualização da paisagem" - "Capitalização automática" + "Capitaliz. automática" "Colocar em maiúscula o início de uma frase" "Pontuação automática" @@ -41,7 +41,7 @@ "Mostrar sugestões" "Exibir sugestões de palavras durante a digitação" "Conclusão automática" - "A barra de espaço e pontuação inserem automaticamente a palavra destacada" + "Barra de espaço e pontuação inserem a palavra destacada" "Nenhum" "Básico" @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Segure uma tecla pressionada para ver os acentos (ø, ö, etc.)" "Apertar a tecla voltar ↶ para fechar o teclado, em qualquer ponto" "Acessar números e símbolos" @@ -76,19 +77,20 @@ "Tocar e segurar esta tecla para alterar as configurações do teclado, como a conclusão automática" "Experimente!" "Ir" - "Próximo" + "Avançar" "Feito" "Enviar" "?123" "123" "ABC" "ALT" - - - - - - - - + "Abra o teclado"\n\n"Toque em qualquer campo de texto." + "Feche o teclado"\n\n"Pressione a tecla Voltar." + "Toque e mantenha pressionada uma tecla para ver as opções"\n\n"Acesse a pontuação e as pronúncias." + "Configurações de teclado"\n\n"Toque e mantenha pressionada a tecla ""?123""." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index eebe1771b..25c5d341f 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Удерживайте клавишу, чтобы увидеть варианты с диакритическими знаками (ø, ö и т.д.)" "Нажмите клавишу \"Назад\" ↶, чтобы закрыть клавиатуру в любой момент" "Открыть цифры и символы" @@ -83,12 +84,13 @@ "123" "АБВ" "ALT" - - - - - - - - + "Откройте клавиатуру"\n\n"Нажмите на любое текстовое поле." + "Закрытие клавиатуры"\n\n"Нажмите клавишу \"Назад\"." + "Нажмите и удерживайте клавишу для вызова параметров"\n\n"Доступ к пунктуационным и диакритическим знакам." + "Настройки клавиатуры"\n\n"Нажмите и удерживайте клавишу ""?123""." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 994d17189..38fdaf20b 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "Håll nere en tangent om du vill visa accenter (ø, ö, etc.)" "Tryck på Tillbaka ↶ om du vill stänga tangentbordet" "För siffror och symboler" @@ -83,12 +84,13 @@ "123" "ABC" "ALT" - - - - - - - - + "Öppna tangentbordet"\n\n"Tryck på ett textfält." + "Stäng tangentbordet"\n\n"Tryck på Tillbaka." + "Tryck länge på en tangent om du vill se alternativ"\n\n"Använda skiljetecken och accenter." + "Tangentbordsinställningar"\n\n"Tryck länge på tangenten ""?123""." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-tr/donottranslate.xml b/res/values-tr/donottranslate.xml new file mode 100644 index 000000000..f206e4c43 --- /dev/null +++ b/res/values-tr/donottranslate.xml @@ -0,0 +1,23 @@ + + + + + ğ + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 33b8b79d4..fe5ee893b 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -31,7 +31,7 @@ "Otomatik tamamlama" "Metin alanı boyutunu artır" "Yatay görünümde kelime önerilerini gizle" - "Ot. olarak büyük harf yap" + "Otomatik olarak büyük harf yap" "Cümlenin baş harfini büyük yap" "Otomatik noktalama" @@ -56,13 +56,14 @@ "%s : Kaydedildi" "àáâãäåæ" "èéêë" - "ıìíîï" + "iìíîï" "öòóôõœø" "üùúû" "ş§ß" "ñ" "ç" "ýÿ" + "i" "Vurguları görmek için bir tuşu basılı tutun (ø, ö, v.b.)" "Klavyeyi herhangi bir anda kapatmak için geri tuşuna ↶ basın" "Sayılara ve simgelere erişin" @@ -83,12 +84,13 @@ "123" "ABC" "ALT" - - - - - - - - + "Klavyeyi açın"\n\n"Herhangi bir metin alanına dokunun." + "Klavyeyi kapatın"\n\n"Geri tuşuna basın." + "Seçenekler için bir tuşa dokunun ve basılı tutun"\n\n"Noktalama ve vurgulama işaretlerine erişin." + "Klavye ayarları"\n\n"?123"" tuşuna dokunun ve basılı tutun." + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 720d30fae..c68b795c9 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -63,17 +63,18 @@ "ñ" "ç" "ýÿ" - "长按键可以查看重音符号(ø、ö 等)" + "i" + "长按某些键可看到重音符号(例如 ø、ö 等)" "随时可以通过按后退键 ↶ 关闭键盘" "访问数字和符号" - "按住最左侧的字词可以将其添加到字典中" + "长按最左侧的字可将其添加到词典中" "轻触此提示继续 »" "轻触此处可关闭该提示,然后便可开始输入内容!" "轻触文本字段即可打开键盘" - "轻触并按住某个键可以查看重音符号"\n"(?, ?, ?, ó 等)" + "长按某些键可看到重音符号"\n"(例如 ø、ö、ô、ó 等)" "轻触该键可切换到数字和符号输入模式" "再次轻触该键可返回字母输入模式" - "轻触并按住该键可以更改键盘设置,例如自动输入" + "长按该键可更改键盘设置,例如自动输入" "试试吧!" "开始" "下一步" @@ -83,12 +84,13 @@ "123" "ABC" "ALT" - - - - - - - - + "打开键盘"\n\n"轻触任意文本字段。" + "关闭键盘"\n\n"按“返回”键。" + "长按某些键可开启其他字符选项"\n\n"访问标点和重音符号。" + "键盘设置"\n\n"长按 ""?123"" 键。" + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 69d82cca3..8d93b311a 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -63,6 +63,7 @@ "ñ" "ç" "ýÿ" + "i" "按住按鍵可查看重音符號 (ø、ö 等)" "隨時可以透過按後退鍵 ↶ 關閉鍵盤" "使用數字和符號" @@ -87,4 +88,9 @@ "關閉鍵盤"\n\n"按下 Back 鍵。" \n"輕觸並按住按鍵開啟選項"\n"輸入標點與輕重音。" "鍵盤設定"\n\n"輕觸並按住 ""?123"" 鍵。" + ".com" + ".net" + ".org" + ".gov" + ".edu" diff --git a/res/values/bools.xml b/res/values/bools.xml index 06aa8f308..3a951b271 100644 --- a/res/values/bools.xml +++ b/res/values/bools.xml @@ -19,7 +19,7 @@ --> - false + true false diff --git a/res/values/dimens.xml b/res/values/dimens.xml index d757f096d..5b2095c0e 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -19,6 +19,8 @@ --> - 50dip + 54dip 22dip + 42dip + 4dip \ No newline at end of file diff --git a/res/values/donottranslate.xml b/res/values/donottranslate.xml index d9649f3b1..c6941949e 100644 --- a/res/values/donottranslate.xml +++ b/res/values/donottranslate.xml @@ -32,4 +32,6 @@ + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 2cd996c2e..ec9a8b731 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -125,7 +125,10 @@ ç ýÿ - + + + i + Hold a key down to see accents (ø, ö, etc.) @@ -191,4 +194,15 @@ Keyboard settings\n\nTouch \u0026 hold the \?123\ key. + + + ".com" + + ".net" + + ".org" + + ".gov" + + ".edu" diff --git a/res/xml-de/kbd_qwerty.xml b/res/xml-de/kbd_qwerty.xml index 763492db5..56113e217 100755 --- a/res/xml-de/kbd_qwerty.xml +++ b/res/xml-de/kbd_qwerty.xml @@ -69,7 +69,7 @@ - @@ -89,43 +89,44 @@ android:popupCharacters="@string/alternates_for_n" /> - - - - + + android:keyWidth="40%p" android:isRepeatable="true"/> - + - - - - - @@ -133,35 +134,37 @@ - + - - - - - + + android:keyWidth="40%p" android:isRepeatable="true"/> + android:keyWidth="10%p"/> - \ No newline at end of file diff --git a/res/xml-fr/kbd_qwerty.xml b/res/xml-fr/kbd_qwerty.xml index 573f08a3b..d47042ea7 100644 --- a/res/xml-fr/kbd_qwerty.xml +++ b/res/xml-fr/kbd_qwerty.xml @@ -102,12 +102,12 @@ android:popupKeyboard="@xml/kbd_popup_template" android:popupCharacters="" android:keyWidth="20%p" android:keyEdgeFlags="left"/> - + + android:keyWidth="40%p" android:isRepeatable="true"/> + android:keyWidth="10%p"/> @@ -118,7 +118,8 @@ android:popupKeyboard="@xml/kbd_popup_template" android:popupCharacters="" android:keyWidth="20%p" android:keyEdgeFlags="left"/> - @@ -137,29 +138,32 @@ android:popupKeyboard="@xml/kbd_popup_template" android:popupCharacters="" android:keyWidth="20%p" android:keyEdgeFlags="left"/> - + - - - - - + - + android:keyWidth="40%p" android:isRepeatable="true"/> + diff --git a/res/xml/kbd_phone.xml b/res/xml/kbd_phone.xml index 880d9613a..d2bcdac52 100755 --- a/res/xml/kbd_phone.xml +++ b/res/xml/kbd_phone.xml @@ -51,7 +51,7 @@ diff --git a/res/xml/kbd_phone_symbols.xml b/res/xml/kbd_phone_symbols.xml index 9ce7a1a1f..9604664fa 100755 --- a/res/xml/kbd_phone_symbols.xml +++ b/res/xml/kbd_phone_symbols.xml @@ -44,8 +44,8 @@ - - + + - @@ -70,7 +70,10 @@ android:popupKeyboard="@xml/kbd_popup_template" android:popupCharacters="@string/alternates_for_d"/> - + + /> @@ -100,8 +103,8 @@ android:popupCharacters="@string/alternates_for_n" /> - @@ -109,69 +112,73 @@ - - + + android:keyWidth="40%p" android:isRepeatable="true"/> - + - - - - - - - - + - - - - - + + android:keyWidth="40%p" android:isRepeatable="true"/> + android:keyWidth="10%p"/> - \ No newline at end of file + diff --git a/res/xml/kbd_symbols.xml b/res/xml/kbd_symbols.xml index 2a150397b..f3b8833dc 100755 --- a/res/xml/kbd_symbols.xml +++ b/res/xml/kbd_symbols.xml @@ -94,10 +94,10 @@ - - @@ -119,18 +119,19 @@ - - - - + diff --git a/res/xml/kbd_symbols_shift.xml b/res/xml/kbd_symbols_shift.xml index 6a472a412..56428a3ad 100755 --- a/res/xml/kbd_symbols_shift.xml +++ b/res/xml/kbd_symbols_shift.xml @@ -55,7 +55,7 @@ - @@ -79,14 +79,16 @@ - - + - - + diff --git a/res/xml/popup_domains.xml b/res/xml/popup_domains.xml index 5c86386d5..b733fe24f 100644 --- a/res/xml/popup_domains.xml +++ b/res/xml/popup_domains.xml @@ -26,9 +26,13 @@ > - - - - + + + + diff --git a/res/xml/popup_punctuation.xml b/res/xml/popup_punctuation.xml index 9d4575db6..7f9f61129 100644 --- a/res/xml/popup_punctuation.xml +++ b/res/xml/popup_punctuation.xml @@ -25,7 +25,16 @@ android:keyHeight="@dimen/key_height" > - + + + + + + + + + + diff --git a/src/com/android/inputmethod/latin/BinaryDictionary.java b/src/com/android/inputmethod/latin/BinaryDictionary.java index bb4f1ba46..e7470a8fc 100644 --- a/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -32,6 +32,7 @@ public class BinaryDictionary extends Dictionary { private static final int MAX_WORDS = 16; private static final int TYPED_LETTER_MULTIPLIER = 2; + private static final boolean ENABLE_MISSED_CHARACTERS = true; private int mNativeDict; private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES]; @@ -64,9 +65,7 @@ public class BinaryDictionary extends Dictionary { private native boolean isValidWordNative(int nativeData, char[] word, int wordLength); private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize, char[] outputChars, int[] frequencies, - int maxWordLength, int maxWords, int maxAlternatives); - private native void setParamsNative(int typedLetterMultiplier, - int fullWordMultiplier); + int maxWordLength, int maxWords, int maxAlternatives, int skipPos); private final void loadDictionary(Context context, int resId) { AssetManager am = context.getResources().getAssets(); @@ -88,9 +87,25 @@ public class BinaryDictionary extends Dictionary { Math.min(alternatives.length, MAX_ALTERNATIVES)); } Arrays.fill(mOutputChars, (char) 0); + Arrays.fill(mFrequencies, 0); - int count = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, mOutputChars, mFrequencies, - MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES); + int count = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, + mOutputChars, mFrequencies, + MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES, -1); + + // If there aren't sufficient suggestions, search for words by allowing wild cards at + // the different character positions. This feature is not ready for prime-time as we need + // to figure out the best ranking for such words compared to proximity corrections and + // completions. + if (ENABLE_MISSED_CHARACTERS && count < 5) { + for (int skip = 0; skip < codesSize; skip++) { + int tempCount = getSuggestionsNative(mNativeDict, mInputCodes, codesSize, + mOutputChars, mFrequencies, + MAX_WORD_LENGTH, MAX_WORDS, MAX_ALTERNATIVES, skip); + count = Math.max(count, tempCount); + if (tempCount > 0) break; + } + } for (int j = 0; j < count; j++) { if (mFrequencies[j] < 1) break; @@ -111,7 +126,7 @@ public class BinaryDictionary extends Dictionary { char[] chars = word.toString().toLowerCase().toCharArray(); return isValidWordNative(mNativeDict, chars, chars.length); } - + public synchronized void close() { if (mNativeDict != 0) { closeNative(mNativeDict); diff --git a/src/com/android/inputmethod/latin/ContactsDictionary.java b/src/com/android/inputmethod/latin/ContactsDictionary.java new file mode 100644 index 000000000..6f7f4b6a4 --- /dev/null +++ b/src/com/android/inputmethod/latin/ContactsDictionary.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2009 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 android.content.ContentResolver; +import android.content.Context; +import android.database.ContentObserver; +import android.database.Cursor; +import android.provider.ContactsContract.Contacts; + +public class ContactsDictionary extends ExpandableDictionary { + + private static final String[] PROJECTION = { + Contacts._ID, + Contacts.DISPLAY_NAME, + }; + + private static final int INDEX_NAME = 1; + + private ContentObserver mObserver; + + private boolean mRequiresReload; + + private long mLastLoadedContacts; + + public ContactsDictionary(Context context) { + super(context); + // Perform a managed query. The Activity will handle closing and requerying the cursor + // when needed. + ContentResolver cres = context.getContentResolver(); + + cres.registerContentObserver(Contacts.CONTENT_URI, true, mObserver = new ContentObserver(null) { + @Override + public void onChange(boolean self) { + mRequiresReload = true; + } + }); + + loadDictionary(); + } + + public synchronized void close() { + if (mObserver != null) { + getContext().getContentResolver().unregisterContentObserver(mObserver); + mObserver = null; + } + } + + private synchronized void loadDictionary() { + long now = android.os.SystemClock.uptimeMillis(); + if (mLastLoadedContacts == 0 + || now - mLastLoadedContacts > 30 * 60 * 1000 /* 30 minutes */) { + Cursor cursor = getContext().getContentResolver() + .query(Contacts.CONTENT_URI, PROJECTION, null, null, null); + if (cursor != null) { + addWords(cursor); + } + mRequiresReload = false; + mLastLoadedContacts = now; + } + } + + @Override + public synchronized void getWords(final WordComposer codes, final WordCallback callback) { + if (mRequiresReload) loadDictionary(); + super.getWords(codes, callback); + } + + @Override + public synchronized boolean isValidWord(CharSequence word) { + if (mRequiresReload) loadDictionary(); + return super.isValidWord(word); + } + + private void addWords(Cursor cursor) { + clearDictionary(); + + final int maxWordLength = getMaxWordLength(); + if (cursor.moveToFirst()) { + while (!cursor.isAfterLast()) { + String name = cursor.getString(INDEX_NAME); + + if (name != null) { + int len = name.length(); + + // TODO: Better tokenization for non-Latin writing systems + for (int i = 0; i < len; i++) { + if (Character.isLetter(name.charAt(i))) { + int j; + for (j = i + 1; j < len; j++) { + char c = name.charAt(j); + + if (!(c == '-' || c == '\'' || + Character.isLetter(c))) { + break; + } + } + + String word = name.substring(i, j); + i = j - 1; + + // Safeguard against adding really long words. Stack + // may overflow due to recursion + if (word.length() < maxWordLength) { + super.addWord(word, 128); + } + } + } + } + + cursor.moveToNext(); + } + } + cursor.close(); + } +} diff --git a/src/com/android/inputmethod/latin/ExpandableDictionary.java b/src/com/android/inputmethod/latin/ExpandableDictionary.java new file mode 100644 index 000000000..a136ee7f4 --- /dev/null +++ b/src/com/android/inputmethod/latin/ExpandableDictionary.java @@ -0,0 +1,457 @@ +/* + * Copyright (C) 2009 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 android.content.Context; + +/** + * Base class for an in-memory dictionary that can grow dynamically and can + * be searched for suggestions and valid words. + */ +public class ExpandableDictionary extends Dictionary { + private Context mContext; + private char[] mWordBuilder = new char[MAX_WORD_LENGTH]; + private int mMaxDepth; + private int mInputLength; + + public static final int MAX_WORD_LENGTH = 32; + private static final char QUOTE = '\''; + + static class Node { + char code; + int frequency; + boolean terminal; + NodeArray children; + } + + static class NodeArray { + Node[] data; + int length = 0; + private static final int INCREMENT = 2; + + NodeArray() { + data = new Node[INCREMENT]; + } + + void add(Node n) { + if (length + 1 > data.length) { + Node[] tempData = new Node[length + INCREMENT]; + if (length > 0) { + System.arraycopy(data, 0, tempData, 0, length); + } + data = tempData; + } + data[length++] = n; + } + } + + private NodeArray mRoots; + + private int[][] mCodes; + + ExpandableDictionary(Context context) { + mContext = context; + clearDictionary(); + mCodes = new int[MAX_WORD_LENGTH][]; + } + + Context getContext() { + return mContext; + } + + int getMaxWordLength() { + return MAX_WORD_LENGTH; + } + + public void addWord(String word, int frequency) { + addWordRec(mRoots, word, 0, frequency); + } + + private void addWordRec(NodeArray children, final String word, + final int depth, final int frequency) { + + final int wordLength = word.length(); + final char c = word.charAt(depth); + // Does children have the current character? + final int childrenLength = children.length; + Node childNode = null; + boolean found = false; + for (int i = 0; i < childrenLength; i++) { + childNode = children.data[i]; + if (childNode.code == c) { + found = true; + break; + } + } + if (!found) { + childNode = new Node(); + childNode.code = c; + children.add(childNode); + } + if (wordLength == depth + 1) { + // Terminate this word + childNode.terminal = true; + childNode.frequency += frequency; // If there are multiple similar words + if (childNode.frequency > 256) childNode.frequency = 256; + return; + } + if (childNode.children == null) { + childNode.children = new NodeArray(); + } + addWordRec(childNode.children, word, depth + 1, frequency); + } + + @Override + public void getWords(final WordComposer codes, final WordCallback callback) { + mInputLength = codes.size(); + if (mCodes.length < mInputLength) mCodes = new int[mInputLength][]; + // Cache the codes so that we don't have to lookup an array list + for (int i = 0; i < mInputLength; i++) { + mCodes[i] = codes.getCodesAt(i); + } + mMaxDepth = mInputLength * 3; + getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1, 0, -1, callback); + for (int i = 0; i < mInputLength; i++) { + getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1, 0, i, callback); + } + } + + @Override + public synchronized boolean isValidWord(CharSequence word) { + final int freq = getWordFrequencyRec(mRoots, word, 0, word.length()); + return freq > -1; + } + + /** + * Returns the word's frequency or -1 if not found + */ + public int getWordFrequency(CharSequence word) { + return getWordFrequencyRec(mRoots, word, 0, word.length()); + } + + /** + * Returns the word's frequency or -1 if not found + */ + private int getWordFrequencyRec(final NodeArray children, final CharSequence word, + final int offset, final int length) { + final int count = children.length; + char currentChar = word.charAt(offset); + for (int j = 0; j < count; j++) { + final Node node = children.data[j]; + if (node.code == currentChar) { + if (offset == length - 1) { + if (node.terminal) { + return node.frequency; + } + } else { + if (node.children != null) { + int freq = getWordFrequencyRec(node.children, word, offset + 1, length); + if (freq > -1) return freq; + } + } + } + } + return -1; + } + + /** + * Recursively traverse the tree for words that match the input. Input consists of + * a list of arrays. Each item in the list is one input character position. An input + * character is actually an array of multiple possible candidates. This function is not + * optimized for speed, assuming that the user dictionary will only be a few hundred words in + * size. + * @param roots node whose children have to be search for matches + * @param codes the input character codes + * @param word the word being composed as a possible match + * @param depth the depth of traversal - the length of the word being composed thus far + * @param completion whether the traversal is now in completion mode - meaning that we've + * exhausted the input and we're looking for all possible suffixes. + * @param snr current weight of the word being formed + * @param inputIndex position in the input characters. This can be off from the depth in + * case we skip over some punctuations such as apostrophe in the traversal. That is, if you type + * "wouldve", it could be matching "would've", so the depth will be one more than the + * inputIndex + * @param callback the callback class for adding a word + */ + protected void getWordsRec(NodeArray roots, final WordComposer codes, final char[] word, + final int depth, boolean completion, int snr, int inputIndex, int skipPos, + WordCallback callback) { + final int count = roots.length; + final int codeSize = mInputLength; + // Optimization: Prune out words that are too long compared to how much was typed. + if (depth > mMaxDepth) { + return; + } + int[] currentChars = null; + if (codeSize <= inputIndex) { + completion = true; + } else { + currentChars = mCodes[inputIndex]; + } + + for (int i = 0; i < count; i++) { + final Node node = roots.data[i]; + final char c = node.code; + final char lowerC = toLowerCase(c); + final boolean terminal = node.terminal; + final NodeArray children = node.children; + final int freq = node.frequency; + if (completion) { + word[depth] = c; + if (terminal) { + if (!callback.addWord(word, 0, depth + 1, freq * snr)) { + return; + } + } + if (children != null) { + getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, + skipPos, callback); + } + } else if ((c == QUOTE && currentChars[0] != QUOTE) || depth == skipPos) { + // Skip the ' and continue deeper + word[depth] = c; + if (children != null) { + getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, + skipPos, callback); + } + } else { + // Don't use alternatives if we're looking for missing characters + final int alternativesSize = skipPos >= 0? 1 : currentChars.length; + for (int j = 0; j < alternativesSize; j++) { + final int addedAttenuation = (j > 0 ? 1 : 2); + final int currentChar = currentChars[j]; + if (currentChar == -1) { + break; + } + if (currentChar == lowerC || currentChar == c) { + word[depth] = c; + + if (codeSize == depth + 1) { + if (terminal) { + if (INCLUDE_TYPED_WORD_IF_VALID + || !same(word, depth + 1, codes.getTypedWord())) { + int finalFreq = freq * snr * addedAttenuation; + if (skipPos < 0) finalFreq *= FULL_WORD_FREQ_MULTIPLIER; + callback.addWord(word, 0, depth + 1, finalFreq); + } + } + if (children != null) { + getWordsRec(children, codes, word, depth + 1, + true, snr * addedAttenuation, inputIndex + 1, + skipPos, callback); + } + } else if (children != null) { + getWordsRec(children, codes, word, depth + 1, + false, snr * addedAttenuation, inputIndex + 1, + skipPos, callback); + } + } + } + } + } + } + + protected void clearDictionary() { + mRoots = new NodeArray(); + } + + static char toLowerCase(char c) { + if (c < BASE_CHARS.length) { + c = BASE_CHARS[c]; + } + if (c >= 'A' && c <= 'Z') { + c = (char) (c | 32); + } else if (c > 127) { + c = Character.toLowerCase(c); + } + return c; + } + + /** + * Table mapping most combined Latin, Greek, and Cyrillic characters + * to their base characters. If c is in range, BASE_CHARS[c] == c + * if c is not a combined character, or the base character if it + * is combined. + */ + static final char BASE_CHARS[] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x0020, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x0020, 0x00a9, 0x0061, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0020, + 0x00b0, 0x00b1, 0x0032, 0x0033, 0x0020, 0x03bc, 0x00b6, 0x00b7, + 0x0020, 0x0031, 0x006f, 0x00bb, 0x0031, 0x0031, 0x0033, 0x00bf, + 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x00c6, 0x0043, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0049, 0x0049, 0x0049, 0x0049, + 0x00d0, 0x004e, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x00d7, + 0x004f, 0x0055, 0x0055, 0x0055, 0x0055, 0x0059, 0x00de, 0x0073, // Manually changed d8 to 4f + // Manually changed df to 73 + 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x00e6, 0x0063, + 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0069, 0x0069, 0x0069, + 0x00f0, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00f7, + 0x006f, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x00fe, 0x0079, // Manually changed f8 to 6f + 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0043, 0x0063, + 0x0043, 0x0063, 0x0043, 0x0063, 0x0043, 0x0063, 0x0044, 0x0064, + 0x0110, 0x0111, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, + 0x0045, 0x0065, 0x0045, 0x0065, 0x0047, 0x0067, 0x0047, 0x0067, + 0x0047, 0x0067, 0x0047, 0x0067, 0x0048, 0x0068, 0x0126, 0x0127, + 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, + 0x0049, 0x0131, 0x0049, 0x0069, 0x004a, 0x006a, 0x004b, 0x006b, + 0x0138, 0x004c, 0x006c, 0x004c, 0x006c, 0x004c, 0x006c, 0x004c, + 0x006c, 0x0141, 0x0142, 0x004e, 0x006e, 0x004e, 0x006e, 0x004e, + 0x006e, 0x02bc, 0x014a, 0x014b, 0x004f, 0x006f, 0x004f, 0x006f, + 0x004f, 0x006f, 0x0152, 0x0153, 0x0052, 0x0072, 0x0052, 0x0072, + 0x0052, 0x0072, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, + 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0166, 0x0167, + 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, + 0x0055, 0x0075, 0x0055, 0x0075, 0x0057, 0x0077, 0x0059, 0x0079, + 0x0059, 0x005a, 0x007a, 0x005a, 0x007a, 0x005a, 0x007a, 0x0073, + 0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, + 0x0188, 0x0189, 0x018a, 0x018b, 0x018c, 0x018d, 0x018e, 0x018f, + 0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, + 0x0198, 0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019e, 0x019f, + 0x004f, 0x006f, 0x01a2, 0x01a3, 0x01a4, 0x01a5, 0x01a6, 0x01a7, + 0x01a8, 0x01a9, 0x01aa, 0x01ab, 0x01ac, 0x01ad, 0x01ae, 0x0055, + 0x0075, 0x01b1, 0x01b2, 0x01b3, 0x01b4, 0x01b5, 0x01b6, 0x01b7, + 0x01b8, 0x01b9, 0x01ba, 0x01bb, 0x01bc, 0x01bd, 0x01be, 0x01bf, + 0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x0044, 0x0044, 0x0064, 0x004c, + 0x004c, 0x006c, 0x004e, 0x004e, 0x006e, 0x0041, 0x0061, 0x0049, + 0x0069, 0x004f, 0x006f, 0x0055, 0x0075, 0x00dc, 0x00fc, 0x00dc, + 0x00fc, 0x00dc, 0x00fc, 0x00dc, 0x00fc, 0x01dd, 0x00c4, 0x00e4, + 0x0226, 0x0227, 0x00c6, 0x00e6, 0x01e4, 0x01e5, 0x0047, 0x0067, + 0x004b, 0x006b, 0x004f, 0x006f, 0x01ea, 0x01eb, 0x01b7, 0x0292, + 0x006a, 0x0044, 0x0044, 0x0064, 0x0047, 0x0067, 0x01f6, 0x01f7, + 0x004e, 0x006e, 0x00c5, 0x00e5, 0x00c6, 0x00e6, 0x00d8, 0x00f8, + 0x0041, 0x0061, 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, + 0x0049, 0x0069, 0x0049, 0x0069, 0x004f, 0x006f, 0x004f, 0x006f, + 0x0052, 0x0072, 0x0052, 0x0072, 0x0055, 0x0075, 0x0055, 0x0075, + 0x0053, 0x0073, 0x0054, 0x0074, 0x021c, 0x021d, 0x0048, 0x0068, + 0x0220, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0041, 0x0061, + 0x0045, 0x0065, 0x00d6, 0x00f6, 0x00d5, 0x00f5, 0x004f, 0x006f, + 0x022e, 0x022f, 0x0059, 0x0079, 0x0234, 0x0235, 0x0236, 0x0237, + 0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023d, 0x023e, 0x023f, + 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, + 0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, 0x024f, + 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, + 0x0258, 0x0259, 0x025a, 0x025b, 0x025c, 0x025d, 0x025e, 0x025f, + 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267, + 0x0268, 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e, 0x026f, + 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, + 0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x027d, 0x027e, 0x027f, + 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, + 0x0288, 0x0289, 0x028a, 0x028b, 0x028c, 0x028d, 0x028e, 0x028f, + 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, + 0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f, + 0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7, + 0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af, + 0x0068, 0x0266, 0x006a, 0x0072, 0x0279, 0x027b, 0x0281, 0x0077, + 0x0079, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf, + 0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7, + 0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf, + 0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x02de, 0x02df, + 0x0263, 0x006c, 0x0073, 0x0078, 0x0295, 0x02e5, 0x02e6, 0x02e7, + 0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef, + 0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7, + 0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff, + 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, + 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f, + 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, + 0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f, + 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, + 0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f, + 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, + 0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f, + 0x0300, 0x0301, 0x0342, 0x0313, 0x0308, 0x0345, 0x0346, 0x0347, + 0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f, + 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, + 0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f, + 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, + 0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f, + 0x0370, 0x0371, 0x0372, 0x0373, 0x02b9, 0x0375, 0x0376, 0x0377, + 0x0378, 0x0379, 0x0020, 0x037b, 0x037c, 0x037d, 0x003b, 0x037f, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0020, 0x00a8, 0x0391, 0x00b7, + 0x0395, 0x0397, 0x0399, 0x038b, 0x039f, 0x038d, 0x03a5, 0x03a9, + 0x03ca, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, + 0x03a8, 0x03a9, 0x0399, 0x03a5, 0x03b1, 0x03b5, 0x03b7, 0x03b9, + 0x03cb, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, + 0x03c8, 0x03c9, 0x03b9, 0x03c5, 0x03bf, 0x03c5, 0x03c9, 0x03cf, + 0x03b2, 0x03b8, 0x03a5, 0x03d2, 0x03d2, 0x03c6, 0x03c0, 0x03d7, + 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df, + 0x03e0, 0x03e1, 0x03e2, 0x03e3, 0x03e4, 0x03e5, 0x03e6, 0x03e7, + 0x03e8, 0x03e9, 0x03ea, 0x03eb, 0x03ec, 0x03ed, 0x03ee, 0x03ef, + 0x03ba, 0x03c1, 0x03c2, 0x03f3, 0x0398, 0x03b5, 0x03f6, 0x03f7, + 0x03f8, 0x03a3, 0x03fa, 0x03fb, 0x03fc, 0x03fd, 0x03fe, 0x03ff, + 0x0415, 0x0415, 0x0402, 0x0413, 0x0404, 0x0405, 0x0406, 0x0406, + 0x0408, 0x0409, 0x040a, 0x040b, 0x041a, 0x0418, 0x0423, 0x040f, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0418, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0438, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + 0x0435, 0x0435, 0x0452, 0x0433, 0x0454, 0x0455, 0x0456, 0x0456, + 0x0458, 0x0459, 0x045a, 0x045b, 0x043a, 0x0438, 0x0443, 0x045f, + 0x0460, 0x0461, 0x0462, 0x0463, 0x0464, 0x0465, 0x0466, 0x0467, + 0x0468, 0x0469, 0x046a, 0x046b, 0x046c, 0x046d, 0x046e, 0x046f, + 0x0470, 0x0471, 0x0472, 0x0473, 0x0474, 0x0475, 0x0474, 0x0475, + 0x0478, 0x0479, 0x047a, 0x047b, 0x047c, 0x047d, 0x047e, 0x047f, + 0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, + 0x0488, 0x0489, 0x048a, 0x048b, 0x048c, 0x048d, 0x048e, 0x048f, + 0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497, + 0x0498, 0x0499, 0x049a, 0x049b, 0x049c, 0x049d, 0x049e, 0x049f, + 0x04a0, 0x04a1, 0x04a2, 0x04a3, 0x04a4, 0x04a5, 0x04a6, 0x04a7, + 0x04a8, 0x04a9, 0x04aa, 0x04ab, 0x04ac, 0x04ad, 0x04ae, 0x04af, + 0x04b0, 0x04b1, 0x04b2, 0x04b3, 0x04b4, 0x04b5, 0x04b6, 0x04b7, + 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc, 0x04bd, 0x04be, 0x04bf, + 0x04c0, 0x0416, 0x0436, 0x04c3, 0x04c4, 0x04c5, 0x04c6, 0x04c7, + 0x04c8, 0x04c9, 0x04ca, 0x04cb, 0x04cc, 0x04cd, 0x04ce, 0x04cf, + 0x0410, 0x0430, 0x0410, 0x0430, 0x04d4, 0x04d5, 0x0415, 0x0435, + 0x04d8, 0x04d9, 0x04d8, 0x04d9, 0x0416, 0x0436, 0x0417, 0x0437, + 0x04e0, 0x04e1, 0x0418, 0x0438, 0x0418, 0x0438, 0x041e, 0x043e, + 0x04e8, 0x04e9, 0x04e8, 0x04e9, 0x042d, 0x044d, 0x0423, 0x0443, + 0x0423, 0x0443, 0x0423, 0x0443, 0x0427, 0x0447, 0x04f6, 0x04f7, + 0x042b, 0x044b, 0x04fa, 0x04fb, 0x04fc, 0x04fd, 0x04fe, 0x04ff, + }; + + // generated with: + // cat UnicodeData.txt | perl -e 'while (<>) { @foo = split(/;/); $foo[5] =~ s/<.*> //; $base[hex($foo[0])] = hex($foo[5]);} for ($i = 0; $i < 0x500; $i += 8) { for ($j = $i; $j < $i + 8; $j++) { printf("0x%04x, ", $base[$j] ? $base[$j] : $j)}; print "\n"; }' + +} diff --git a/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 92b7cd4a1..c82587b71 100644 --- a/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -37,6 +37,10 @@ public class KeyboardSwitcher { public static final int KEYBOARDMODE_EMAIL = R.id.mode_email; public static final int KEYBOARDMODE_IM = R.id.mode_im; + private static final int SYMBOLS_MODE_STATE_NONE = 0; + private static final int SYMBOLS_MODE_STATE_BEGIN = 1; + private static final int SYMBOLS_MODE_STATE_SYMBOL = 2; + LatinKeyboardView mInputView; LatinIME mContext; @@ -50,6 +54,8 @@ public class KeyboardSwitcher { private int mImeOptions; private int mTextMode = MODE_TEXT_QWERTY; private boolean mIsSymbols; + private boolean mPreferSymbols; + private int mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; private int mLastDisplayWidth; @@ -64,14 +70,15 @@ public class KeyboardSwitcher { mInputView = inputView; } - void makeKeyboards() { + void makeKeyboards(boolean forceCreate) { + if (forceCreate) mKeyboards.clear(); // Configuration change is coming after the keyboard gets recreated. So don't rely on that. // If keyboards have already been made, check if we have a screen width change and // create the keyboard layouts again at the correct orientation int displayWidth = mContext.getMaxWidth(); if (displayWidth == mLastDisplayWidth) return; mLastDisplayWidth = displayWidth; - mKeyboards.clear(); + if (!forceCreate) mKeyboards.clear(); mSymbolsId = new KeyboardId(R.xml.kbd_symbols); mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift); } @@ -109,7 +116,10 @@ public class KeyboardSwitcher { } void setKeyboardMode(int mode, int imeOptions) { - setKeyboardMode(mode, imeOptions, false); + mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; + mPreferSymbols = mode == MODE_SYMBOLS; + setKeyboardMode(mode == MODE_SYMBOLS ? MODE_TEXT : mode, imeOptions, + mPreferSymbols); } void setKeyboardMode(int mode, int imeOptions, boolean isSymbols) { @@ -228,5 +238,30 @@ public class KeyboardSwitcher { void toggleSymbols() { setKeyboardMode(mMode, mImeOptions, !mIsSymbols); + if (mIsSymbols && !mPreferSymbols) { + mSymbolsModeState = SYMBOLS_MODE_STATE_BEGIN; + } else { + mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; + } + } + + /** + * Updates state machine to figure out when to automatically switch back to alpha mode. + * Returns true if the keyboard needs to switch back + */ + boolean onKey(int key) { + // Switch back to alpha mode if user types one or more non-space/enter characters + // followed by a space/enter + switch (mSymbolsModeState) { + case SYMBOLS_MODE_STATE_BEGIN: + if (key != LatinIME.KEYCODE_SPACE && key != LatinIME.KEYCODE_ENTER && key > 0) { + mSymbolsModeState = SYMBOLS_MODE_STATE_SYMBOL; + } + break; + case SYMBOLS_MODE_STATE_SYMBOL: + if (key == LatinIME.KEYCODE_ENTER || key == LatinIME.KEYCODE_SPACE) return true; + break; + } + return false; } } diff --git a/src/com/android/inputmethod/latin/LatinIME.java b/src/com/android/inputmethod/latin/LatinIME.java index 240668ebb..8b76dbd39 100644 --- a/src/com/android/inputmethod/latin/LatinIME.java +++ b/src/com/android/inputmethod/latin/LatinIME.java @@ -71,14 +71,22 @@ public class LatinIME extends InputMethodService private static final int MSG_UPDATE_SUGGESTIONS = 0; private static final int MSG_START_TUTORIAL = 1; + private static final int MSG_UPDATE_SHIFT_STATE = 2; // How many continuous deletes at which to start deleting at a higher speed. private static final int DELETE_ACCELERATE_AT = 20; // Key events coming any faster than this are long-presses. - private static final int QUICK_PRESS = 200; + private static final int QUICK_PRESS = 200; + // Weight added to a user picking a new word from the suggestion strip + static final int FREQUENCY_FOR_PICKED = 3; + // Weight added to a user typing a new word that doesn't get corrected (or is reverted) + static final int FREQUENCY_FOR_TYPED = 1; + // A word that is frequently typed and get's promoted to the user dictionary, uses this + // frequency. + static final int FREQUENCY_FOR_AUTO_ADD = 250; - private static final int KEYCODE_ENTER = 10; - private static final int KEYCODE_SPACE = ' '; + static final int KEYCODE_ENTER = '\n'; + static final int KEYCODE_SPACE = ' '; // Contextual menu positions private static final int POS_SETTINGS = 0; @@ -95,6 +103,8 @@ public class LatinIME extends InputMethodService KeyboardSwitcher mKeyboardSwitcher; private UserDictionary mUserDictionary; + private ContactsDictionary mContactsDictionary; + private ExpandableDictionary mAutoDictionary; private String mLocale; @@ -114,6 +124,8 @@ public class LatinIME extends InputMethodService private boolean mQuickFixes; private boolean mShowSuggestions; private int mCorrectionMode; + private int mOrientation; + // Indicates whether the suggestion strip is to be on in landscape private boolean mJustAccepted; private CharSequence mJustRevertedSeparator; @@ -126,7 +138,8 @@ public class LatinIME extends InputMethodService private long mVibrateDuration; private AudioManager mAudioManager; - private final float FX_VOLUME = 1.0f; + // Align sound effect volume on music volume + private final float FX_VOLUME = -1.0f; private boolean mSilentMode; private String mWordSeparators; @@ -150,6 +163,9 @@ public class LatinIME extends InputMethodService } } break; + case MSG_UPDATE_SHIFT_STATE: + updateShiftKeyState(getCurrentInputEditorInfo()); + break; } } }; @@ -158,10 +174,12 @@ public class LatinIME extends InputMethodService super.onCreate(); //setStatusIcon(R.drawable.ime_qwerty); mKeyboardSwitcher = new KeyboardSwitcher(this); - initSuggest(getResources().getConfiguration().locale.toString()); - + final Configuration conf = getResources().getConfiguration(); + initSuggest(conf.locale.toString()); + mOrientation = conf.orientation; + mVibrateDuration = getResources().getInteger(R.integer.vibrate_duration_ms); - + // register to receive ringer mode changes for silent mode IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); registerReceiver(mReceiver, filter); @@ -172,13 +190,18 @@ public class LatinIME extends InputMethodService mSuggest = new Suggest(this, R.raw.main); mSuggest.setCorrectionMode(mCorrectionMode); mUserDictionary = new UserDictionary(this); + mContactsDictionary = new ContactsDictionary(this); + mAutoDictionary = new AutoDictionary(this); mSuggest.setUserDictionary(mUserDictionary); + mSuggest.setContactsDictionary(mContactsDictionary); + mSuggest.setAutoDictionary(mAutoDictionary); mWordSeparators = getResources().getString(R.string.word_separators); mSentenceSeparators = getResources().getString(R.string.sentence_separators); } @Override public void onDestroy() { mUserDictionary.close(); + mContactsDictionary.close(); unregisterReceiver(mReceiver); super.onDestroy(); } @@ -188,15 +211,24 @@ public class LatinIME extends InputMethodService if (!TextUtils.equals(conf.locale.toString(), mLocale)) { initSuggest(conf.locale.toString()); } + // If orientation changed while predicting, commit the change + if (conf.orientation != mOrientation) { + commitTyped(getCurrentInputConnection()); + mOrientation = conf.orientation; + } + if (mKeyboardSwitcher == null) { + mKeyboardSwitcher = new KeyboardSwitcher(this); + } + mKeyboardSwitcher.makeKeyboards(true); super.onConfigurationChanged(conf); } - + @Override public View onCreateInputView() { mInputView = (LatinKeyboardView) getLayoutInflater().inflate( R.layout.input, null); mKeyboardSwitcher.setInputView(mInputView); - mKeyboardSwitcher.makeKeyboards(); + mKeyboardSwitcher.makeKeyboards(true); mInputView.setOnKeyboardActionListener(this); mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, 0); return mInputView; @@ -204,7 +236,7 @@ public class LatinIME extends InputMethodService @Override public View onCreateCandidatesView() { - mKeyboardSwitcher.makeKeyboards(); + mKeyboardSwitcher.makeKeyboards(true); mCandidateViewContainer = (CandidateViewContainer) getLayoutInflater().inflate( R.layout.candidates, null); mCandidateViewContainer.initViews(); @@ -221,7 +253,7 @@ public class LatinIME extends InputMethodService return; } - mKeyboardSwitcher.makeKeyboards(); + mKeyboardSwitcher.makeKeyboards(false); TextEntryState.newSession(this); @@ -233,9 +265,8 @@ public class LatinIME extends InputMethodService switch (attribute.inputType&EditorInfo.TYPE_MASK_CLASS) { case EditorInfo.TYPE_CLASS_NUMBER: case EditorInfo.TYPE_CLASS_DATETIME: - mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, + mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_SYMBOLS, attribute.imeOptions); - mKeyboardSwitcher.toggleSymbols(); break; case EditorInfo.TYPE_CLASS_PHONE: mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_PHONE, @@ -278,6 +309,17 @@ public class LatinIME extends InputMethodService disableAutoCorrect = true; } } + + // If NO_SUGGESTIONS is set, don't do prediction. + if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0) { + mPredictionOn = false; + disableAutoCorrect = true; + } + // If it's not multiline and the autoCorrect flag is not set, then don't correct + if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0 && + (attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) == 0) { + disableAutoCorrect = true; + } if ((attribute.inputType&EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) { mPredictionOn = false; mCompletionOn = true && isFullscreenMode(); @@ -309,7 +351,7 @@ public class LatinIME extends InputMethodService } mPredictionOn = mPredictionOn && mCorrectionMode > 0; checkTutorial(attribute.privateImeOptions); - if (TRACE) Debug.startMethodTracing("latinime"); + if (TRACE) Debug.startMethodTracing("/data/trace/latinime"); } @Override @@ -344,6 +386,7 @@ public class LatinIME extends InputMethodService TextEntryState.reset(); } mJustAccepted = false; + postUpdateShiftKeyState(); } @Override @@ -465,11 +508,17 @@ public class LatinIME extends InputMethodService } mCommittedLength = mComposing.length(); TextEntryState.acceptedTyped(mComposing); + mAutoDictionary.addWord(mComposing.toString(), FREQUENCY_FOR_TYPED); } updateSuggestions(); } } + private void postUpdateShiftKeyState() { + mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE); + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SHIFT_STATE), 300); + } + public void updateShiftKeyState(EditorInfo attr) { InputConnection ic = getCurrentInputConnection(); if (attr != null && mInputView != null && mKeyboardSwitcher.isAlphabetMode() @@ -571,6 +620,9 @@ public class LatinIME extends InputMethodService // Cancel the just reverted state mJustRevertedSeparator = null; } + if (mKeyboardSwitcher.onKey(primaryCode)) { + changeKeyboardMode(); + } } public void onText(CharSequence text) { @@ -606,7 +658,7 @@ public class LatinIME extends InputMethodService } else { deleteChar = true; } - updateShiftKeyState(getCurrentInputEditorInfo()); + postUpdateShiftKeyState(); TextEntryState.backspace(); if (TextEntryState.getState() == TextEntryState.STATE_UNDO_COMMIT) { revertLastWord(deleteChar); @@ -640,7 +692,12 @@ public class LatinIME extends InputMethodService } } if (mInputView.isShifted()) { - primaryCode = Character.toUpperCase(primaryCode); + // TODO: This doesn't work with ß, need to fix it in the next release. + if (keyCodes == null || keyCodes[0] < Character.MIN_CODE_POINT + || keyCodes[0] > Character.MAX_CODE_POINT) { + return; + } + primaryCode = new String(keyCodes, 0, 1).toUpperCase().charAt(0); } if (mPredicting) { if (mInputView.isShifted() && mComposing.length() == 0) { @@ -756,7 +813,9 @@ public class LatinIME extends InputMethodService if (mCorrectionMode == Suggest.CORRECTION_FULL) { correctionAvailable |= typedWordValid; } - + // Don't auto-correct words with multiple capital letter + correctionAvailable &= !mWord.isMostlyCaps(); + mCandidateView.setSuggestions(stringList, false, typedWordValid, correctionAvailable); if (stringList.size() > 0) { if (correctionAvailable && !typedWordValid && stringList.size() > 1) { @@ -813,13 +872,17 @@ public class LatinIME extends InputMethodService suggestion = suggestion.toString().toUpperCase(); } else if (preferCapitalization() || (mKeyboardSwitcher.isAlphabetMode() && mInputView.isShifted())) { - suggestion = Character.toUpperCase(suggestion.charAt(0)) + suggestion = suggestion.toString().toUpperCase().charAt(0) + suggestion.subSequence(1, suggestion.length()).toString(); } InputConnection ic = getCurrentInputConnection(); if (ic != null) { ic.commitText(suggestion, 1); } + // Add the word to the auto dictionary if it's not a known word + if (mAutoDictionary.isValidWord(suggestion) || !mSuggest.isValidWord(suggestion)) { + mAutoDictionary.addWord(suggestion.toString(), FREQUENCY_FOR_PICKED); + } mPredicting = false; mCommittedLength = suggestion.length(); if (mCandidateView != null) { @@ -907,7 +970,7 @@ public class LatinIME extends InputMethodService } public void swipeDown() { - //handleClose(); + handleClose(); } public void swipeUp() { @@ -973,7 +1036,7 @@ public class LatinIME extends InputMethodService return; } if (mVibrator == null) { - mVibrator = new Vibrator(); + mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); } mVibrator.vibrate(mVibrateDuration); } @@ -998,7 +1061,12 @@ public class LatinIME extends InputMethodService void tutorialDone() { mTutorial = null; } - + + void promoteToUserDictionary(String word, int frequency) { + if (mUserDictionary.isValidWord(word)) return; + mUserDictionary.addWord(word, frequency); + } + private void launchSettings() { handleClose(); Intent intent = new Intent(); @@ -1044,7 +1112,8 @@ public class LatinIME extends InputMethodService launchSettings(); break; case POS_METHOD: - InputMethodManager.getInstance(LatinIME.this).showInputMethodPicker(); + ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) + .showInputMethodPicker(); break; } } @@ -1107,7 +1176,35 @@ public class LatinIME extends InputMethodService for (int i = 0; i < CPS_BUFFER_SIZE; i++) total += mCpsIntervals[i]; System.out.println("CPS = " + ((CPS_BUFFER_SIZE * 1000f) / total)); } - + + class AutoDictionary extends ExpandableDictionary { + // If the user touches a typed word 2 times or more, it will become valid. + private static final int VALIDITY_THRESHOLD = 2 * FREQUENCY_FOR_PICKED; + // If the user touches a typed word 5 times or more, it will be added to the user dict. + private static final int PROMOTION_THRESHOLD = 5 * FREQUENCY_FOR_PICKED; + + public AutoDictionary(Context context) { + super(context); + } + + @Override + public boolean isValidWord(CharSequence word) { + final int frequency = getWordFrequency(word); + return frequency > VALIDITY_THRESHOLD; + } + + @Override + public void addWord(String word, int addFrequency) { + final int length = word.length(); + // Don't add very short or very long words. + if (length < 2 || length > getMaxWordLength()) return; + super.addWord(word, addFrequency); + final int freq = getWordFrequency(word); + if (freq > PROMOTION_THRESHOLD) { + LatinIME.this.promoteToUserDictionary(word, FREQUENCY_FOR_AUTO_ADD); + } + } + } } diff --git a/src/com/android/inputmethod/latin/LatinKeyboard.java b/src/com/android/inputmethod/latin/LatinKeyboard.java index 8527d9cd5..9b04aa264 100644 --- a/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -37,20 +37,23 @@ public class LatinKeyboard extends Keyboard { private static final int SHIFT_LOCKED = 2; private int mShiftState = SHIFT_OFF; - + + static int sSpacebarVerticalCorrection; + public LatinKeyboard(Context context, int xmlLayoutResId) { this(context, xmlLayoutResId, 0); } public LatinKeyboard(Context context, int xmlLayoutResId, int mode) { super(context, xmlLayoutResId, mode); - mShiftLockIcon = context.getResources() - .getDrawable(R.drawable.sym_keyboard_shift_locked); - mShiftLockPreviewIcon = context.getResources() - .getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); + Resources res = context.getResources(); + mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); + mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); mShiftLockPreviewIcon.setBounds(0, 0, mShiftLockPreviewIcon.getIntrinsicWidth(), mShiftLockPreviewIcon.getIntrinsicHeight()); + sSpacebarVerticalCorrection = res.getDimensionPixelOffset( + R.dimen.spacebar_vertical_correction); } public LatinKeyboard(Context context, int layoutTemplateResId, @@ -225,6 +228,8 @@ public class LatinKeyboard extends Keyboard { y -= height / 10; if (code == KEYCODE_SHIFT) x += width / 6; if (code == KEYCODE_DELETE) x -= width / 6; + } else if (code == LatinIME.KEYCODE_SPACE) { + y += LatinKeyboard.sSpacebarVerticalCorrection; } return super.isInside(x, y); } diff --git a/src/com/android/inputmethod/latin/Suggest.java b/src/com/android/inputmethod/latin/Suggest.java index 91decd66a..c025566b7 100755 --- a/src/com/android/inputmethod/latin/Suggest.java +++ b/src/com/android/inputmethod/latin/Suggest.java @@ -36,17 +36,21 @@ public class Suggest implements Dictionary.WordCallback { public static final int CORRECTION_NONE = 0; public static final int CORRECTION_BASIC = 1; public static final int CORRECTION_FULL = 2; - + private Dictionary mMainDict; - + private Dictionary mUserDictionary; - + + private Dictionary mAutoDictionary; + + private Dictionary mContactsDictionary; + private int mPrefMaxSuggestions = 12; - + private int[] mPriorities = new int[mPrefMaxSuggestions]; - private List mSuggestions = new ArrayList(); + private ArrayList mSuggestions = new ArrayList(); private boolean mIncludeTypedWordIfValid; - private List mStringPool = new ArrayList(); + private ArrayList mStringPool = new ArrayList(); private Context mContext; private boolean mHaveCorrection; private CharSequence mOriginalWord; @@ -63,11 +67,11 @@ public class Suggest implements Dictionary.WordCallback { mStringPool.add(sb); } } - + public int getCorrectionMode() { return mCorrectionMode; } - + public void setCorrectionMode(int mode) { mCorrectionMode = mode; } @@ -80,6 +84,17 @@ public class Suggest implements Dictionary.WordCallback { mUserDictionary = userDictionary; } + /** + * Sets an optional contacts dictionary resource to be loaded. + */ + public void setContactsDictionary(Dictionary userDictionary) { + mContactsDictionary = userDictionary; + } + + public void setAutoDictionary(Dictionary autoDictionary) { + mAutoDictionary = autoDictionary; + } + /** * Number of suggestions to generate from the input key sequence. This has * to be a number between 1 and 100 (inclusive). @@ -98,24 +113,34 @@ public class Suggest implements Dictionary.WordCallback { mStringPool.add(sb); } } - + private boolean haveSufficientCommonality(String original, CharSequence suggestion) { - final int len = Math.min(original.length(), suggestion.length()); - if (len <= 2) return true; + final int originalLength = original.length(); + final int suggestionLength = suggestion.length(); + final int minLength = Math.min(originalLength, suggestionLength); + if (minLength <= 2) return true; int matching = 0; - for (int i = 0; i < len; i++) { - if (UserDictionary.toLowerCase(original.charAt(i)) - == UserDictionary.toLowerCase(suggestion.charAt(i))) { + int lessMatching = 0; // Count matches if we skip one character + int i; + for (i = 0; i < minLength; i++) { + final char origChar = ExpandableDictionary.toLowerCase(original.charAt(i)); + if (origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i))) { matching++; + lessMatching++; + } else if (i + 1 < suggestionLength + && origChar == ExpandableDictionary.toLowerCase(suggestion.charAt(i + 1))) { + lessMatching++; } } - if (len <= 4) { + matching = Math.max(matching, lessMatching); + + if (minLength <= 4) { return matching >= 2; } else { - return matching > len / 2; + return matching > minLength / 2; } } - + /** * Returns a list of words that match the list of character codes passed in. * This list will be overwritten the next time this function is called. @@ -142,8 +167,14 @@ public class Suggest implements Dictionary.WordCallback { } // Search the dictionary only if there are at least 2 characters if (wordComposer.size() > 1) { - if (mUserDictionary != null) { - mUserDictionary.getWords(wordComposer, this); + if (mUserDictionary != null || mContactsDictionary != null) { + if (mUserDictionary != null) { + mUserDictionary.getWords(wordComposer, this); + } + if (mContactsDictionary != null) { + mContactsDictionary.getWords(wordComposer, this); + } + if (mSuggestions.size() > 0 && isValidWord(mOriginalWord)) { mHaveCorrection = true; } @@ -187,10 +218,38 @@ public class Suggest implements Dictionary.WordCallback { } i++; } - + + removeDupes(); return mSuggestions; } + private void removeDupes() { + final ArrayList suggestions = mSuggestions; + if (suggestions.size() < 2) return; + int i = 1; + // Don't cache suggestions.size(), since we may be removing items + while (i < suggestions.size()) { + final CharSequence cur = suggestions.get(i); + // Compare each candidate with each previous candidate + for (int j = 0; j < i; j++) { + CharSequence previous = suggestions.get(j); + if (TextUtils.equals(cur, previous)) { + removeFromSuggestions(i); + i--; + break; + } + } + i++; + } + } + + private void removeFromSuggestions(int index) { + CharSequence garbage = mSuggestions.remove(index); + if (garbage != null && garbage instanceof StringBuilder) { + mStringPool.add(garbage); + } + } + public boolean hasMinimalCorrection() { return mHaveCorrection; } @@ -256,7 +315,9 @@ public class Suggest implements Dictionary.WordCallback { } return (mCorrectionMode == CORRECTION_FULL && mMainDict.isValidWord(word)) || (mCorrectionMode > CORRECTION_NONE && - (mUserDictionary != null && mUserDictionary.isValidWord(word))); + ((mUserDictionary != null && mUserDictionary.isValidWord(word))) + || (mAutoDictionary != null && mAutoDictionary.isValidWord(word)) + || (mContactsDictionary != null && mContactsDictionary.isValidWord(word))); } private void collectGarbage() { diff --git a/src/com/android/inputmethod/latin/UserDictionary.java b/src/com/android/inputmethod/latin/UserDictionary.java index 09549bf8c..2f3447abd 100644 --- a/src/com/android/inputmethod/latin/UserDictionary.java +++ b/src/com/android/inputmethod/latin/UserDictionary.java @@ -26,7 +26,7 @@ import android.database.ContentObserver; import android.database.Cursor; import android.provider.UserDictionary.Words; -public class UserDictionary extends Dictionary { +public class UserDictionary extends ExpandableDictionary { private static final String[] PROJECTION = { Words._ID, @@ -37,31 +37,12 @@ public class UserDictionary extends Dictionary { private static final int INDEX_WORD = 1; private static final int INDEX_FREQUENCY = 2; - private static final char QUOTE = '\''; - - private Context mContext; - - List mRoots; - private int mMaxDepth; - private int mInputLength; - - public static final int MAX_WORD_LENGTH = 32; - - private char[] mWordBuilder = new char[MAX_WORD_LENGTH]; - private ContentObserver mObserver; - static class Node { - char code; - int frequency; - boolean terminal; - List children; - } - private boolean mRequiresReload; public UserDictionary(Context context) { - mContext = context; + super(context); // Perform a managed query. The Activity will handle closing and requerying the cursor // when needed. ContentResolver cres = context.getContentResolver(); @@ -78,13 +59,13 @@ public class UserDictionary extends Dictionary { public synchronized void close() { if (mObserver != null) { - mContext.getContentResolver().unregisterContentObserver(mObserver); + getContext().getContentResolver().unregisterContentObserver(mObserver); mObserver = null; } } private synchronized void loadDictionary() { - Cursor cursor = mContext.getContentResolver() + Cursor cursor = getContext().getContentResolver() .query(Words.CONTENT_URI, PROJECTION, "(locale IS NULL) or (locale=?)", new String[] { Locale.getDefault().toString() }, null); addWords(cursor); @@ -99,12 +80,15 @@ public class UserDictionary extends Dictionary { * the highest. * @TODO use a higher or float range for frequency */ + @Override public synchronized void addWord(String word, int frequency) { if (mRequiresReload) loadDictionary(); // Safeguard against adding long words. Can cause stack overflow. - if (word.length() >= MAX_WORD_LENGTH) return; - addWordRec(mRoots, word, 0, frequency); - Words.addWord(mContext, word, frequency, Words.LOCALE_TYPE_CURRENT); + if (word.length() >= getMaxWordLength()) return; + + super.addWord(word, frequency); + + Words.addWord(getContext(), word, frequency, Words.LOCALE_TYPE_CURRENT); // In case the above does a synchronous callback of the change observer mRequiresReload = false; } @@ -112,362 +96,31 @@ public class UserDictionary extends Dictionary { @Override public synchronized void getWords(final WordComposer codes, final WordCallback callback) { if (mRequiresReload) loadDictionary(); - mInputLength = codes.size(); - mMaxDepth = mInputLength * 3; - getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1.0f, 0, callback); + super.getWords(codes, callback); } @Override public synchronized boolean isValidWord(CharSequence word) { if (mRequiresReload) loadDictionary(); - return isValidWordRec(mRoots, word, 0, word.length()); - } - - private boolean isValidWordRec(final List children, final CharSequence word, - final int offset, final int length) { - final int count = children.size(); - char currentChar = word.charAt(offset); - for (int j = 0; j < count; j++) { - final Node node = children.get(j); - if (node.code == currentChar) { - if (offset == length - 1) { - if (node.terminal) { - return true; - } - } else { - if (node.children != null) { - if (isValidWordRec(node.children, word, offset + 1, length)) { - return true; - } - } - } - } - } - return false; - } - - static char toLowerCase(char c) { - if (c < BASE_CHARS.length) { - c = BASE_CHARS[c]; - } - c = Character.toLowerCase(c); - return c; - } - - /** - * Recursively traverse the tree for words that match the input. Input consists of - * a list of arrays. Each item in the list is one input character position. An input - * character is actually an array of multiple possible candidates. This function is not - * optimized for speed, assuming that the user dictionary will only be a few hundred words in - * size. - * @param roots node whose children have to be search for matches - * @param codes the input character codes - * @param word the word being composed as a possible match - * @param depth the depth of traversal - the length of the word being composed thus far - * @param completion whether the traversal is now in completion mode - meaning that we've - * exhausted the input and we're looking for all possible suffixes. - * @param snr current weight of the word being formed - * @param inputIndex position in the input characters. This can be off from the depth in - * case we skip over some punctuations such as apostrophe in the traversal. That is, if you type - * "wouldve", it could be matching "would've", so the depth will be one more than the - * inputIndex - * @param callback the callback class for adding a word - */ - private void getWordsRec(List roots, final WordComposer codes, final char[] word, - final int depth, boolean completion, float snr, int inputIndex, - WordCallback callback) { - final int count = roots.size(); - final int codeSize = mInputLength; - // Optimization: Prune out words that are too long compared to how much was typed. - if (depth > mMaxDepth) { - return; - } - int[] currentChars = null; - if (codeSize <= inputIndex) { - completion = true; - } else { - currentChars = codes.getCodesAt(inputIndex); - } - - for (int i = 0; i < count; i++) { - final Node node = roots.get(i); - final char c = node.code; - final char lowerC = toLowerCase(c); - boolean terminal = node.terminal; - List children = node.children; - int freq = node.frequency; - if (completion) { - word[depth] = c; - if (terminal) { - if (!callback.addWord(word, 0, depth + 1, (int) (freq * snr))) { - return; - } - } - if (children != null) { - getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, - callback); - } - } else if (c == QUOTE && currentChars[0] != QUOTE) { - // Skip the ' and continue deeper - word[depth] = QUOTE; - if (children != null) { - getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, - callback); - } - } else { - for (int j = 0; j < currentChars.length; j++) { - float addedAttenuation = (j > 0 ? 1f : 3f); - if (currentChars[j] == -1) { - break; - } - if (currentChars[j] == lowerC || currentChars[j] == c) { - word[depth] = c; - - if (codes.size() == depth + 1) { - if (terminal) { - if (INCLUDE_TYPED_WORD_IF_VALID - || !same(word, depth + 1, codes.getTypedWord())) { - callback.addWord(word, 0, depth + 1, - (int) (freq * snr * addedAttenuation - * FULL_WORD_FREQ_MULTIPLIER)); - } - } - if (children != null) { - getWordsRec(children, codes, word, depth + 1, - true, snr * addedAttenuation, inputIndex + 1, callback); - } - } else if (children != null) { - getWordsRec(children, codes, word, depth + 1, - false, snr * addedAttenuation, inputIndex + 1, callback); - } - } - } - } - } + return super.isValidWord(word); } private void addWords(Cursor cursor) { - mRoots = new ArrayList(); - + clearDictionary(); + + final int maxWordLength = getMaxWordLength(); if (cursor.moveToFirst()) { while (!cursor.isAfterLast()) { String word = cursor.getString(INDEX_WORD); int frequency = cursor.getInt(INDEX_FREQUENCY); // Safeguard against adding really long words. Stack may overflow due // to recursion - if (word.length() < MAX_WORD_LENGTH) { - addWordRec(mRoots, word, 0, frequency); + if (word.length() < maxWordLength) { + super.addWord(word, frequency); } cursor.moveToNext(); } } cursor.close(); } - - private void addWordRec(List children, final String word, - final int depth, final int frequency) { - - final int wordLength = word.length(); - final char c = word.charAt(depth); - // Does children have the current character? - final int childrenLength = children.size(); - Node childNode = null; - boolean found = false; - for (int i = 0; i < childrenLength; i++) { - childNode = children.get(i); - if (childNode.code == c) { - found = true; - break; - } - } - if (!found) { - childNode = new Node(); - childNode.code = c; - children.add(childNode); - } - if (wordLength == depth + 1) { - // Terminate this word - childNode.terminal = true; - childNode.frequency += frequency; // If there are multiple similar words - return; - } - if (childNode.children == null) { - childNode.children = new ArrayList(); - } - addWordRec(childNode.children, word, depth + 1, frequency); - } - - /** - * Table mapping most combined Latin, Greek, and Cyrillic characters - * to their base characters. If c is in range, BASE_CHARS[c] == c - * if c is not a combined character, or the base character if it - * is combined. - */ - static final char BASE_CHARS[] = { - 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, - 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, - 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, - 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x0020, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x0020, 0x00a9, 0x0061, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0020, - 0x00b0, 0x00b1, 0x0032, 0x0033, 0x0020, 0x03bc, 0x00b6, 0x00b7, - 0x0020, 0x0031, 0x006f, 0x00bb, 0x0031, 0x0031, 0x0033, 0x00bf, - 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x00c6, 0x0043, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0049, 0x0049, 0x0049, 0x0049, - 0x00d0, 0x004e, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x00d7, - 0x004f, 0x0055, 0x0055, 0x0055, 0x0055, 0x0059, 0x00de, 0x0073, // Manually changed d8 to 4f - // Manually changed df to 73 - 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x00e6, 0x0063, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0069, 0x0069, 0x0069, - 0x00f0, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00f7, - 0x006f, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x00fe, 0x0079, // Manually changed f8 to 6f - 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0043, 0x0063, - 0x0043, 0x0063, 0x0043, 0x0063, 0x0043, 0x0063, 0x0044, 0x0064, - 0x0110, 0x0111, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, - 0x0045, 0x0065, 0x0045, 0x0065, 0x0047, 0x0067, 0x0047, 0x0067, - 0x0047, 0x0067, 0x0047, 0x0067, 0x0048, 0x0068, 0x0126, 0x0127, - 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, - 0x0049, 0x0131, 0x0049, 0x0069, 0x004a, 0x006a, 0x004b, 0x006b, - 0x0138, 0x004c, 0x006c, 0x004c, 0x006c, 0x004c, 0x006c, 0x004c, - 0x006c, 0x0141, 0x0142, 0x004e, 0x006e, 0x004e, 0x006e, 0x004e, - 0x006e, 0x02bc, 0x014a, 0x014b, 0x004f, 0x006f, 0x004f, 0x006f, - 0x004f, 0x006f, 0x0152, 0x0153, 0x0052, 0x0072, 0x0052, 0x0072, - 0x0052, 0x0072, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, - 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0166, 0x0167, - 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, - 0x0055, 0x0075, 0x0055, 0x0075, 0x0057, 0x0077, 0x0059, 0x0079, - 0x0059, 0x005a, 0x007a, 0x005a, 0x007a, 0x005a, 0x007a, 0x0073, - 0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, - 0x0188, 0x0189, 0x018a, 0x018b, 0x018c, 0x018d, 0x018e, 0x018f, - 0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, - 0x0198, 0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019e, 0x019f, - 0x004f, 0x006f, 0x01a2, 0x01a3, 0x01a4, 0x01a5, 0x01a6, 0x01a7, - 0x01a8, 0x01a9, 0x01aa, 0x01ab, 0x01ac, 0x01ad, 0x01ae, 0x0055, - 0x0075, 0x01b1, 0x01b2, 0x01b3, 0x01b4, 0x01b5, 0x01b6, 0x01b7, - 0x01b8, 0x01b9, 0x01ba, 0x01bb, 0x01bc, 0x01bd, 0x01be, 0x01bf, - 0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x0044, 0x0044, 0x0064, 0x004c, - 0x004c, 0x006c, 0x004e, 0x004e, 0x006e, 0x0041, 0x0061, 0x0049, - 0x0069, 0x004f, 0x006f, 0x0055, 0x0075, 0x00dc, 0x00fc, 0x00dc, - 0x00fc, 0x00dc, 0x00fc, 0x00dc, 0x00fc, 0x01dd, 0x00c4, 0x00e4, - 0x0226, 0x0227, 0x00c6, 0x00e6, 0x01e4, 0x01e5, 0x0047, 0x0067, - 0x004b, 0x006b, 0x004f, 0x006f, 0x01ea, 0x01eb, 0x01b7, 0x0292, - 0x006a, 0x0044, 0x0044, 0x0064, 0x0047, 0x0067, 0x01f6, 0x01f7, - 0x004e, 0x006e, 0x00c5, 0x00e5, 0x00c6, 0x00e6, 0x00d8, 0x00f8, - 0x0041, 0x0061, 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, - 0x0049, 0x0069, 0x0049, 0x0069, 0x004f, 0x006f, 0x004f, 0x006f, - 0x0052, 0x0072, 0x0052, 0x0072, 0x0055, 0x0075, 0x0055, 0x0075, - 0x0053, 0x0073, 0x0054, 0x0074, 0x021c, 0x021d, 0x0048, 0x0068, - 0x0220, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0041, 0x0061, - 0x0045, 0x0065, 0x00d6, 0x00f6, 0x00d5, 0x00f5, 0x004f, 0x006f, - 0x022e, 0x022f, 0x0059, 0x0079, 0x0234, 0x0235, 0x0236, 0x0237, - 0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023d, 0x023e, 0x023f, - 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, - 0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, 0x024f, - 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, - 0x0258, 0x0259, 0x025a, 0x025b, 0x025c, 0x025d, 0x025e, 0x025f, - 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267, - 0x0268, 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e, 0x026f, - 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, - 0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x027d, 0x027e, 0x027f, - 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, - 0x0288, 0x0289, 0x028a, 0x028b, 0x028c, 0x028d, 0x028e, 0x028f, - 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, - 0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f, - 0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7, - 0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af, - 0x0068, 0x0266, 0x006a, 0x0072, 0x0279, 0x027b, 0x0281, 0x0077, - 0x0079, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf, - 0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7, - 0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf, - 0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x02de, 0x02df, - 0x0263, 0x006c, 0x0073, 0x0078, 0x0295, 0x02e5, 0x02e6, 0x02e7, - 0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef, - 0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7, - 0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff, - 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, - 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f, - 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, - 0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f, - 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, - 0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f, - 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, - 0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f, - 0x0300, 0x0301, 0x0342, 0x0313, 0x0308, 0x0345, 0x0346, 0x0347, - 0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f, - 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, - 0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f, - 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, - 0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f, - 0x0370, 0x0371, 0x0372, 0x0373, 0x02b9, 0x0375, 0x0376, 0x0377, - 0x0378, 0x0379, 0x0020, 0x037b, 0x037c, 0x037d, 0x003b, 0x037f, - 0x0380, 0x0381, 0x0382, 0x0383, 0x0020, 0x00a8, 0x0391, 0x00b7, - 0x0395, 0x0397, 0x0399, 0x038b, 0x039f, 0x038d, 0x03a5, 0x03a9, - 0x03ca, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, - 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, - 0x03a8, 0x03a9, 0x0399, 0x03a5, 0x03b1, 0x03b5, 0x03b7, 0x03b9, - 0x03cb, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, - 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, - 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, - 0x03c8, 0x03c9, 0x03b9, 0x03c5, 0x03bf, 0x03c5, 0x03c9, 0x03cf, - 0x03b2, 0x03b8, 0x03a5, 0x03d2, 0x03d2, 0x03c6, 0x03c0, 0x03d7, - 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df, - 0x03e0, 0x03e1, 0x03e2, 0x03e3, 0x03e4, 0x03e5, 0x03e6, 0x03e7, - 0x03e8, 0x03e9, 0x03ea, 0x03eb, 0x03ec, 0x03ed, 0x03ee, 0x03ef, - 0x03ba, 0x03c1, 0x03c2, 0x03f3, 0x0398, 0x03b5, 0x03f6, 0x03f7, - 0x03f8, 0x03a3, 0x03fa, 0x03fb, 0x03fc, 0x03fd, 0x03fe, 0x03ff, - 0x0415, 0x0415, 0x0402, 0x0413, 0x0404, 0x0405, 0x0406, 0x0406, - 0x0408, 0x0409, 0x040a, 0x040b, 0x041a, 0x0418, 0x0423, 0x040f, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0418, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0438, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0435, 0x0435, 0x0452, 0x0433, 0x0454, 0x0455, 0x0456, 0x0456, - 0x0458, 0x0459, 0x045a, 0x045b, 0x043a, 0x0438, 0x0443, 0x045f, - 0x0460, 0x0461, 0x0462, 0x0463, 0x0464, 0x0465, 0x0466, 0x0467, - 0x0468, 0x0469, 0x046a, 0x046b, 0x046c, 0x046d, 0x046e, 0x046f, - 0x0470, 0x0471, 0x0472, 0x0473, 0x0474, 0x0475, 0x0474, 0x0475, - 0x0478, 0x0479, 0x047a, 0x047b, 0x047c, 0x047d, 0x047e, 0x047f, - 0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, - 0x0488, 0x0489, 0x048a, 0x048b, 0x048c, 0x048d, 0x048e, 0x048f, - 0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497, - 0x0498, 0x0499, 0x049a, 0x049b, 0x049c, 0x049d, 0x049e, 0x049f, - 0x04a0, 0x04a1, 0x04a2, 0x04a3, 0x04a4, 0x04a5, 0x04a6, 0x04a7, - 0x04a8, 0x04a9, 0x04aa, 0x04ab, 0x04ac, 0x04ad, 0x04ae, 0x04af, - 0x04b0, 0x04b1, 0x04b2, 0x04b3, 0x04b4, 0x04b5, 0x04b6, 0x04b7, - 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc, 0x04bd, 0x04be, 0x04bf, - 0x04c0, 0x0416, 0x0436, 0x04c3, 0x04c4, 0x04c5, 0x04c6, 0x04c7, - 0x04c8, 0x04c9, 0x04ca, 0x04cb, 0x04cc, 0x04cd, 0x04ce, 0x04cf, - 0x0410, 0x0430, 0x0410, 0x0430, 0x04d4, 0x04d5, 0x0415, 0x0435, - 0x04d8, 0x04d9, 0x04d8, 0x04d9, 0x0416, 0x0436, 0x0417, 0x0437, - 0x04e0, 0x04e1, 0x0418, 0x0438, 0x0418, 0x0438, 0x041e, 0x043e, - 0x04e8, 0x04e9, 0x04e8, 0x04e9, 0x042d, 0x044d, 0x0423, 0x0443, - 0x0423, 0x0443, 0x0423, 0x0443, 0x0427, 0x0447, 0x04f6, 0x04f7, - 0x042b, 0x044b, 0x04fa, 0x04fb, 0x04fc, 0x04fd, 0x04fe, 0x04ff, - }; - - // generated with: - // cat UnicodeData.txt | perl -e 'while (<>) { @foo = split(/;/); $foo[5] =~ s/<.*> //; $base[hex($foo[0])] = hex($foo[5]);} for ($i = 0; $i < 0x500; $i += 8) { for ($j = $i; $j < $i + 8; $j++) { printf("0x%04x, ", $base[$j] ? $base[$j] : $j)}; print "\n"; }' - } diff --git a/src/com/android/inputmethod/latin/WordComposer.java b/src/com/android/inputmethod/latin/WordComposer.java index c950a7f18..50725d481 100644 --- a/src/com/android/inputmethod/latin/WordComposer.java +++ b/src/com/android/inputmethod/latin/WordComposer.java @@ -26,7 +26,7 @@ public class WordComposer { /** * The list of unicode values for each keystroke (including surrounding keys) */ - private List mCodes; + private ArrayList mCodes; /** * The word chosen from the candidate list, until it is committed. @@ -34,6 +34,8 @@ public class WordComposer { private String mPreferredWord; private StringBuilder mTypedWord; + + private int mCapsCount; /** * Whether the user chose to capitalize the word. @@ -53,6 +55,7 @@ public class WordComposer { mIsCapitalized = false; mPreferredWord = null; mTypedWord.setLength(0); + mCapsCount = 0; } /** @@ -80,6 +83,7 @@ public class WordComposer { public void add(int primaryCode, int[] codes) { mTypedWord.append((char) primaryCode); mCodes.add(codes); + if (Character.isUpperCase((char) primaryCode)) mCapsCount++; } /** @@ -87,7 +91,10 @@ public class WordComposer { */ public void deleteLast() { mCodes.remove(mCodes.size() - 1); - mTypedWord.deleteCharAt(mTypedWord.length() - 1); + final int lastPos = mTypedWord.length() - 1; + char last = mTypedWord.charAt(lastPos); + mTypedWord.deleteCharAt(lastPos); + if (Character.isUpperCase(last)) mCapsCount--; } /** @@ -138,4 +145,11 @@ public class WordComposer { public CharSequence getPreferredWord() { return mPreferredWord != null ? mPreferredWord : getTypedWord(); } + + /** + * Returns true if more than one character is upper case, otherwise returns false. + */ + public boolean isMostlyCaps() { + return mCapsCount > 1; + } }