From c12588d40b030263304df05e1a0789e8c3ef0821 Mon Sep 17 00:00:00 2001 From: Roman Mitnitski Date: Sun, 21 Mar 2010 11:29:07 +0200 Subject: [PATCH 001/159] Add hebrew keyboard to LatinIME Bug: 2532052 Change-Id: Id2de988327fa3501e9049dc972a215b754bd3d91 --- java/res/xml-iw/kbd_qwerty.xml | 164 +++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100755 java/res/xml-iw/kbd_qwerty.xml diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml new file mode 100755 index 000000000..3cec7cda4 --- /dev/null +++ b/java/res/xml-iw/kbd_qwerty.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 1cf0ce74e857e3f03a3f7173f0d588b2ed02ce2d Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 7 Apr 2010 18:37:36 +0900 Subject: [PATCH 002/159] Make this sandbox buildable under the froyo tree using symlink under vendor/google/apps. Change-Id: Ia83a8e27d7a44a3a4dcf21b7a0bf0ab814f106ea --- java/Android.mk | 4 ++-- java/AndroidManifest.xml | 10 +++++----- java/res/values-ja/strings.xml | 4 ++-- java/res/values-zh-rCN/strings.xml | 4 ++-- java/res/values-zh-rTW/strings.xml | 4 ++-- java/res/values/strings.xml | 4 ++-- native/Android.mk | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/java/Android.mk b/java/Android.mk index 4bb8986ee..1ecd596af 100755 --- a/java/Android.mk +++ b/java/Android.mk @@ -5,11 +5,11 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) -LOCAL_PACKAGE_NAME := LatinIME +LOCAL_PACKAGE_NAME := LatinIme2Google LOCAL_CERTIFICATE := shared -LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime +LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime2 LOCAL_STATIC_JAVA_LIBRARIES := android-common diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index e229bc76a..df54323d1 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.android.inputmethod.latin2"> @@ -10,10 +10,10 @@ - @@ -22,13 +22,13 @@ - + - diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 7867684cb..f77cb210c 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -20,8 +20,8 @@ - "Androidキーボード" - "Androidキーボードの設定" + "Androidキーボード 2" + "Androidキーボード 2 の設定" "キー操作バイブ" "キー操作音" "入力ミス補正" diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 3fe189621..435c8c883 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -20,8 +20,8 @@ - "Android 键盘" - "Android 键盘设置" + "Android 键盘 2" + "Android 键盘 2 设置" "按键时振动" "按键时播放音效" "纠正输入错误" diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 683078eef..d35730f92 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -20,8 +20,8 @@ - "Android 鍵盤" - "Android 鍵盤設定" + "Android 鍵盤 2" + "Android 鍵盤 2 設定" "按鍵時震動" "按鍵時播放音效" "修正輸入錯誤" diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 35dd3e089..f1af31c50 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -19,9 +19,9 @@ --> - Android keyboard + Android keyboard 2 - Android keyboard settings + Android keyboard 2 settings Vibrate on keypress diff --git a/native/Android.mk b/native/Android.mk index 9ba9f75ec..6a9a3c534 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -21,7 +21,7 @@ LOCAL_SHARED_LIBRARIES := \ libutils \ libicuuc -LOCAL_MODULE := libjni_latinime +LOCAL_MODULE := libjni_latinime2 LOCAL_MODULE_TAGS := user From 07cab72ce4b82ad8cc879c2787da0f21a193e38c Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 20 Apr 2010 01:24:57 +0900 Subject: [PATCH 003/159] Fix the sandbox build & get rid of ICU dependency. Changed package name from com.android.inputmethod.latin2 to com.google.android.inputmethod.latin2. Copied LatinIME's current dictionaries from master's vendor directory. Confirmed latin_tolower() function returns the result identical to ICU's u_tolower(). - Note that I will merge the ICU dependency removal change to master. Change-Id: Ia85bd3e88ce5159934684e2228d8b0c5a8885296 --- java/Android.mk | 3 + java/AndroidManifest.xml | 5 +- .../inputmethod/latin/BinaryDictionary.java | 2 +- native/Android.mk | 9 +- native/src/char_utils.cpp | 899 ++++++++++++++++++ native/src/char_utils.h | 26 + native/src/dictionary.cpp | 5 +- 7 files changed, 938 insertions(+), 11 deletions(-) create mode 100644 native/src/char_utils.cpp create mode 100644 native/src/char_utils.h diff --git a/java/Android.mk b/java/Android.mk index 1ecd596af..97c906f26 100755 --- a/java/Android.mk +++ b/java/Android.mk @@ -14,6 +14,9 @@ LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime2 LOCAL_STATIC_JAVA_LIBRARIES := android-common #LOCAL_AAPT_FLAGS := -0 .dict +# The following flag is required because we use a different package name +# com.google.android.inputmethod.latin2 in the LatinIME sandbox. +LOCAL_AAPT_FLAGS := --custom-package com.android.inputmethod.latin LOCAL_SDK_VERSION := current diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index df54323d1..d33016a94 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,8 @@ + package="com.google.android.inputmethod.latin2"> - + + diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 87de94b76..6d0257b82 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -42,7 +42,7 @@ public class BinaryDictionary extends Dictionary { static { try { - System.loadLibrary("jni_latinime"); + System.loadLibrary("jni_latinime2"); } catch (UnsatisfiedLinkError ule) { Log.e("BinaryDictionary", "Could not load native library jni_latinime"); } diff --git a/native/Android.mk b/native/Android.mk index 6a9a3c534..260ca3023 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -5,10 +5,10 @@ LOCAL_C_INCLUDES += $(LOCAL_PATH)/src LOCAL_SRC_FILES := \ jni/com_android_inputmethod_latin_BinaryDictionary.cpp \ - src/dictionary.cpp + src/dictionary.cpp \ + src/char_utils.cpp LOCAL_C_INCLUDES += \ - external/icu4c/common \ $(JNI_H_INCLUDE) LOCAL_LDLIBS := -lm @@ -18,11 +18,10 @@ LOCAL_PRELINK_MODULE := false LOCAL_SHARED_LIBRARIES := \ libandroid_runtime \ libcutils \ - libutils \ - libicuuc + libutils LOCAL_MODULE := libjni_latinime2 -LOCAL_MODULE_TAGS := user +LOCAL_MODULE_TAGS := optional include $(BUILD_SHARED_LIBRARY) diff --git a/native/src/char_utils.cpp b/native/src/char_utils.cpp new file mode 100644 index 000000000..3cacc9e16 --- /dev/null +++ b/native/src/char_utils.cpp @@ -0,0 +1,899 @@ +/* + * Copyright (C) 2010 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. + */ + +#include + +namespace latinime { + +struct LatinCapitalSmallPair { + unsigned short capital; + unsigned short small; +}; + +// Generated from http://unicode.org/Public/UNIDATA/UnicodeData.txt +// +// 1. Run the following code. Bascially taken from +// Dictionary::toLowerCase(unsigned short c) in dictionary.cpp. +// Then, get the list of chars where ccc != ccc2 above. +// +// unsigned short c, cc, ccc, ccc2; +// for (c = 0; c < 0xFFFF ; c++) { +// if (c < sizeof(BASE_CHARS) / sizeof(BASE_CHARS[0])) { +// cc = BASE_CHARS[c]; +// } else { +// cc = c; +// } +// +// // tolower +// int isBase = 0; +// if (cc >='A' && cc <= 'Z') { +// ccc = (cc | 0x20); +// ccc2 = ccc; +// isBase = 1; +// } else if (cc > 0x7F) { +// ccc = u_tolower(cc); +// ccc2 = latin_tolower(cc); +// } else { +// ccc = cc; +// ccc2 = ccc; +// } +// if (!isBase && cc != ccc) { +// wprintf(L" 0x%04X => 0x%04X => 0x%04X %lc => %lc => %lc \n", +// c, cc, ccc, c, cc, ccc); +// //assert(ccc == ccc2); +// } +// } +// +// Initially, started with an empty latin_tolower() as below. +// +// unsigned short latin_tolower(unsigned short c) { +// return c; +// } +// +// +// 2. Process the list obtained by 1 by the following perl script and apply +// 'sort -u' as well. Get the SORTED_CHAR_MAP[]. +// Note that '$1' in the perl script is 'cc' in the above C code. +// +// while(<>) { +// / 0x\w* => 0x(\w*) =/; +// open(HDL, "grep -iw ^" . $1 . " UnicodeData.txt | "); +// $line = ; +// chomp $line; +// @cols = split(/;/, $line); +// print " { 0x$1, 0x$cols[13] }, // $cols[1]\n"; +// } +// +// +// 3. Update the latin_tolower() function above with SORTED_CHAR_MAP. Enable +// the assert(ccc == ccc2) above and confirm the function exits successfully. +// +static const struct LatinCapitalSmallPair SORTED_CHAR_MAP[] = { + { 0x00C4, 0x00E4 }, // LATIN CAPITAL LETTER A WITH DIAERESIS + { 0x00C5, 0x00E5 }, // LATIN CAPITAL LETTER A WITH RING ABOVE + { 0x00C6, 0x00E6 }, // LATIN CAPITAL LETTER AE + { 0x00D0, 0x00F0 }, // LATIN CAPITAL LETTER ETH + { 0x00D5, 0x00F5 }, // LATIN CAPITAL LETTER O WITH TILDE + { 0x00D6, 0x00F6 }, // LATIN CAPITAL LETTER O WITH DIAERESIS + { 0x00D8, 0x00F8 }, // LATIN CAPITAL LETTER O WITH STROKE + { 0x00DC, 0x00FC }, // LATIN CAPITAL LETTER U WITH DIAERESIS + { 0x00DE, 0x00FE }, // LATIN CAPITAL LETTER THORN + { 0x0110, 0x0111 }, // LATIN CAPITAL LETTER D WITH STROKE + { 0x0126, 0x0127 }, // LATIN CAPITAL LETTER H WITH STROKE + { 0x0141, 0x0142 }, // LATIN CAPITAL LETTER L WITH STROKE + { 0x014A, 0x014B }, // LATIN CAPITAL LETTER ENG + { 0x0152, 0x0153 }, // LATIN CAPITAL LIGATURE OE + { 0x0166, 0x0167 }, // LATIN CAPITAL LETTER T WITH STROKE + { 0x0181, 0x0253 }, // LATIN CAPITAL LETTER B WITH HOOK + { 0x0182, 0x0183 }, // LATIN CAPITAL LETTER B WITH TOPBAR + { 0x0184, 0x0185 }, // LATIN CAPITAL LETTER TONE SIX + { 0x0186, 0x0254 }, // LATIN CAPITAL LETTER OPEN O + { 0x0187, 0x0188 }, // LATIN CAPITAL LETTER C WITH HOOK + { 0x0189, 0x0256 }, // LATIN CAPITAL LETTER AFRICAN D + { 0x018A, 0x0257 }, // LATIN CAPITAL LETTER D WITH HOOK + { 0x018B, 0x018C }, // LATIN CAPITAL LETTER D WITH TOPBAR + { 0x018E, 0x01DD }, // LATIN CAPITAL LETTER REVERSED E + { 0x018F, 0x0259 }, // LATIN CAPITAL LETTER SCHWA + { 0x0190, 0x025B }, // LATIN CAPITAL LETTER OPEN E + { 0x0191, 0x0192 }, // LATIN CAPITAL LETTER F WITH HOOK + { 0x0193, 0x0260 }, // LATIN CAPITAL LETTER G WITH HOOK + { 0x0194, 0x0263 }, // LATIN CAPITAL LETTER GAMMA + { 0x0196, 0x0269 }, // LATIN CAPITAL LETTER IOTA + { 0x0197, 0x0268 }, // LATIN CAPITAL LETTER I WITH STROKE + { 0x0198, 0x0199 }, // LATIN CAPITAL LETTER K WITH HOOK + { 0x019C, 0x026F }, // LATIN CAPITAL LETTER TURNED M + { 0x019D, 0x0272 }, // LATIN CAPITAL LETTER N WITH LEFT HOOK + { 0x019F, 0x0275 }, // LATIN CAPITAL LETTER O WITH MIDDLE TILDE + { 0x01A2, 0x01A3 }, // LATIN CAPITAL LETTER OI + { 0x01A4, 0x01A5 }, // LATIN CAPITAL LETTER P WITH HOOK + { 0x01A6, 0x0280 }, // LATIN LETTER YR + { 0x01A7, 0x01A8 }, // LATIN CAPITAL LETTER TONE TWO + { 0x01A9, 0x0283 }, // LATIN CAPITAL LETTER ESH + { 0x01AC, 0x01AD }, // LATIN CAPITAL LETTER T WITH HOOK + { 0x01AE, 0x0288 }, // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK + { 0x01B1, 0x028A }, // LATIN CAPITAL LETTER UPSILON + { 0x01B2, 0x028B }, // LATIN CAPITAL LETTER V WITH HOOK + { 0x01B3, 0x01B4 }, // LATIN CAPITAL LETTER Y WITH HOOK + { 0x01B5, 0x01B6 }, // LATIN CAPITAL LETTER Z WITH STROKE + { 0x01B7, 0x0292 }, // LATIN CAPITAL LETTER EZH + { 0x01B8, 0x01B9 }, // LATIN CAPITAL LETTER EZH REVERSED + { 0x01BC, 0x01BD }, // LATIN CAPITAL LETTER TONE FIVE + { 0x01E4, 0x01E5 }, // LATIN CAPITAL LETTER G WITH STROKE + { 0x01EA, 0x01EB }, // LATIN CAPITAL LETTER O WITH OGONEK + { 0x01F6, 0x0195 }, // LATIN CAPITAL LETTER HWAIR + { 0x01F7, 0x01BF }, // LATIN CAPITAL LETTER WYNN + { 0x021C, 0x021D }, // LATIN CAPITAL LETTER YOGH + { 0x0220, 0x019E }, // LATIN CAPITAL LETTER N WITH LONG RIGHT LEG + { 0x0222, 0x0223 }, // LATIN CAPITAL LETTER OU + { 0x0224, 0x0225 }, // LATIN CAPITAL LETTER Z WITH HOOK + { 0x0226, 0x0227 }, // LATIN CAPITAL LETTER A WITH DOT ABOVE + { 0x022E, 0x022F }, // LATIN CAPITAL LETTER O WITH DOT ABOVE + { 0x023A, 0x2C65 }, // LATIN CAPITAL LETTER A WITH STROKE + { 0x023B, 0x023C }, // LATIN CAPITAL LETTER C WITH STROKE + { 0x023D, 0x019A }, // LATIN CAPITAL LETTER L WITH BAR + { 0x023E, 0x2C66 }, // LATIN CAPITAL LETTER T WITH DIAGONAL STROKE + { 0x0241, 0x0242 }, // LATIN CAPITAL LETTER GLOTTAL STOP + { 0x0243, 0x0180 }, // LATIN CAPITAL LETTER B WITH STROKE + { 0x0244, 0x0289 }, // LATIN CAPITAL LETTER U BAR + { 0x0245, 0x028C }, // LATIN CAPITAL LETTER TURNED V + { 0x0246, 0x0247 }, // LATIN CAPITAL LETTER E WITH STROKE + { 0x0248, 0x0249 }, // LATIN CAPITAL LETTER J WITH STROKE + { 0x024A, 0x024B }, // LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL + { 0x024C, 0x024D }, // LATIN CAPITAL LETTER R WITH STROKE + { 0x024E, 0x024F }, // LATIN CAPITAL LETTER Y WITH STROKE + { 0x0370, 0x0371 }, // GREEK CAPITAL LETTER HETA + { 0x0372, 0x0373 }, // GREEK CAPITAL LETTER ARCHAIC SAMPI + { 0x0376, 0x0377 }, // GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA + { 0x0391, 0x03B1 }, // GREEK CAPITAL LETTER ALPHA + { 0x0392, 0x03B2 }, // GREEK CAPITAL LETTER BETA + { 0x0393, 0x03B3 }, // GREEK CAPITAL LETTER GAMMA + { 0x0394, 0x03B4 }, // GREEK CAPITAL LETTER DELTA + { 0x0395, 0x03B5 }, // GREEK CAPITAL LETTER EPSILON + { 0x0396, 0x03B6 }, // GREEK CAPITAL LETTER ZETA + { 0x0397, 0x03B7 }, // GREEK CAPITAL LETTER ETA + { 0x0398, 0x03B8 }, // GREEK CAPITAL LETTER THETA + { 0x0399, 0x03B9 }, // GREEK CAPITAL LETTER IOTA + { 0x039A, 0x03BA }, // GREEK CAPITAL LETTER KAPPA + { 0x039B, 0x03BB }, // GREEK CAPITAL LETTER LAMDA + { 0x039C, 0x03BC }, // GREEK CAPITAL LETTER MU + { 0x039D, 0x03BD }, // GREEK CAPITAL LETTER NU + { 0x039E, 0x03BE }, // GREEK CAPITAL LETTER XI + { 0x039F, 0x03BF }, // GREEK CAPITAL LETTER OMICRON + { 0x03A0, 0x03C0 }, // GREEK CAPITAL LETTER PI + { 0x03A1, 0x03C1 }, // GREEK CAPITAL LETTER RHO + { 0x03A3, 0x03C3 }, // GREEK CAPITAL LETTER SIGMA + { 0x03A4, 0x03C4 }, // GREEK CAPITAL LETTER TAU + { 0x03A5, 0x03C5 }, // GREEK CAPITAL LETTER UPSILON + { 0x03A6, 0x03C6 }, // GREEK CAPITAL LETTER PHI + { 0x03A7, 0x03C7 }, // GREEK CAPITAL LETTER CHI + { 0x03A8, 0x03C8 }, // GREEK CAPITAL LETTER PSI + { 0x03A9, 0x03C9 }, // GREEK CAPITAL LETTER OMEGA + { 0x03CF, 0x03D7 }, // GREEK CAPITAL KAI SYMBOL + { 0x03D8, 0x03D9 }, // GREEK LETTER ARCHAIC KOPPA + { 0x03DA, 0x03DB }, // GREEK LETTER STIGMA + { 0x03DC, 0x03DD }, // GREEK LETTER DIGAMMA + { 0x03DE, 0x03DF }, // GREEK LETTER KOPPA + { 0x03E0, 0x03E1 }, // GREEK LETTER SAMPI + { 0x03E2, 0x03E3 }, // COPTIC CAPITAL LETTER SHEI + { 0x03E4, 0x03E5 }, // COPTIC CAPITAL LETTER FEI + { 0x03E6, 0x03E7 }, // COPTIC CAPITAL LETTER KHEI + { 0x03E8, 0x03E9 }, // COPTIC CAPITAL LETTER HORI + { 0x03EA, 0x03EB }, // COPTIC CAPITAL LETTER GANGIA + { 0x03EC, 0x03ED }, // COPTIC CAPITAL LETTER SHIMA + { 0x03EE, 0x03EF }, // COPTIC CAPITAL LETTER DEI + { 0x03F7, 0x03F8 }, // GREEK CAPITAL LETTER SHO + { 0x03FA, 0x03FB }, // GREEK CAPITAL LETTER SAN + { 0x03FD, 0x037B }, // GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL + { 0x03FE, 0x037C }, // GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL + { 0x03FF, 0x037D }, // GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL + { 0x0402, 0x0452 }, // CYRILLIC CAPITAL LETTER DJE + { 0x0404, 0x0454 }, // CYRILLIC CAPITAL LETTER UKRAINIAN IE + { 0x0405, 0x0455 }, // CYRILLIC CAPITAL LETTER DZE + { 0x0406, 0x0456 }, // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + { 0x0408, 0x0458 }, // CYRILLIC CAPITAL LETTER JE + { 0x0409, 0x0459 }, // CYRILLIC CAPITAL LETTER LJE + { 0x040A, 0x045A }, // CYRILLIC CAPITAL LETTER NJE + { 0x040B, 0x045B }, // CYRILLIC CAPITAL LETTER TSHE + { 0x040F, 0x045F }, // CYRILLIC CAPITAL LETTER DZHE + { 0x0410, 0x0430 }, // CYRILLIC CAPITAL LETTER A + { 0x0411, 0x0431 }, // CYRILLIC CAPITAL LETTER BE + { 0x0412, 0x0432 }, // CYRILLIC CAPITAL LETTER VE + { 0x0413, 0x0433 }, // CYRILLIC CAPITAL LETTER GHE + { 0x0414, 0x0434 }, // CYRILLIC CAPITAL LETTER DE + { 0x0415, 0x0435 }, // CYRILLIC CAPITAL LETTER IE + { 0x0416, 0x0436 }, // CYRILLIC CAPITAL LETTER ZHE + { 0x0417, 0x0437 }, // CYRILLIC CAPITAL LETTER ZE + { 0x0418, 0x0438 }, // CYRILLIC CAPITAL LETTER I + { 0x041A, 0x043A }, // CYRILLIC CAPITAL LETTER KA + { 0x041B, 0x043B }, // CYRILLIC CAPITAL LETTER EL + { 0x041C, 0x043C }, // CYRILLIC CAPITAL LETTER EM + { 0x041D, 0x043D }, // CYRILLIC CAPITAL LETTER EN + { 0x041E, 0x043E }, // CYRILLIC CAPITAL LETTER O + { 0x041F, 0x043F }, // CYRILLIC CAPITAL LETTER PE + { 0x0420, 0x0440 }, // CYRILLIC CAPITAL LETTER ER + { 0x0421, 0x0441 }, // CYRILLIC CAPITAL LETTER ES + { 0x0422, 0x0442 }, // CYRILLIC CAPITAL LETTER TE + { 0x0423, 0x0443 }, // CYRILLIC CAPITAL LETTER U + { 0x0424, 0x0444 }, // CYRILLIC CAPITAL LETTER EF + { 0x0425, 0x0445 }, // CYRILLIC CAPITAL LETTER HA + { 0x0426, 0x0446 }, // CYRILLIC CAPITAL LETTER TSE + { 0x0427, 0x0447 }, // CYRILLIC CAPITAL LETTER CHE + { 0x0428, 0x0448 }, // CYRILLIC CAPITAL LETTER SHA + { 0x0429, 0x0449 }, // CYRILLIC CAPITAL LETTER SHCHA + { 0x042A, 0x044A }, // CYRILLIC CAPITAL LETTER HARD SIGN + { 0x042B, 0x044B }, // CYRILLIC CAPITAL LETTER YERU + { 0x042C, 0x044C }, // CYRILLIC CAPITAL LETTER SOFT SIGN + { 0x042D, 0x044D }, // CYRILLIC CAPITAL LETTER E + { 0x042E, 0x044E }, // CYRILLIC CAPITAL LETTER YU + { 0x042F, 0x044F }, // CYRILLIC CAPITAL LETTER YA + { 0x0460, 0x0461 }, // CYRILLIC CAPITAL LETTER OMEGA + { 0x0462, 0x0463 }, // CYRILLIC CAPITAL LETTER YAT + { 0x0464, 0x0465 }, // CYRILLIC CAPITAL LETTER IOTIFIED E + { 0x0466, 0x0467 }, // CYRILLIC CAPITAL LETTER LITTLE YUS + { 0x0468, 0x0469 }, // CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS + { 0x046A, 0x046B }, // CYRILLIC CAPITAL LETTER BIG YUS + { 0x046C, 0x046D }, // CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS + { 0x046E, 0x046F }, // CYRILLIC CAPITAL LETTER KSI + { 0x0470, 0x0471 }, // CYRILLIC CAPITAL LETTER PSI + { 0x0472, 0x0473 }, // CYRILLIC CAPITAL LETTER FITA + { 0x0474, 0x0475 }, // CYRILLIC CAPITAL LETTER IZHITSA + { 0x0478, 0x0479 }, // CYRILLIC CAPITAL LETTER UK + { 0x047A, 0x047B }, // CYRILLIC CAPITAL LETTER ROUND OMEGA + { 0x047C, 0x047D }, // CYRILLIC CAPITAL LETTER OMEGA WITH TITLO + { 0x047E, 0x047F }, // CYRILLIC CAPITAL LETTER OT + { 0x0480, 0x0481 }, // CYRILLIC CAPITAL LETTER KOPPA + { 0x048A, 0x048B }, // CYRILLIC CAPITAL LETTER SHORT I WITH TAIL + { 0x048C, 0x048D }, // CYRILLIC CAPITAL LETTER SEMISOFT SIGN + { 0x048E, 0x048F }, // CYRILLIC CAPITAL LETTER ER WITH TICK + { 0x0490, 0x0491 }, // CYRILLIC CAPITAL LETTER GHE WITH UPTURN + { 0x0492, 0x0493 }, // CYRILLIC CAPITAL LETTER GHE WITH STROKE + { 0x0494, 0x0495 }, // CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK + { 0x0496, 0x0497 }, // CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER + { 0x0498, 0x0499 }, // CYRILLIC CAPITAL LETTER ZE WITH DESCENDER + { 0x049A, 0x049B }, // CYRILLIC CAPITAL LETTER KA WITH DESCENDER + { 0x049C, 0x049D }, // CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE + { 0x049E, 0x049F }, // CYRILLIC CAPITAL LETTER KA WITH STROKE + { 0x04A0, 0x04A1 }, // CYRILLIC CAPITAL LETTER BASHKIR KA + { 0x04A2, 0x04A3 }, // CYRILLIC CAPITAL LETTER EN WITH DESCENDER + { 0x04A4, 0x04A5 }, // CYRILLIC CAPITAL LIGATURE EN GHE + { 0x04A6, 0x04A7 }, // CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK + { 0x04A8, 0x04A9 }, // CYRILLIC CAPITAL LETTER ABKHASIAN HA + { 0x04AA, 0x04AB }, // CYRILLIC CAPITAL LETTER ES WITH DESCENDER + { 0x04AC, 0x04AD }, // CYRILLIC CAPITAL LETTER TE WITH DESCENDER + { 0x04AE, 0x04AF }, // CYRILLIC CAPITAL LETTER STRAIGHT U + { 0x04B0, 0x04B1 }, // CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + { 0x04B2, 0x04B3 }, // CYRILLIC CAPITAL LETTER HA WITH DESCENDER + { 0x04B4, 0x04B5 }, // CYRILLIC CAPITAL LIGATURE TE TSE + { 0x04B6, 0x04B7 }, // CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + { 0x04B8, 0x04B9 }, // CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE + { 0x04BA, 0x04BB }, // CYRILLIC CAPITAL LETTER SHHA + { 0x04BC, 0x04BD }, // CYRILLIC CAPITAL LETTER ABKHASIAN CHE + { 0x04BE, 0x04BF }, // CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER + { 0x04C0, 0x04CF }, // CYRILLIC LETTER PALOCHKA + { 0x04C3, 0x04C4 }, // CYRILLIC CAPITAL LETTER KA WITH HOOK + { 0x04C5, 0x04C6 }, // CYRILLIC CAPITAL LETTER EL WITH TAIL + { 0x04C7, 0x04C8 }, // CYRILLIC CAPITAL LETTER EN WITH HOOK + { 0x04C9, 0x04CA }, // CYRILLIC CAPITAL LETTER EN WITH TAIL + { 0x04CB, 0x04CC }, // CYRILLIC CAPITAL LETTER KHAKASSIAN CHE + { 0x04CD, 0x04CE }, // CYRILLIC CAPITAL LETTER EM WITH TAIL + { 0x04D4, 0x04D5 }, // CYRILLIC CAPITAL LIGATURE A IE + { 0x04D8, 0x04D9 }, // CYRILLIC CAPITAL LETTER SCHWA + { 0x04E0, 0x04E1 }, // CYRILLIC CAPITAL LETTER ABKHASIAN DZE + { 0x04E8, 0x04E9 }, // CYRILLIC CAPITAL LETTER BARRED O + { 0x04F6, 0x04F7 }, // CYRILLIC CAPITAL LETTER GHE WITH DESCENDER + { 0x04FA, 0x04FB }, // CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK + { 0x04FC, 0x04FD }, // CYRILLIC CAPITAL LETTER HA WITH HOOK + { 0x04FE, 0x04FF }, // CYRILLIC CAPITAL LETTER HA WITH STROKE + { 0x0500, 0x0501 }, // CYRILLIC CAPITAL LETTER KOMI DE + { 0x0502, 0x0503 }, // CYRILLIC CAPITAL LETTER KOMI DJE + { 0x0504, 0x0505 }, // CYRILLIC CAPITAL LETTER KOMI ZJE + { 0x0506, 0x0507 }, // CYRILLIC CAPITAL LETTER KOMI DZJE + { 0x0508, 0x0509 }, // CYRILLIC CAPITAL LETTER KOMI LJE + { 0x050A, 0x050B }, // CYRILLIC CAPITAL LETTER KOMI NJE + { 0x050C, 0x050D }, // CYRILLIC CAPITAL LETTER KOMI SJE + { 0x050E, 0x050F }, // CYRILLIC CAPITAL LETTER KOMI TJE + { 0x0510, 0x0511 }, // CYRILLIC CAPITAL LETTER REVERSED ZE + { 0x0512, 0x0513 }, // CYRILLIC CAPITAL LETTER EL WITH HOOK + { 0x0514, 0x0515 }, // CYRILLIC CAPITAL LETTER LHA + { 0x0516, 0x0517 }, // CYRILLIC CAPITAL LETTER RHA + { 0x0518, 0x0519 }, // CYRILLIC CAPITAL LETTER YAE + { 0x051A, 0x051B }, // CYRILLIC CAPITAL LETTER QA + { 0x051C, 0x051D }, // CYRILLIC CAPITAL LETTER WE + { 0x051E, 0x051F }, // CYRILLIC CAPITAL LETTER ALEUT KA + { 0x0520, 0x0521 }, // CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK + { 0x0522, 0x0523 }, // CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK + { 0x0524, 0x0525 }, // CYRILLIC CAPITAL LETTER PE WITH DESCENDER + { 0x0531, 0x0561 }, // ARMENIAN CAPITAL LETTER AYB + { 0x0532, 0x0562 }, // ARMENIAN CAPITAL LETTER BEN + { 0x0533, 0x0563 }, // ARMENIAN CAPITAL LETTER GIM + { 0x0534, 0x0564 }, // ARMENIAN CAPITAL LETTER DA + { 0x0535, 0x0565 }, // ARMENIAN CAPITAL LETTER ECH + { 0x0536, 0x0566 }, // ARMENIAN CAPITAL LETTER ZA + { 0x0537, 0x0567 }, // ARMENIAN CAPITAL LETTER EH + { 0x0538, 0x0568 }, // ARMENIAN CAPITAL LETTER ET + { 0x0539, 0x0569 }, // ARMENIAN CAPITAL LETTER TO + { 0x053A, 0x056A }, // ARMENIAN CAPITAL LETTER ZHE + { 0x053B, 0x056B }, // ARMENIAN CAPITAL LETTER INI + { 0x053C, 0x056C }, // ARMENIAN CAPITAL LETTER LIWN + { 0x053D, 0x056D }, // ARMENIAN CAPITAL LETTER XEH + { 0x053E, 0x056E }, // ARMENIAN CAPITAL LETTER CA + { 0x053F, 0x056F }, // ARMENIAN CAPITAL LETTER KEN + { 0x0540, 0x0570 }, // ARMENIAN CAPITAL LETTER HO + { 0x0541, 0x0571 }, // ARMENIAN CAPITAL LETTER JA + { 0x0542, 0x0572 }, // ARMENIAN CAPITAL LETTER GHAD + { 0x0543, 0x0573 }, // ARMENIAN CAPITAL LETTER CHEH + { 0x0544, 0x0574 }, // ARMENIAN CAPITAL LETTER MEN + { 0x0545, 0x0575 }, // ARMENIAN CAPITAL LETTER YI + { 0x0546, 0x0576 }, // ARMENIAN CAPITAL LETTER NOW + { 0x0547, 0x0577 }, // ARMENIAN CAPITAL LETTER SHA + { 0x0548, 0x0578 }, // ARMENIAN CAPITAL LETTER VO + { 0x0549, 0x0579 }, // ARMENIAN CAPITAL LETTER CHA + { 0x054A, 0x057A }, // ARMENIAN CAPITAL LETTER PEH + { 0x054B, 0x057B }, // ARMENIAN CAPITAL LETTER JHEH + { 0x054C, 0x057C }, // ARMENIAN CAPITAL LETTER RA + { 0x054D, 0x057D }, // ARMENIAN CAPITAL LETTER SEH + { 0x054E, 0x057E }, // ARMENIAN CAPITAL LETTER VEW + { 0x054F, 0x057F }, // ARMENIAN CAPITAL LETTER TIWN + { 0x0550, 0x0580 }, // ARMENIAN CAPITAL LETTER REH + { 0x0551, 0x0581 }, // ARMENIAN CAPITAL LETTER CO + { 0x0552, 0x0582 }, // ARMENIAN CAPITAL LETTER YIWN + { 0x0553, 0x0583 }, // ARMENIAN CAPITAL LETTER PIWR + { 0x0554, 0x0584 }, // ARMENIAN CAPITAL LETTER KEH + { 0x0555, 0x0585 }, // ARMENIAN CAPITAL LETTER OH + { 0x0556, 0x0586 }, // ARMENIAN CAPITAL LETTER FEH + { 0x10A0, 0x2D00 }, // GEORGIAN CAPITAL LETTER AN + { 0x10A1, 0x2D01 }, // GEORGIAN CAPITAL LETTER BAN + { 0x10A2, 0x2D02 }, // GEORGIAN CAPITAL LETTER GAN + { 0x10A3, 0x2D03 }, // GEORGIAN CAPITAL LETTER DON + { 0x10A4, 0x2D04 }, // GEORGIAN CAPITAL LETTER EN + { 0x10A5, 0x2D05 }, // GEORGIAN CAPITAL LETTER VIN + { 0x10A6, 0x2D06 }, // GEORGIAN CAPITAL LETTER ZEN + { 0x10A7, 0x2D07 }, // GEORGIAN CAPITAL LETTER TAN + { 0x10A8, 0x2D08 }, // GEORGIAN CAPITAL LETTER IN + { 0x10A9, 0x2D09 }, // GEORGIAN CAPITAL LETTER KAN + { 0x10AA, 0x2D0A }, // GEORGIAN CAPITAL LETTER LAS + { 0x10AB, 0x2D0B }, // GEORGIAN CAPITAL LETTER MAN + { 0x10AC, 0x2D0C }, // GEORGIAN CAPITAL LETTER NAR + { 0x10AD, 0x2D0D }, // GEORGIAN CAPITAL LETTER ON + { 0x10AE, 0x2D0E }, // GEORGIAN CAPITAL LETTER PAR + { 0x10AF, 0x2D0F }, // GEORGIAN CAPITAL LETTER ZHAR + { 0x10B0, 0x2D10 }, // GEORGIAN CAPITAL LETTER RAE + { 0x10B1, 0x2D11 }, // GEORGIAN CAPITAL LETTER SAN + { 0x10B2, 0x2D12 }, // GEORGIAN CAPITAL LETTER TAR + { 0x10B3, 0x2D13 }, // GEORGIAN CAPITAL LETTER UN + { 0x10B4, 0x2D14 }, // GEORGIAN CAPITAL LETTER PHAR + { 0x10B5, 0x2D15 }, // GEORGIAN CAPITAL LETTER KHAR + { 0x10B6, 0x2D16 }, // GEORGIAN CAPITAL LETTER GHAN + { 0x10B7, 0x2D17 }, // GEORGIAN CAPITAL LETTER QAR + { 0x10B8, 0x2D18 }, // GEORGIAN CAPITAL LETTER SHIN + { 0x10B9, 0x2D19 }, // GEORGIAN CAPITAL LETTER CHIN + { 0x10BA, 0x2D1A }, // GEORGIAN CAPITAL LETTER CAN + { 0x10BB, 0x2D1B }, // GEORGIAN CAPITAL LETTER JIL + { 0x10BC, 0x2D1C }, // GEORGIAN CAPITAL LETTER CIL + { 0x10BD, 0x2D1D }, // GEORGIAN CAPITAL LETTER CHAR + { 0x10BE, 0x2D1E }, // GEORGIAN CAPITAL LETTER XAN + { 0x10BF, 0x2D1F }, // GEORGIAN CAPITAL LETTER JHAN + { 0x10C0, 0x2D20 }, // GEORGIAN CAPITAL LETTER HAE + { 0x10C1, 0x2D21 }, // GEORGIAN CAPITAL LETTER HE + { 0x10C2, 0x2D22 }, // GEORGIAN CAPITAL LETTER HIE + { 0x10C3, 0x2D23 }, // GEORGIAN CAPITAL LETTER WE + { 0x10C4, 0x2D24 }, // GEORGIAN CAPITAL LETTER HAR + { 0x10C5, 0x2D25 }, // GEORGIAN CAPITAL LETTER HOE + { 0x1E00, 0x1E01 }, // LATIN CAPITAL LETTER A WITH RING BELOW + { 0x1E02, 0x1E03 }, // LATIN CAPITAL LETTER B WITH DOT ABOVE + { 0x1E04, 0x1E05 }, // LATIN CAPITAL LETTER B WITH DOT BELOW + { 0x1E06, 0x1E07 }, // LATIN CAPITAL LETTER B WITH LINE BELOW + { 0x1E08, 0x1E09 }, // LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + { 0x1E0A, 0x1E0B }, // LATIN CAPITAL LETTER D WITH DOT ABOVE + { 0x1E0C, 0x1E0D }, // LATIN CAPITAL LETTER D WITH DOT BELOW + { 0x1E0E, 0x1E0F }, // LATIN CAPITAL LETTER D WITH LINE BELOW + { 0x1E10, 0x1E11 }, // LATIN CAPITAL LETTER D WITH CEDILLA + { 0x1E12, 0x1E13 }, // LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW + { 0x1E14, 0x1E15 }, // LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + { 0x1E16, 0x1E17 }, // LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + { 0x1E18, 0x1E19 }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW + { 0x1E1A, 0x1E1B }, // LATIN CAPITAL LETTER E WITH TILDE BELOW + { 0x1E1C, 0x1E1D }, // LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + { 0x1E1E, 0x1E1F }, // LATIN CAPITAL LETTER F WITH DOT ABOVE + { 0x1E20, 0x1E21 }, // LATIN CAPITAL LETTER G WITH MACRON + { 0x1E22, 0x1E23 }, // LATIN CAPITAL LETTER H WITH DOT ABOVE + { 0x1E24, 0x1E25 }, // LATIN CAPITAL LETTER H WITH DOT BELOW + { 0x1E26, 0x1E27 }, // LATIN CAPITAL LETTER H WITH DIAERESIS + { 0x1E28, 0x1E29 }, // LATIN CAPITAL LETTER H WITH CEDILLA + { 0x1E2A, 0x1E2B }, // LATIN CAPITAL LETTER H WITH BREVE BELOW + { 0x1E2C, 0x1E2D }, // LATIN CAPITAL LETTER I WITH TILDE BELOW + { 0x1E2E, 0x1E2F }, // LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + { 0x1E30, 0x1E31 }, // LATIN CAPITAL LETTER K WITH ACUTE + { 0x1E32, 0x1E33 }, // LATIN CAPITAL LETTER K WITH DOT BELOW + { 0x1E34, 0x1E35 }, // LATIN CAPITAL LETTER K WITH LINE BELOW + { 0x1E36, 0x1E37 }, // LATIN CAPITAL LETTER L WITH DOT BELOW + { 0x1E38, 0x1E39 }, // LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + { 0x1E3A, 0x1E3B }, // LATIN CAPITAL LETTER L WITH LINE BELOW + { 0x1E3C, 0x1E3D }, // LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW + { 0x1E3E, 0x1E3F }, // LATIN CAPITAL LETTER M WITH ACUTE + { 0x1E40, 0x1E41 }, // LATIN CAPITAL LETTER M WITH DOT ABOVE + { 0x1E42, 0x1E43 }, // LATIN CAPITAL LETTER M WITH DOT BELOW + { 0x1E44, 0x1E45 }, // LATIN CAPITAL LETTER N WITH DOT ABOVE + { 0x1E46, 0x1E47 }, // LATIN CAPITAL LETTER N WITH DOT BELOW + { 0x1E48, 0x1E49 }, // LATIN CAPITAL LETTER N WITH LINE BELOW + { 0x1E4A, 0x1E4B }, // LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW + { 0x1E4C, 0x1E4D }, // LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + { 0x1E4E, 0x1E4F }, // LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + { 0x1E50, 0x1E51 }, // LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + { 0x1E52, 0x1E53 }, // LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + { 0x1E54, 0x1E55 }, // LATIN CAPITAL LETTER P WITH ACUTE + { 0x1E56, 0x1E57 }, // LATIN CAPITAL LETTER P WITH DOT ABOVE + { 0x1E58, 0x1E59 }, // LATIN CAPITAL LETTER R WITH DOT ABOVE + { 0x1E5A, 0x1E5B }, // LATIN CAPITAL LETTER R WITH DOT BELOW + { 0x1E5C, 0x1E5D }, // LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + { 0x1E5E, 0x1E5F }, // LATIN CAPITAL LETTER R WITH LINE BELOW + { 0x1E60, 0x1E61 }, // LATIN CAPITAL LETTER S WITH DOT ABOVE + { 0x1E62, 0x1E63 }, // LATIN CAPITAL LETTER S WITH DOT BELOW + { 0x1E64, 0x1E65 }, // LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + { 0x1E66, 0x1E67 }, // LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + { 0x1E68, 0x1E69 }, // LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + { 0x1E6A, 0x1E6B }, // LATIN CAPITAL LETTER T WITH DOT ABOVE + { 0x1E6C, 0x1E6D }, // LATIN CAPITAL LETTER T WITH DOT BELOW + { 0x1E6E, 0x1E6F }, // LATIN CAPITAL LETTER T WITH LINE BELOW + { 0x1E70, 0x1E71 }, // LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW + { 0x1E72, 0x1E73 }, // LATIN CAPITAL LETTER U WITH DIAERESIS BELOW + { 0x1E74, 0x1E75 }, // LATIN CAPITAL LETTER U WITH TILDE BELOW + { 0x1E76, 0x1E77 }, // LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW + { 0x1E78, 0x1E79 }, // LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + { 0x1E7A, 0x1E7B }, // LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + { 0x1E7C, 0x1E7D }, // LATIN CAPITAL LETTER V WITH TILDE + { 0x1E7E, 0x1E7F }, // LATIN CAPITAL LETTER V WITH DOT BELOW + { 0x1E80, 0x1E81 }, // LATIN CAPITAL LETTER W WITH GRAVE + { 0x1E82, 0x1E83 }, // LATIN CAPITAL LETTER W WITH ACUTE + { 0x1E84, 0x1E85 }, // LATIN CAPITAL LETTER W WITH DIAERESIS + { 0x1E86, 0x1E87 }, // LATIN CAPITAL LETTER W WITH DOT ABOVE + { 0x1E88, 0x1E89 }, // LATIN CAPITAL LETTER W WITH DOT BELOW + { 0x1E8A, 0x1E8B }, // LATIN CAPITAL LETTER X WITH DOT ABOVE + { 0x1E8C, 0x1E8D }, // LATIN CAPITAL LETTER X WITH DIAERESIS + { 0x1E8E, 0x1E8F }, // LATIN CAPITAL LETTER Y WITH DOT ABOVE + { 0x1E90, 0x1E91 }, // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX + { 0x1E92, 0x1E93 }, // LATIN CAPITAL LETTER Z WITH DOT BELOW + { 0x1E94, 0x1E95 }, // LATIN CAPITAL LETTER Z WITH LINE BELOW + { 0x1E9E, 0x00DF }, // LATIN CAPITAL LETTER SHARP S + { 0x1EA0, 0x1EA1 }, // LATIN CAPITAL LETTER A WITH DOT BELOW + { 0x1EA2, 0x1EA3 }, // LATIN CAPITAL LETTER A WITH HOOK ABOVE + { 0x1EA4, 0x1EA5 }, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + { 0x1EA6, 0x1EA7 }, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + { 0x1EA8, 0x1EA9 }, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + { 0x1EAA, 0x1EAB }, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + { 0x1EAC, 0x1EAD }, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + { 0x1EAE, 0x1EAF }, // LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + { 0x1EB0, 0x1EB1 }, // LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + { 0x1EB2, 0x1EB3 }, // LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + { 0x1EB4, 0x1EB5 }, // LATIN CAPITAL LETTER A WITH BREVE AND TILDE + { 0x1EB6, 0x1EB7 }, // LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + { 0x1EB8, 0x1EB9 }, // LATIN CAPITAL LETTER E WITH DOT BELOW + { 0x1EBA, 0x1EBB }, // LATIN CAPITAL LETTER E WITH HOOK ABOVE + { 0x1EBC, 0x1EBD }, // LATIN CAPITAL LETTER E WITH TILDE + { 0x1EBE, 0x1EBF }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + { 0x1EC0, 0x1EC1 }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + { 0x1EC2, 0x1EC3 }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + { 0x1EC4, 0x1EC5 }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + { 0x1EC6, 0x1EC7 }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + { 0x1EC8, 0x1EC9 }, // LATIN CAPITAL LETTER I WITH HOOK ABOVE + { 0x1ECA, 0x1ECB }, // LATIN CAPITAL LETTER I WITH DOT BELOW + { 0x1ECC, 0x1ECD }, // LATIN CAPITAL LETTER O WITH DOT BELOW + { 0x1ECE, 0x1ECF }, // LATIN CAPITAL LETTER O WITH HOOK ABOVE + { 0x1ED0, 0x1ED1 }, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + { 0x1ED2, 0x1ED3 }, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + { 0x1ED4, 0x1ED5 }, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + { 0x1ED6, 0x1ED7 }, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + { 0x1ED8, 0x1ED9 }, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + { 0x1EDA, 0x1EDB }, // LATIN CAPITAL LETTER O WITH HORN AND ACUTE + { 0x1EDC, 0x1EDD }, // LATIN CAPITAL LETTER O WITH HORN AND GRAVE + { 0x1EDE, 0x1EDF }, // LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + { 0x1EE0, 0x1EE1 }, // LATIN CAPITAL LETTER O WITH HORN AND TILDE + { 0x1EE2, 0x1EE3 }, // LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + { 0x1EE4, 0x1EE5 }, // LATIN CAPITAL LETTER U WITH DOT BELOW + { 0x1EE6, 0x1EE7 }, // LATIN CAPITAL LETTER U WITH HOOK ABOVE + { 0x1EE8, 0x1EE9 }, // LATIN CAPITAL LETTER U WITH HORN AND ACUTE + { 0x1EEA, 0x1EEB }, // LATIN CAPITAL LETTER U WITH HORN AND GRAVE + { 0x1EEC, 0x1EED }, // LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + { 0x1EEE, 0x1EEF }, // LATIN CAPITAL LETTER U WITH HORN AND TILDE + { 0x1EF0, 0x1EF1 }, // LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + { 0x1EF2, 0x1EF3 }, // LATIN CAPITAL LETTER Y WITH GRAVE + { 0x1EF4, 0x1EF5 }, // LATIN CAPITAL LETTER Y WITH DOT BELOW + { 0x1EF6, 0x1EF7 }, // LATIN CAPITAL LETTER Y WITH HOOK ABOVE + { 0x1EF8, 0x1EF9 }, // LATIN CAPITAL LETTER Y WITH TILDE + { 0x1EFA, 0x1EFB }, // LATIN CAPITAL LETTER MIDDLE-WELSH LL + { 0x1EFC, 0x1EFD }, // LATIN CAPITAL LETTER MIDDLE-WELSH V + { 0x1EFE, 0x1EFF }, // LATIN CAPITAL LETTER Y WITH LOOP + { 0x1F08, 0x1F00 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI + { 0x1F09, 0x1F01 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA + { 0x1F0A, 0x1F02 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA + { 0x1F0B, 0x1F03 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA + { 0x1F0C, 0x1F04 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + { 0x1F0D, 0x1F05 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + { 0x1F0E, 0x1F06 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + { 0x1F0F, 0x1F07 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + { 0x1F18, 0x1F10 }, // GREEK CAPITAL LETTER EPSILON WITH PSILI + { 0x1F19, 0x1F11 }, // GREEK CAPITAL LETTER EPSILON WITH DASIA + { 0x1F1A, 0x1F12 }, // GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA + { 0x1F1B, 0x1F13 }, // GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA + { 0x1F1C, 0x1F14 }, // GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + { 0x1F1D, 0x1F15 }, // GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + { 0x1F28, 0x1F20 }, // GREEK CAPITAL LETTER ETA WITH PSILI + { 0x1F29, 0x1F21 }, // GREEK CAPITAL LETTER ETA WITH DASIA + { 0x1F2A, 0x1F22 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + { 0x1F2B, 0x1F23 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA + { 0x1F2C, 0x1F24 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + { 0x1F2D, 0x1F25 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + { 0x1F2E, 0x1F26 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + { 0x1F2F, 0x1F27 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + { 0x1F38, 0x1F30 }, // GREEK CAPITAL LETTER IOTA WITH PSILI + { 0x1F39, 0x1F31 }, // GREEK CAPITAL LETTER IOTA WITH DASIA + { 0x1F3A, 0x1F32 }, // GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA + { 0x1F3B, 0x1F33 }, // GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA + { 0x1F3C, 0x1F34 }, // GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + { 0x1F3D, 0x1F35 }, // GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + { 0x1F3E, 0x1F36 }, // GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI + { 0x1F3F, 0x1F37 }, // GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + { 0x1F48, 0x1F40 }, // GREEK CAPITAL LETTER OMICRON WITH PSILI + { 0x1F49, 0x1F41 }, // GREEK CAPITAL LETTER OMICRON WITH DASIA + { 0x1F4A, 0x1F42 }, // GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA + { 0x1F4B, 0x1F43 }, // GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA + { 0x1F4C, 0x1F44 }, // GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + { 0x1F4D, 0x1F45 }, // GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + { 0x1F59, 0x1F51 }, // GREEK CAPITAL LETTER UPSILON WITH DASIA + { 0x1F5B, 0x1F53 }, // GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + { 0x1F5D, 0x1F55 }, // GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + { 0x1F5F, 0x1F57 }, // GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + { 0x1F68, 0x1F60 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI + { 0x1F69, 0x1F61 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA + { 0x1F6A, 0x1F62 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA + { 0x1F6B, 0x1F63 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA + { 0x1F6C, 0x1F64 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + { 0x1F6D, 0x1F65 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + { 0x1F6E, 0x1F66 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + { 0x1F6F, 0x1F67 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + { 0x1F88, 0x1F80 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + { 0x1F89, 0x1F81 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI + { 0x1F8A, 0x1F82 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + { 0x1F8B, 0x1F83 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + { 0x1F8C, 0x1F84 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + { 0x1F8D, 0x1F85 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + { 0x1F8E, 0x1F86 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1F8F, 0x1F87 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1F98, 0x1F90 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + { 0x1F99, 0x1F91 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + { 0x1F9A, 0x1F92 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + { 0x1F9B, 0x1F93 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + { 0x1F9C, 0x1F94 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + { 0x1F9D, 0x1F95 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + { 0x1F9E, 0x1F96 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1F9F, 0x1F97 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1FA8, 0x1FA0 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI + { 0x1FA9, 0x1FA1 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI + { 0x1FAA, 0x1FA2 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + { 0x1FAB, 0x1FA3 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + { 0x1FAC, 0x1FA4 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + { 0x1FAD, 0x1FA5 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + { 0x1FAE, 0x1FA6 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1FAF, 0x1FA7 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1FB8, 0x1FB0 }, // GREEK CAPITAL LETTER ALPHA WITH VRACHY + { 0x1FB9, 0x1FB1 }, // GREEK CAPITAL LETTER ALPHA WITH MACRON + { 0x1FBA, 0x1F70 }, // GREEK CAPITAL LETTER ALPHA WITH VARIA + { 0x1FBB, 0x1F71 }, // GREEK CAPITAL LETTER ALPHA WITH OXIA + { 0x1FBC, 0x1FB3 }, // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + { 0x1FC8, 0x1F72 }, // GREEK CAPITAL LETTER EPSILON WITH VARIA + { 0x1FC9, 0x1F73 }, // GREEK CAPITAL LETTER EPSILON WITH OXIA + { 0x1FCA, 0x1F74 }, // GREEK CAPITAL LETTER ETA WITH VARIA + { 0x1FCB, 0x1F75 }, // GREEK CAPITAL LETTER ETA WITH OXIA + { 0x1FCC, 0x1FC3 }, // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + { 0x1FD8, 0x1FD0 }, // GREEK CAPITAL LETTER IOTA WITH VRACHY + { 0x1FD9, 0x1FD1 }, // GREEK CAPITAL LETTER IOTA WITH MACRON + { 0x1FDA, 0x1F76 }, // GREEK CAPITAL LETTER IOTA WITH VARIA + { 0x1FDB, 0x1F77 }, // GREEK CAPITAL LETTER IOTA WITH OXIA + { 0x1FE8, 0x1FE0 }, // GREEK CAPITAL LETTER UPSILON WITH VRACHY + { 0x1FE9, 0x1FE1 }, // GREEK CAPITAL LETTER UPSILON WITH MACRON + { 0x1FEA, 0x1F7A }, // GREEK CAPITAL LETTER UPSILON WITH VARIA + { 0x1FEB, 0x1F7B }, // GREEK CAPITAL LETTER UPSILON WITH OXIA + { 0x1FEC, 0x1FE5 }, // GREEK CAPITAL LETTER RHO WITH DASIA + { 0x1FF8, 0x1F78 }, // GREEK CAPITAL LETTER OMICRON WITH VARIA + { 0x1FF9, 0x1F79 }, // GREEK CAPITAL LETTER OMICRON WITH OXIA + { 0x1FFA, 0x1F7C }, // GREEK CAPITAL LETTER OMEGA WITH VARIA + { 0x1FFB, 0x1F7D }, // GREEK CAPITAL LETTER OMEGA WITH OXIA + { 0x1FFC, 0x1FF3 }, // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + { 0x2126, 0x03C9 }, // OHM SIGN + { 0x212A, 0x006B }, // KELVIN SIGN + { 0x212B, 0x00E5 }, // ANGSTROM SIGN + { 0x2132, 0x214E }, // TURNED CAPITAL F + { 0x2160, 0x2170 }, // ROMAN NUMERAL ONE + { 0x2161, 0x2171 }, // ROMAN NUMERAL TWO + { 0x2162, 0x2172 }, // ROMAN NUMERAL THREE + { 0x2163, 0x2173 }, // ROMAN NUMERAL FOUR + { 0x2164, 0x2174 }, // ROMAN NUMERAL FIVE + { 0x2165, 0x2175 }, // ROMAN NUMERAL SIX + { 0x2166, 0x2176 }, // ROMAN NUMERAL SEVEN + { 0x2167, 0x2177 }, // ROMAN NUMERAL EIGHT + { 0x2168, 0x2178 }, // ROMAN NUMERAL NINE + { 0x2169, 0x2179 }, // ROMAN NUMERAL TEN + { 0x216A, 0x217A }, // ROMAN NUMERAL ELEVEN + { 0x216B, 0x217B }, // ROMAN NUMERAL TWELVE + { 0x216C, 0x217C }, // ROMAN NUMERAL FIFTY + { 0x216D, 0x217D }, // ROMAN NUMERAL ONE HUNDRED + { 0x216E, 0x217E }, // ROMAN NUMERAL FIVE HUNDRED + { 0x216F, 0x217F }, // ROMAN NUMERAL ONE THOUSAND + { 0x2183, 0x2184 }, // ROMAN NUMERAL REVERSED ONE HUNDRED + { 0x24B6, 0x24D0 }, // CIRCLED LATIN CAPITAL LETTER A + { 0x24B7, 0x24D1 }, // CIRCLED LATIN CAPITAL LETTER B + { 0x24B8, 0x24D2 }, // CIRCLED LATIN CAPITAL LETTER C + { 0x24B9, 0x24D3 }, // CIRCLED LATIN CAPITAL LETTER D + { 0x24BA, 0x24D4 }, // CIRCLED LATIN CAPITAL LETTER E + { 0x24BB, 0x24D5 }, // CIRCLED LATIN CAPITAL LETTER F + { 0x24BC, 0x24D6 }, // CIRCLED LATIN CAPITAL LETTER G + { 0x24BD, 0x24D7 }, // CIRCLED LATIN CAPITAL LETTER H + { 0x24BE, 0x24D8 }, // CIRCLED LATIN CAPITAL LETTER I + { 0x24BF, 0x24D9 }, // CIRCLED LATIN CAPITAL LETTER J + { 0x24C0, 0x24DA }, // CIRCLED LATIN CAPITAL LETTER K + { 0x24C1, 0x24DB }, // CIRCLED LATIN CAPITAL LETTER L + { 0x24C2, 0x24DC }, // CIRCLED LATIN CAPITAL LETTER M + { 0x24C3, 0x24DD }, // CIRCLED LATIN CAPITAL LETTER N + { 0x24C4, 0x24DE }, // CIRCLED LATIN CAPITAL LETTER O + { 0x24C5, 0x24DF }, // CIRCLED LATIN CAPITAL LETTER P + { 0x24C6, 0x24E0 }, // CIRCLED LATIN CAPITAL LETTER Q + { 0x24C7, 0x24E1 }, // CIRCLED LATIN CAPITAL LETTER R + { 0x24C8, 0x24E2 }, // CIRCLED LATIN CAPITAL LETTER S + { 0x24C9, 0x24E3 }, // CIRCLED LATIN CAPITAL LETTER T + { 0x24CA, 0x24E4 }, // CIRCLED LATIN CAPITAL LETTER U + { 0x24CB, 0x24E5 }, // CIRCLED LATIN CAPITAL LETTER V + { 0x24CC, 0x24E6 }, // CIRCLED LATIN CAPITAL LETTER W + { 0x24CD, 0x24E7 }, // CIRCLED LATIN CAPITAL LETTER X + { 0x24CE, 0x24E8 }, // CIRCLED LATIN CAPITAL LETTER Y + { 0x24CF, 0x24E9 }, // CIRCLED LATIN CAPITAL LETTER Z + { 0x2C00, 0x2C30 }, // GLAGOLITIC CAPITAL LETTER AZU + { 0x2C01, 0x2C31 }, // GLAGOLITIC CAPITAL LETTER BUKY + { 0x2C02, 0x2C32 }, // GLAGOLITIC CAPITAL LETTER VEDE + { 0x2C03, 0x2C33 }, // GLAGOLITIC CAPITAL LETTER GLAGOLI + { 0x2C04, 0x2C34 }, // GLAGOLITIC CAPITAL LETTER DOBRO + { 0x2C05, 0x2C35 }, // GLAGOLITIC CAPITAL LETTER YESTU + { 0x2C06, 0x2C36 }, // GLAGOLITIC CAPITAL LETTER ZHIVETE + { 0x2C07, 0x2C37 }, // GLAGOLITIC CAPITAL LETTER DZELO + { 0x2C08, 0x2C38 }, // GLAGOLITIC CAPITAL LETTER ZEMLJA + { 0x2C09, 0x2C39 }, // GLAGOLITIC CAPITAL LETTER IZHE + { 0x2C0A, 0x2C3A }, // GLAGOLITIC CAPITAL LETTER INITIAL IZHE + { 0x2C0B, 0x2C3B }, // GLAGOLITIC CAPITAL LETTER I + { 0x2C0C, 0x2C3C }, // GLAGOLITIC CAPITAL LETTER DJERVI + { 0x2C0D, 0x2C3D }, // GLAGOLITIC CAPITAL LETTER KAKO + { 0x2C0E, 0x2C3E }, // GLAGOLITIC CAPITAL LETTER LJUDIJE + { 0x2C0F, 0x2C3F }, // GLAGOLITIC CAPITAL LETTER MYSLITE + { 0x2C10, 0x2C40 }, // GLAGOLITIC CAPITAL LETTER NASHI + { 0x2C11, 0x2C41 }, // GLAGOLITIC CAPITAL LETTER ONU + { 0x2C12, 0x2C42 }, // GLAGOLITIC CAPITAL LETTER POKOJI + { 0x2C13, 0x2C43 }, // GLAGOLITIC CAPITAL LETTER RITSI + { 0x2C14, 0x2C44 }, // GLAGOLITIC CAPITAL LETTER SLOVO + { 0x2C15, 0x2C45 }, // GLAGOLITIC CAPITAL LETTER TVRIDO + { 0x2C16, 0x2C46 }, // GLAGOLITIC CAPITAL LETTER UKU + { 0x2C17, 0x2C47 }, // GLAGOLITIC CAPITAL LETTER FRITU + { 0x2C18, 0x2C48 }, // GLAGOLITIC CAPITAL LETTER HERU + { 0x2C19, 0x2C49 }, // GLAGOLITIC CAPITAL LETTER OTU + { 0x2C1A, 0x2C4A }, // GLAGOLITIC CAPITAL LETTER PE + { 0x2C1B, 0x2C4B }, // GLAGOLITIC CAPITAL LETTER SHTA + { 0x2C1C, 0x2C4C }, // GLAGOLITIC CAPITAL LETTER TSI + { 0x2C1D, 0x2C4D }, // GLAGOLITIC CAPITAL LETTER CHRIVI + { 0x2C1E, 0x2C4E }, // GLAGOLITIC CAPITAL LETTER SHA + { 0x2C1F, 0x2C4F }, // GLAGOLITIC CAPITAL LETTER YERU + { 0x2C20, 0x2C50 }, // GLAGOLITIC CAPITAL LETTER YERI + { 0x2C21, 0x2C51 }, // GLAGOLITIC CAPITAL LETTER YATI + { 0x2C22, 0x2C52 }, // GLAGOLITIC CAPITAL LETTER SPIDERY HA + { 0x2C23, 0x2C53 }, // GLAGOLITIC CAPITAL LETTER YU + { 0x2C24, 0x2C54 }, // GLAGOLITIC CAPITAL LETTER SMALL YUS + { 0x2C25, 0x2C55 }, // GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL + { 0x2C26, 0x2C56 }, // GLAGOLITIC CAPITAL LETTER YO + { 0x2C27, 0x2C57 }, // GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS + { 0x2C28, 0x2C58 }, // GLAGOLITIC CAPITAL LETTER BIG YUS + { 0x2C29, 0x2C59 }, // GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS + { 0x2C2A, 0x2C5A }, // GLAGOLITIC CAPITAL LETTER FITA + { 0x2C2B, 0x2C5B }, // GLAGOLITIC CAPITAL LETTER IZHITSA + { 0x2C2C, 0x2C5C }, // GLAGOLITIC CAPITAL LETTER SHTAPIC + { 0x2C2D, 0x2C5D }, // GLAGOLITIC CAPITAL LETTER TROKUTASTI A + { 0x2C2E, 0x2C5E }, // GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE + { 0x2C60, 0x2C61 }, // LATIN CAPITAL LETTER L WITH DOUBLE BAR + { 0x2C62, 0x026B }, // LATIN CAPITAL LETTER L WITH MIDDLE TILDE + { 0x2C63, 0x1D7D }, // LATIN CAPITAL LETTER P WITH STROKE + { 0x2C64, 0x027D }, // LATIN CAPITAL LETTER R WITH TAIL + { 0x2C67, 0x2C68 }, // LATIN CAPITAL LETTER H WITH DESCENDER + { 0x2C69, 0x2C6A }, // LATIN CAPITAL LETTER K WITH DESCENDER + { 0x2C6B, 0x2C6C }, // LATIN CAPITAL LETTER Z WITH DESCENDER + { 0x2C6D, 0x0251 }, // LATIN CAPITAL LETTER ALPHA + { 0x2C6E, 0x0271 }, // LATIN CAPITAL LETTER M WITH HOOK + { 0x2C6F, 0x0250 }, // LATIN CAPITAL LETTER TURNED A + { 0x2C70, 0x0252 }, // LATIN CAPITAL LETTER TURNED ALPHA + { 0x2C72, 0x2C73 }, // LATIN CAPITAL LETTER W WITH HOOK + { 0x2C75, 0x2C76 }, // LATIN CAPITAL LETTER HALF H + { 0x2C7E, 0x023F }, // LATIN CAPITAL LETTER S WITH SWASH TAIL + { 0x2C7F, 0x0240 }, // LATIN CAPITAL LETTER Z WITH SWASH TAIL + { 0x2C80, 0x2C81 }, // COPTIC CAPITAL LETTER ALFA + { 0x2C82, 0x2C83 }, // COPTIC CAPITAL LETTER VIDA + { 0x2C84, 0x2C85 }, // COPTIC CAPITAL LETTER GAMMA + { 0x2C86, 0x2C87 }, // COPTIC CAPITAL LETTER DALDA + { 0x2C88, 0x2C89 }, // COPTIC CAPITAL LETTER EIE + { 0x2C8A, 0x2C8B }, // COPTIC CAPITAL LETTER SOU + { 0x2C8C, 0x2C8D }, // COPTIC CAPITAL LETTER ZATA + { 0x2C8E, 0x2C8F }, // COPTIC CAPITAL LETTER HATE + { 0x2C90, 0x2C91 }, // COPTIC CAPITAL LETTER THETHE + { 0x2C92, 0x2C93 }, // COPTIC CAPITAL LETTER IAUDA + { 0x2C94, 0x2C95 }, // COPTIC CAPITAL LETTER KAPA + { 0x2C96, 0x2C97 }, // COPTIC CAPITAL LETTER LAULA + { 0x2C98, 0x2C99 }, // COPTIC CAPITAL LETTER MI + { 0x2C9A, 0x2C9B }, // COPTIC CAPITAL LETTER NI + { 0x2C9C, 0x2C9D }, // COPTIC CAPITAL LETTER KSI + { 0x2C9E, 0x2C9F }, // COPTIC CAPITAL LETTER O + { 0x2CA0, 0x2CA1 }, // COPTIC CAPITAL LETTER PI + { 0x2CA2, 0x2CA3 }, // COPTIC CAPITAL LETTER RO + { 0x2CA4, 0x2CA5 }, // COPTIC CAPITAL LETTER SIMA + { 0x2CA6, 0x2CA7 }, // COPTIC CAPITAL LETTER TAU + { 0x2CA8, 0x2CA9 }, // COPTIC CAPITAL LETTER UA + { 0x2CAA, 0x2CAB }, // COPTIC CAPITAL LETTER FI + { 0x2CAC, 0x2CAD }, // COPTIC CAPITAL LETTER KHI + { 0x2CAE, 0x2CAF }, // COPTIC CAPITAL LETTER PSI + { 0x2CB0, 0x2CB1 }, // COPTIC CAPITAL LETTER OOU + { 0x2CB2, 0x2CB3 }, // COPTIC CAPITAL LETTER DIALECT-P ALEF + { 0x2CB4, 0x2CB5 }, // COPTIC CAPITAL LETTER OLD COPTIC AIN + { 0x2CB6, 0x2CB7 }, // COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE + { 0x2CB8, 0x2CB9 }, // COPTIC CAPITAL LETTER DIALECT-P KAPA + { 0x2CBA, 0x2CBB }, // COPTIC CAPITAL LETTER DIALECT-P NI + { 0x2CBC, 0x2CBD }, // COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI + { 0x2CBE, 0x2CBF }, // COPTIC CAPITAL LETTER OLD COPTIC OOU + { 0x2CC0, 0x2CC1 }, // COPTIC CAPITAL LETTER SAMPI + { 0x2CC2, 0x2CC3 }, // COPTIC CAPITAL LETTER CROSSED SHEI + { 0x2CC4, 0x2CC5 }, // COPTIC CAPITAL LETTER OLD COPTIC SHEI + { 0x2CC6, 0x2CC7 }, // COPTIC CAPITAL LETTER OLD COPTIC ESH + { 0x2CC8, 0x2CC9 }, // COPTIC CAPITAL LETTER AKHMIMIC KHEI + { 0x2CCA, 0x2CCB }, // COPTIC CAPITAL LETTER DIALECT-P HORI + { 0x2CCC, 0x2CCD }, // COPTIC CAPITAL LETTER OLD COPTIC HORI + { 0x2CCE, 0x2CCF }, // COPTIC CAPITAL LETTER OLD COPTIC HA + { 0x2CD0, 0x2CD1 }, // COPTIC CAPITAL LETTER L-SHAPED HA + { 0x2CD2, 0x2CD3 }, // COPTIC CAPITAL LETTER OLD COPTIC HEI + { 0x2CD4, 0x2CD5 }, // COPTIC CAPITAL LETTER OLD COPTIC HAT + { 0x2CD6, 0x2CD7 }, // COPTIC CAPITAL LETTER OLD COPTIC GANGIA + { 0x2CD8, 0x2CD9 }, // COPTIC CAPITAL LETTER OLD COPTIC DJA + { 0x2CDA, 0x2CDB }, // COPTIC CAPITAL LETTER OLD COPTIC SHIMA + { 0x2CDC, 0x2CDD }, // COPTIC CAPITAL LETTER OLD NUBIAN SHIMA + { 0x2CDE, 0x2CDF }, // COPTIC CAPITAL LETTER OLD NUBIAN NGI + { 0x2CE0, 0x2CE1 }, // COPTIC CAPITAL LETTER OLD NUBIAN NYI + { 0x2CE2, 0x2CE3 }, // COPTIC CAPITAL LETTER OLD NUBIAN WAU + { 0x2CEB, 0x2CEC }, // COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI + { 0x2CED, 0x2CEE }, // COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA + { 0xA640, 0xA641 }, // CYRILLIC CAPITAL LETTER ZEMLYA + { 0xA642, 0xA643 }, // CYRILLIC CAPITAL LETTER DZELO + { 0xA644, 0xA645 }, // CYRILLIC CAPITAL LETTER REVERSED DZE + { 0xA646, 0xA647 }, // CYRILLIC CAPITAL LETTER IOTA + { 0xA648, 0xA649 }, // CYRILLIC CAPITAL LETTER DJERV + { 0xA64A, 0xA64B }, // CYRILLIC CAPITAL LETTER MONOGRAPH UK + { 0xA64C, 0xA64D }, // CYRILLIC CAPITAL LETTER BROAD OMEGA + { 0xA64E, 0xA64F }, // CYRILLIC CAPITAL LETTER NEUTRAL YER + { 0xA650, 0xA651 }, // CYRILLIC CAPITAL LETTER YERU WITH BACK YER + { 0xA652, 0xA653 }, // CYRILLIC CAPITAL LETTER IOTIFIED YAT + { 0xA654, 0xA655 }, // CYRILLIC CAPITAL LETTER REVERSED YU + { 0xA656, 0xA657 }, // CYRILLIC CAPITAL LETTER IOTIFIED A + { 0xA658, 0xA659 }, // CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS + { 0xA65A, 0xA65B }, // CYRILLIC CAPITAL LETTER BLENDED YUS + { 0xA65C, 0xA65D }, // CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS + { 0xA65E, 0xA65F }, // CYRILLIC CAPITAL LETTER YN + { 0xA662, 0xA663 }, // CYRILLIC CAPITAL LETTER SOFT DE + { 0xA664, 0xA665 }, // CYRILLIC CAPITAL LETTER SOFT EL + { 0xA666, 0xA667 }, // CYRILLIC CAPITAL LETTER SOFT EM + { 0xA668, 0xA669 }, // CYRILLIC CAPITAL LETTER MONOCULAR O + { 0xA66A, 0xA66B }, // CYRILLIC CAPITAL LETTER BINOCULAR O + { 0xA66C, 0xA66D }, // CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O + { 0xA680, 0xA681 }, // CYRILLIC CAPITAL LETTER DWE + { 0xA682, 0xA683 }, // CYRILLIC CAPITAL LETTER DZWE + { 0xA684, 0xA685 }, // CYRILLIC CAPITAL LETTER ZHWE + { 0xA686, 0xA687 }, // CYRILLIC CAPITAL LETTER CCHE + { 0xA688, 0xA689 }, // CYRILLIC CAPITAL LETTER DZZE + { 0xA68A, 0xA68B }, // CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK + { 0xA68C, 0xA68D }, // CYRILLIC CAPITAL LETTER TWE + { 0xA68E, 0xA68F }, // CYRILLIC CAPITAL LETTER TSWE + { 0xA690, 0xA691 }, // CYRILLIC CAPITAL LETTER TSSE + { 0xA692, 0xA693 }, // CYRILLIC CAPITAL LETTER TCHE + { 0xA694, 0xA695 }, // CYRILLIC CAPITAL LETTER HWE + { 0xA696, 0xA697 }, // CYRILLIC CAPITAL LETTER SHWE + { 0xA722, 0xA723 }, // LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF + { 0xA724, 0xA725 }, // LATIN CAPITAL LETTER EGYPTOLOGICAL AIN + { 0xA726, 0xA727 }, // LATIN CAPITAL LETTER HENG + { 0xA728, 0xA729 }, // LATIN CAPITAL LETTER TZ + { 0xA72A, 0xA72B }, // LATIN CAPITAL LETTER TRESILLO + { 0xA72C, 0xA72D }, // LATIN CAPITAL LETTER CUATRILLO + { 0xA72E, 0xA72F }, // LATIN CAPITAL LETTER CUATRILLO WITH COMMA + { 0xA732, 0xA733 }, // LATIN CAPITAL LETTER AA + { 0xA734, 0xA735 }, // LATIN CAPITAL LETTER AO + { 0xA736, 0xA737 }, // LATIN CAPITAL LETTER AU + { 0xA738, 0xA739 }, // LATIN CAPITAL LETTER AV + { 0xA73A, 0xA73B }, // LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR + { 0xA73C, 0xA73D }, // LATIN CAPITAL LETTER AY + { 0xA73E, 0xA73F }, // LATIN CAPITAL LETTER REVERSED C WITH DOT + { 0xA740, 0xA741 }, // LATIN CAPITAL LETTER K WITH STROKE + { 0xA742, 0xA743 }, // LATIN CAPITAL LETTER K WITH DIAGONAL STROKE + { 0xA744, 0xA745 }, // LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE + { 0xA746, 0xA747 }, // LATIN CAPITAL LETTER BROKEN L + { 0xA748, 0xA749 }, // LATIN CAPITAL LETTER L WITH HIGH STROKE + { 0xA74A, 0xA74B }, // LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY + { 0xA74C, 0xA74D }, // LATIN CAPITAL LETTER O WITH LOOP + { 0xA74E, 0xA74F }, // LATIN CAPITAL LETTER OO + { 0xA750, 0xA751 }, // LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER + { 0xA752, 0xA753 }, // LATIN CAPITAL LETTER P WITH FLOURISH + { 0xA754, 0xA755 }, // LATIN CAPITAL LETTER P WITH SQUIRREL TAIL + { 0xA756, 0xA757 }, // LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER + { 0xA758, 0xA759 }, // LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE + { 0xA75A, 0xA75B }, // LATIN CAPITAL LETTER R ROTUNDA + { 0xA75C, 0xA75D }, // LATIN CAPITAL LETTER RUM ROTUNDA + { 0xA75E, 0xA75F }, // LATIN CAPITAL LETTER V WITH DIAGONAL STROKE + { 0xA760, 0xA761 }, // LATIN CAPITAL LETTER VY + { 0xA762, 0xA763 }, // LATIN CAPITAL LETTER VISIGOTHIC Z + { 0xA764, 0xA765 }, // LATIN CAPITAL LETTER THORN WITH STROKE + { 0xA766, 0xA767 }, // LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER + { 0xA768, 0xA769 }, // LATIN CAPITAL LETTER VEND + { 0xA76A, 0xA76B }, // LATIN CAPITAL LETTER ET + { 0xA76C, 0xA76D }, // LATIN CAPITAL LETTER IS + { 0xA76E, 0xA76F }, // LATIN CAPITAL LETTER CON + { 0xA779, 0xA77A }, // LATIN CAPITAL LETTER INSULAR D + { 0xA77B, 0xA77C }, // LATIN CAPITAL LETTER INSULAR F + { 0xA77D, 0x1D79 }, // LATIN CAPITAL LETTER INSULAR G + { 0xA77E, 0xA77F }, // LATIN CAPITAL LETTER TURNED INSULAR G + { 0xA780, 0xA781 }, // LATIN CAPITAL LETTER TURNED L + { 0xA782, 0xA783 }, // LATIN CAPITAL LETTER INSULAR R + { 0xA784, 0xA785 }, // LATIN CAPITAL LETTER INSULAR S + { 0xA786, 0xA787 }, // LATIN CAPITAL LETTER INSULAR T + { 0xA78B, 0xA78C }, // LATIN CAPITAL LETTER SALTILLO + { 0xFF21, 0xFF41 }, // FULLWIDTH LATIN CAPITAL LETTER A + { 0xFF22, 0xFF42 }, // FULLWIDTH LATIN CAPITAL LETTER B + { 0xFF23, 0xFF43 }, // FULLWIDTH LATIN CAPITAL LETTER C + { 0xFF24, 0xFF44 }, // FULLWIDTH LATIN CAPITAL LETTER D + { 0xFF25, 0xFF45 }, // FULLWIDTH LATIN CAPITAL LETTER E + { 0xFF26, 0xFF46 }, // FULLWIDTH LATIN CAPITAL LETTER F + { 0xFF27, 0xFF47 }, // FULLWIDTH LATIN CAPITAL LETTER G + { 0xFF28, 0xFF48 }, // FULLWIDTH LATIN CAPITAL LETTER H + { 0xFF29, 0xFF49 }, // FULLWIDTH LATIN CAPITAL LETTER I + { 0xFF2A, 0xFF4A }, // FULLWIDTH LATIN CAPITAL LETTER J + { 0xFF2B, 0xFF4B }, // FULLWIDTH LATIN CAPITAL LETTER K + { 0xFF2C, 0xFF4C }, // FULLWIDTH LATIN CAPITAL LETTER L + { 0xFF2D, 0xFF4D }, // FULLWIDTH LATIN CAPITAL LETTER M + { 0xFF2E, 0xFF4E }, // FULLWIDTH LATIN CAPITAL LETTER N + { 0xFF2F, 0xFF4F }, // FULLWIDTH LATIN CAPITAL LETTER O + { 0xFF30, 0xFF50 }, // FULLWIDTH LATIN CAPITAL LETTER P + { 0xFF31, 0xFF51 }, // FULLWIDTH LATIN CAPITAL LETTER Q + { 0xFF32, 0xFF52 }, // FULLWIDTH LATIN CAPITAL LETTER R + { 0xFF33, 0xFF53 }, // FULLWIDTH LATIN CAPITAL LETTER S + { 0xFF34, 0xFF54 }, // FULLWIDTH LATIN CAPITAL LETTER T + { 0xFF35, 0xFF55 }, // FULLWIDTH LATIN CAPITAL LETTER U + { 0xFF36, 0xFF56 }, // FULLWIDTH LATIN CAPITAL LETTER V + { 0xFF37, 0xFF57 }, // FULLWIDTH LATIN CAPITAL LETTER W + { 0xFF38, 0xFF58 }, // FULLWIDTH LATIN CAPITAL LETTER X + { 0xFF39, 0xFF59 }, // FULLWIDTH LATIN CAPITAL LETTER Y + { 0xFF3A, 0xFF5A } // FULLWIDTH LATIN CAPITAL LETTER Z +}; + +static int compare_pair_capital(const void *a, const void *b) { + return (int)((struct LatinCapitalSmallPair*)a)->capital + - (int)((struct LatinCapitalSmallPair*)b)->capital; +} + +unsigned short latin_tolower(unsigned short c) { + struct LatinCapitalSmallPair *p = + (struct LatinCapitalSmallPair *)bsearch(&c, SORTED_CHAR_MAP, + sizeof(SORTED_CHAR_MAP) / sizeof(SORTED_CHAR_MAP[0]), + sizeof(SORTED_CHAR_MAP[0]), + compare_pair_capital); + return p ? p->small : c; +} + +} // namespace latinime diff --git a/native/src/char_utils.h b/native/src/char_utils.h new file mode 100644 index 000000000..921ecb4a5 --- /dev/null +++ b/native/src/char_utils.h @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2010 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. + */ + +#ifndef LATINIME_CHAR_UTILS_H +#define LATINIME_CHAR_UTILS_H + +namespace latinime { + +unsigned short latin_tolower(unsigned short c); + +}; // namespace latinime + +#endif // LATINIME_CHAR_UTILS_H diff --git a/native/src/dictionary.cpp b/native/src/dictionary.cpp index 6e6f44182..3f196a9ed 100644 --- a/native/src/dictionary.cpp +++ b/native/src/dictionary.cpp @@ -21,8 +21,6 @@ #include #include -#include - //#define USE_ASSET_MANAGER #ifdef USE_ASSET_MANAGER @@ -32,6 +30,7 @@ #include "dictionary.h" #include "basechars.h" +#include "char_utils.h" #define DEBUG_DICT 0 @@ -176,7 +175,7 @@ Dictionary::toLowerCase(unsigned short c) { if (c >='A' && c <= 'Z') { c |= 32; } else if (c > 127) { - c = u_tolower(c); + c = latin_tolower(c); } return c; } From 707505ec18dcbd057f8ac4b2b82ddd2bbbe3a371 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 21 Apr 2010 02:35:47 +0900 Subject: [PATCH 004/159] A part of efforts of unbundling LatinIME: Get rid of ICU dependency in the native code. This is actually a back merge from the LatinIME sandbox. Please refer to http://arvarest.i.corp.google.com:8080/#change,77 Change-Id: I3ff3781903d5c642c662c2d744f808be7e4d8997 --- native/Android.mk | 7 +- native/src/char_utils.cpp | 906 ++++++++++++++++++++++++++++++++++++++ native/src/char_utils.h | 26 ++ native/src/dictionary.cpp | 5 +- 4 files changed, 937 insertions(+), 7 deletions(-) create mode 100644 native/src/char_utils.cpp create mode 100644 native/src/char_utils.h diff --git a/native/Android.mk b/native/Android.mk index 9ba9f75ec..3cf6aa83f 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -5,10 +5,10 @@ LOCAL_C_INCLUDES += $(LOCAL_PATH)/src LOCAL_SRC_FILES := \ jni/com_android_inputmethod_latin_BinaryDictionary.cpp \ - src/dictionary.cpp + src/dictionary.cpp \ + src/char_utils.cpp LOCAL_C_INCLUDES += \ - external/icu4c/common \ $(JNI_H_INCLUDE) LOCAL_LDLIBS := -lm @@ -18,8 +18,7 @@ LOCAL_PRELINK_MODULE := false LOCAL_SHARED_LIBRARIES := \ libandroid_runtime \ libcutils \ - libutils \ - libicuuc + libutils LOCAL_MODULE := libjni_latinime diff --git a/native/src/char_utils.cpp b/native/src/char_utils.cpp new file mode 100644 index 000000000..c9204df24 --- /dev/null +++ b/native/src/char_utils.cpp @@ -0,0 +1,906 @@ +/* + * Copyright (C) 2010 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. + */ + +#include + +namespace latinime { + +struct LatinCapitalSmallPair { + unsigned short capital; + unsigned short small; +}; + +// Generated from http://unicode.org/Public/UNIDATA/UnicodeData.txt +// +// 1. Run the following code. Bascially taken from +// Dictionary::toLowerCase(unsigned short c) in dictionary.cpp. +// Then, get the list of chars where ccc != ccc2 above. +// +// unsigned short c, cc, ccc, ccc2; +// for (c = 0; c < 0xFFFF ; c++) { +// if (c < sizeof(BASE_CHARS) / sizeof(BASE_CHARS[0])) { +// cc = BASE_CHARS[c]; +// } else { +// cc = c; +// } +// +// // tolower +// int isBase = 0; +// if (cc >='A' && cc <= 'Z') { +// ccc = (cc | 0x20); +// ccc2 = ccc; +// isBase = 1; +// } else if (cc > 0x7F) { +// ccc = u_tolower(cc); +// ccc2 = latin_tolower(cc); +// } else { +// ccc = cc; +// ccc2 = ccc; +// } +// if (!isBase && cc != ccc) { +// wprintf(L" 0x%04X => 0x%04X => 0x%04X %lc => %lc => %lc \n", +// c, cc, ccc, c, cc, ccc); +// //assert(ccc == ccc2); +// } +// } +// +// Initially, started with an empty latin_tolower() as below. +// +// unsigned short latin_tolower(unsigned short c) { +// return c; +// } +// +// +// 2. Process the list obtained by 1 by the following perl script and apply +// 'sort -u' as well. Get the SORTED_CHAR_MAP[]. +// Note that '$1' in the perl script is 'cc' in the above C code. +// +// while(<>) { +// / 0x\w* => 0x(\w*) =/; +// open(HDL, "grep -iw ^" . $1 . " UnicodeData.txt | "); +// $line = ; +// chomp $line; +// @cols = split(/;/, $line); +// print " { 0x$1, 0x$cols[13] }, // $cols[1]\n"; +// } +// +// +// 3. Update the latin_tolower() function above with SORTED_CHAR_MAP. Enable +// the assert(ccc == ccc2) above and confirm the function exits successfully. +// +static const struct LatinCapitalSmallPair SORTED_CHAR_MAP[] = { + { 0x00C4, 0x00E4 }, // LATIN CAPITAL LETTER A WITH DIAERESIS + { 0x00C5, 0x00E5 }, // LATIN CAPITAL LETTER A WITH RING ABOVE + { 0x00C6, 0x00E6 }, // LATIN CAPITAL LETTER AE + { 0x00D0, 0x00F0 }, // LATIN CAPITAL LETTER ETH + { 0x00D5, 0x00F5 }, // LATIN CAPITAL LETTER O WITH TILDE + { 0x00D6, 0x00F6 }, // LATIN CAPITAL LETTER O WITH DIAERESIS + { 0x00D8, 0x00F8 }, // LATIN CAPITAL LETTER O WITH STROKE + { 0x00DC, 0x00FC }, // LATIN CAPITAL LETTER U WITH DIAERESIS + { 0x00DE, 0x00FE }, // LATIN CAPITAL LETTER THORN + { 0x0110, 0x0111 }, // LATIN CAPITAL LETTER D WITH STROKE + { 0x0126, 0x0127 }, // LATIN CAPITAL LETTER H WITH STROKE + { 0x0141, 0x0142 }, // LATIN CAPITAL LETTER L WITH STROKE + { 0x014A, 0x014B }, // LATIN CAPITAL LETTER ENG + { 0x0152, 0x0153 }, // LATIN CAPITAL LIGATURE OE + { 0x0166, 0x0167 }, // LATIN CAPITAL LETTER T WITH STROKE + { 0x0181, 0x0253 }, // LATIN CAPITAL LETTER B WITH HOOK + { 0x0182, 0x0183 }, // LATIN CAPITAL LETTER B WITH TOPBAR + { 0x0184, 0x0185 }, // LATIN CAPITAL LETTER TONE SIX + { 0x0186, 0x0254 }, // LATIN CAPITAL LETTER OPEN O + { 0x0187, 0x0188 }, // LATIN CAPITAL LETTER C WITH HOOK + { 0x0189, 0x0256 }, // LATIN CAPITAL LETTER AFRICAN D + { 0x018A, 0x0257 }, // LATIN CAPITAL LETTER D WITH HOOK + { 0x018B, 0x018C }, // LATIN CAPITAL LETTER D WITH TOPBAR + { 0x018E, 0x01DD }, // LATIN CAPITAL LETTER REVERSED E + { 0x018F, 0x0259 }, // LATIN CAPITAL LETTER SCHWA + { 0x0190, 0x025B }, // LATIN CAPITAL LETTER OPEN E + { 0x0191, 0x0192 }, // LATIN CAPITAL LETTER F WITH HOOK + { 0x0193, 0x0260 }, // LATIN CAPITAL LETTER G WITH HOOK + { 0x0194, 0x0263 }, // LATIN CAPITAL LETTER GAMMA + { 0x0196, 0x0269 }, // LATIN CAPITAL LETTER IOTA + { 0x0197, 0x0268 }, // LATIN CAPITAL LETTER I WITH STROKE + { 0x0198, 0x0199 }, // LATIN CAPITAL LETTER K WITH HOOK + { 0x019C, 0x026F }, // LATIN CAPITAL LETTER TURNED M + { 0x019D, 0x0272 }, // LATIN CAPITAL LETTER N WITH LEFT HOOK + { 0x019F, 0x0275 }, // LATIN CAPITAL LETTER O WITH MIDDLE TILDE + { 0x01A2, 0x01A3 }, // LATIN CAPITAL LETTER OI + { 0x01A4, 0x01A5 }, // LATIN CAPITAL LETTER P WITH HOOK + { 0x01A6, 0x0280 }, // LATIN LETTER YR + { 0x01A7, 0x01A8 }, // LATIN CAPITAL LETTER TONE TWO + { 0x01A9, 0x0283 }, // LATIN CAPITAL LETTER ESH + { 0x01AC, 0x01AD }, // LATIN CAPITAL LETTER T WITH HOOK + { 0x01AE, 0x0288 }, // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK + { 0x01B1, 0x028A }, // LATIN CAPITAL LETTER UPSILON + { 0x01B2, 0x028B }, // LATIN CAPITAL LETTER V WITH HOOK + { 0x01B3, 0x01B4 }, // LATIN CAPITAL LETTER Y WITH HOOK + { 0x01B5, 0x01B6 }, // LATIN CAPITAL LETTER Z WITH STROKE + { 0x01B7, 0x0292 }, // LATIN CAPITAL LETTER EZH + { 0x01B8, 0x01B9 }, // LATIN CAPITAL LETTER EZH REVERSED + { 0x01BC, 0x01BD }, // LATIN CAPITAL LETTER TONE FIVE + { 0x01E4, 0x01E5 }, // LATIN CAPITAL LETTER G WITH STROKE + { 0x01EA, 0x01EB }, // LATIN CAPITAL LETTER O WITH OGONEK + { 0x01F6, 0x0195 }, // LATIN CAPITAL LETTER HWAIR + { 0x01F7, 0x01BF }, // LATIN CAPITAL LETTER WYNN + { 0x021C, 0x021D }, // LATIN CAPITAL LETTER YOGH + { 0x0220, 0x019E }, // LATIN CAPITAL LETTER N WITH LONG RIGHT LEG + { 0x0222, 0x0223 }, // LATIN CAPITAL LETTER OU + { 0x0224, 0x0225 }, // LATIN CAPITAL LETTER Z WITH HOOK + { 0x0226, 0x0227 }, // LATIN CAPITAL LETTER A WITH DOT ABOVE + { 0x022E, 0x022F }, // LATIN CAPITAL LETTER O WITH DOT ABOVE + { 0x023A, 0x2C65 }, // LATIN CAPITAL LETTER A WITH STROKE + { 0x023B, 0x023C }, // LATIN CAPITAL LETTER C WITH STROKE + { 0x023D, 0x019A }, // LATIN CAPITAL LETTER L WITH BAR + { 0x023E, 0x2C66 }, // LATIN CAPITAL LETTER T WITH DIAGONAL STROKE + { 0x0241, 0x0242 }, // LATIN CAPITAL LETTER GLOTTAL STOP + { 0x0243, 0x0180 }, // LATIN CAPITAL LETTER B WITH STROKE + { 0x0244, 0x0289 }, // LATIN CAPITAL LETTER U BAR + { 0x0245, 0x028C }, // LATIN CAPITAL LETTER TURNED V + { 0x0246, 0x0247 }, // LATIN CAPITAL LETTER E WITH STROKE + { 0x0248, 0x0249 }, // LATIN CAPITAL LETTER J WITH STROKE + { 0x024A, 0x024B }, // LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL + { 0x024C, 0x024D }, // LATIN CAPITAL LETTER R WITH STROKE + { 0x024E, 0x024F }, // LATIN CAPITAL LETTER Y WITH STROKE + { 0x0370, 0x0371 }, // GREEK CAPITAL LETTER HETA + { 0x0372, 0x0373 }, // GREEK CAPITAL LETTER ARCHAIC SAMPI + { 0x0376, 0x0377 }, // GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA + { 0x0391, 0x03B1 }, // GREEK CAPITAL LETTER ALPHA + { 0x0392, 0x03B2 }, // GREEK CAPITAL LETTER BETA + { 0x0393, 0x03B3 }, // GREEK CAPITAL LETTER GAMMA + { 0x0394, 0x03B4 }, // GREEK CAPITAL LETTER DELTA + { 0x0395, 0x03B5 }, // GREEK CAPITAL LETTER EPSILON + { 0x0396, 0x03B6 }, // GREEK CAPITAL LETTER ZETA + { 0x0397, 0x03B7 }, // GREEK CAPITAL LETTER ETA + { 0x0398, 0x03B8 }, // GREEK CAPITAL LETTER THETA + { 0x0399, 0x03B9 }, // GREEK CAPITAL LETTER IOTA + { 0x039A, 0x03BA }, // GREEK CAPITAL LETTER KAPPA + { 0x039B, 0x03BB }, // GREEK CAPITAL LETTER LAMDA + { 0x039C, 0x03BC }, // GREEK CAPITAL LETTER MU + { 0x039D, 0x03BD }, // GREEK CAPITAL LETTER NU + { 0x039E, 0x03BE }, // GREEK CAPITAL LETTER XI + { 0x039F, 0x03BF }, // GREEK CAPITAL LETTER OMICRON + { 0x03A0, 0x03C0 }, // GREEK CAPITAL LETTER PI + { 0x03A1, 0x03C1 }, // GREEK CAPITAL LETTER RHO + { 0x03A3, 0x03C3 }, // GREEK CAPITAL LETTER SIGMA + { 0x03A4, 0x03C4 }, // GREEK CAPITAL LETTER TAU + { 0x03A5, 0x03C5 }, // GREEK CAPITAL LETTER UPSILON + { 0x03A6, 0x03C6 }, // GREEK CAPITAL LETTER PHI + { 0x03A7, 0x03C7 }, // GREEK CAPITAL LETTER CHI + { 0x03A8, 0x03C8 }, // GREEK CAPITAL LETTER PSI + { 0x03A9, 0x03C9 }, // GREEK CAPITAL LETTER OMEGA + { 0x03CF, 0x03D7 }, // GREEK CAPITAL KAI SYMBOL + { 0x03D8, 0x03D9 }, // GREEK LETTER ARCHAIC KOPPA + { 0x03DA, 0x03DB }, // GREEK LETTER STIGMA + { 0x03DC, 0x03DD }, // GREEK LETTER DIGAMMA + { 0x03DE, 0x03DF }, // GREEK LETTER KOPPA + { 0x03E0, 0x03E1 }, // GREEK LETTER SAMPI + { 0x03E2, 0x03E3 }, // COPTIC CAPITAL LETTER SHEI + { 0x03E4, 0x03E5 }, // COPTIC CAPITAL LETTER FEI + { 0x03E6, 0x03E7 }, // COPTIC CAPITAL LETTER KHEI + { 0x03E8, 0x03E9 }, // COPTIC CAPITAL LETTER HORI + { 0x03EA, 0x03EB }, // COPTIC CAPITAL LETTER GANGIA + { 0x03EC, 0x03ED }, // COPTIC CAPITAL LETTER SHIMA + { 0x03EE, 0x03EF }, // COPTIC CAPITAL LETTER DEI + { 0x03F7, 0x03F8 }, // GREEK CAPITAL LETTER SHO + { 0x03FA, 0x03FB }, // GREEK CAPITAL LETTER SAN + { 0x03FD, 0x037B }, // GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL + { 0x03FE, 0x037C }, // GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL + { 0x03FF, 0x037D }, // GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL + { 0x0402, 0x0452 }, // CYRILLIC CAPITAL LETTER DJE + { 0x0404, 0x0454 }, // CYRILLIC CAPITAL LETTER UKRAINIAN IE + { 0x0405, 0x0455 }, // CYRILLIC CAPITAL LETTER DZE + { 0x0406, 0x0456 }, // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + { 0x0408, 0x0458 }, // CYRILLIC CAPITAL LETTER JE + { 0x0409, 0x0459 }, // CYRILLIC CAPITAL LETTER LJE + { 0x040A, 0x045A }, // CYRILLIC CAPITAL LETTER NJE + { 0x040B, 0x045B }, // CYRILLIC CAPITAL LETTER TSHE + { 0x040F, 0x045F }, // CYRILLIC CAPITAL LETTER DZHE + { 0x0410, 0x0430 }, // CYRILLIC CAPITAL LETTER A + { 0x0411, 0x0431 }, // CYRILLIC CAPITAL LETTER BE + { 0x0412, 0x0432 }, // CYRILLIC CAPITAL LETTER VE + { 0x0413, 0x0433 }, // CYRILLIC CAPITAL LETTER GHE + { 0x0414, 0x0434 }, // CYRILLIC CAPITAL LETTER DE + { 0x0415, 0x0435 }, // CYRILLIC CAPITAL LETTER IE + { 0x0416, 0x0436 }, // CYRILLIC CAPITAL LETTER ZHE + { 0x0417, 0x0437 }, // CYRILLIC CAPITAL LETTER ZE + { 0x0418, 0x0438 }, // CYRILLIC CAPITAL LETTER I + { 0x041A, 0x043A }, // CYRILLIC CAPITAL LETTER KA + { 0x041B, 0x043B }, // CYRILLIC CAPITAL LETTER EL + { 0x041C, 0x043C }, // CYRILLIC CAPITAL LETTER EM + { 0x041D, 0x043D }, // CYRILLIC CAPITAL LETTER EN + { 0x041E, 0x043E }, // CYRILLIC CAPITAL LETTER O + { 0x041F, 0x043F }, // CYRILLIC CAPITAL LETTER PE + { 0x0420, 0x0440 }, // CYRILLIC CAPITAL LETTER ER + { 0x0421, 0x0441 }, // CYRILLIC CAPITAL LETTER ES + { 0x0422, 0x0442 }, // CYRILLIC CAPITAL LETTER TE + { 0x0423, 0x0443 }, // CYRILLIC CAPITAL LETTER U + { 0x0424, 0x0444 }, // CYRILLIC CAPITAL LETTER EF + { 0x0425, 0x0445 }, // CYRILLIC CAPITAL LETTER HA + { 0x0426, 0x0446 }, // CYRILLIC CAPITAL LETTER TSE + { 0x0427, 0x0447 }, // CYRILLIC CAPITAL LETTER CHE + { 0x0428, 0x0448 }, // CYRILLIC CAPITAL LETTER SHA + { 0x0429, 0x0449 }, // CYRILLIC CAPITAL LETTER SHCHA + { 0x042A, 0x044A }, // CYRILLIC CAPITAL LETTER HARD SIGN + { 0x042B, 0x044B }, // CYRILLIC CAPITAL LETTER YERU + { 0x042C, 0x044C }, // CYRILLIC CAPITAL LETTER SOFT SIGN + { 0x042D, 0x044D }, // CYRILLIC CAPITAL LETTER E + { 0x042E, 0x044E }, // CYRILLIC CAPITAL LETTER YU + { 0x042F, 0x044F }, // CYRILLIC CAPITAL LETTER YA + { 0x0460, 0x0461 }, // CYRILLIC CAPITAL LETTER OMEGA + { 0x0462, 0x0463 }, // CYRILLIC CAPITAL LETTER YAT + { 0x0464, 0x0465 }, // CYRILLIC CAPITAL LETTER IOTIFIED E + { 0x0466, 0x0467 }, // CYRILLIC CAPITAL LETTER LITTLE YUS + { 0x0468, 0x0469 }, // CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS + { 0x046A, 0x046B }, // CYRILLIC CAPITAL LETTER BIG YUS + { 0x046C, 0x046D }, // CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS + { 0x046E, 0x046F }, // CYRILLIC CAPITAL LETTER KSI + { 0x0470, 0x0471 }, // CYRILLIC CAPITAL LETTER PSI + { 0x0472, 0x0473 }, // CYRILLIC CAPITAL LETTER FITA + { 0x0474, 0x0475 }, // CYRILLIC CAPITAL LETTER IZHITSA + { 0x0478, 0x0479 }, // CYRILLIC CAPITAL LETTER UK + { 0x047A, 0x047B }, // CYRILLIC CAPITAL LETTER ROUND OMEGA + { 0x047C, 0x047D }, // CYRILLIC CAPITAL LETTER OMEGA WITH TITLO + { 0x047E, 0x047F }, // CYRILLIC CAPITAL LETTER OT + { 0x0480, 0x0481 }, // CYRILLIC CAPITAL LETTER KOPPA + { 0x048A, 0x048B }, // CYRILLIC CAPITAL LETTER SHORT I WITH TAIL + { 0x048C, 0x048D }, // CYRILLIC CAPITAL LETTER SEMISOFT SIGN + { 0x048E, 0x048F }, // CYRILLIC CAPITAL LETTER ER WITH TICK + { 0x0490, 0x0491 }, // CYRILLIC CAPITAL LETTER GHE WITH UPTURN + { 0x0492, 0x0493 }, // CYRILLIC CAPITAL LETTER GHE WITH STROKE + { 0x0494, 0x0495 }, // CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK + { 0x0496, 0x0497 }, // CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER + { 0x0498, 0x0499 }, // CYRILLIC CAPITAL LETTER ZE WITH DESCENDER + { 0x049A, 0x049B }, // CYRILLIC CAPITAL LETTER KA WITH DESCENDER + { 0x049C, 0x049D }, // CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE + { 0x049E, 0x049F }, // CYRILLIC CAPITAL LETTER KA WITH STROKE + { 0x04A0, 0x04A1 }, // CYRILLIC CAPITAL LETTER BASHKIR KA + { 0x04A2, 0x04A3 }, // CYRILLIC CAPITAL LETTER EN WITH DESCENDER + { 0x04A4, 0x04A5 }, // CYRILLIC CAPITAL LIGATURE EN GHE + { 0x04A6, 0x04A7 }, // CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK + { 0x04A8, 0x04A9 }, // CYRILLIC CAPITAL LETTER ABKHASIAN HA + { 0x04AA, 0x04AB }, // CYRILLIC CAPITAL LETTER ES WITH DESCENDER + { 0x04AC, 0x04AD }, // CYRILLIC CAPITAL LETTER TE WITH DESCENDER + { 0x04AE, 0x04AF }, // CYRILLIC CAPITAL LETTER STRAIGHT U + { 0x04B0, 0x04B1 }, // CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + { 0x04B2, 0x04B3 }, // CYRILLIC CAPITAL LETTER HA WITH DESCENDER + { 0x04B4, 0x04B5 }, // CYRILLIC CAPITAL LIGATURE TE TSE + { 0x04B6, 0x04B7 }, // CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + { 0x04B8, 0x04B9 }, // CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE + { 0x04BA, 0x04BB }, // CYRILLIC CAPITAL LETTER SHHA + { 0x04BC, 0x04BD }, // CYRILLIC CAPITAL LETTER ABKHASIAN CHE + { 0x04BE, 0x04BF }, // CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER + { 0x04C0, 0x04CF }, // CYRILLIC LETTER PALOCHKA + { 0x04C3, 0x04C4 }, // CYRILLIC CAPITAL LETTER KA WITH HOOK + { 0x04C5, 0x04C6 }, // CYRILLIC CAPITAL LETTER EL WITH TAIL + { 0x04C7, 0x04C8 }, // CYRILLIC CAPITAL LETTER EN WITH HOOK + { 0x04C9, 0x04CA }, // CYRILLIC CAPITAL LETTER EN WITH TAIL + { 0x04CB, 0x04CC }, // CYRILLIC CAPITAL LETTER KHAKASSIAN CHE + { 0x04CD, 0x04CE }, // CYRILLIC CAPITAL LETTER EM WITH TAIL + { 0x04D4, 0x04D5 }, // CYRILLIC CAPITAL LIGATURE A IE + { 0x04D8, 0x04D9 }, // CYRILLIC CAPITAL LETTER SCHWA + { 0x04E0, 0x04E1 }, // CYRILLIC CAPITAL LETTER ABKHASIAN DZE + { 0x04E8, 0x04E9 }, // CYRILLIC CAPITAL LETTER BARRED O + { 0x04F6, 0x04F7 }, // CYRILLIC CAPITAL LETTER GHE WITH DESCENDER + { 0x04FA, 0x04FB }, // CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK + { 0x04FC, 0x04FD }, // CYRILLIC CAPITAL LETTER HA WITH HOOK + { 0x04FE, 0x04FF }, // CYRILLIC CAPITAL LETTER HA WITH STROKE + { 0x0500, 0x0501 }, // CYRILLIC CAPITAL LETTER KOMI DE + { 0x0502, 0x0503 }, // CYRILLIC CAPITAL LETTER KOMI DJE + { 0x0504, 0x0505 }, // CYRILLIC CAPITAL LETTER KOMI ZJE + { 0x0506, 0x0507 }, // CYRILLIC CAPITAL LETTER KOMI DZJE + { 0x0508, 0x0509 }, // CYRILLIC CAPITAL LETTER KOMI LJE + { 0x050A, 0x050B }, // CYRILLIC CAPITAL LETTER KOMI NJE + { 0x050C, 0x050D }, // CYRILLIC CAPITAL LETTER KOMI SJE + { 0x050E, 0x050F }, // CYRILLIC CAPITAL LETTER KOMI TJE + { 0x0510, 0x0511 }, // CYRILLIC CAPITAL LETTER REVERSED ZE + { 0x0512, 0x0513 }, // CYRILLIC CAPITAL LETTER EL WITH HOOK + { 0x0514, 0x0515 }, // CYRILLIC CAPITAL LETTER LHA + { 0x0516, 0x0517 }, // CYRILLIC CAPITAL LETTER RHA + { 0x0518, 0x0519 }, // CYRILLIC CAPITAL LETTER YAE + { 0x051A, 0x051B }, // CYRILLIC CAPITAL LETTER QA + { 0x051C, 0x051D }, // CYRILLIC CAPITAL LETTER WE + { 0x051E, 0x051F }, // CYRILLIC CAPITAL LETTER ALEUT KA + { 0x0520, 0x0521 }, // CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK + { 0x0522, 0x0523 }, // CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK + { 0x0524, 0x0525 }, // CYRILLIC CAPITAL LETTER PE WITH DESCENDER + { 0x0531, 0x0561 }, // ARMENIAN CAPITAL LETTER AYB + { 0x0532, 0x0562 }, // ARMENIAN CAPITAL LETTER BEN + { 0x0533, 0x0563 }, // ARMENIAN CAPITAL LETTER GIM + { 0x0534, 0x0564 }, // ARMENIAN CAPITAL LETTER DA + { 0x0535, 0x0565 }, // ARMENIAN CAPITAL LETTER ECH + { 0x0536, 0x0566 }, // ARMENIAN CAPITAL LETTER ZA + { 0x0537, 0x0567 }, // ARMENIAN CAPITAL LETTER EH + { 0x0538, 0x0568 }, // ARMENIAN CAPITAL LETTER ET + { 0x0539, 0x0569 }, // ARMENIAN CAPITAL LETTER TO + { 0x053A, 0x056A }, // ARMENIAN CAPITAL LETTER ZHE + { 0x053B, 0x056B }, // ARMENIAN CAPITAL LETTER INI + { 0x053C, 0x056C }, // ARMENIAN CAPITAL LETTER LIWN + { 0x053D, 0x056D }, // ARMENIAN CAPITAL LETTER XEH + { 0x053E, 0x056E }, // ARMENIAN CAPITAL LETTER CA + { 0x053F, 0x056F }, // ARMENIAN CAPITAL LETTER KEN + { 0x0540, 0x0570 }, // ARMENIAN CAPITAL LETTER HO + { 0x0541, 0x0571 }, // ARMENIAN CAPITAL LETTER JA + { 0x0542, 0x0572 }, // ARMENIAN CAPITAL LETTER GHAD + { 0x0543, 0x0573 }, // ARMENIAN CAPITAL LETTER CHEH + { 0x0544, 0x0574 }, // ARMENIAN CAPITAL LETTER MEN + { 0x0545, 0x0575 }, // ARMENIAN CAPITAL LETTER YI + { 0x0546, 0x0576 }, // ARMENIAN CAPITAL LETTER NOW + { 0x0547, 0x0577 }, // ARMENIAN CAPITAL LETTER SHA + { 0x0548, 0x0578 }, // ARMENIAN CAPITAL LETTER VO + { 0x0549, 0x0579 }, // ARMENIAN CAPITAL LETTER CHA + { 0x054A, 0x057A }, // ARMENIAN CAPITAL LETTER PEH + { 0x054B, 0x057B }, // ARMENIAN CAPITAL LETTER JHEH + { 0x054C, 0x057C }, // ARMENIAN CAPITAL LETTER RA + { 0x054D, 0x057D }, // ARMENIAN CAPITAL LETTER SEH + { 0x054E, 0x057E }, // ARMENIAN CAPITAL LETTER VEW + { 0x054F, 0x057F }, // ARMENIAN CAPITAL LETTER TIWN + { 0x0550, 0x0580 }, // ARMENIAN CAPITAL LETTER REH + { 0x0551, 0x0581 }, // ARMENIAN CAPITAL LETTER CO + { 0x0552, 0x0582 }, // ARMENIAN CAPITAL LETTER YIWN + { 0x0553, 0x0583 }, // ARMENIAN CAPITAL LETTER PIWR + { 0x0554, 0x0584 }, // ARMENIAN CAPITAL LETTER KEH + { 0x0555, 0x0585 }, // ARMENIAN CAPITAL LETTER OH + { 0x0556, 0x0586 }, // ARMENIAN CAPITAL LETTER FEH + { 0x10A0, 0x2D00 }, // GEORGIAN CAPITAL LETTER AN + { 0x10A1, 0x2D01 }, // GEORGIAN CAPITAL LETTER BAN + { 0x10A2, 0x2D02 }, // GEORGIAN CAPITAL LETTER GAN + { 0x10A3, 0x2D03 }, // GEORGIAN CAPITAL LETTER DON + { 0x10A4, 0x2D04 }, // GEORGIAN CAPITAL LETTER EN + { 0x10A5, 0x2D05 }, // GEORGIAN CAPITAL LETTER VIN + { 0x10A6, 0x2D06 }, // GEORGIAN CAPITAL LETTER ZEN + { 0x10A7, 0x2D07 }, // GEORGIAN CAPITAL LETTER TAN + { 0x10A8, 0x2D08 }, // GEORGIAN CAPITAL LETTER IN + { 0x10A9, 0x2D09 }, // GEORGIAN CAPITAL LETTER KAN + { 0x10AA, 0x2D0A }, // GEORGIAN CAPITAL LETTER LAS + { 0x10AB, 0x2D0B }, // GEORGIAN CAPITAL LETTER MAN + { 0x10AC, 0x2D0C }, // GEORGIAN CAPITAL LETTER NAR + { 0x10AD, 0x2D0D }, // GEORGIAN CAPITAL LETTER ON + { 0x10AE, 0x2D0E }, // GEORGIAN CAPITAL LETTER PAR + { 0x10AF, 0x2D0F }, // GEORGIAN CAPITAL LETTER ZHAR + { 0x10B0, 0x2D10 }, // GEORGIAN CAPITAL LETTER RAE + { 0x10B1, 0x2D11 }, // GEORGIAN CAPITAL LETTER SAN + { 0x10B2, 0x2D12 }, // GEORGIAN CAPITAL LETTER TAR + { 0x10B3, 0x2D13 }, // GEORGIAN CAPITAL LETTER UN + { 0x10B4, 0x2D14 }, // GEORGIAN CAPITAL LETTER PHAR + { 0x10B5, 0x2D15 }, // GEORGIAN CAPITAL LETTER KHAR + { 0x10B6, 0x2D16 }, // GEORGIAN CAPITAL LETTER GHAN + { 0x10B7, 0x2D17 }, // GEORGIAN CAPITAL LETTER QAR + { 0x10B8, 0x2D18 }, // GEORGIAN CAPITAL LETTER SHIN + { 0x10B9, 0x2D19 }, // GEORGIAN CAPITAL LETTER CHIN + { 0x10BA, 0x2D1A }, // GEORGIAN CAPITAL LETTER CAN + { 0x10BB, 0x2D1B }, // GEORGIAN CAPITAL LETTER JIL + { 0x10BC, 0x2D1C }, // GEORGIAN CAPITAL LETTER CIL + { 0x10BD, 0x2D1D }, // GEORGIAN CAPITAL LETTER CHAR + { 0x10BE, 0x2D1E }, // GEORGIAN CAPITAL LETTER XAN + { 0x10BF, 0x2D1F }, // GEORGIAN CAPITAL LETTER JHAN + { 0x10C0, 0x2D20 }, // GEORGIAN CAPITAL LETTER HAE + { 0x10C1, 0x2D21 }, // GEORGIAN CAPITAL LETTER HE + { 0x10C2, 0x2D22 }, // GEORGIAN CAPITAL LETTER HIE + { 0x10C3, 0x2D23 }, // GEORGIAN CAPITAL LETTER WE + { 0x10C4, 0x2D24 }, // GEORGIAN CAPITAL LETTER HAR + { 0x10C5, 0x2D25 }, // GEORGIAN CAPITAL LETTER HOE + { 0x1E00, 0x1E01 }, // LATIN CAPITAL LETTER A WITH RING BELOW + { 0x1E02, 0x1E03 }, // LATIN CAPITAL LETTER B WITH DOT ABOVE + { 0x1E04, 0x1E05 }, // LATIN CAPITAL LETTER B WITH DOT BELOW + { 0x1E06, 0x1E07 }, // LATIN CAPITAL LETTER B WITH LINE BELOW + { 0x1E08, 0x1E09 }, // LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + { 0x1E0A, 0x1E0B }, // LATIN CAPITAL LETTER D WITH DOT ABOVE + { 0x1E0C, 0x1E0D }, // LATIN CAPITAL LETTER D WITH DOT BELOW + { 0x1E0E, 0x1E0F }, // LATIN CAPITAL LETTER D WITH LINE BELOW + { 0x1E10, 0x1E11 }, // LATIN CAPITAL LETTER D WITH CEDILLA + { 0x1E12, 0x1E13 }, // LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW + { 0x1E14, 0x1E15 }, // LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + { 0x1E16, 0x1E17 }, // LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + { 0x1E18, 0x1E19 }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW + { 0x1E1A, 0x1E1B }, // LATIN CAPITAL LETTER E WITH TILDE BELOW + { 0x1E1C, 0x1E1D }, // LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + { 0x1E1E, 0x1E1F }, // LATIN CAPITAL LETTER F WITH DOT ABOVE + { 0x1E20, 0x1E21 }, // LATIN CAPITAL LETTER G WITH MACRON + { 0x1E22, 0x1E23 }, // LATIN CAPITAL LETTER H WITH DOT ABOVE + { 0x1E24, 0x1E25 }, // LATIN CAPITAL LETTER H WITH DOT BELOW + { 0x1E26, 0x1E27 }, // LATIN CAPITAL LETTER H WITH DIAERESIS + { 0x1E28, 0x1E29 }, // LATIN CAPITAL LETTER H WITH CEDILLA + { 0x1E2A, 0x1E2B }, // LATIN CAPITAL LETTER H WITH BREVE BELOW + { 0x1E2C, 0x1E2D }, // LATIN CAPITAL LETTER I WITH TILDE BELOW + { 0x1E2E, 0x1E2F }, // LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + { 0x1E30, 0x1E31 }, // LATIN CAPITAL LETTER K WITH ACUTE + { 0x1E32, 0x1E33 }, // LATIN CAPITAL LETTER K WITH DOT BELOW + { 0x1E34, 0x1E35 }, // LATIN CAPITAL LETTER K WITH LINE BELOW + { 0x1E36, 0x1E37 }, // LATIN CAPITAL LETTER L WITH DOT BELOW + { 0x1E38, 0x1E39 }, // LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + { 0x1E3A, 0x1E3B }, // LATIN CAPITAL LETTER L WITH LINE BELOW + { 0x1E3C, 0x1E3D }, // LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW + { 0x1E3E, 0x1E3F }, // LATIN CAPITAL LETTER M WITH ACUTE + { 0x1E40, 0x1E41 }, // LATIN CAPITAL LETTER M WITH DOT ABOVE + { 0x1E42, 0x1E43 }, // LATIN CAPITAL LETTER M WITH DOT BELOW + { 0x1E44, 0x1E45 }, // LATIN CAPITAL LETTER N WITH DOT ABOVE + { 0x1E46, 0x1E47 }, // LATIN CAPITAL LETTER N WITH DOT BELOW + { 0x1E48, 0x1E49 }, // LATIN CAPITAL LETTER N WITH LINE BELOW + { 0x1E4A, 0x1E4B }, // LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW + { 0x1E4C, 0x1E4D }, // LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + { 0x1E4E, 0x1E4F }, // LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + { 0x1E50, 0x1E51 }, // LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + { 0x1E52, 0x1E53 }, // LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + { 0x1E54, 0x1E55 }, // LATIN CAPITAL LETTER P WITH ACUTE + { 0x1E56, 0x1E57 }, // LATIN CAPITAL LETTER P WITH DOT ABOVE + { 0x1E58, 0x1E59 }, // LATIN CAPITAL LETTER R WITH DOT ABOVE + { 0x1E5A, 0x1E5B }, // LATIN CAPITAL LETTER R WITH DOT BELOW + { 0x1E5C, 0x1E5D }, // LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + { 0x1E5E, 0x1E5F }, // LATIN CAPITAL LETTER R WITH LINE BELOW + { 0x1E60, 0x1E61 }, // LATIN CAPITAL LETTER S WITH DOT ABOVE + { 0x1E62, 0x1E63 }, // LATIN CAPITAL LETTER S WITH DOT BELOW + { 0x1E64, 0x1E65 }, // LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + { 0x1E66, 0x1E67 }, // LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + { 0x1E68, 0x1E69 }, // LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + { 0x1E6A, 0x1E6B }, // LATIN CAPITAL LETTER T WITH DOT ABOVE + { 0x1E6C, 0x1E6D }, // LATIN CAPITAL LETTER T WITH DOT BELOW + { 0x1E6E, 0x1E6F }, // LATIN CAPITAL LETTER T WITH LINE BELOW + { 0x1E70, 0x1E71 }, // LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW + { 0x1E72, 0x1E73 }, // LATIN CAPITAL LETTER U WITH DIAERESIS BELOW + { 0x1E74, 0x1E75 }, // LATIN CAPITAL LETTER U WITH TILDE BELOW + { 0x1E76, 0x1E77 }, // LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW + { 0x1E78, 0x1E79 }, // LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + { 0x1E7A, 0x1E7B }, // LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + { 0x1E7C, 0x1E7D }, // LATIN CAPITAL LETTER V WITH TILDE + { 0x1E7E, 0x1E7F }, // LATIN CAPITAL LETTER V WITH DOT BELOW + { 0x1E80, 0x1E81 }, // LATIN CAPITAL LETTER W WITH GRAVE + { 0x1E82, 0x1E83 }, // LATIN CAPITAL LETTER W WITH ACUTE + { 0x1E84, 0x1E85 }, // LATIN CAPITAL LETTER W WITH DIAERESIS + { 0x1E86, 0x1E87 }, // LATIN CAPITAL LETTER W WITH DOT ABOVE + { 0x1E88, 0x1E89 }, // LATIN CAPITAL LETTER W WITH DOT BELOW + { 0x1E8A, 0x1E8B }, // LATIN CAPITAL LETTER X WITH DOT ABOVE + { 0x1E8C, 0x1E8D }, // LATIN CAPITAL LETTER X WITH DIAERESIS + { 0x1E8E, 0x1E8F }, // LATIN CAPITAL LETTER Y WITH DOT ABOVE + { 0x1E90, 0x1E91 }, // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX + { 0x1E92, 0x1E93 }, // LATIN CAPITAL LETTER Z WITH DOT BELOW + { 0x1E94, 0x1E95 }, // LATIN CAPITAL LETTER Z WITH LINE BELOW + { 0x1E9E, 0x00DF }, // LATIN CAPITAL LETTER SHARP S + { 0x1EA0, 0x1EA1 }, // LATIN CAPITAL LETTER A WITH DOT BELOW + { 0x1EA2, 0x1EA3 }, // LATIN CAPITAL LETTER A WITH HOOK ABOVE + { 0x1EA4, 0x1EA5 }, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + { 0x1EA6, 0x1EA7 }, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + { 0x1EA8, 0x1EA9 }, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + { 0x1EAA, 0x1EAB }, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + { 0x1EAC, 0x1EAD }, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + { 0x1EAE, 0x1EAF }, // LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + { 0x1EB0, 0x1EB1 }, // LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + { 0x1EB2, 0x1EB3 }, // LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + { 0x1EB4, 0x1EB5 }, // LATIN CAPITAL LETTER A WITH BREVE AND TILDE + { 0x1EB6, 0x1EB7 }, // LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + { 0x1EB8, 0x1EB9 }, // LATIN CAPITAL LETTER E WITH DOT BELOW + { 0x1EBA, 0x1EBB }, // LATIN CAPITAL LETTER E WITH HOOK ABOVE + { 0x1EBC, 0x1EBD }, // LATIN CAPITAL LETTER E WITH TILDE + { 0x1EBE, 0x1EBF }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + { 0x1EC0, 0x1EC1 }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + { 0x1EC2, 0x1EC3 }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + { 0x1EC4, 0x1EC5 }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + { 0x1EC6, 0x1EC7 }, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + { 0x1EC8, 0x1EC9 }, // LATIN CAPITAL LETTER I WITH HOOK ABOVE + { 0x1ECA, 0x1ECB }, // LATIN CAPITAL LETTER I WITH DOT BELOW + { 0x1ECC, 0x1ECD }, // LATIN CAPITAL LETTER O WITH DOT BELOW + { 0x1ECE, 0x1ECF }, // LATIN CAPITAL LETTER O WITH HOOK ABOVE + { 0x1ED0, 0x1ED1 }, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + { 0x1ED2, 0x1ED3 }, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + { 0x1ED4, 0x1ED5 }, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + { 0x1ED6, 0x1ED7 }, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + { 0x1ED8, 0x1ED9 }, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + { 0x1EDA, 0x1EDB }, // LATIN CAPITAL LETTER O WITH HORN AND ACUTE + { 0x1EDC, 0x1EDD }, // LATIN CAPITAL LETTER O WITH HORN AND GRAVE + { 0x1EDE, 0x1EDF }, // LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + { 0x1EE0, 0x1EE1 }, // LATIN CAPITAL LETTER O WITH HORN AND TILDE + { 0x1EE2, 0x1EE3 }, // LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + { 0x1EE4, 0x1EE5 }, // LATIN CAPITAL LETTER U WITH DOT BELOW + { 0x1EE6, 0x1EE7 }, // LATIN CAPITAL LETTER U WITH HOOK ABOVE + { 0x1EE8, 0x1EE9 }, // LATIN CAPITAL LETTER U WITH HORN AND ACUTE + { 0x1EEA, 0x1EEB }, // LATIN CAPITAL LETTER U WITH HORN AND GRAVE + { 0x1EEC, 0x1EED }, // LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + { 0x1EEE, 0x1EEF }, // LATIN CAPITAL LETTER U WITH HORN AND TILDE + { 0x1EF0, 0x1EF1 }, // LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + { 0x1EF2, 0x1EF3 }, // LATIN CAPITAL LETTER Y WITH GRAVE + { 0x1EF4, 0x1EF5 }, // LATIN CAPITAL LETTER Y WITH DOT BELOW + { 0x1EF6, 0x1EF7 }, // LATIN CAPITAL LETTER Y WITH HOOK ABOVE + { 0x1EF8, 0x1EF9 }, // LATIN CAPITAL LETTER Y WITH TILDE + { 0x1EFA, 0x1EFB }, // LATIN CAPITAL LETTER MIDDLE-WELSH LL + { 0x1EFC, 0x1EFD }, // LATIN CAPITAL LETTER MIDDLE-WELSH V + { 0x1EFE, 0x1EFF }, // LATIN CAPITAL LETTER Y WITH LOOP + { 0x1F08, 0x1F00 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI + { 0x1F09, 0x1F01 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA + { 0x1F0A, 0x1F02 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA + { 0x1F0B, 0x1F03 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA + { 0x1F0C, 0x1F04 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + { 0x1F0D, 0x1F05 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + { 0x1F0E, 0x1F06 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + { 0x1F0F, 0x1F07 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + { 0x1F18, 0x1F10 }, // GREEK CAPITAL LETTER EPSILON WITH PSILI + { 0x1F19, 0x1F11 }, // GREEK CAPITAL LETTER EPSILON WITH DASIA + { 0x1F1A, 0x1F12 }, // GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA + { 0x1F1B, 0x1F13 }, // GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA + { 0x1F1C, 0x1F14 }, // GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + { 0x1F1D, 0x1F15 }, // GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + { 0x1F28, 0x1F20 }, // GREEK CAPITAL LETTER ETA WITH PSILI + { 0x1F29, 0x1F21 }, // GREEK CAPITAL LETTER ETA WITH DASIA + { 0x1F2A, 0x1F22 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + { 0x1F2B, 0x1F23 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA + { 0x1F2C, 0x1F24 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + { 0x1F2D, 0x1F25 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + { 0x1F2E, 0x1F26 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + { 0x1F2F, 0x1F27 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + { 0x1F38, 0x1F30 }, // GREEK CAPITAL LETTER IOTA WITH PSILI + { 0x1F39, 0x1F31 }, // GREEK CAPITAL LETTER IOTA WITH DASIA + { 0x1F3A, 0x1F32 }, // GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA + { 0x1F3B, 0x1F33 }, // GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA + { 0x1F3C, 0x1F34 }, // GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + { 0x1F3D, 0x1F35 }, // GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + { 0x1F3E, 0x1F36 }, // GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI + { 0x1F3F, 0x1F37 }, // GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + { 0x1F48, 0x1F40 }, // GREEK CAPITAL LETTER OMICRON WITH PSILI + { 0x1F49, 0x1F41 }, // GREEK CAPITAL LETTER OMICRON WITH DASIA + { 0x1F4A, 0x1F42 }, // GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA + { 0x1F4B, 0x1F43 }, // GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA + { 0x1F4C, 0x1F44 }, // GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + { 0x1F4D, 0x1F45 }, // GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + { 0x1F59, 0x1F51 }, // GREEK CAPITAL LETTER UPSILON WITH DASIA + { 0x1F5B, 0x1F53 }, // GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + { 0x1F5D, 0x1F55 }, // GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + { 0x1F5F, 0x1F57 }, // GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + { 0x1F68, 0x1F60 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI + { 0x1F69, 0x1F61 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA + { 0x1F6A, 0x1F62 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA + { 0x1F6B, 0x1F63 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA + { 0x1F6C, 0x1F64 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + { 0x1F6D, 0x1F65 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + { 0x1F6E, 0x1F66 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + { 0x1F6F, 0x1F67 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + { 0x1F88, 0x1F80 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + { 0x1F89, 0x1F81 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI + { 0x1F8A, 0x1F82 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + { 0x1F8B, 0x1F83 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + { 0x1F8C, 0x1F84 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + { 0x1F8D, 0x1F85 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + { 0x1F8E, 0x1F86 }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1F8F, 0x1F87 }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1F98, 0x1F90 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + { 0x1F99, 0x1F91 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + { 0x1F9A, 0x1F92 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + { 0x1F9B, 0x1F93 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + { 0x1F9C, 0x1F94 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + { 0x1F9D, 0x1F95 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + { 0x1F9E, 0x1F96 }, // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1F9F, 0x1F97 }, // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1FA8, 0x1FA0 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI + { 0x1FA9, 0x1FA1 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI + { 0x1FAA, 0x1FA2 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + { 0x1FAB, 0x1FA3 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + { 0x1FAC, 0x1FA4 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + { 0x1FAD, 0x1FA5 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + { 0x1FAE, 0x1FA6 }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1FAF, 0x1FA7 }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1FB8, 0x1FB0 }, // GREEK CAPITAL LETTER ALPHA WITH VRACHY + { 0x1FB9, 0x1FB1 }, // GREEK CAPITAL LETTER ALPHA WITH MACRON + { 0x1FBA, 0x1F70 }, // GREEK CAPITAL LETTER ALPHA WITH VARIA + { 0x1FBB, 0x1F71 }, // GREEK CAPITAL LETTER ALPHA WITH OXIA + { 0x1FBC, 0x1FB3 }, // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + { 0x1FC8, 0x1F72 }, // GREEK CAPITAL LETTER EPSILON WITH VARIA + { 0x1FC9, 0x1F73 }, // GREEK CAPITAL LETTER EPSILON WITH OXIA + { 0x1FCA, 0x1F74 }, // GREEK CAPITAL LETTER ETA WITH VARIA + { 0x1FCB, 0x1F75 }, // GREEK CAPITAL LETTER ETA WITH OXIA + { 0x1FCC, 0x1FC3 }, // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + { 0x1FD8, 0x1FD0 }, // GREEK CAPITAL LETTER IOTA WITH VRACHY + { 0x1FD9, 0x1FD1 }, // GREEK CAPITAL LETTER IOTA WITH MACRON + { 0x1FDA, 0x1F76 }, // GREEK CAPITAL LETTER IOTA WITH VARIA + { 0x1FDB, 0x1F77 }, // GREEK CAPITAL LETTER IOTA WITH OXIA + { 0x1FE8, 0x1FE0 }, // GREEK CAPITAL LETTER UPSILON WITH VRACHY + { 0x1FE9, 0x1FE1 }, // GREEK CAPITAL LETTER UPSILON WITH MACRON + { 0x1FEA, 0x1F7A }, // GREEK CAPITAL LETTER UPSILON WITH VARIA + { 0x1FEB, 0x1F7B }, // GREEK CAPITAL LETTER UPSILON WITH OXIA + { 0x1FEC, 0x1FE5 }, // GREEK CAPITAL LETTER RHO WITH DASIA + { 0x1FF8, 0x1F78 }, // GREEK CAPITAL LETTER OMICRON WITH VARIA + { 0x1FF9, 0x1F79 }, // GREEK CAPITAL LETTER OMICRON WITH OXIA + { 0x1FFA, 0x1F7C }, // GREEK CAPITAL LETTER OMEGA WITH VARIA + { 0x1FFB, 0x1F7D }, // GREEK CAPITAL LETTER OMEGA WITH OXIA + { 0x1FFC, 0x1FF3 }, // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + { 0x2126, 0x03C9 }, // OHM SIGN + { 0x212A, 0x006B }, // KELVIN SIGN + { 0x212B, 0x00E5 }, // ANGSTROM SIGN + { 0x2132, 0x214E }, // TURNED CAPITAL F + { 0x2160, 0x2170 }, // ROMAN NUMERAL ONE + { 0x2161, 0x2171 }, // ROMAN NUMERAL TWO + { 0x2162, 0x2172 }, // ROMAN NUMERAL THREE + { 0x2163, 0x2173 }, // ROMAN NUMERAL FOUR + { 0x2164, 0x2174 }, // ROMAN NUMERAL FIVE + { 0x2165, 0x2175 }, // ROMAN NUMERAL SIX + { 0x2166, 0x2176 }, // ROMAN NUMERAL SEVEN + { 0x2167, 0x2177 }, // ROMAN NUMERAL EIGHT + { 0x2168, 0x2178 }, // ROMAN NUMERAL NINE + { 0x2169, 0x2179 }, // ROMAN NUMERAL TEN + { 0x216A, 0x217A }, // ROMAN NUMERAL ELEVEN + { 0x216B, 0x217B }, // ROMAN NUMERAL TWELVE + { 0x216C, 0x217C }, // ROMAN NUMERAL FIFTY + { 0x216D, 0x217D }, // ROMAN NUMERAL ONE HUNDRED + { 0x216E, 0x217E }, // ROMAN NUMERAL FIVE HUNDRED + { 0x216F, 0x217F }, // ROMAN NUMERAL ONE THOUSAND + { 0x2183, 0x2184 }, // ROMAN NUMERAL REVERSED ONE HUNDRED + { 0x24B6, 0x24D0 }, // CIRCLED LATIN CAPITAL LETTER A + { 0x24B7, 0x24D1 }, // CIRCLED LATIN CAPITAL LETTER B + { 0x24B8, 0x24D2 }, // CIRCLED LATIN CAPITAL LETTER C + { 0x24B9, 0x24D3 }, // CIRCLED LATIN CAPITAL LETTER D + { 0x24BA, 0x24D4 }, // CIRCLED LATIN CAPITAL LETTER E + { 0x24BB, 0x24D5 }, // CIRCLED LATIN CAPITAL LETTER F + { 0x24BC, 0x24D6 }, // CIRCLED LATIN CAPITAL LETTER G + { 0x24BD, 0x24D7 }, // CIRCLED LATIN CAPITAL LETTER H + { 0x24BE, 0x24D8 }, // CIRCLED LATIN CAPITAL LETTER I + { 0x24BF, 0x24D9 }, // CIRCLED LATIN CAPITAL LETTER J + { 0x24C0, 0x24DA }, // CIRCLED LATIN CAPITAL LETTER K + { 0x24C1, 0x24DB }, // CIRCLED LATIN CAPITAL LETTER L + { 0x24C2, 0x24DC }, // CIRCLED LATIN CAPITAL LETTER M + { 0x24C3, 0x24DD }, // CIRCLED LATIN CAPITAL LETTER N + { 0x24C4, 0x24DE }, // CIRCLED LATIN CAPITAL LETTER O + { 0x24C5, 0x24DF }, // CIRCLED LATIN CAPITAL LETTER P + { 0x24C6, 0x24E0 }, // CIRCLED LATIN CAPITAL LETTER Q + { 0x24C7, 0x24E1 }, // CIRCLED LATIN CAPITAL LETTER R + { 0x24C8, 0x24E2 }, // CIRCLED LATIN CAPITAL LETTER S + { 0x24C9, 0x24E3 }, // CIRCLED LATIN CAPITAL LETTER T + { 0x24CA, 0x24E4 }, // CIRCLED LATIN CAPITAL LETTER U + { 0x24CB, 0x24E5 }, // CIRCLED LATIN CAPITAL LETTER V + { 0x24CC, 0x24E6 }, // CIRCLED LATIN CAPITAL LETTER W + { 0x24CD, 0x24E7 }, // CIRCLED LATIN CAPITAL LETTER X + { 0x24CE, 0x24E8 }, // CIRCLED LATIN CAPITAL LETTER Y + { 0x24CF, 0x24E9 }, // CIRCLED LATIN CAPITAL LETTER Z + { 0x2C00, 0x2C30 }, // GLAGOLITIC CAPITAL LETTER AZU + { 0x2C01, 0x2C31 }, // GLAGOLITIC CAPITAL LETTER BUKY + { 0x2C02, 0x2C32 }, // GLAGOLITIC CAPITAL LETTER VEDE + { 0x2C03, 0x2C33 }, // GLAGOLITIC CAPITAL LETTER GLAGOLI + { 0x2C04, 0x2C34 }, // GLAGOLITIC CAPITAL LETTER DOBRO + { 0x2C05, 0x2C35 }, // GLAGOLITIC CAPITAL LETTER YESTU + { 0x2C06, 0x2C36 }, // GLAGOLITIC CAPITAL LETTER ZHIVETE + { 0x2C07, 0x2C37 }, // GLAGOLITIC CAPITAL LETTER DZELO + { 0x2C08, 0x2C38 }, // GLAGOLITIC CAPITAL LETTER ZEMLJA + { 0x2C09, 0x2C39 }, // GLAGOLITIC CAPITAL LETTER IZHE + { 0x2C0A, 0x2C3A }, // GLAGOLITIC CAPITAL LETTER INITIAL IZHE + { 0x2C0B, 0x2C3B }, // GLAGOLITIC CAPITAL LETTER I + { 0x2C0C, 0x2C3C }, // GLAGOLITIC CAPITAL LETTER DJERVI + { 0x2C0D, 0x2C3D }, // GLAGOLITIC CAPITAL LETTER KAKO + { 0x2C0E, 0x2C3E }, // GLAGOLITIC CAPITAL LETTER LJUDIJE + { 0x2C0F, 0x2C3F }, // GLAGOLITIC CAPITAL LETTER MYSLITE + { 0x2C10, 0x2C40 }, // GLAGOLITIC CAPITAL LETTER NASHI + { 0x2C11, 0x2C41 }, // GLAGOLITIC CAPITAL LETTER ONU + { 0x2C12, 0x2C42 }, // GLAGOLITIC CAPITAL LETTER POKOJI + { 0x2C13, 0x2C43 }, // GLAGOLITIC CAPITAL LETTER RITSI + { 0x2C14, 0x2C44 }, // GLAGOLITIC CAPITAL LETTER SLOVO + { 0x2C15, 0x2C45 }, // GLAGOLITIC CAPITAL LETTER TVRIDO + { 0x2C16, 0x2C46 }, // GLAGOLITIC CAPITAL LETTER UKU + { 0x2C17, 0x2C47 }, // GLAGOLITIC CAPITAL LETTER FRITU + { 0x2C18, 0x2C48 }, // GLAGOLITIC CAPITAL LETTER HERU + { 0x2C19, 0x2C49 }, // GLAGOLITIC CAPITAL LETTER OTU + { 0x2C1A, 0x2C4A }, // GLAGOLITIC CAPITAL LETTER PE + { 0x2C1B, 0x2C4B }, // GLAGOLITIC CAPITAL LETTER SHTA + { 0x2C1C, 0x2C4C }, // GLAGOLITIC CAPITAL LETTER TSI + { 0x2C1D, 0x2C4D }, // GLAGOLITIC CAPITAL LETTER CHRIVI + { 0x2C1E, 0x2C4E }, // GLAGOLITIC CAPITAL LETTER SHA + { 0x2C1F, 0x2C4F }, // GLAGOLITIC CAPITAL LETTER YERU + { 0x2C20, 0x2C50 }, // GLAGOLITIC CAPITAL LETTER YERI + { 0x2C21, 0x2C51 }, // GLAGOLITIC CAPITAL LETTER YATI + { 0x2C22, 0x2C52 }, // GLAGOLITIC CAPITAL LETTER SPIDERY HA + { 0x2C23, 0x2C53 }, // GLAGOLITIC CAPITAL LETTER YU + { 0x2C24, 0x2C54 }, // GLAGOLITIC CAPITAL LETTER SMALL YUS + { 0x2C25, 0x2C55 }, // GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL + { 0x2C26, 0x2C56 }, // GLAGOLITIC CAPITAL LETTER YO + { 0x2C27, 0x2C57 }, // GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS + { 0x2C28, 0x2C58 }, // GLAGOLITIC CAPITAL LETTER BIG YUS + { 0x2C29, 0x2C59 }, // GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS + { 0x2C2A, 0x2C5A }, // GLAGOLITIC CAPITAL LETTER FITA + { 0x2C2B, 0x2C5B }, // GLAGOLITIC CAPITAL LETTER IZHITSA + { 0x2C2C, 0x2C5C }, // GLAGOLITIC CAPITAL LETTER SHTAPIC + { 0x2C2D, 0x2C5D }, // GLAGOLITIC CAPITAL LETTER TROKUTASTI A + { 0x2C2E, 0x2C5E }, // GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE + { 0x2C60, 0x2C61 }, // LATIN CAPITAL LETTER L WITH DOUBLE BAR + { 0x2C62, 0x026B }, // LATIN CAPITAL LETTER L WITH MIDDLE TILDE + { 0x2C63, 0x1D7D }, // LATIN CAPITAL LETTER P WITH STROKE + { 0x2C64, 0x027D }, // LATIN CAPITAL LETTER R WITH TAIL + { 0x2C67, 0x2C68 }, // LATIN CAPITAL LETTER H WITH DESCENDER + { 0x2C69, 0x2C6A }, // LATIN CAPITAL LETTER K WITH DESCENDER + { 0x2C6B, 0x2C6C }, // LATIN CAPITAL LETTER Z WITH DESCENDER + { 0x2C6D, 0x0251 }, // LATIN CAPITAL LETTER ALPHA + { 0x2C6E, 0x0271 }, // LATIN CAPITAL LETTER M WITH HOOK + { 0x2C6F, 0x0250 }, // LATIN CAPITAL LETTER TURNED A + { 0x2C70, 0x0252 }, // LATIN CAPITAL LETTER TURNED ALPHA + { 0x2C72, 0x2C73 }, // LATIN CAPITAL LETTER W WITH HOOK + { 0x2C75, 0x2C76 }, // LATIN CAPITAL LETTER HALF H + { 0x2C7E, 0x023F }, // LATIN CAPITAL LETTER S WITH SWASH TAIL + { 0x2C7F, 0x0240 }, // LATIN CAPITAL LETTER Z WITH SWASH TAIL + { 0x2C80, 0x2C81 }, // COPTIC CAPITAL LETTER ALFA + { 0x2C82, 0x2C83 }, // COPTIC CAPITAL LETTER VIDA + { 0x2C84, 0x2C85 }, // COPTIC CAPITAL LETTER GAMMA + { 0x2C86, 0x2C87 }, // COPTIC CAPITAL LETTER DALDA + { 0x2C88, 0x2C89 }, // COPTIC CAPITAL LETTER EIE + { 0x2C8A, 0x2C8B }, // COPTIC CAPITAL LETTER SOU + { 0x2C8C, 0x2C8D }, // COPTIC CAPITAL LETTER ZATA + { 0x2C8E, 0x2C8F }, // COPTIC CAPITAL LETTER HATE + { 0x2C90, 0x2C91 }, // COPTIC CAPITAL LETTER THETHE + { 0x2C92, 0x2C93 }, // COPTIC CAPITAL LETTER IAUDA + { 0x2C94, 0x2C95 }, // COPTIC CAPITAL LETTER KAPA + { 0x2C96, 0x2C97 }, // COPTIC CAPITAL LETTER LAULA + { 0x2C98, 0x2C99 }, // COPTIC CAPITAL LETTER MI + { 0x2C9A, 0x2C9B }, // COPTIC CAPITAL LETTER NI + { 0x2C9C, 0x2C9D }, // COPTIC CAPITAL LETTER KSI + { 0x2C9E, 0x2C9F }, // COPTIC CAPITAL LETTER O + { 0x2CA0, 0x2CA1 }, // COPTIC CAPITAL LETTER PI + { 0x2CA2, 0x2CA3 }, // COPTIC CAPITAL LETTER RO + { 0x2CA4, 0x2CA5 }, // COPTIC CAPITAL LETTER SIMA + { 0x2CA6, 0x2CA7 }, // COPTIC CAPITAL LETTER TAU + { 0x2CA8, 0x2CA9 }, // COPTIC CAPITAL LETTER UA + { 0x2CAA, 0x2CAB }, // COPTIC CAPITAL LETTER FI + { 0x2CAC, 0x2CAD }, // COPTIC CAPITAL LETTER KHI + { 0x2CAE, 0x2CAF }, // COPTIC CAPITAL LETTER PSI + { 0x2CB0, 0x2CB1 }, // COPTIC CAPITAL LETTER OOU + { 0x2CB2, 0x2CB3 }, // COPTIC CAPITAL LETTER DIALECT-P ALEF + { 0x2CB4, 0x2CB5 }, // COPTIC CAPITAL LETTER OLD COPTIC AIN + { 0x2CB6, 0x2CB7 }, // COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE + { 0x2CB8, 0x2CB9 }, // COPTIC CAPITAL LETTER DIALECT-P KAPA + { 0x2CBA, 0x2CBB }, // COPTIC CAPITAL LETTER DIALECT-P NI + { 0x2CBC, 0x2CBD }, // COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI + { 0x2CBE, 0x2CBF }, // COPTIC CAPITAL LETTER OLD COPTIC OOU + { 0x2CC0, 0x2CC1 }, // COPTIC CAPITAL LETTER SAMPI + { 0x2CC2, 0x2CC3 }, // COPTIC CAPITAL LETTER CROSSED SHEI + { 0x2CC4, 0x2CC5 }, // COPTIC CAPITAL LETTER OLD COPTIC SHEI + { 0x2CC6, 0x2CC7 }, // COPTIC CAPITAL LETTER OLD COPTIC ESH + { 0x2CC8, 0x2CC9 }, // COPTIC CAPITAL LETTER AKHMIMIC KHEI + { 0x2CCA, 0x2CCB }, // COPTIC CAPITAL LETTER DIALECT-P HORI + { 0x2CCC, 0x2CCD }, // COPTIC CAPITAL LETTER OLD COPTIC HORI + { 0x2CCE, 0x2CCF }, // COPTIC CAPITAL LETTER OLD COPTIC HA + { 0x2CD0, 0x2CD1 }, // COPTIC CAPITAL LETTER L-SHAPED HA + { 0x2CD2, 0x2CD3 }, // COPTIC CAPITAL LETTER OLD COPTIC HEI + { 0x2CD4, 0x2CD5 }, // COPTIC CAPITAL LETTER OLD COPTIC HAT + { 0x2CD6, 0x2CD7 }, // COPTIC CAPITAL LETTER OLD COPTIC GANGIA + { 0x2CD8, 0x2CD9 }, // COPTIC CAPITAL LETTER OLD COPTIC DJA + { 0x2CDA, 0x2CDB }, // COPTIC CAPITAL LETTER OLD COPTIC SHIMA + { 0x2CDC, 0x2CDD }, // COPTIC CAPITAL LETTER OLD NUBIAN SHIMA + { 0x2CDE, 0x2CDF }, // COPTIC CAPITAL LETTER OLD NUBIAN NGI + { 0x2CE0, 0x2CE1 }, // COPTIC CAPITAL LETTER OLD NUBIAN NYI + { 0x2CE2, 0x2CE3 }, // COPTIC CAPITAL LETTER OLD NUBIAN WAU + { 0x2CEB, 0x2CEC }, // COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI + { 0x2CED, 0x2CEE }, // COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA + { 0xA640, 0xA641 }, // CYRILLIC CAPITAL LETTER ZEMLYA + { 0xA642, 0xA643 }, // CYRILLIC CAPITAL LETTER DZELO + { 0xA644, 0xA645 }, // CYRILLIC CAPITAL LETTER REVERSED DZE + { 0xA646, 0xA647 }, // CYRILLIC CAPITAL LETTER IOTA + { 0xA648, 0xA649 }, // CYRILLIC CAPITAL LETTER DJERV + { 0xA64A, 0xA64B }, // CYRILLIC CAPITAL LETTER MONOGRAPH UK + { 0xA64C, 0xA64D }, // CYRILLIC CAPITAL LETTER BROAD OMEGA + { 0xA64E, 0xA64F }, // CYRILLIC CAPITAL LETTER NEUTRAL YER + { 0xA650, 0xA651 }, // CYRILLIC CAPITAL LETTER YERU WITH BACK YER + { 0xA652, 0xA653 }, // CYRILLIC CAPITAL LETTER IOTIFIED YAT + { 0xA654, 0xA655 }, // CYRILLIC CAPITAL LETTER REVERSED YU + { 0xA656, 0xA657 }, // CYRILLIC CAPITAL LETTER IOTIFIED A + { 0xA658, 0xA659 }, // CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS + { 0xA65A, 0xA65B }, // CYRILLIC CAPITAL LETTER BLENDED YUS + { 0xA65C, 0xA65D }, // CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS + { 0xA65E, 0xA65F }, // CYRILLIC CAPITAL LETTER YN + { 0xA662, 0xA663 }, // CYRILLIC CAPITAL LETTER SOFT DE + { 0xA664, 0xA665 }, // CYRILLIC CAPITAL LETTER SOFT EL + { 0xA666, 0xA667 }, // CYRILLIC CAPITAL LETTER SOFT EM + { 0xA668, 0xA669 }, // CYRILLIC CAPITAL LETTER MONOCULAR O + { 0xA66A, 0xA66B }, // CYRILLIC CAPITAL LETTER BINOCULAR O + { 0xA66C, 0xA66D }, // CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O + { 0xA680, 0xA681 }, // CYRILLIC CAPITAL LETTER DWE + { 0xA682, 0xA683 }, // CYRILLIC CAPITAL LETTER DZWE + { 0xA684, 0xA685 }, // CYRILLIC CAPITAL LETTER ZHWE + { 0xA686, 0xA687 }, // CYRILLIC CAPITAL LETTER CCHE + { 0xA688, 0xA689 }, // CYRILLIC CAPITAL LETTER DZZE + { 0xA68A, 0xA68B }, // CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK + { 0xA68C, 0xA68D }, // CYRILLIC CAPITAL LETTER TWE + { 0xA68E, 0xA68F }, // CYRILLIC CAPITAL LETTER TSWE + { 0xA690, 0xA691 }, // CYRILLIC CAPITAL LETTER TSSE + { 0xA692, 0xA693 }, // CYRILLIC CAPITAL LETTER TCHE + { 0xA694, 0xA695 }, // CYRILLIC CAPITAL LETTER HWE + { 0xA696, 0xA697 }, // CYRILLIC CAPITAL LETTER SHWE + { 0xA722, 0xA723 }, // LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF + { 0xA724, 0xA725 }, // LATIN CAPITAL LETTER EGYPTOLOGICAL AIN + { 0xA726, 0xA727 }, // LATIN CAPITAL LETTER HENG + { 0xA728, 0xA729 }, // LATIN CAPITAL LETTER TZ + { 0xA72A, 0xA72B }, // LATIN CAPITAL LETTER TRESILLO + { 0xA72C, 0xA72D }, // LATIN CAPITAL LETTER CUATRILLO + { 0xA72E, 0xA72F }, // LATIN CAPITAL LETTER CUATRILLO WITH COMMA + { 0xA732, 0xA733 }, // LATIN CAPITAL LETTER AA + { 0xA734, 0xA735 }, // LATIN CAPITAL LETTER AO + { 0xA736, 0xA737 }, // LATIN CAPITAL LETTER AU + { 0xA738, 0xA739 }, // LATIN CAPITAL LETTER AV + { 0xA73A, 0xA73B }, // LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR + { 0xA73C, 0xA73D }, // LATIN CAPITAL LETTER AY + { 0xA73E, 0xA73F }, // LATIN CAPITAL LETTER REVERSED C WITH DOT + { 0xA740, 0xA741 }, // LATIN CAPITAL LETTER K WITH STROKE + { 0xA742, 0xA743 }, // LATIN CAPITAL LETTER K WITH DIAGONAL STROKE + { 0xA744, 0xA745 }, // LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE + { 0xA746, 0xA747 }, // LATIN CAPITAL LETTER BROKEN L + { 0xA748, 0xA749 }, // LATIN CAPITAL LETTER L WITH HIGH STROKE + { 0xA74A, 0xA74B }, // LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY + { 0xA74C, 0xA74D }, // LATIN CAPITAL LETTER O WITH LOOP + { 0xA74E, 0xA74F }, // LATIN CAPITAL LETTER OO + { 0xA750, 0xA751 }, // LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER + { 0xA752, 0xA753 }, // LATIN CAPITAL LETTER P WITH FLOURISH + { 0xA754, 0xA755 }, // LATIN CAPITAL LETTER P WITH SQUIRREL TAIL + { 0xA756, 0xA757 }, // LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER + { 0xA758, 0xA759 }, // LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE + { 0xA75A, 0xA75B }, // LATIN CAPITAL LETTER R ROTUNDA + { 0xA75C, 0xA75D }, // LATIN CAPITAL LETTER RUM ROTUNDA + { 0xA75E, 0xA75F }, // LATIN CAPITAL LETTER V WITH DIAGONAL STROKE + { 0xA760, 0xA761 }, // LATIN CAPITAL LETTER VY + { 0xA762, 0xA763 }, // LATIN CAPITAL LETTER VISIGOTHIC Z + { 0xA764, 0xA765 }, // LATIN CAPITAL LETTER THORN WITH STROKE + { 0xA766, 0xA767 }, // LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER + { 0xA768, 0xA769 }, // LATIN CAPITAL LETTER VEND + { 0xA76A, 0xA76B }, // LATIN CAPITAL LETTER ET + { 0xA76C, 0xA76D }, // LATIN CAPITAL LETTER IS + { 0xA76E, 0xA76F }, // LATIN CAPITAL LETTER CON + { 0xA779, 0xA77A }, // LATIN CAPITAL LETTER INSULAR D + { 0xA77B, 0xA77C }, // LATIN CAPITAL LETTER INSULAR F + { 0xA77D, 0x1D79 }, // LATIN CAPITAL LETTER INSULAR G + { 0xA77E, 0xA77F }, // LATIN CAPITAL LETTER TURNED INSULAR G + { 0xA780, 0xA781 }, // LATIN CAPITAL LETTER TURNED L + { 0xA782, 0xA783 }, // LATIN CAPITAL LETTER INSULAR R + { 0xA784, 0xA785 }, // LATIN CAPITAL LETTER INSULAR S + { 0xA786, 0xA787 }, // LATIN CAPITAL LETTER INSULAR T + { 0xA78B, 0xA78C }, // LATIN CAPITAL LETTER SALTILLO + { 0xFF21, 0xFF41 }, // FULLWIDTH LATIN CAPITAL LETTER A + { 0xFF22, 0xFF42 }, // FULLWIDTH LATIN CAPITAL LETTER B + { 0xFF23, 0xFF43 }, // FULLWIDTH LATIN CAPITAL LETTER C + { 0xFF24, 0xFF44 }, // FULLWIDTH LATIN CAPITAL LETTER D + { 0xFF25, 0xFF45 }, // FULLWIDTH LATIN CAPITAL LETTER E + { 0xFF26, 0xFF46 }, // FULLWIDTH LATIN CAPITAL LETTER F + { 0xFF27, 0xFF47 }, // FULLWIDTH LATIN CAPITAL LETTER G + { 0xFF28, 0xFF48 }, // FULLWIDTH LATIN CAPITAL LETTER H + { 0xFF29, 0xFF49 }, // FULLWIDTH LATIN CAPITAL LETTER I + { 0xFF2A, 0xFF4A }, // FULLWIDTH LATIN CAPITAL LETTER J + { 0xFF2B, 0xFF4B }, // FULLWIDTH LATIN CAPITAL LETTER K + { 0xFF2C, 0xFF4C }, // FULLWIDTH LATIN CAPITAL LETTER L + { 0xFF2D, 0xFF4D }, // FULLWIDTH LATIN CAPITAL LETTER M + { 0xFF2E, 0xFF4E }, // FULLWIDTH LATIN CAPITAL LETTER N + { 0xFF2F, 0xFF4F }, // FULLWIDTH LATIN CAPITAL LETTER O + { 0xFF30, 0xFF50 }, // FULLWIDTH LATIN CAPITAL LETTER P + { 0xFF31, 0xFF51 }, // FULLWIDTH LATIN CAPITAL LETTER Q + { 0xFF32, 0xFF52 }, // FULLWIDTH LATIN CAPITAL LETTER R + { 0xFF33, 0xFF53 }, // FULLWIDTH LATIN CAPITAL LETTER S + { 0xFF34, 0xFF54 }, // FULLWIDTH LATIN CAPITAL LETTER T + { 0xFF35, 0xFF55 }, // FULLWIDTH LATIN CAPITAL LETTER U + { 0xFF36, 0xFF56 }, // FULLWIDTH LATIN CAPITAL LETTER V + { 0xFF37, 0xFF57 }, // FULLWIDTH LATIN CAPITAL LETTER W + { 0xFF38, 0xFF58 }, // FULLWIDTH LATIN CAPITAL LETTER X + { 0xFF39, 0xFF59 }, // FULLWIDTH LATIN CAPITAL LETTER Y + { 0xFF3A, 0xFF5A } // FULLWIDTH LATIN CAPITAL LETTER Z +}; + +unsigned short latin_tolower(unsigned short c0) { + const struct LatinCapitalSmallPair *p; + const struct LatinCapitalSmallPair *base = SORTED_CHAR_MAP; + int c = c0; + int lim, cmp; + const size_t nmemb = sizeof(SORTED_CHAR_MAP) / sizeof(SORTED_CHAR_MAP[0]); + + // Binary search: Taken from bionic + for (lim = nmemb; lim != 0; lim >>= 1) { + p = base + (lim >> 1); + cmp = c - (int)p->capital; + if (cmp == 0) + return p->small; + if (cmp > 0) { /* key > p: move right */ + base = p + 1; + lim--; + } /* else move left */ + } + return c0; +} + +} // namespace latinime diff --git a/native/src/char_utils.h b/native/src/char_utils.h new file mode 100644 index 000000000..921ecb4a5 --- /dev/null +++ b/native/src/char_utils.h @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2010 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. + */ + +#ifndef LATINIME_CHAR_UTILS_H +#define LATINIME_CHAR_UTILS_H + +namespace latinime { + +unsigned short latin_tolower(unsigned short c); + +}; // namespace latinime + +#endif // LATINIME_CHAR_UTILS_H diff --git a/native/src/dictionary.cpp b/native/src/dictionary.cpp index 6e6f44182..3f196a9ed 100644 --- a/native/src/dictionary.cpp +++ b/native/src/dictionary.cpp @@ -21,8 +21,6 @@ #include #include -#include - //#define USE_ASSET_MANAGER #ifdef USE_ASSET_MANAGER @@ -32,6 +30,7 @@ #include "dictionary.h" #include "basechars.h" +#include "char_utils.h" #define DEBUG_DICT 0 @@ -176,7 +175,7 @@ Dictionary::toLowerCase(unsigned short c) { if (c >='A' && c <= 'Z') { c |= 32; } else if (c > 127) { - c = u_tolower(c); + c = latin_tolower(c); } return c; } From 6874267be0cfceb9db98c24136216c6ef84b4ec9 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 21 Apr 2010 23:07:14 +0900 Subject: [PATCH 005/159] Optimize latin_tolower(). Marge from master: https://android-git.corp.google.com/g/#change,49214 Change-Id: Ib1d7711aca533c21e5179b557a3ed806ac3fbdc6 --- native/src/char_utils.cpp | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/native/src/char_utils.cpp b/native/src/char_utils.cpp index 3cacc9e16..c9204df24 100644 --- a/native/src/char_utils.cpp +++ b/native/src/char_utils.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include +#include namespace latinime { @@ -882,18 +882,25 @@ static const struct LatinCapitalSmallPair SORTED_CHAR_MAP[] = { { 0xFF3A, 0xFF5A } // FULLWIDTH LATIN CAPITAL LETTER Z }; -static int compare_pair_capital(const void *a, const void *b) { - return (int)((struct LatinCapitalSmallPair*)a)->capital - - (int)((struct LatinCapitalSmallPair*)b)->capital; -} +unsigned short latin_tolower(unsigned short c0) { + const struct LatinCapitalSmallPair *p; + const struct LatinCapitalSmallPair *base = SORTED_CHAR_MAP; + int c = c0; + int lim, cmp; + const size_t nmemb = sizeof(SORTED_CHAR_MAP) / sizeof(SORTED_CHAR_MAP[0]); -unsigned short latin_tolower(unsigned short c) { - struct LatinCapitalSmallPair *p = - (struct LatinCapitalSmallPair *)bsearch(&c, SORTED_CHAR_MAP, - sizeof(SORTED_CHAR_MAP) / sizeof(SORTED_CHAR_MAP[0]), - sizeof(SORTED_CHAR_MAP[0]), - compare_pair_capital); - return p ? p->small : c; + // Binary search: Taken from bionic + for (lim = nmemb; lim != 0; lim >>= 1) { + p = base + (lim >> 1); + cmp = c - (int)p->capital; + if (cmp == 0) + return p->small; + if (cmp > 0) { /* key > p: move right */ + base = p + 1; + lim--; + } /* else move left */ + } + return c0; } } // namespace latinime From f1abb8ce3c5527b67c21aab68e357a39626ce0af Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 23 Apr 2010 01:24:09 +0900 Subject: [PATCH 006/159] Get rid of code taken from bionic to avoid license issue. Change-Id: If96f4247edbc7b1e9f7418d2ddef191618a54ae3 --- native/src/char_utils.cpp | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/native/src/char_utils.cpp b/native/src/char_utils.cpp index c9204df24..a31a0632c 100644 --- a/native/src/char_utils.cpp +++ b/native/src/char_utils.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include +#include namespace latinime { @@ -27,7 +27,7 @@ struct LatinCapitalSmallPair { // // 1. Run the following code. Bascially taken from // Dictionary::toLowerCase(unsigned short c) in dictionary.cpp. -// Then, get the list of chars where ccc != ccc2 above. +// Then, get the list of chars where cc != ccc. // // unsigned short c, cc, ccc, ccc2; // for (c = 0; c < 0xFFFF ; c++) { @@ -882,25 +882,18 @@ static const struct LatinCapitalSmallPair SORTED_CHAR_MAP[] = { { 0xFF3A, 0xFF5A } // FULLWIDTH LATIN CAPITAL LETTER Z }; -unsigned short latin_tolower(unsigned short c0) { - const struct LatinCapitalSmallPair *p; - const struct LatinCapitalSmallPair *base = SORTED_CHAR_MAP; - int c = c0; - int lim, cmp; - const size_t nmemb = sizeof(SORTED_CHAR_MAP) / sizeof(SORTED_CHAR_MAP[0]); +static int compare_pair_capital(const void *a, const void *b) { + return (int)(*(unsigned short *)a) + - (int)((struct LatinCapitalSmallPair*)b)->capital; +} - // Binary search: Taken from bionic - for (lim = nmemb; lim != 0; lim >>= 1) { - p = base + (lim >> 1); - cmp = c - (int)p->capital; - if (cmp == 0) - return p->small; - if (cmp > 0) { /* key > p: move right */ - base = p + 1; - lim--; - } /* else move left */ - } - return c0; +unsigned short latin_tolower(unsigned short c) { + struct LatinCapitalSmallPair *p = + (struct LatinCapitalSmallPair *)bsearch(&c, SORTED_CHAR_MAP, + sizeof(SORTED_CHAR_MAP) / sizeof(SORTED_CHAR_MAP[0]), + sizeof(SORTED_CHAR_MAP[0]), + compare_pair_capital); + return p ? p->small : c; } } // namespace latinime From 6d0c954bafb63ed544351c8fe8d673a83e6f7014 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 23 Apr 2010 08:58:56 +0900 Subject: [PATCH 007/159] bionic code removal. Merge from https://android-git.corp.google.com/g/#change,49461 . Change-Id: I9448ad4ee8bf566c830cdef0df907f1695cfb409 --- native/src/char_utils.cpp | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/native/src/char_utils.cpp b/native/src/char_utils.cpp index c9204df24..a31a0632c 100644 --- a/native/src/char_utils.cpp +++ b/native/src/char_utils.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include +#include namespace latinime { @@ -27,7 +27,7 @@ struct LatinCapitalSmallPair { // // 1. Run the following code. Bascially taken from // Dictionary::toLowerCase(unsigned short c) in dictionary.cpp. -// Then, get the list of chars where ccc != ccc2 above. +// Then, get the list of chars where cc != ccc. // // unsigned short c, cc, ccc, ccc2; // for (c = 0; c < 0xFFFF ; c++) { @@ -882,25 +882,18 @@ static const struct LatinCapitalSmallPair SORTED_CHAR_MAP[] = { { 0xFF3A, 0xFF5A } // FULLWIDTH LATIN CAPITAL LETTER Z }; -unsigned short latin_tolower(unsigned short c0) { - const struct LatinCapitalSmallPair *p; - const struct LatinCapitalSmallPair *base = SORTED_CHAR_MAP; - int c = c0; - int lim, cmp; - const size_t nmemb = sizeof(SORTED_CHAR_MAP) / sizeof(SORTED_CHAR_MAP[0]); +static int compare_pair_capital(const void *a, const void *b) { + return (int)(*(unsigned short *)a) + - (int)((struct LatinCapitalSmallPair*)b)->capital; +} - // Binary search: Taken from bionic - for (lim = nmemb; lim != 0; lim >>= 1) { - p = base + (lim >> 1); - cmp = c - (int)p->capital; - if (cmp == 0) - return p->small; - if (cmp > 0) { /* key > p: move right */ - base = p + 1; - lim--; - } /* else move left */ - } - return c0; +unsigned short latin_tolower(unsigned short c) { + struct LatinCapitalSmallPair *p = + (struct LatinCapitalSmallPair *)bsearch(&c, SORTED_CHAR_MAP, + sizeof(SORTED_CHAR_MAP) / sizeof(SORTED_CHAR_MAP[0]), + sizeof(SORTED_CHAR_MAP[0]), + compare_pair_capital); + return p ? p->small : c; } } // namespace latinime From 4606367f98a30c97715e9b7f312d5f9b97d0a053 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Mon, 26 Apr 2010 19:10:14 +0900 Subject: [PATCH 008/159] Get rid of dependency on native AssetManager API. Confirmed the native code builds with the NDK r3. Change-Id: I6a9a5bb4129e9269d74348801436c9e5e0058da5 --- .../inputmethod/latin/BinaryDictionary.java | 41 +++++++++-- native/Android.mk | 7 -- ...oid_inputmethod_latin_BinaryDictionary.cpp | 68 ++----------------- native/src/dictionary.cpp | 10 +-- 4 files changed, 41 insertions(+), 85 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 6d0257b82..9fcd9e50c 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -16,6 +16,11 @@ package com.android.inputmethod.latin; +import java.io.InputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.Channels; import java.util.Arrays; import android.content.Context; @@ -27,6 +32,7 @@ import android.util.Log; */ public class BinaryDictionary extends Dictionary { + private static final String TAG = "BinaryDictionary"; public static final int MAX_WORD_LENGTH = 48; private static final int MAX_ALTERNATIVES = 16; private static final int MAX_WORDS = 16; @@ -35,16 +41,19 @@ public class BinaryDictionary extends Dictionary { private static final boolean ENABLE_MISSED_CHARACTERS = true; private int mNativeDict; - private int mDictLength; // This value is set from native code, don't change the name!!!! + private int mDictLength; private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES]; private char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS]; private int[] mFrequencies = new int[MAX_WORDS]; + // Keep a reference to the native dict direct buffer in Java to avoid + // unexpected deallocation of the direct buffer. + private ByteBuffer mNativeDictDirectBuffer; static { try { System.loadLibrary("jni_latinime2"); } catch (UnsatisfiedLinkError ule) { - Log.e("BinaryDictionary", "Could not load native library jni_latinime"); + Log.e("BinaryDictionary", "Could not load native library jni_latinime2"); } } @@ -59,8 +68,7 @@ public class BinaryDictionary extends Dictionary { } } - private native int openNative(AssetManager am, String resourcePath, int typedLetterMultiplier, - int fullWordMultiplier); + private native int openNative(ByteBuffer bb, int typedLetterMultiplier, int fullWordMultiplier); private native void closeNative(int dict); private native boolean isValidWordNative(int nativeData, char[] word, int wordLength); private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize, @@ -69,9 +77,28 @@ public class BinaryDictionary extends Dictionary { int[] nextLettersFrequencies, int nextLettersSize); private final void loadDictionary(Context context, int resId) { - AssetManager am = context.getResources().getAssets(); - String assetName = context.getResources().getString(resId); - mNativeDict = openNative(am, assetName, TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); + InputStream is = context.getResources().openRawResource(resId); + try { + int avail = is.available(); + ByteBuffer mNativeDictDirectBuffer = + ByteBuffer.allocateDirect(avail).order(ByteOrder.nativeOrder()); + int got = Channels.newChannel(is).read(mNativeDictDirectBuffer); + if (got != avail) { + Log.e(TAG, "Read " + got + " bytes, expected " + avail); + } else { + mNativeDict = openNative(mNativeDictDirectBuffer, + TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); + mDictLength = avail; + } + } catch (IOException e) { + Log.w(TAG, "No available size for binary dictionary"); + } finally { + try { + is.close(); + } catch (IOException e) { + Log.w(TAG, "Failed to close input stream"); + } + } } @Override diff --git a/native/Android.mk b/native/Android.mk index 260ca3023..57551097b 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -11,15 +11,8 @@ LOCAL_SRC_FILES := \ LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) -LOCAL_LDLIBS := -lm - LOCAL_PRELINK_MODULE := false -LOCAL_SHARED_LIBRARIES := \ - libandroid_runtime \ - libcutils \ - libutils - LOCAL_MODULE := libjni_latinime2 LOCAL_MODULE_TAGS := optional diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp index d068f3faf..bb45cb538 100644 --- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp +++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp @@ -15,31 +15,18 @@ ** limitations under the License. */ -#define LOG_TAG "BinaryDictionary" -#include "utils/Log.h" - #include #include #include #include -#include -#include "utils/AssetManager.h" -#include "utils/Asset.h" - +#include #include "dictionary.h" // ---------------------------------------------------------------------------- using namespace latinime; -using namespace android; - -static jfieldID sDescriptorField; -static jfieldID sAssetManagerNativeField; -static jmethodID sAddWordMethod; -static jfieldID sDictLength; - // // helper function to throw an exception // @@ -54,35 +41,15 @@ static void throwException(JNIEnv *env, const char* ex, const char* fmt, int dat } static jint latinime_BinaryDictionary_open - (JNIEnv *env, jobject object, jobject assetManager, jstring resourceString, + (JNIEnv *env, jobject object, jobject dictDirectBuffer, jint typedLetterMultiplier, jint fullWordMultiplier) { - // Get the native file descriptor from the FileDescriptor object - AssetManager *am = (AssetManager*) env->GetIntField(assetManager, sAssetManagerNativeField); - if (!am) { - LOGE("DICT: Couldn't get AssetManager native peer\n"); - return 0; - } - const char *resourcePath = env->GetStringUTFChars(resourceString, NULL); - - Asset *dictAsset = am->openNonAsset(resourcePath, Asset::ACCESS_BUFFER); - if (dictAsset == NULL) { - LOGE("DICT: Couldn't get asset %s\n", resourcePath); - env->ReleaseStringUTFChars(resourceString, resourcePath); - return 0; - } - - void *dict = (void*) dictAsset->getBuffer(false); + void *dict = env->GetDirectBufferAddress(dictDirectBuffer); if (dict == NULL) { - LOGE("DICT: Dictionary buffer is null\n"); - env->ReleaseStringUTFChars(resourceString, resourcePath); + fprintf(stderr, "DICT: Dictionary buffer is null\n"); return 0; } Dictionary *dictionary = new Dictionary(dict, typedLetterMultiplier, fullWordMultiplier); - dictionary->setAsset(dictAsset); - env->SetIntField(object, sDictLength, (jint) dictAsset->getLength()); - - env->ReleaseStringUTFChars(resourceString, resourcePath); return (jint) dictionary; } @@ -131,14 +98,13 @@ static void latinime_BinaryDictionary_close (JNIEnv *env, jobject object, jint dict) { Dictionary *dictionary = (Dictionary*) dict; - ((Asset*) dictionary->getAsset())->close(); delete (Dictionary*) dict; } // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { - {"openNative", "(Landroid/content/res/AssetManager;Ljava/lang/String;II)I", + {"openNative", "(Ljava/nio/ByteBuffer;II)I", (void*)latinime_BinaryDictionary_open}, {"closeNative", "(I)V", (void*)latinime_BinaryDictionary_close}, {"getSuggestionsNative", "(I[II[C[IIIII[II)I", (void*)latinime_BinaryDictionary_getSuggestions}, @@ -167,30 +133,6 @@ static int registerNativeMethods(JNIEnv* env, const char* className, 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"); - - // Get the field pointer for the dictionary length - clazz = env->FindClass(kClassPathName); - if (clazz == NULL) { - LOGE("Can't find %s", kClassPathName); - return -1; - } - sDictLength = env->GetFieldID(clazz, "mDictLength", "I"); - return registerNativeMethods(env, kClassPathName, gMethods, sizeof(gMethods) / sizeof(gMethods[0])); } diff --git a/native/src/dictionary.cpp b/native/src/dictionary.cpp index 3f196a9ed..e75beb5b7 100644 --- a/native/src/dictionary.cpp +++ b/native/src/dictionary.cpp @@ -19,14 +19,8 @@ #include #include #include -#include - -//#define USE_ASSET_MANAGER - -#ifdef USE_ASSET_MANAGER -#include -#include -#endif +//#include +#define LOGI #include "dictionary.h" #include "basechars.h" From ac981fd39af593e76aa88849e23dc21f46578580 Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 27 Apr 2010 13:59:08 +0900 Subject: [PATCH 009/159] Add a base class of logger Change-Id: I8462369d59f90642331c08baada354f7a0b07e45 --- .../inputmethod/latin/LatinImeLogger.java | 202 ++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 java/src/com/android/inputmethod/latin/LatinImeLogger.java diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java new file mode 100644 index 000000000..f65720d2a --- /dev/null +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2010 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; +import android.os.DropBoxManager; +import android.text.format.DateUtils; +import android.util.Log; + +import java.util.ArrayList; + +public class LatinImeLogger { + private static final String TAG = "LatinIMELogs"; + private static final boolean DBG = false; + + // Volatile is needed for multi-cpu platform. + private static volatile LatinImeLogger sLatinImeLogger; + + private static final long MINIMUMINTERVAL = 20 * DateUtils.SECOND_IN_MILLIS; // 20 sec + private static final char SEPARATER = ';'; + private static final int ID_CLICKSUGGESTION = 0; + private static final int ID_AUTOSUGGESTION = 1; + private static final int ID_AUTOSUGGESTIONCANCELED = 2; + private static final int ID_INPUT = 3; + private static final int ID_DELETE = 4; + + private ArrayList mLogBuffer; + private final Context mContext; + private final DropBoxManager mDropBox; + private long mLastTimeActive; + private long mLastTimeSend; + + private int mDeleteCount; + private int mInputCount; + + private static class LogEntry { + public final int mTag; + public final long mTime; + public final String mData; + public LogEntry (long time, int tag, String data) { + mTag = tag; + mTime = time; + mData = data; + } + } + + /** + * Returns the singleton of the logger. + * @param context + */ + public static LatinImeLogger getLogger(Context context) { + if (sLatinImeLogger == null) { + synchronized (LatinImeLogger.class) { + if (sLatinImeLogger == null) { + sLatinImeLogger =new LatinImeLogger(context); + } + } + } + return sLatinImeLogger; + } + + private LatinImeLogger(Context context) { + mContext = context; + mDropBox = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE); + mLastTimeSend = System.currentTimeMillis(); + mLastTimeActive = mLastTimeSend; + mDeleteCount = 0; + mInputCount = 0; + } + + /** + * Clear all logged data + */ + private void reset() { + mDeleteCount = 0; + mInputCount = 0; + mLogBuffer.clear(); + } + + /** + * Check if the input string is safe as an entry or not. + */ + private boolean checkStringDataSafe(String s) { + for (int i = 0; i < s.length(); ++i) { + if (!Character.isDigit(s.charAt(i))) { + return true; + } + } + return false; + } + + /** + * Add an entry + * @param tag + * @param data + */ + private void addData(int tag, Object data) { + switch (tag) { + case ID_DELETE: + mDeleteCount += (Integer)data; + break; + case ID_INPUT: + mInputCount += (Integer)data; + break; + default: + if (data instanceof String) { + String dataString = (String) data; + if (checkStringDataSafe(dataString)) { + mLogBuffer.add(new LogEntry (System.currentTimeMillis(), tag, dataString)); + } else { + if (DBG) { + Log.d(TAG, "Skipped to add an entry because data is unsafe."); + } + } + } else { + if (DBG) { + Log.e(TAG, "Log is invalid."); + } + } + break; + } + } + + private static void appendWithLength(StringBuffer sb, String data) { + sb.append(data.length()); + sb.append(SEPARATER); + sb.append(data); + } + + private static void appendLogEntry(StringBuffer sb, String time, String tag, String data) { + appendWithLength(sb, time); + appendWithLength(sb, tag); + appendWithLength(sb, data); + } + + private String createStringFromEntries(ArrayList logs) { + StringBuffer sb = new StringBuffer(); + String nowString = String.valueOf(System.currentTimeMillis()); + appendLogEntry(sb, nowString, String.valueOf(ID_DELETE), String.valueOf(mDeleteCount)); + appendLogEntry(sb, nowString, String.valueOf(ID_INPUT), String.valueOf(mInputCount)); + for (LogEntry log: logs) { + appendLogEntry(sb, String.valueOf(log.mTime), String.valueOf(log.mTag), log.mData); + } + return sb.toString(); + } + + private void commit() { + mDropBox.addText(TAG, createStringFromEntries(mLogBuffer)); + reset(); + mLastTimeSend = System.currentTimeMillis(); + } + + private void sendLogToDropBox(int tag, Object s) { + long now = System.currentTimeMillis(); + if (now - mLastTimeActive > MINIMUMINTERVAL) { + // Send a log before adding an log entry if the last data is too old. + commit(); + addData(tag, s); + } else if (now - mLastTimeSend > MINIMUMINTERVAL) { + // Send a log after adding an log entry. + addData(tag, s); + commit(); + } else { + addData(tag, s); + } + mLastTimeActive = now; + } + + public void logOnClickSuggestion(String s) { + sendLogToDropBox(ID_CLICKSUGGESTION, s); + } + + public void logOnAutoSuggestion(String s) { + sendLogToDropBox(ID_AUTOSUGGESTION, s); + } + + public void logOnAutoSuggestionCanceled(String s) { + sendLogToDropBox(ID_AUTOSUGGESTIONCANCELED, s); + } + + public void logOnDelete(int length) { + sendLogToDropBox(ID_DELETE, length); + } + + public void logOnInputChar(int length) { + sendLogToDropBox(ID_INPUT, length); + } +} From 826269c8aebb0b21f6e7650e528f0d9876b9a163 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 27 Apr 2010 10:28:14 +0900 Subject: [PATCH 010/159] Get rid of dependency on native AssetManager API. Confirmed the native code builds with the NDK r3. Change-Id: I0d2d3a0e262847d6948a0336a35440e21e312ad2 --- .../inputmethod/latin/BinaryDictionary.java | 39 +++++++++-- native/Android.mk | 7 -- ...oid_inputmethod_latin_BinaryDictionary.cpp | 68 ++----------------- native/src/dictionary.cpp | 10 +-- 4 files changed, 40 insertions(+), 84 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 87de94b76..4901b210b 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -16,6 +16,11 @@ package com.android.inputmethod.latin; +import java.io.InputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.Channels; import java.util.Arrays; import android.content.Context; @@ -27,6 +32,7 @@ import android.util.Log; */ public class BinaryDictionary extends Dictionary { + private static final String TAG = "BinaryDictionary"; public static final int MAX_WORD_LENGTH = 48; private static final int MAX_ALTERNATIVES = 16; private static final int MAX_WORDS = 16; @@ -35,10 +41,13 @@ public class BinaryDictionary extends Dictionary { private static final boolean ENABLE_MISSED_CHARACTERS = true; private int mNativeDict; - private int mDictLength; // This value is set from native code, don't change the name!!!! + private int mDictLength; private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES]; private char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS]; private int[] mFrequencies = new int[MAX_WORDS]; + // Keep a reference to the native dict direct buffer in Java to avoid + // unexpected deallocation of the direct buffer. + private ByteBuffer mNativeDictDirectBuffer; static { try { @@ -59,8 +68,7 @@ public class BinaryDictionary extends Dictionary { } } - private native int openNative(AssetManager am, String resourcePath, int typedLetterMultiplier, - int fullWordMultiplier); + private native int openNative(ByteBuffer bb, int typedLetterMultiplier, int fullWordMultiplier); private native void closeNative(int dict); private native boolean isValidWordNative(int nativeData, char[] word, int wordLength); private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize, @@ -69,9 +77,28 @@ public class BinaryDictionary extends Dictionary { int[] nextLettersFrequencies, int nextLettersSize); private final void loadDictionary(Context context, int resId) { - AssetManager am = context.getResources().getAssets(); - String assetName = context.getResources().getString(resId); - mNativeDict = openNative(am, assetName, TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); + InputStream is = context.getResources().openRawResource(resId); + try { + int avail = is.available(); + mNativeDictDirectBuffer = + ByteBuffer.allocateDirect(avail).order(ByteOrder.nativeOrder()); + int got = Channels.newChannel(is).read(mNativeDictDirectBuffer); + if (got != avail) { + Log.e(TAG, "Read " + got + " bytes, expected " + avail); + } else { + mNativeDict = openNative(mNativeDictDirectBuffer, + TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); + mDictLength = avail; + } + } catch (IOException e) { + Log.w(TAG, "No available size for binary dictionary"); + } finally { + try { + is.close(); + } catch (IOException e) { + Log.w(TAG, "Failed to close input stream"); + } + } } @Override diff --git a/native/Android.mk b/native/Android.mk index 3cf6aa83f..952448435 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -11,15 +11,8 @@ LOCAL_SRC_FILES := \ LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) -LOCAL_LDLIBS := -lm - LOCAL_PRELINK_MODULE := false -LOCAL_SHARED_LIBRARIES := \ - libandroid_runtime \ - libcutils \ - libutils - LOCAL_MODULE := libjni_latinime LOCAL_MODULE_TAGS := user diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp index d068f3faf..bb45cb538 100644 --- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp +++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp @@ -15,31 +15,18 @@ ** limitations under the License. */ -#define LOG_TAG "BinaryDictionary" -#include "utils/Log.h" - #include #include #include #include -#include -#include "utils/AssetManager.h" -#include "utils/Asset.h" - +#include #include "dictionary.h" // ---------------------------------------------------------------------------- using namespace latinime; -using namespace android; - -static jfieldID sDescriptorField; -static jfieldID sAssetManagerNativeField; -static jmethodID sAddWordMethod; -static jfieldID sDictLength; - // // helper function to throw an exception // @@ -54,35 +41,15 @@ static void throwException(JNIEnv *env, const char* ex, const char* fmt, int dat } static jint latinime_BinaryDictionary_open - (JNIEnv *env, jobject object, jobject assetManager, jstring resourceString, + (JNIEnv *env, jobject object, jobject dictDirectBuffer, jint typedLetterMultiplier, jint fullWordMultiplier) { - // Get the native file descriptor from the FileDescriptor object - AssetManager *am = (AssetManager*) env->GetIntField(assetManager, sAssetManagerNativeField); - if (!am) { - LOGE("DICT: Couldn't get AssetManager native peer\n"); - return 0; - } - const char *resourcePath = env->GetStringUTFChars(resourceString, NULL); - - Asset *dictAsset = am->openNonAsset(resourcePath, Asset::ACCESS_BUFFER); - if (dictAsset == NULL) { - LOGE("DICT: Couldn't get asset %s\n", resourcePath); - env->ReleaseStringUTFChars(resourceString, resourcePath); - return 0; - } - - void *dict = (void*) dictAsset->getBuffer(false); + void *dict = env->GetDirectBufferAddress(dictDirectBuffer); if (dict == NULL) { - LOGE("DICT: Dictionary buffer is null\n"); - env->ReleaseStringUTFChars(resourceString, resourcePath); + fprintf(stderr, "DICT: Dictionary buffer is null\n"); return 0; } Dictionary *dictionary = new Dictionary(dict, typedLetterMultiplier, fullWordMultiplier); - dictionary->setAsset(dictAsset); - env->SetIntField(object, sDictLength, (jint) dictAsset->getLength()); - - env->ReleaseStringUTFChars(resourceString, resourcePath); return (jint) dictionary; } @@ -131,14 +98,13 @@ static void latinime_BinaryDictionary_close (JNIEnv *env, jobject object, jint dict) { Dictionary *dictionary = (Dictionary*) dict; - ((Asset*) dictionary->getAsset())->close(); delete (Dictionary*) dict; } // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { - {"openNative", "(Landroid/content/res/AssetManager;Ljava/lang/String;II)I", + {"openNative", "(Ljava/nio/ByteBuffer;II)I", (void*)latinime_BinaryDictionary_open}, {"closeNative", "(I)V", (void*)latinime_BinaryDictionary_close}, {"getSuggestionsNative", "(I[II[C[IIIII[II)I", (void*)latinime_BinaryDictionary_getSuggestions}, @@ -167,30 +133,6 @@ static int registerNativeMethods(JNIEnv* env, const char* className, 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"); - - // Get the field pointer for the dictionary length - clazz = env->FindClass(kClassPathName); - if (clazz == NULL) { - LOGE("Can't find %s", kClassPathName); - return -1; - } - sDictLength = env->GetFieldID(clazz, "mDictLength", "I"); - return registerNativeMethods(env, kClassPathName, gMethods, sizeof(gMethods) / sizeof(gMethods[0])); } diff --git a/native/src/dictionary.cpp b/native/src/dictionary.cpp index 3f196a9ed..e75beb5b7 100644 --- a/native/src/dictionary.cpp +++ b/native/src/dictionary.cpp @@ -19,14 +19,8 @@ #include #include #include -#include - -//#define USE_ASSET_MANAGER - -#ifdef USE_ASSET_MANAGER -#include -#include -#endif +//#include +#define LOGI #include "dictionary.h" #include "basechars.h" From e945a182c25f9352a99367a47d0e58b0c18f414c Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 27 Apr 2010 23:35:45 +0900 Subject: [PATCH 011/159] Remove ByteBuffer prefix which wrongly suppresses a class member. Change-Id: I5114106eca0f67326fb3f939165bae0c122ed982 --- java/src/com/android/inputmethod/latin/BinaryDictionary.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 9fcd9e50c..dc5417e8e 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -80,7 +80,7 @@ public class BinaryDictionary extends Dictionary { InputStream is = context.getResources().openRawResource(resId); try { int avail = is.available(); - ByteBuffer mNativeDictDirectBuffer = + mNativeDictDirectBuffer = ByteBuffer.allocateDirect(avail).order(ByteOrder.nativeOrder()); int got = Channels.newChannel(is).read(mNativeDictDirectBuffer); if (got != avail) { From 8677ac3586e077b7cd7542a6daeb4b7e147587c3 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 28 Apr 2010 12:34:14 +0900 Subject: [PATCH 012/159] Logger improvements - Made each method static - Added a setter of contest - Added a function to entry counts periodically Change-Id: I644dfa83c4fcb1933dc267fc4cfad05c9bb7adc7 --- .../android/inputmethod/latin/LatinIME.java | 2 + .../inputmethod/latin/LatinImeLogger.java | 127 ++++++++++++------ 2 files changed, 86 insertions(+), 43 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index d0baed52a..c92587ea9 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -308,6 +308,7 @@ public class LatinIME extends InputMethodService }); } prefs.registerOnSharedPreferenceChangeListener(this); + LatinImeLogger.init(this); } private void initSuggest(String locale) { @@ -353,6 +354,7 @@ public class LatinIME extends InputMethodService if (VOICE_INSTALLED) { mVoiceInput.destroy(); } + LatinImeLogger.commit(); super.onDestroy(); } diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index f65720d2a..873c697e5 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -17,36 +17,44 @@ package com.android.inputmethod.latin; import android.content.Context; +import android.content.SharedPreferences; import android.os.DropBoxManager; +import android.preference.PreferenceManager; import android.text.format.DateUtils; import android.util.Log; import java.util.ArrayList; -public class LatinImeLogger { +public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIMELogs"; private static final boolean DBG = false; + // DEFAULT_LOG_ENABLED should be false when released to public. + private static final boolean DEFAULT_LOG_ENABLED = true; - // Volatile is needed for multi-cpu platform. - private static volatile LatinImeLogger sLatinImeLogger; - - private static final long MINIMUMINTERVAL = 20 * DateUtils.SECOND_IN_MILLIS; // 20 sec + private static final long MINIMUMSENDINTERVAL = 5 * DateUtils.MINUTE_IN_MILLIS; // 5 min + private static final long MINIMUMCOUNTINTERVAL = 20 * DateUtils.SECOND_IN_MILLIS; // 20 sec private static final char SEPARATER = ';'; private static final int ID_CLICKSUGGESTION = 0; private static final int ID_AUTOSUGGESTION = 1; private static final int ID_AUTOSUGGESTIONCANCELED = 2; private static final int ID_INPUT = 3; private static final int ID_DELETE = 4; + private static final String PREF_ENABLE_LOG = "enable_log"; - private ArrayList mLogBuffer; - private final Context mContext; - private final DropBoxManager mDropBox; + private static LatinImeLogger sLatinImeLogger = new LatinImeLogger(); + public static boolean sLogEnabled = true; + + private ArrayList mLogBuffer = null; + private Context mContext = null; + private DropBoxManager mDropBox = null; private long mLastTimeActive; private long mLastTimeSend; + private long mLastTimeCountEntry; private int mDeleteCount; private int mInputCount; + private static class LogEntry { public final int mTag; public final long mTime; @@ -58,28 +66,17 @@ public class LatinImeLogger { } } - /** - * Returns the singleton of the logger. - * @param context - */ - public static LatinImeLogger getLogger(Context context) { - if (sLatinImeLogger == null) { - synchronized (LatinImeLogger.class) { - if (sLatinImeLogger == null) { - sLatinImeLogger =new LatinImeLogger(context); - } - } - } - return sLatinImeLogger; - } - - private LatinImeLogger(Context context) { + private void initInternal(Context context) { mContext = context; mDropBox = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE); mLastTimeSend = System.currentTimeMillis(); mLastTimeActive = mLastTimeSend; + mLastTimeCountEntry = mLastTimeSend; mDeleteCount = 0; mInputCount = 0; + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + sLogEnabled = prefs.getBoolean(PREF_ENABLE_LOG, DEFAULT_LOG_ENABLED); + prefs.registerOnSharedPreferenceChangeListener(this); } /** @@ -94,7 +91,7 @@ public class LatinImeLogger { /** * Check if the input string is safe as an entry or not. */ - private boolean checkStringDataSafe(String s) { + private static boolean checkStringDataSafe(String s) { for (int i = 0; i < s.length(); ++i) { if (!Character.isDigit(s.charAt(i))) { return true; @@ -103,6 +100,13 @@ public class LatinImeLogger { return false; } + private void addCountEntry(long time) { + mLogBuffer.add(new LogEntry (time, ID_DELETE, String.valueOf(mDeleteCount))); + mLogBuffer.add(new LogEntry (time, ID_INPUT, String.valueOf(mInputCount))); + mDeleteCount = 0; + mInputCount = 0; + } + /** * Add an entry * @param tag @@ -111,9 +115,17 @@ public class LatinImeLogger { private void addData(int tag, Object data) { switch (tag) { case ID_DELETE: + if (mLastTimeActive - mLastTimeCountEntry > MINIMUMCOUNTINTERVAL + || (mDeleteCount == 0 && mInputCount == 0)) { + addCountEntry(mLastTimeActive); + } mDeleteCount += (Integer)data; break; case ID_INPUT: + if (mLastTimeActive - mLastTimeCountEntry > MINIMUMCOUNTINTERVAL + || (mDeleteCount == 0 && mInputCount == 0)) { + addCountEntry(mLastTimeActive); + } mInputCount += (Integer)data; break; default: @@ -148,17 +160,15 @@ public class LatinImeLogger { } private String createStringFromEntries(ArrayList logs) { + addCountEntry(System.currentTimeMillis()); StringBuffer sb = new StringBuffer(); - String nowString = String.valueOf(System.currentTimeMillis()); - appendLogEntry(sb, nowString, String.valueOf(ID_DELETE), String.valueOf(mDeleteCount)); - appendLogEntry(sb, nowString, String.valueOf(ID_INPUT), String.valueOf(mInputCount)); for (LogEntry log: logs) { appendLogEntry(sb, String.valueOf(log.mTime), String.valueOf(log.mTag), log.mData); } return sb.toString(); } - private void commit() { + private void commitInternal() { mDropBox.addText(TAG, createStringFromEntries(mLogBuffer)); reset(); mLastTimeSend = System.currentTimeMillis(); @@ -166,37 +176,68 @@ public class LatinImeLogger { private void sendLogToDropBox(int tag, Object s) { long now = System.currentTimeMillis(); - if (now - mLastTimeActive > MINIMUMINTERVAL) { + if (now - mLastTimeActive > MINIMUMSENDINTERVAL) { // Send a log before adding an log entry if the last data is too old. - commit(); + commitInternal(); addData(tag, s); - } else if (now - mLastTimeSend > MINIMUMINTERVAL) { + } else if (now - mLastTimeSend > MINIMUMSENDINTERVAL) { // Send a log after adding an log entry. addData(tag, s); - commit(); + commitInternal(); } else { addData(tag, s); } mLastTimeActive = now; } - public void logOnClickSuggestion(String s) { - sendLogToDropBox(ID_CLICKSUGGESTION, s); + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (PREF_ENABLE_LOG.equals(key)) { + if (sharedPreferences.getBoolean(key, DEFAULT_LOG_ENABLED)) { + sLogEnabled = (mContext != null); + } else { + sLogEnabled = false; + } + } } - public void logOnAutoSuggestion(String s) { - sendLogToDropBox(ID_AUTOSUGGESTION, s); + public static void init(Context context) { + sLatinImeLogger.initInternal(context); } - public void logOnAutoSuggestionCanceled(String s) { - sendLogToDropBox(ID_AUTOSUGGESTIONCANCELED, s); + public static void commit() { + if (sLogEnabled) { + sLatinImeLogger.commitInternal(); + } } - public void logOnDelete(int length) { - sendLogToDropBox(ID_DELETE, length); + public static void logOnClickSuggestion(String s) { + if (sLogEnabled) { + sLatinImeLogger.sendLogToDropBox(ID_CLICKSUGGESTION, s); + } } - public void logOnInputChar(int length) { - sendLogToDropBox(ID_INPUT, length); + public static void logOnAutoSuggestion(String s) { + if (sLogEnabled) { + sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTION, s); + } } + + public static void logOnAutoSuggestionCanceled(String s) { + if (sLogEnabled) { + sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTIONCANCELED, s); + } + } + + public static void logOnDelete(int length) { + if (sLogEnabled) { + sLatinImeLogger.sendLogToDropBox(ID_DELETE, length); + } + } + + public static void logOnInputChar(int length) { + if (sLogEnabled) { + sLatinImeLogger.sendLogToDropBox(ID_INPUT, length); + } + } + } From 22f7ea75187ae2931558ddfef13ee1610ba1ad6f Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 28 Apr 2010 16:43:41 +0900 Subject: [PATCH 013/159] Add logging - add logging for delete - add logging for inputchar Change-Id: I684692385f4c3acb66ab2bcd6421dae1d84feb8f --- java/src/com/android/inputmethod/latin/LatinIME.java | 2 ++ java/src/com/android/inputmethod/latin/LatinImeLogger.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index c92587ea9..2485a328d 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -937,6 +937,7 @@ public class LatinIME extends InputMethodService case Keyboard.KEYCODE_DELETE: handleBackspace(); mDeleteCount++; + LatinImeLogger.logOnDelete(1); break; case Keyboard.KEYCODE_SHIFT: handleShift(); @@ -982,6 +983,7 @@ public class LatinIME extends InputMethodService } else { handleCharacter(primaryCode, keyCodes); } + LatinImeLogger.logOnInputChar(1); // Cancel the just reverted state mJustRevertedSeparator = null; } diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 873c697e5..98e20a6d8 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -175,6 +175,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void sendLogToDropBox(int tag, Object s) { + if (DBG) { + Log.d(TAG, "SendLog: " + tag + ";" + s); + } long now = System.currentTimeMillis(); if (now - mLastTimeActive > MINIMUMSENDINTERVAL) { // Send a log before adding an log entry if the last data is too old. From 85b6c5fc6b07ec62d1ffa7d1d705826d4a4b5769 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 28 Apr 2010 17:25:29 +0900 Subject: [PATCH 014/159] Fix NPE Change-Id: I27fc6268ea325f6e5f2a8bfd36499bf6c2b9f146 --- .../com/android/inputmethod/latin/LatinImeLogger.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 98e20a6d8..4e769b309 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -31,7 +31,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang // DEFAULT_LOG_ENABLED should be false when released to public. private static final boolean DEFAULT_LOG_ENABLED = true; - private static final long MINIMUMSENDINTERVAL = 5 * DateUtils.MINUTE_IN_MILLIS; // 5 min + private static final long MINIMUMSENDINTERVAL = 1 * DateUtils.MINUTE_IN_MILLIS; // 1 min private static final long MINIMUMCOUNTINTERVAL = 20 * DateUtils.SECOND_IN_MILLIS; // 20 sec private static final char SEPARATER = ';'; private static final int ID_CLICKSUGGESTION = 0; @@ -74,6 +74,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mLastTimeCountEntry = mLastTimeSend; mDeleteCount = 0; mInputCount = 0; + mLogBuffer = new ArrayList(); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); sLogEnabled = prefs.getBoolean(PREF_ENABLE_LOG, DEFAULT_LOG_ENABLED); prefs.registerOnSharedPreferenceChangeListener(this); @@ -169,7 +170,11 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void commitInternal() { - mDropBox.addText(TAG, createStringFromEntries(mLogBuffer)); + String s = createStringFromEntries(mLogBuffer); + if (DBG) { + Log.d(TAG, "Commit log: " + s); + } + mDropBox.addText(TAG, s); reset(); mLastTimeSend = System.currentTimeMillis(); } From 8f3106e276ff04fde9f619f36b13c438589997bd Mon Sep 17 00:00:00 2001 From: Filip Miletic Date: Mon, 1 Mar 2010 22:51:49 -0800 Subject: [PATCH 015/159] Adds the basic Serbian files to LatinIME. - Adds the Serbian keyboard layout. - Adds the Serbian translatio to strings.xml. Change-Id: I29739f422fd58d31fd2e5213b72908dd1f617805 --- res/values-sr/strings.xml | 313 ++++++++++++++++++++++++++++++++++++++ res/xml-sr/kbd_qwerty.xml | 171 +++++++++++++++++++++ 2 files changed, 484 insertions(+) create mode 100644 res/values-sr/strings.xml create mode 100644 res/xml-sr/kbd_qwerty.xml diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml new file mode 100644 index 000000000..64f5af1f1 --- /dev/null +++ b/res/values-sr/strings.xml @@ -0,0 +1,313 @@ + + + + + Андроидова тастатура + + Подешавања андроидове тастатуре + + + Вибрације при притиску + + Звук при притиску + + + Исправљање грешака + + + Исправљање грешака при уносу + + + Грешке при водоравној оријентацији + + + Исправљање грешака при уносу при + водоравном положају + + + Предлози речи + + + Аутоматска исправка претходно унесене речи + + + Предлози речи + + Подешавања за предлоге речи + + Укључи аутоматске наставке при уносу + + + Аутоматски наставци + + + Увећан поље за унос текста + + Сакриј предлоге речи при водоравном положају + + + Аутоматска величина слова + + Велико слово на почетку реченице + + Аутоматска интерпункција + + Аутоматско постављање интерпункцијских знака при уносу. + + + Брзе исправке + + Аутоматска исправка честих грешака + + + Приказ предлога + + Приказује предлоге речи током уноса + + + Аутоматска допуна + + Размакница и интерпункција аутоматски убацују означену реч. + + + + Искључено + Основно + Напредно + + + + 0 + + 1 + + 2 + + + @string/prediction_none + @string/prediction_basic + @string/prediction_full + + + + %s : Saved + + Дуги притисак на тастере открива проширене знаке (ø, ö, итд.) + + Притисните тастер за назад \u21B6 како бисте затворили тастатуру + + Приступ бројевима и симболима + + Притисните и држите притиснуту реч са крајње леве стране + како бисте је додали у речник + + + Притисните овај подсетник да наставите » + + + Притисните овде да бисте затворили подсетник и наставили унос! + + + Тастатура се отвара кад год је потребно да унесете текст + + + Притисните и држите тастер како бисте видели проширене + знаке\n(„, ‟, итд.) + + + + Пребаците се на бројеве и симболе притиском на овај тастер + + + + Вратите се назад на слова притиском на овај тастер + + + Притисните и држите притиснут овај тастер да бисте променили + подешавања тастатуре, попут аутоматског настављања + + + Пробајте сами! + + + + Иди + + Даље + + Крај + + Шаљи + + \?123 + + 123 + + АБВ + + ALT + + + + + Говорни унос + + + Говорни унос није тренутно подржан на Вашем језику, + али ради на енглеском. + + + Говорни унос је експериментална могућност која користи + Google-ово мрежно препознавање говора. + + + Како бисте искључили говорни унос, изаберите подешавања + тастатуре. + + + Како бисте укључили говорни унос, притисните дугме са сличицом + микрофона или превуците прстом преко целе дужине тастатуре. + + + Говорите сада + + + Обрада је у току + + + + + + Грешка. Молимо пробајте поново. + + + Повезивање није успело + + + Грешка, говор је предугачак. + + + Проблем са звуком + + + Грешка на серверу + + + Говор није снимљен + + + Нема погодака + + + Говорна претрага није инсталирана + + + Савет: Превуците прстом преко тастатуре а онда говорите. + + + Савет: Следећи пут, изговорите назив интерпункције, + попут „тачка“, „запета“ или „знак питања“. + + + Откажи + + + У реду + + + Говорни унос + + + + На главној тастатури + На симболичкој тастатури + Искључен + + + + 0 + + 1 + + 2 + + + @string/voice_mode_main + @string/voice_mode_symbols + @string/voice_mode_off + + + + + Микрофон на главној тастатури + Микрофон на симболичкој тастатури + Говорни унос је искључен + + + + Аутоматско слање по говорном уносу + + + Дугме за претрагу се аутоматски притиска при претрази или преласку + на следеће поље за унос. + + + + Отварање тастатуре\n\nTouch any text field. + + + Затварање тастатуре\n\nPress the Back key. + + + Притисните \u0026 и држите пристиснут тастер за опције\n\nПриступ акцентима и интерпункцији. + + + Подешавање тастатуре\n\nПритисните \u0026 и држите тастер \?123\. + + + ".rs" + + ".com" + + ".net" + + ".org" + + ".edu" + + + Метод за унос + + + Језици за унос + + Превуците прстом по размакници за промену језика + + + \u2190 Притисните опет да бисте сачували + diff --git a/res/xml-sr/kbd_qwerty.xml b/res/xml-sr/kbd_qwerty.xml new file mode 100644 index 000000000..e4884a8a6 --- /dev/null +++ b/res/xml-sr/kbd_qwerty.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 5c7c33735df5313ecbf8e40efd72edeb0cf941b2 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 7 May 2010 15:49:04 +0900 Subject: [PATCH 016/159] IME Logger improvement - Eabled to handle an array value in the log entry - Added word counter - Added parameters to Log APIs - Obfuscate user privacy support Change-Id: I5e2a7d58113b0581e51d22d6dac9a6a6fdc34356 --- .../inputmethod/latin/LatinImeLogger.java | 179 ++++++++++++------ 1 file changed, 123 insertions(+), 56 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 4e769b309..a04e1cf96 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -24,6 +24,7 @@ import android.text.format.DateUtils; import android.util.Log; import java.util.ArrayList; +import java.util.Collections; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIMELogs"; @@ -31,20 +32,23 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang // DEFAULT_LOG_ENABLED should be false when released to public. private static final boolean DEFAULT_LOG_ENABLED = true; - private static final long MINIMUMSENDINTERVAL = 1 * DateUtils.MINUTE_IN_MILLIS; // 1 min + private static final long MINIMUMSENDINTERVAL = 60 * DateUtils.SECOND_IN_MILLIS; // 60 sec private static final long MINIMUMCOUNTINTERVAL = 20 * DateUtils.SECOND_IN_MILLIS; // 20 sec private static final char SEPARATER = ';'; private static final int ID_CLICKSUGGESTION = 0; private static final int ID_AUTOSUGGESTION = 1; private static final int ID_AUTOSUGGESTIONCANCELED = 2; - private static final int ID_INPUT = 3; - private static final int ID_DELETE = 4; + private static final int ID_INPUT_COUNT = 3; + private static final int ID_DELETE_COUNT = 4; + private static final int ID_WORD_COUNT = 5; + private static final String PREF_ENABLE_LOG = "enable_log"; private static LatinImeLogger sLatinImeLogger = new LatinImeLogger(); public static boolean sLogEnabled = true; private ArrayList mLogBuffer = null; + private ArrayList mPrivacyLogBuffer = null; private Context mContext = null; private DropBoxManager mDropBox = null; private long mLastTimeActive; @@ -53,17 +57,29 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private int mDeleteCount; private int mInputCount; + private int mWordCount; - - private static class LogEntry { + private static class LogEntry implements Comparable { public final int mTag; - public final long mTime; - public final String mData; - public LogEntry (long time, int tag, String data) { + public final String[] mData; + public long mTime; + + public LogEntry (long time, int tag, String[] data) { mTag = tag; mTime = time; mData = data; } + + public int compareTo(LogEntry log2) { + if (mData.length == 0 && log2.mData.length == 0) { + return 0; + } else if (mData.length == 0) { + return 1; + } else if (log2.mData.length == 0) { + return -1; + } + return log2.mData[0].compareTo(mData[0]); + } } private void initInternal(Context context) { @@ -101,11 +117,36 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang return false; } + private static boolean checkStringsDataSafe(String[] strings) { + for(String s: strings) { + if (!checkStringDataSafe(s)) { + return false; + } + } + return true; + } + private void addCountEntry(long time) { - mLogBuffer.add(new LogEntry (time, ID_DELETE, String.valueOf(mDeleteCount))); - mLogBuffer.add(new LogEntry (time, ID_INPUT, String.valueOf(mInputCount))); + mLogBuffer.add( + new LogEntry (time, ID_DELETE_COUNT, + new String[] {String.valueOf(mDeleteCount)})); + mLogBuffer.add(new LogEntry (time, ID_INPUT_COUNT, + new String[] {String.valueOf(mInputCount)})); + mLogBuffer.add(new LogEntry (time, ID_WORD_COUNT, + new String[] {String.valueOf(mWordCount)})); mDeleteCount = 0; mInputCount = 0; + mWordCount = 0; + } + + private void flushPrivacyLogSafely() { + long now = System.currentTimeMillis(); + Collections.sort(mPrivacyLogBuffer); + for (LogEntry l: mPrivacyLogBuffer) { + l.mTime = now; + mLogBuffer.add(l); + } + mPrivacyLogBuffer.clear(); } /** @@ -115,62 +156,57 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang */ private void addData(int tag, Object data) { switch (tag) { - case ID_DELETE: + case ID_DELETE_COUNT: if (mLastTimeActive - mLastTimeCountEntry > MINIMUMCOUNTINTERVAL || (mDeleteCount == 0 && mInputCount == 0)) { addCountEntry(mLastTimeActive); } mDeleteCount += (Integer)data; break; - case ID_INPUT: + case ID_INPUT_COUNT: if (mLastTimeActive - mLastTimeCountEntry > MINIMUMCOUNTINTERVAL || (mDeleteCount == 0 && mInputCount == 0)) { addCountEntry(mLastTimeActive); } mInputCount += (Integer)data; break; - default: - if (data instanceof String) { - String dataString = (String) data; - if (checkStringDataSafe(dataString)) { - mLogBuffer.add(new LogEntry (System.currentTimeMillis(), tag, dataString)); - } else { - if (DBG) { - Log.d(TAG, "Skipped to add an entry because data is unsafe."); - } - } + case ID_CLICKSUGGESTION: + case ID_AUTOSUGGESTION: + ++mWordCount; + String[] dataStrings = (String[]) data; + if (checkStringsDataSafe(dataStrings)) { + mPrivacyLogBuffer.add( + new LogEntry (System.currentTimeMillis(), tag, dataStrings)); } else { if (DBG) { - Log.e(TAG, "Log is invalid."); + Log.d(TAG, "Skipped to add an entry because data is unsafe."); } } break; + case ID_AUTOSUGGESTIONCANCELED: + --mWordCount; + dataStrings = (String[]) data; + if (checkStringsDataSafe(dataStrings)) { + mPrivacyLogBuffer.add( + new LogEntry (System.currentTimeMillis(), tag, dataStrings)); + } else { + if (DBG) { + Log.d(TAG, "Skipped to add an entry because data is unsafe."); + } + } + break; + default: + if (DBG) { + Log.e(TAG, "Log Tag is not entried."); + } + break; } } - private static void appendWithLength(StringBuffer sb, String data) { - sb.append(data.length()); - sb.append(SEPARATER); - sb.append(data); - } - - private static void appendLogEntry(StringBuffer sb, String time, String tag, String data) { - appendWithLength(sb, time); - appendWithLength(sb, tag); - appendWithLength(sb, data); - } - - private String createStringFromEntries(ArrayList logs) { - addCountEntry(System.currentTimeMillis()); - StringBuffer sb = new StringBuffer(); - for (LogEntry log: logs) { - appendLogEntry(sb, String.valueOf(log.mTime), String.valueOf(log.mTag), log.mData); - } - return sb.toString(); - } - private void commitInternal() { - String s = createStringFromEntries(mLogBuffer); + flushPrivacyLogSafely(); + addCountEntry(System.currentTimeMillis()); + String s = LogSerializer.createStringFromEntries(mLogBuffer); if (DBG) { Log.d(TAG, "Commit log: " + s); } @@ -180,10 +216,11 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void sendLogToDropBox(int tag, Object s) { - if (DBG) { - Log.d(TAG, "SendLog: " + tag + ";" + s); - } long now = System.currentTimeMillis(); + if (DBG) { + Log.d(TAG, "SendLog: " + tag + ";" + s + "," + + (now - mLastTimeSend - MINIMUMSENDINTERVAL) ); + } if (now - mLastTimeActive > MINIMUMSENDINTERVAL) { // Send a log before adding an log entry if the last data is too old. commitInternal(); @@ -218,34 +255,64 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } - public static void logOnClickSuggestion(String s) { + public static void logOnClickSuggestion(String before, String after, int position) { if (sLogEnabled) { - sLatinImeLogger.sendLogToDropBox(ID_CLICKSUGGESTION, s); + String[] strings = new String[] {before, after, String.valueOf(position)}; + sLatinImeLogger.sendLogToDropBox(ID_CLICKSUGGESTION, strings); } } - public static void logOnAutoSuggestion(String s) { + public static void logOnAutoSuggestion(String before, String after) { if (sLogEnabled) { - sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTION, s); + String[] strings = new String[] {before, after}; + sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTION, strings); } } - public static void logOnAutoSuggestionCanceled(String s) { + public static void logOnAutoSuggestionCanceled(String before, String after) { if (sLogEnabled) { - sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTIONCANCELED, s); + String[] strings = new String[] {before, after}; + sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTIONCANCELED, strings); } } public static void logOnDelete(int length) { if (sLogEnabled) { - sLatinImeLogger.sendLogToDropBox(ID_DELETE, length); + sLatinImeLogger.sendLogToDropBox(ID_DELETE_COUNT, length); } } public static void logOnInputChar(int length) { if (sLogEnabled) { - sLatinImeLogger.sendLogToDropBox(ID_INPUT, length); + sLatinImeLogger.sendLogToDropBox(ID_INPUT_COUNT, length); } } + private static class LogSerializer { + private static void appendWithLength(StringBuffer sb, String data) { + sb.append(data.length()); + sb.append(SEPARATER); + sb.append(data); + sb.append(SEPARATER); + } + + private static void appendLogEntry(StringBuffer sb, String time, String tag, String[] data) { + if (data.length > 0) { + appendWithLength(sb, String.valueOf(data.length + 2)); + appendWithLength(sb, time); + appendWithLength(sb, tag); + for (String s: data) { + appendWithLength(sb, s); + } + } + } + + public static String createStringFromEntries(ArrayList logs) { + StringBuffer sb = new StringBuffer(); + for (LogEntry log: logs) { + appendLogEntry(sb, String.valueOf(log.mTime), String.valueOf(log.mTag), log.mData); + } + return sb.toString(); + } + } } From e4e1130d003a75e3b5cbea1678755d2b71d7cb1d Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Wed, 28 Apr 2010 18:12:58 -0700 Subject: [PATCH 017/159] Tests and some new constructors to help in testing. Added tests for the dictionary lookup and correction logic on the primary dictionary. This exercises part of the Suggest class and the native dictionary lookup code. --- java/proguard.flags | 5 + .../inputmethod/latin/BinaryDictionary.java | 20 ++ .../android/inputmethod/latin/Suggest.java | 21 +- .../inputmethod/latin/WordComposer.java | 2 +- tests/Android.mk | 17 ++ tests/AndroidManifest.xml | 33 +++ tests/data/wordlist.xml | 243 +++++++++++++++++ tests/res/raw/test.dict | Bin 0 -> 2562 bytes .../inputmethod/latin/tests/SuggestTests.java | 248 ++++++++++++++++++ 9 files changed, 581 insertions(+), 8 deletions(-) create mode 100644 tests/Android.mk create mode 100644 tests/AndroidManifest.xml create mode 100644 tests/data/wordlist.xml create mode 100644 tests/res/raw/test.dict create mode 100644 tests/src/com/android/inputmethod/latin/tests/SuggestTests.java diff --git a/java/proguard.flags b/java/proguard.flags index 0a5d2dda9..829a096c0 100644 --- a/java/proguard.flags +++ b/java/proguard.flags @@ -1,3 +1,8 @@ -keep class com.android.inputmethod.latin.BinaryDictionary { int mDictLength; + (...); +} + +-keep class com.android.inputmethod.latin.Suggest { + (...); } diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 4901b210b..6473f4558 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -68,6 +68,26 @@ public class BinaryDictionary extends Dictionary { } } + /** + * Create a dictionary from a byte buffer. This is used for testing. + * @param context application context for reading resources + * @param resId the resource containing the raw binary dictionary + */ + public BinaryDictionary(Context context, ByteBuffer byteBuffer) { + if (byteBuffer != null) { + if (byteBuffer.isDirect()) { + mNativeDictDirectBuffer = byteBuffer; + } else { + mNativeDictDirectBuffer = ByteBuffer.allocateDirect(byteBuffer.capacity()); + byteBuffer.rewind(); + mNativeDictDirectBuffer.put(byteBuffer); + } + mDictLength = byteBuffer.capacity(); + mNativeDict = openNative(mNativeDictDirectBuffer, + TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); + } + } + private native int openNative(ByteBuffer bb, int typedLetterMultiplier, int fullWordMultiplier); private native void closeNative(int dict); private native boolean isValidWordNative(int nativeData, char[] word, int wordLength); diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index a70bea003..010913d6d 100755 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -16,18 +16,17 @@ package com.android.inputmethod.latin; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import android.content.Context; import android.text.AutoText; import android.text.TextUtils; import android.util.Log; import android.view.View; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import com.android.inputmethod.latin.WordComposer; - /** * This class loads a dictionary and provides a list of suggestions for a given sequence of * characters. This includes corrections and completions. @@ -69,9 +68,17 @@ public class Suggest implements Dictionary.WordCallback { private int mCorrectionMode = CORRECTION_BASIC; - public Suggest(Context context, int dictionaryResId) { mMainDict = new BinaryDictionary(context, dictionaryResId); + initPool(); + } + + public Suggest(Context context, ByteBuffer byteBuffer) { + mMainDict = new BinaryDictionary(context, byteBuffer); + initPool(); + } + + private void initPool() { for (int i = 0; i < mPrefMaxSuggestions; i++) { StringBuilder sb = new StringBuilder(32); mStringPool.add(sb); diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index 19f714ae7..2547aa133 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -44,7 +44,7 @@ public class WordComposer { */ private boolean mIsCapitalized; - WordComposer() { + public WordComposer() { mCodes = new ArrayList(12); mTypedWord = new StringBuilder(20); } diff --git a/tests/Android.mk b/tests/Android.mk new file mode 100644 index 000000000..fba7a8d74 --- /dev/null +++ b/tests/Android.mk @@ -0,0 +1,17 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +# We only want this apk build for tests. +LOCAL_MODULE_TAGS := tests +LOCAL_CERTIFICATE := shared + +LOCAL_JAVA_LIBRARIES := android.test.runner + +# Include all test java files. +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := LatinIMETests + +LOCAL_INSTRUMENTATION_FOR := LatinIME + +include $(BUILD_PACKAGE) diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml new file mode 100644 index 000000000..210e81489 --- /dev/null +++ b/tests/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + diff --git a/tests/data/wordlist.xml b/tests/data/wordlist.xml new file mode 100644 index 000000000..22d0caa38 --- /dev/null +++ b/tests/data/wordlist.xml @@ -0,0 +1,243 @@ + + the + and + of + to + in + that + for + with + on + it + this + you + is + was + by + or + from + but + be + Sunday + are + he + so + not + have + as + all + his + my + if + which + they + at + it's + an + your + will + about + I'm + there + had + has + when + no + were + what + more + out + just + their + up + would + here + can + who + her + me + now + our + do + some + been + two + like + them + new + time + we + she + one + over + may + any + him + calling + other + how + see + because + then + right + into + well + very + said + people + these + than + only + back + first + dot + after + where + please + could + its + before + us + again + home + also + that's + think + three + good + get + know + thank + should + going + down + last + today + those + go + through + such + don't + did + most + day + man + number + work + too + show + made + even + being + make + give + off + com + much + great + take + call + way + four + say + information + under + page + many + little + thanks + okay + five + we're + between + use + come + years + office + house + search + free + next + without + still + around + I've + business + part + every + bye + upon + you're + state + life + year + thing + since + things + something + long + got + while + I'll + help + service + really + must + does + name + both + six + want + same + each + yet + let + view + place + another + company + talk + might + am + though + find + details + look + world + old + called + case + system + news + used + contact + never + seven + city + until + during + set + why + point + twenty + high + love + services + niño + María + hmmm + hon + tty + ttyl + txt + ur + wah + whatcha + woah + ya + yea + yeh + yessir + yikes + yrs + diff --git a/tests/res/raw/test.dict b/tests/res/raw/test.dict new file mode 100644 index 0000000000000000000000000000000000000000..e789aaa9a66cd003e1282870a79fc12a8d731fdd GIT binary patch literal 2562 zcmX9=eT-aH6@Ta6`@WK5QWI*@CRRl)h$v`5lp0Slp;|-`geW37otfR4&dhtwo7tUR z4dxmRNR1G+Adr-r7O6BMmD!ou+0WZ#{X)^4*~x@g<5DNB$FZD>P5sK2}ZF}wGk zd(Q9t&c{9XEw8YXPcbDi)5ScCVh4-iDoeMQO9kWc)g>-l<8rL+^li7UQDqwnrG)<2|H)O=Mt}1Ph(w!tXa|%ksd3vGe}we5+!;P z|M!ZDaVB4jjB{i!tzzd8mGvkUjB{)RtClG16A?S7L_v>s8s|R^2pb~H&igSt7hyk2 zT}+BPnL^6xVNqsU2FY?94O{6-Nb4fQbY-ju352hvUZ}--BFnUfBBr&35N?9BMkS_O zVYpuunC>Yu{REoygdMmI%K9|8Tt6eB7e&)MS>aCp!{ zyl$;e!+MX6;yfY$?^C2r&|$dIL^L~u=j|Ho=S8Z_~I7ekAthY%kF-J-9C5|8K|{Du}{Iz{R^H{%# zwh(ES8-Ws`m8RjaAtHSsVfj<6_fW;iUriBI9zx#a!<5nvsLE|H*s+S`PAE;m)fn<3 z|B6jZg1|5~`{7}lptctQOrpVuus&$B3_p$wu5V;nS-d=}D-u>;p)MoeK8`FM0`R*Q z@B;ugRm!NPPDR&YR%W$=5~DuWM0Wd;CiMvY6R5h{ zLcn~&>OKW5+ZSpl=qek(?RQnDPTa;Ss}YMjX8*KpYY-3*JPKdP3J!Rqun{&0Xx?8X+f^9>(PNvFJw+yFW(vIYDgPU(V*(eJ0E9Xo@}2 z#on?Cdn@zoeXWE{RHVL3-*Q;y=C2;vtzJ^thpZ|Yc&ZTA3+;q zuzwVgNGI}^W^V<|hXoEV2kC3z(Yp$r*aSuII_NY7UV|HZ{;#_Z0-&;Yn?1f0*xua; zzR!(~SDC`@X9)U9;5-Ms2D)Rms@t+^yoV-w*!yiad%pvxKC%}J+K*API8VK8w1K^+ zt>{^ZhL9=mg+*6q*c+r+@3JpM%-(EPw}HNZ2TA4Gzf>gbodBJAC{F=(NMW2t#(Q@t z!`^=j>^qAyDT_?vhb!t|Qf7ZCA|8Nt1Eb$xjxzWwv8&@@@h_JpeXyJT)kXHNhmF1e z4Rn{k7E${*L2XKHGX6c2W#eZ}#C~kAOw4`?DMn1jFZ3h1HM}K$Plf$oASVBQ#MDA< z{0D$mlPUK92#c{i2U13Q60UXte3XjDe|7+s@Lzz@AezE&qABdu?*o-Sj0FF1$@p`a zME=_-ls}6jgP!T%#Qv)U+y!g&CStCmKK?l?dXEtGMG&t+6a+Y{p<2PG+Hn8P6bI|F z9H6sT63GQ30Dn1Kx zR#XCuAOZCniWEEu&0R4EHGm$F1rD~r{_zeDo4n!QkLl9q}(;R+? I_hHxn0FARwX8-^I literal 0 HcmV?d00001 diff --git a/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java b/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java new file mode 100644 index 000000000..9401d926a --- /dev/null +++ b/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java @@ -0,0 +1,248 @@ +package com.android.inputmethod.latin.tests; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.Channels; +import java.util.List; + +import android.content.Context; +import android.test.AndroidTestCase; +import android.text.TextUtils; +import android.util.Log; + +import com.android.inputmethod.latin.Suggest; +import com.android.inputmethod.latin.WordComposer; + +public class SuggestTests extends AndroidTestCase { + private static final String TAG = "SuggestTests"; + + private Suggest mSuggest; + + int[][] adjacents = { + {'a','s','w','q',-1}, + {'b','h','v','n','g','j',-1}, + {'c','v','f','x','g',}, + {'d','f','r','e','s','x',-1}, + {'e','w','r','s','d',-1}, + {'f','g','d','c','t','r',-1}, + {'g','h','f','y','t','v',-1}, + {'h','j','u','g','b','y',-1}, + {'i','o','u','k',-1}, + {'j','k','i','h','u','n',-1}, + {'k','l','o','j','i','m',-1}, + {'l','k','o','p',-1}, + {'m','k','n','l',-1}, + {'n','m','j','k','b',-1}, + {'o','p','i','l',-1}, + {'p','o',-1}, + {'q','w',-1}, + {'r','t','e','f',-1}, + {'s','d','e','w','a','z',-1}, + {'t','y','r',-1}, + {'u','y','i','h','j',-1}, + {'v','b','g','c','h',-1}, + {'w','e','q',-1}, + {'x','c','d','z','f',-1}, + {'y','u','t','h','g',-1}, + {'z','s','x','a','d',-1}, + }; + + @Override + protected void setUp() { + final Context context = getTestContext(); + InputStream is = context.getResources().openRawResource(R.raw.test); + Log.i(TAG, "Stream type is " + is); + try { + int avail = is.available(); + if (avail > 0) { + ByteBuffer byteBuffer = + ByteBuffer.allocateDirect(avail).order(ByteOrder.nativeOrder()); + int got = Channels.newChannel(is).read(byteBuffer); + if (got != avail) { + Log.e(TAG, "Read " + got + " bytes, expected " + avail); + } else { + mSuggest = new Suggest(context, byteBuffer); + Log.i(TAG, "Created mSuggest " + avail + " bytes"); + } + } + } catch (IOException ioe) { + Log.w(TAG, "No available size for binary dictionary"); + } + mSuggest.setAutoTextEnabled(false); + mSuggest.setCorrectionMode(Suggest.CORRECTION_FULL); + } + + /************************** Helper functions ************************/ + + private WordComposer createWordComposer(CharSequence s) { + WordComposer word = new WordComposer(); + for (int i = 0; i < s.length(); i++) { + final char c = s.charAt(i); + int[] codes; + // If it's not a lowercase letter, don't find adjacent letters + if (c < 'a' || c > 'z') { + codes = new int[] { c }; + } else { + codes = adjacents[c - 'a']; + } + word.add(c, codes); + } + return word; + } + + private void showList(String title, List suggestions) { + Log.i(TAG, title); + for (int i = 0; i < suggestions.size(); i++) { + Log.i(title, suggestions.get(i) + ", "); + } + } + + private boolean isDefaultSuggestion(List suggestions, CharSequence word) { + // Check if either the word is what you typed or the first alternative + return suggestions.size() > 0 && + (/*TextUtils.equals(suggestions.get(0), word) || */ + (suggestions.size() > 1 && TextUtils.equals(suggestions.get(1), word))); + } + + private boolean isDefaultSuggestion(CharSequence typed, CharSequence expected) { + WordComposer word = createWordComposer(typed); + List suggestions = mSuggest.getSuggestions(null, word, false); + return isDefaultSuggestion(suggestions, expected); + } + + private boolean isDefaultCorrection(CharSequence typed, CharSequence expected) { + WordComposer word = createWordComposer(typed); + List suggestions = mSuggest.getSuggestions(null, word, false); + return isDefaultSuggestion(suggestions, expected) && mSuggest.hasMinimalCorrection(); + } + + private boolean isASuggestion(CharSequence typed, CharSequence expected) { + WordComposer word = createWordComposer(typed); + List suggestions = mSuggest.getSuggestions(null, word, false); + for (int i = 1; i < suggestions.size(); i++) { + if (TextUtils.equals(suggestions.get(i), expected)) return true; + } + return false; + } + + private boolean isValid(CharSequence typed) { + return mSuggest.isValidWord(typed); + } + + /************************** Tests ************************/ + + /** + * Tests for simple completions of one character. + */ + public void testCompletion1char() { + assertTrue(isDefaultSuggestion("peopl", "people")); + assertTrue(isDefaultSuggestion("abou", "about")); + assertTrue(isDefaultSuggestion("thei", "their")); + } + + /** + * Tests for simple completions of two characters. + */ + public void testCompletion2char() { + assertTrue(isDefaultSuggestion("peop", "people")); + assertTrue(isDefaultSuggestion("calli", "calling")); + assertTrue(isDefaultSuggestion("busine", "business")); + } + + /** + * Tests for proximity errors. + */ + public void testProximityPositive() { + assertTrue(isDefaultSuggestion("peiple", "people")); + assertTrue(isDefaultSuggestion("peoole", "people")); + assertTrue(isDefaultSuggestion("pwpple", "people")); + } + + /** + * Tests for proximity errors - negative, when the error key is not near. + */ + public void testProximityNegative() { + assertFalse(isDefaultSuggestion("arout", "about")); + assertFalse(isDefaultSuggestion("ire", "are")); + } + + /** + * Tests for checking if apostrophes are added automatically. + */ + public void testApostropheInsertion() { + assertTrue(isDefaultSuggestion("im", "I'm")); + assertTrue(isDefaultSuggestion("dont", "don't")); + } + + /** + * Test to make sure apostrophed word is not suggested for an apostrophed word. + */ + public void testApostrophe() { + assertFalse(isDefaultSuggestion("don't", "don't")); + } + + /** + * Tests for suggestion of capitalized version of a word. + */ + public void testCapitalization() { + assertTrue(isDefaultSuggestion("i'm", "I'm")); + assertTrue(isDefaultSuggestion("sunday", "Sunday")); + assertTrue(isDefaultSuggestion("sundat", "Sunday")); + } + + /** + * Tests to see if more than one completion is provided for certain prefixes. + */ + public void testMultipleCompletions() { + assertTrue(isASuggestion("com", "come")); + assertTrue(isASuggestion("com", "company")); + assertTrue(isASuggestion("th", "the")); + assertTrue(isASuggestion("th", "that")); + assertTrue(isASuggestion("th", "this")); + assertTrue(isASuggestion("th", "they")); + } + + /** + * Does the suggestion engine recognize zero frequency words as valid words. + */ + public void testZeroFrequencyAccepted() { + assertTrue(isValid("yikes")); + assertFalse(isValid("yike")); + } + + /** + * Tests to make sure that zero frequency words are not suggested as completions. + */ + public void testZeroFrequencySuggestionsNegative() { + assertFalse(isASuggestion("yike", "yikes")); + assertFalse(isASuggestion("what", "whatcha")); + } + + /** + * Tests to ensure that words with large edit distances are not suggested, in some cases + * and not considered corrections, in some cases. + */ + public void testTooLargeEditDistance() { + assertFalse(isASuggestion("sniyr", "about")); + assertFalse(isDefaultCorrection("rjw", "the")); + } + + /** + * Make sure isValid is case-sensitive. + */ + public void testValidityCaseSensitivity() { + assertTrue(isValid("Sunday")); + assertFalse(isValid("sunday")); + } + + /** + * Are accented forms of words suggested as corrections? + */ + public void testAccents() { + assertTrue(isDefaultCorrection("nino", "ni\u00F1o")); // nio + assertTrue(isDefaultCorrection("nimo", "ni\u00F1o")); // nio + assertTrue(isDefaultCorrection("maria", "Mar\u00EDa")); // Mara + } +} From 1263d234666ae8fa19ab053b929c35236929d229 Mon Sep 17 00:00:00 2001 From: satok Date: Sat, 8 May 2010 02:03:29 +0900 Subject: [PATCH 018/159] Insert logging code - Add log of auto suggestion - Add log of cancelling auto suggestion - Add log of actual number of charactors - Add log of manually clicking suggestion Change-Id: I8fc1cef356bf1a98b0676ed171bfb17825e18425 --- .../inputmethod/latin/CandidateView.java | 25 +++-------- .../android/inputmethod/latin/LatinIME.java | 8 +++- .../inputmethod/latin/LatinImeLogger.java | 42 +++++++++++++++---- .../inputmethod/latin/TextEntryState.java | 2 + 4 files changed, 49 insertions(+), 28 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index 3a199bbaf..8355d6738 100755 --- a/java/src/com/android/inputmethod/latin/CandidateView.java +++ b/java/src/com/android/inputmethod/latin/CandidateView.java @@ -167,7 +167,7 @@ public class CandidateView extends View { if (scrollX < 0) { scrollX = 0; } - if (distanceX > 0 && scrollX + width > mTotalWidth) { + if (distanceX > 0 && scrollX + width > mTotalWidth) { scrollX -= (int) distanceX; } mTargetScrollX = scrollX; @@ -412,7 +412,11 @@ public class CandidateView extends View { if (y <= 0) { // Fling up!? if (mSelectedString != null) { + // If there are completions from the application, we don't change the state to + // STATE_PICKED_SUGGESTION if (!mShowingCompletions) { + // This "acceptedSuggestion" will not be counted as a word because + // it will be counted in pickSuggestion instead. TextEntryState.acceptedSuggestion(mSuggestions.get(0), mSelectedString); } @@ -447,25 +451,6 @@ public class CandidateView extends View { } return true; } - - /** - * For flick through from keyboard, call this method with the x coordinate of the flick - * gesture. - * @param x - */ - public void takeSuggestionAt(float x) { - mTouchX = (int) x; - // To detect candidate - onDraw(null); - if (mSelectedString != null) { - if (!mShowingCompletions) { - TextEntryState.acceptedSuggestion(mSuggestions.get(0), mSelectedString); - } - mService.pickSuggestionManually(mSelectedIndex, mSelectedString); - } - invalidate(); - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_REMOVE_THROUGH_PREVIEW), 200); - } private void hidePreview() { mCurrentWordIndex = OUT_OF_BOUNDS; diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 1586a758b..dfbde8759 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -701,7 +701,7 @@ public class LatinIME extends InputMethodService CompletionInfo ci = completions[i]; if (ci != null) stringList.add(ci.getText()); } - //CharSequence typedWord = mWord.getTypedWord(); + // When in fullscreen mode, show completions generated by the application setSuggestions(stringList, true, true, true); mBestWord = null; setCandidatesViewShown(isCandidateStripVisible() || mCompletionOn); @@ -1526,6 +1526,10 @@ public class LatinIME extends InputMethodService // If this is a punctuation, apply it through the normal key press if (suggestion.length() == 1 && isWordSeparator(suggestion.charAt(0))) { + // Word separators are suggested before the user inputs something. + // So, LatinImeLogger logs suggestion.charAt(0) as a user's input. + LatinImeLogger.logOnClickSuggestion( + suggestion.toString(), suggestion.toString(), index); onKey(suggestion.charAt(0), null); if (ic != null) { ic.endBatchEdit(); @@ -1538,6 +1542,8 @@ public class LatinIME extends InputMethodService if (index == 0) { checkAddToDictionary(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED); } + LatinImeLogger.logOnClickSuggestion( + mComposing.toString(), suggestion.toString(), index); TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion); // Follow it with a space if (mAutoSpace) { diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index a04e1cf96..c03d1a7ef 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -41,11 +41,16 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final int ID_INPUT_COUNT = 3; private static final int ID_DELETE_COUNT = 4; private static final int ID_WORD_COUNT = 5; + private static final int ID_ACTUAL_CHAR_COUNT = 6; private static final String PREF_ENABLE_LOG = "enable_log"; - private static LatinImeLogger sLatinImeLogger = new LatinImeLogger(); public static boolean sLogEnabled = true; + private static LatinImeLogger sLatinImeLogger = new LatinImeLogger(); + // Store the last auto suggested word. + // This is required for a cancellation log of auto suggestion of that word. + private static String sLastAutoSuggestBefore; + private static String sLastAutoSuggestAfter; private ArrayList mLogBuffer = null; private ArrayList mPrivacyLogBuffer = null; @@ -58,6 +63,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private int mDeleteCount; private int mInputCount; private int mWordCount; + // ActualCharCount includes all characters that were completed. + private int mActualCharCount; private static class LogEntry implements Comparable { public final int mTag; @@ -90,7 +97,10 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mLastTimeCountEntry = mLastTimeSend; mDeleteCount = 0; mInputCount = 0; + mWordCount = 0; + mActualCharCount = 0; mLogBuffer = new ArrayList(); + mPrivacyLogBuffer = new ArrayList(); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); sLogEnabled = prefs.getBoolean(PREF_ENABLE_LOG, DEFAULT_LOG_ENABLED); prefs.registerOnSharedPreferenceChangeListener(this); @@ -102,7 +112,10 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private void reset() { mDeleteCount = 0; mInputCount = 0; + mWordCount = 0; + mActualCharCount = 0; mLogBuffer.clear(); + mPrivacyLogBuffer.clear(); } /** @@ -134,9 +147,12 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang new String[] {String.valueOf(mInputCount)})); mLogBuffer.add(new LogEntry (time, ID_WORD_COUNT, new String[] {String.valueOf(mWordCount)})); + mLogBuffer.add(new LogEntry (time, ID_ACTUAL_CHAR_COUNT, + new String[] {String.valueOf(mActualCharCount)})); mDeleteCount = 0; mInputCount = 0; mWordCount = 0; + mActualCharCount = 0; } private void flushPrivacyLogSafely() { @@ -174,6 +190,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang case ID_AUTOSUGGESTION: ++mWordCount; String[] dataStrings = (String[]) data; + mActualCharCount += dataStrings[1].length(); if (checkStringsDataSafe(dataStrings)) { mPrivacyLogBuffer.add( new LogEntry (System.currentTimeMillis(), tag, dataStrings)); @@ -186,6 +203,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang case ID_AUTOSUGGESTIONCANCELED: --mWordCount; dataStrings = (String[]) data; + mActualCharCount -= dataStrings[1].length(); if (checkStringsDataSafe(dataStrings)) { mPrivacyLogBuffer.add( new LogEntry (System.currentTimeMillis(), tag, dataStrings)); @@ -215,7 +233,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mLastTimeSend = System.currentTimeMillis(); } - private void sendLogToDropBox(int tag, Object s) { + private synchronized void sendLogToDropBox(int tag, Object s) { long now = System.currentTimeMillis(); if (DBG) { Log.d(TAG, "SendLog: " + tag + ";" + s + "," @@ -255,6 +273,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } + // TODO: Handle CharSequence instead of String public static void logOnClickSuggestion(String before, String after, int position) { if (sLogEnabled) { String[] strings = new String[] {before, after, String.valueOf(position)}; @@ -265,14 +284,22 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void logOnAutoSuggestion(String before, String after) { if (sLogEnabled) { String[] strings = new String[] {before, after}; - sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTION, strings); + synchronized (sLastAutoSuggestBefore) { + sLastAutoSuggestBefore = before; + } + synchronized (sLastAutoSuggestAfter) { + sLastAutoSuggestAfter = after; + } + sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTIONCANCELED, strings); } } - public static void logOnAutoSuggestionCanceled(String before, String after) { + public static void logOnAutoSuggestionCanceled() { if (sLogEnabled) { - String[] strings = new String[] {before, after}; - sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTIONCANCELED, strings); + if (sLastAutoSuggestBefore != null && sLastAutoSuggestAfter != null) { + String[] strings = new String[] {sLastAutoSuggestBefore, sLastAutoSuggestAfter}; + sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTION, strings); + } } } @@ -296,7 +323,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang sb.append(SEPARATER); } - private static void appendLogEntry(StringBuffer sb, String time, String tag, String[] data) { + private static void appendLogEntry(StringBuffer sb, String time, String tag, + String[] data) { if (data.length > 0) { appendWithLength(sb, String.valueOf(data.length + 2)); appendWithLength(sb, time); diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java index d056ceb16..d291af651 100644 --- a/java/src/com/android/inputmethod/latin/TextEntryState.java +++ b/java/src/com/android/inputmethod/latin/TextEntryState.java @@ -130,6 +130,7 @@ public class TextEntryState { sTypedChars += typedWord.length(); sActualChars += actualWord.length(); sState = STATE_ACCEPTED_DEFAULT; + LatinImeLogger.logOnAutoSuggestion(typedWord.toString(), actualWord.toString()); } public static void acceptedTyped(CharSequence typedWord) { @@ -199,6 +200,7 @@ public class TextEntryState { if (sState == STATE_ACCEPTED_DEFAULT) { sState = STATE_UNDO_COMMIT; sAutoSuggestUndoneCount++; + LatinImeLogger.logOnAutoSuggestionCanceled(); } else if (sState == STATE_UNDO_COMMIT) { sState = STATE_IN_WORD; } From 54b3fe771f4b6dfc92c959213325742618a04416 Mon Sep 17 00:00:00 2001 From: Roman Mitnitski Date: Mon, 10 May 2010 09:26:58 +0300 Subject: [PATCH 019/159] Sync hebrew keyboard with the rest (removed popular domain button) Change-Id: Ib7e91513fcb02e7383c7d0e524b7f56a53b1abd8 --- java/res/xml-iw/kbd_qwerty.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml index 3cec7cda4..b893f1a62 100755 --- a/java/res/xml-iw/kbd_qwerty.xml +++ b/java/res/xml-iw/kbd_qwerty.xml @@ -94,11 +94,11 @@ - + - + Date: Mon, 10 May 2010 15:49:11 +0900 Subject: [PATCH 020/159] Cleanup unused function Change-Id: I7417bcaa578ef85f0b634bcac8ddde2b0368b905 --- .../inputmethod/latin/CandidateView.java | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index 3a199bbaf..0bd993e7b 100755 --- a/java/src/com/android/inputmethod/latin/CandidateView.java +++ b/java/src/com/android/inputmethod/latin/CandidateView.java @@ -447,25 +447,6 @@ public class CandidateView extends View { } return true; } - - /** - * For flick through from keyboard, call this method with the x coordinate of the flick - * gesture. - * @param x - */ - public void takeSuggestionAt(float x) { - mTouchX = (int) x; - // To detect candidate - onDraw(null); - if (mSelectedString != null) { - if (!mShowingCompletions) { - TextEntryState.acceptedSuggestion(mSuggestions.get(0), mSelectedString); - } - mService.pickSuggestionManually(mSelectedIndex, mSelectedString); - } - invalidate(); - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_REMOVE_THROUGH_PREVIEW), 200); - } private void hidePreview() { mCurrentWordIndex = OUT_OF_BOUNDS; From 34a69469acd5cc900bc1116a880e1f7ac49aec44 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 10 May 2010 16:31:51 +0900 Subject: [PATCH 021/159] Change the application name Change-Id: I097bfe031ff8a0652329469fa11074e109653fdb --- java/res/values-cs/strings.xml | 4 ++-- java/res/values-da/strings.xml | 4 ++-- java/res/values-de/strings.xml | 4 ++-- java/res/values-el/strings.xml | 4 ++-- java/res/values-es-rUS/strings.xml | 4 ++-- java/res/values-es/strings.xml | 4 ++-- java/res/values-fr-rCA/strings.xml | 2 +- java/res/values-fr/strings.xml | 4 ++-- java/res/values-it/strings.xml | 4 ++-- java/res/values-ko/strings.xml | 4 ++-- java/res/values-nb/strings.xml | 4 ++-- java/res/values-nl/strings.xml | 4 ++-- java/res/values-pl/strings.xml | 4 ++-- java/res/values-pt-rPT/strings.xml | 4 ++-- java/res/values-pt/strings.xml | 4 ++-- java/res/values-ru/strings.xml | 4 ++-- java/res/values-sv/strings.xml | 4 ++-- java/res/values-tr/strings.xml | 4 ++-- 18 files changed, 35 insertions(+), 35 deletions(-) diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 4bc1f5543..e063c8a28 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -20,8 +20,8 @@ - "Klávesnice Android" - "Nastavení klávesnice Android" + "Klávesnice Android 2" + "Nastavení klávesnice Android 2" "Při stisku klávesy vibrovat" "Zvuk při stisku klávesy" "Opravovat překlepy" diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 750d67b20..09cb8c90c 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -20,8 +20,8 @@ - "Android-tastatur" - "Indstillinger for Android-tastatur" + "Android-tastatur 2" + "Indstillinger for Android-tastatur 2" "Vibration ved tastetryk" "Lyd ved tastetryk" "Ret stavefejl" diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index 7d3d53c3c..12cef4eb4 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -20,8 +20,8 @@ - "Android-Tastatur" - "Android-Tastatureinstellungen" + "Android-Tastatur 2" + "Android-Tastatur2einstellungen" "Vibrieren bei Tastendruck" "Sound bei Tastendruck" "Eingabefehler korrigieren" diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index c4a50771a..fbe705fd2 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -20,8 +20,8 @@ - "Πληκτρολόγιο Android" - "Ρυθμίσεις πληκτρολογίου Android" + "Πληκτρολόγιο Android 2" + "Ρυθμίσεις πληκτρολογίου Android 2" "Δόνηση κατά το πάτημα πλήκτρων" "Ήχος κατά το πάτημα πλήκτρων" "Διόρθωση σφαλμάτων πληκτρολόγησης" diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index cd17dba31..150ff7574 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -20,8 +20,8 @@ - "Teclado de Android" - "Configuración de teclado de Android" + "Teclado de Android 2" + "Configuración de teclado de Android 2" "Vibrar al pulsar teclas" "Sonar al pulsar las teclas" "Corregir errores de escritura" diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index fbe3ad347..4ef3eac31 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -20,8 +20,8 @@ - "Teclado de Android" - "Ajustes del teclado de Android" + "Teclado de Android 2" + "Ajustes del teclado de Android 2" "Vibrar al pulsar tecla" "Sonido al pulsar tecla" "Corregir errores de escritura" diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml index b56463ed9..e0d456d00 100644 --- a/java/res/values-fr-rCA/strings.xml +++ b/java/res/values-fr-rCA/strings.xml @@ -15,5 +15,5 @@ --> - "Clavier Android" + "Clavier Android 2" diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index 2cabe40d9..d4ec8789e 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -20,8 +20,8 @@ - "Clavier Android" - "Paramètres du clavier Android" + "Clavier Android 2" + "Paramètres du clavier Android 2" "Vibrer à chaque touche" "Son à chaque touche" "Corriger les fautes de frappe" diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 3844aea8f..beb48cbbb 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -20,8 +20,8 @@ - "Tastiera Android" - "Impostazioni tastiera Android" + "Tastiera Android 2" + "Impostazioni tastiera Android 2" "Vibra alla pressione di un tasto" "Suona alla pressione di un tasto" "Correggi errori di digitazione" diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index 350957939..fbfdd4cd2 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -20,8 +20,8 @@ - "Android 키보드" - "Android 키보드 설정" + "Android 키보드 2" + "Android 키보드 2 설정" "키를 누를 때 진동 발생" "버튼을 누를 때 소리 발생" "입력 오류 수정" diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 041d07eb3..5c1bbf1c4 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -20,8 +20,8 @@ - "Skjermtastatur" - "Innstillinger for skjermtastatur" + "Skjermtastatur 2" + "Innstillinger for skjermtastatur 2" "Vibrer ved tastetrykk" "Lyd ved tastetrykk" "Rett opp skrivefeil" diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index 00b197bf1..c5771c8b7 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -20,8 +20,8 @@ - "Android-toetsenbord" - "Instellingen voor Android-toetsenbord" + "Android-toetsenbord 2" + "Instellingen voor Android-toetsenbord 2" "Trillen bij druk op toets" "Geluid bij druk op een toets" "Typefouten corrigeren" diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 0c72727ce..561191d98 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -20,8 +20,8 @@ - "Klawiatura Android" - "Ustawienia klawiatury Android" + "Klawiatura Android 2" + "Ustawienia klawiatury Android 2" "Wibracja przy naciśnięciu" "Dźwięk przy naciśnięciu" "Popraw błędy pisowni" diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 35a9cb715..39007c130 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -20,8 +20,8 @@ - "Teclado do Android" - "Definições de teclado do Android" + "Teclado do Android 2" + "Definições de teclado do Android 2" "Vibrar ao primir as teclas" "Som ao premir as teclas" "Corrigir erros de escrita" diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 235fd65ac..38890d8ff 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -20,8 +20,8 @@ - "Teclado Android" - "Configurações de teclado Android" + "Teclado Android 2" + "Configurações de teclado Android 2" "Vibrar ao tocar a tecla" "Som ao tocar a tecla" "Corrigir erros de digitação" diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index e27402c7f..f1a8a1c0b 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -20,8 +20,8 @@ - "Клавиатура Android" - "Настройки клавиатуры Android" + "Клавиатура Android 2" + "Настройки клавиатуры Android 2" "Виброотклик клавиш" "Звук клавиш" "Исправлять опечатки" diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 9c6c22159..8970a05f7 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -20,8 +20,8 @@ - "Androids tangentbord" - "Inställningar för Androids tangentbord" + "Androids tangentbord 2" + "Inställningar för Androids tangentbord 2" "Vibrera vid tangenttryck" "Knappljud" "Rätta skrivfel" diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 0fbdc7da3..86d956971 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -20,8 +20,8 @@ - "Android klavyesi" - "Android klavye ayarları" + "Android klavyesi 2" + "Android klavye 2 ayarları" "Tuşa basıldığında titret" "Tuşa basıldığında ses çıkar" "Yazım hatalarını düzelt" From ee2ab40c7a5609f5bc7a8a066b666fcb86d2f498 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 10 May 2010 18:43:50 +0900 Subject: [PATCH 022/159] Add settings for "enable log" to UI Change-Id: Ib6ebfbc586dbea4dce037e484598cbc47ba58c7e --- java/res/values/strings.xml | 8 +++++++- java/res/xml/prefs.xml | 7 +++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index f1af31c50..83e0adb08 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -25,9 +25,10 @@ Vibrate on keypress + Sound on keypress - + Correct typing errors @@ -322,4 +323,9 @@ Dictionary available + + + Enable user feedback + + Help improve this input method editor by automatically sending usage statistics and crash reports to Google. diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 535b63f3b..7346d0271 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -37,6 +37,13 @@ android:defaultValue="true" /> + + Date: Tue, 11 May 2010 17:34:49 +0900 Subject: [PATCH 023/159] Cleanup - Remove dead code - Add colors Change-Id: I011146b33a37375d2a0b12342d65bad62ba7542b --- java/res/values/colors.xml | 4 +++ .../android/inputmethod/latin/LatinIME.java | 15 +++----- .../inputmethod/latin/LatinKeyboard.java | 23 +++++------- .../inputmethod/latin/LatinKeyboardView.java | 36 ++++++++++--------- .../inputmethod/voice/LatinIMEWithVoice.java | 28 --------------- .../voice/LatinIMEWithVoiceSettings.java | 21 ----------- .../voicesearch/LatinIMEWithVoice.java | 29 --------------- .../LatinIMEWithVoiceSettings.java | 5 --- 8 files changed, 35 insertions(+), 126 deletions(-) delete mode 100644 java/src/com/android/inputmethod/voice/LatinIMEWithVoice.java delete mode 100644 java/src/com/android/inputmethod/voice/LatinIMEWithVoiceSettings.java delete mode 100644 java/src/com/google/android/voicesearch/LatinIMEWithVoice.java delete mode 100644 java/src/com/google/android/voicesearch/LatinIMEWithVoiceSettings.java diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml index c90d9f6af..ced3e3fae 100644 --- a/java/res/values/colors.xml +++ b/java/res/values/colors.xml @@ -21,4 +21,8 @@ #FF000000 #FFE35900 #ff808080 + #00000000 + #80000000 + #FF808080 + #FF000000 \ No newline at end of file diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index b4ed80c1f..38313c05c 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -40,7 +40,6 @@ import android.os.Message; import android.os.SystemClock; import android.preference.PreferenceManager; import android.speech.SpeechRecognizer; -import android.text.AutoText; import android.text.ClipboardManager; import android.text.TextUtils; import android.util.Log; @@ -78,6 +77,7 @@ public class LatinIME extends InputMethodService VoiceInput.UiListener, SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIME"; + private static final boolean PERF_DEBUG = false; static final boolean DEBUG = false; static final boolean TRACE = false; static final boolean VOICE_INSTALLED = true; @@ -189,7 +189,6 @@ public class LatinIME extends InputMethodService private boolean mAutoCorrectOn; private boolean mCapsLock; private boolean mPasswordText; - private boolean mEmailText; private boolean mVibrateOn; private boolean mSoundOn; private boolean mAutoCap; @@ -456,7 +455,6 @@ public class LatinIME extends InputMethodService mCompletionOn = false; mCompletions = null; mCapsLock = false; - mEmailText = false; mEnteredText = null; switch (attribute.inputType & EditorInfo.TYPE_MASK_CLASS) { @@ -479,9 +477,6 @@ public class LatinIME extends InputMethodService variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ) { mPredictionOn = false; } - if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS) { - mEmailText = true; - } if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS || variation == EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME) { mAutoSpace = false; @@ -681,7 +676,7 @@ public class LatinIME extends InputMethodService @Override public void onDisplayCompletions(CompletionInfo[] completions) { - if (false) { + if (DEBUG) { Log.i("foo", "Received completions:"); for (int i=0; i<(completions != null ? completions.length : 0); i++) { Log.i("foo", " #" + i + ": " + completions[i]); @@ -1122,7 +1117,7 @@ public class LatinIME extends InputMethodService sendKeyChar((char)primaryCode); } updateShiftKeyState(getCurrentInputEditorInfo()); - measureCps(); + if (LatinIME.PERF_DEBUG) measureCps(); TextEntryState.typedCharacter((char) primaryCode, isWordSeparator(primaryCode)); } @@ -1858,7 +1853,7 @@ public class LatinIME extends InputMethodService launchSettings(LatinIMESettings.class); } - protected void launchSettings(Class settingsClass) { + protected void launchSettings(Class settingsClass) { handleClose(); Intent intent = new Intent(); intent.setClass(LatinIME.this, settingsClass); @@ -1995,7 +1990,6 @@ public class LatinIME extends InputMethodService // Characters per second measurement - private static final boolean PERF_DEBUG = false; private long mLastCpsTime; private static final int CPS_BUFFER_SIZE = 16; private long[] mCpsIntervals = new long[CPS_BUFFER_SIZE]; @@ -2003,7 +1997,6 @@ public class LatinIME extends InputMethodService private boolean mInputTypeNoAutoCorrect; private void measureCps() { - if (!LatinIME.PERF_DEBUG) return; long now = System.currentTimeMillis(); if (mLastCpsTime == 0) mLastCpsTime = now - 100; // Initial mCpsIntervals[mCpsIndex] = now - mLastCpsTime; diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 6aea5d13a..ea6b74e1b 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -47,7 +47,6 @@ public class LatinKeyboard extends Keyboard { private Drawable mShiftLockIcon; private Drawable mShiftLockPreviewIcon; private Drawable mOldShiftIcon; - private Drawable mOldShiftPreviewIcon; private Drawable mSpaceIcon; private Drawable mSpacePreviewIcon; private Drawable mMicIcon; @@ -68,7 +67,6 @@ public class LatinKeyboard extends Keyboard { private LanguageSwitcher mLanguageSwitcher; private Resources mRes; private Context mContext; - private int mMode; // Whether this keyboard has voice icon on it private boolean mHasVoiceButton; // Whether voice icon is enabled at all @@ -77,9 +75,7 @@ public class LatinKeyboard extends Keyboard { private CharSequence m123Label; private boolean mCurrentlyInSpace; private SlidingLocaleDrawable mSlidingLocaleIcon; - private Rect mBounds = new Rect(); private int[] mPrefLetterFrequencies; - private boolean mPreemptiveCorrection; private int mPrefLetter; private int mPrefLetterX; private int mPrefLetterY; @@ -107,7 +103,6 @@ public class LatinKeyboard extends Keyboard { super(context, xmlLayoutResId, mode); final Resources res = context.getResources(); mContext = context; - mMode = mode; mRes = res; mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); @@ -224,7 +219,6 @@ public class LatinKeyboard extends Keyboard { ((LatinKey)mShiftKey).enableShiftLock(); } mOldShiftIcon = mShiftKey.icon; - mOldShiftPreviewIcon = mShiftKey.iconPreview; } } @@ -338,21 +332,19 @@ public class LatinKeyboard extends Keyboard { } private void drawSpaceBar(Canvas canvas, int width, int height, int opacity) { - canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR); + canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setAlpha(opacity); // Get the text size from the theme paint.setTextSize(getTextSizeFromTheme(android.R.style.TextAppearance_Small, 14)); paint.setTextAlign(Align.CENTER); - //// Draw a drop shadow for the text - //paint.setShadowLayer(2f, 0, 0, 0xFF000000); final String language = getInputLanguage(mSpaceKey.width, paint); final int ascent = (int) -paint.ascent(); - paint.setColor(0x80000000); + paint.setColor(mRes.getColor(R.color.latinkeyboard_bar_language_shadow)); canvas.drawText(language, width / 2, ascent - 1, paint); - paint.setColor(0xFF808080); + paint.setColor(mRes.getColor(R.color.latinkeyboard_bar_language_text)); canvas.drawText(language, width / 2, ascent, paint); // Put arrows on either side of the text @@ -503,9 +495,10 @@ public class LatinKeyboard extends Keyboard { // Handle preferred next letter final int[] pref = mPrefLetterFrequencies; if (mPrefLetter > 0) { - if (DEBUG_PREFERRED_LETTER && mPrefLetter == code - && !key.isInsideSuper(x, y)) { - Log.d(TAG, "CORRECTED !!!!!!"); + if (DEBUG_PREFERRED_LETTER) { + if (mPrefLetter == code && !key.isInsideSuper(x, y)) { + Log.d(TAG, "CORRECTED !!!!!!"); + } } return mPrefLetter == code; } else { @@ -718,7 +711,7 @@ public class LatinKeyboard extends Keyboard { public void draw(Canvas canvas) { canvas.save(); if (mHitThreshold) { - mTextPaint.setColor(0xFF000000); + mTextPaint.setColor(mRes.getColor(R.color.latinkeyboard_text_color)); canvas.clipRect(0, 0, mWidth, mHeight); if (mCurrentLanguage == null) { mCurrentLanguage = getInputLanguage(mWidth, mTextPaint); diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index 74fc475e6..323f4bf6b 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -23,7 +23,6 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.inputmethodservice.Keyboard; import android.inputmethodservice.KeyboardView; -import android.inputmethodservice.KeyboardView.OnKeyboardActionListener; import android.inputmethodservice.Keyboard.Key; import android.os.Handler; import android.os.Message; @@ -452,27 +451,30 @@ public class LatinKeyboardView extends KeyboardView { } } } - - void startPlaying(String s) { - if (!DEBUG_AUTO_PLAY) return; - if (s == null) return; - mStringToPlay = s.toLowerCase(); - mPlaying = true; - mDownDelivered = false; - mStringIndex = 0; - mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 10); + + public void startPlaying(String s) { + if (DEBUG_AUTO_PLAY) { + if (s == null) return; + mStringToPlay = s.toLowerCase(); + mPlaying = true; + mDownDelivered = false; + mStringIndex = 0; + mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 10); + } } @Override public void draw(Canvas c) { super.draw(c); - if (DEBUG_AUTO_PLAY && mPlaying) { - mHandler2.removeMessages(MSG_TOUCH_DOWN); - mHandler2.removeMessages(MSG_TOUCH_UP); - if (mDownDelivered) { - mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_UP, 20); - } else { - mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 20); + if (DEBUG_AUTO_PLAY) { + if (mPlaying) { + mHandler2.removeMessages(MSG_TOUCH_DOWN); + mHandler2.removeMessages(MSG_TOUCH_UP); + if (mDownDelivered) { + mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_UP, 20); + } else { + mHandler2.sendEmptyMessageDelayed(MSG_TOUCH_DOWN, 20); + } } } if (DEBUG_LINE) { diff --git a/java/src/com/android/inputmethod/voice/LatinIMEWithVoice.java b/java/src/com/android/inputmethod/voice/LatinIMEWithVoice.java deleted file mode 100644 index ccbf5b6bc..000000000 --- a/java/src/com/android/inputmethod/voice/LatinIMEWithVoice.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2009 Google Inc. - * - * 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.voice; - -import android.content.Intent; - -import com.android.inputmethod.latin.LatinIME; - -public class LatinIMEWithVoice extends LatinIME { - @Override - protected void launchSettings() { - launchSettings(LatinIMEWithVoiceSettings.class); - } -} diff --git a/java/src/com/android/inputmethod/voice/LatinIMEWithVoiceSettings.java b/java/src/com/android/inputmethod/voice/LatinIMEWithVoiceSettings.java deleted file mode 100644 index 13a58e14d..000000000 --- a/java/src/com/android/inputmethod/voice/LatinIMEWithVoiceSettings.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2009 Google Inc. - * - * 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.voice; - -import com.android.inputmethod.latin.LatinIMESettings; - -public class LatinIMEWithVoiceSettings extends LatinIMESettings {} diff --git a/java/src/com/google/android/voicesearch/LatinIMEWithVoice.java b/java/src/com/google/android/voicesearch/LatinIMEWithVoice.java deleted file mode 100644 index 8a339d14a..000000000 --- a/java/src/com/google/android/voicesearch/LatinIMEWithVoice.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * - * Copyright (C) 2009 Google Inc. - * - * 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.google.android.voicesearch; - -import android.content.Intent; - -import com.android.inputmethod.latin.LatinIME; - -public class LatinIMEWithVoice extends LatinIME { - @Override - protected void launchSettings() { - launchSettings(LatinIMEWithVoiceSettings.class); - } -} diff --git a/java/src/com/google/android/voicesearch/LatinIMEWithVoiceSettings.java b/java/src/com/google/android/voicesearch/LatinIMEWithVoiceSettings.java deleted file mode 100644 index a53cebfd9..000000000 --- a/java/src/com/google/android/voicesearch/LatinIMEWithVoiceSettings.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.google.android.voicesearch; - -import com.android.inputmethod.latin.LatinIMESettings; - -public class LatinIMEWithVoiceSettings extends LatinIMESettings {} From 75e0abcfdba338fe6a46770d3c964f296f96a2f2 Mon Sep 17 00:00:00 2001 From: Yuncheol Heo Date: Wed, 12 May 2010 09:59:38 +0900 Subject: [PATCH 024/159] Fix a bug throwing IndexOutOfBoundsException when IME receives completions more than MAX_SUGGESTIONS in full-screen mode. Change-Id: Ic76287c2f8aa91733769e789df1f2a0614100f65 --- java/src/com/android/inputmethod/latin/CandidateView.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index 0bd993e7b..ae45001b8 100755 --- a/java/src/com/android/inputmethod/latin/CandidateView.java +++ b/java/src/com/android/inputmethod/latin/CandidateView.java @@ -219,7 +219,7 @@ public class CandidateView extends View { mDivider.getIntrinsicHeight()); } int x = 0; - final int count = mSuggestions.size(); + final int count = Math.min(mSuggestions.size(), MAX_SUGGESTIONS); final int width = getWidth(); final Rect bgPadding = mBgPadding; final Paint paint = mPaint; @@ -335,7 +335,7 @@ public class CandidateView extends View { public void scrollPrev() { int i = 0; - final int count = mSuggestions.size(); + final int count = Math.min(mSuggestions.size(), MAX_SUGGESTIONS); int firstItem = 0; // Actually just before the first item, if at the boundary while (i < count) { if (mWordX[i] < getScrollX() @@ -354,7 +354,7 @@ public class CandidateView extends View { int i = 0; int scrollX = getScrollX(); int targetX = scrollX; - final int count = mSuggestions.size(); + final int count = Math.min(mSuggestions.size(), MAX_SUGGESTIONS); int rightEdge = scrollX + getWidth(); while (i < count) { if (mWordX[i] <= rightEdge && From 00dd9e180a7bdcbb41a4247383ea956367b56a60 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 12 May 2010 11:54:28 +0900 Subject: [PATCH 025/159] Fix NPE Change-Id: Ic438704af64e8ebcecba13dbc0f3e72b14ac6f4f --- java/src/com/android/inputmethod/latin/LatinImeLogger.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index c03d1a7ef..c03e7d01c 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -284,10 +284,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void logOnAutoSuggestion(String before, String after) { if (sLogEnabled) { String[] strings = new String[] {before, after}; - synchronized (sLastAutoSuggestBefore) { + synchronized (LatinImeLogger.class) { sLastAutoSuggestBefore = before; - } - synchronized (sLastAutoSuggestAfter) { sLastAutoSuggestAfter = after; } sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTIONCANCELED, strings); From 8d6bd9389f6a184ed43d4bc43dbd09ba7f479fe9 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 12 May 2010 14:35:07 +0900 Subject: [PATCH 026/159] Clean up - extract color Change-Id: Ic9cbb44502e71941eb74f15cc2f96b9abdb4b327 --- java/res/layout/input_trans.xml | 2 +- java/res/values/colors.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/java/res/layout/input_trans.xml b/java/res/layout/input_trans.xml index 94806f7e3..f66e8cd5c 100755 --- a/java/res/layout/input_trans.xml +++ b/java/res/layout/input_trans.xml @@ -24,7 +24,7 @@ android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="#A0000000" + android:background="@color/latinkeyboard_extension_background" android:verticalCorrection="0dip" android:keyBackground="@drawable/btn_keyboard_key_fulltrans" /> diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml index ced3e3fae..d4bb13829 100644 --- a/java/res/values/colors.xml +++ b/java/res/values/colors.xml @@ -24,5 +24,6 @@ #00000000 #80000000 #FF808080 + #A0000000 #FF000000 \ No newline at end of file From a0f87399147c0aa53a50f1f1f7a83b6901298c69 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 14 May 2010 22:20:13 +0900 Subject: [PATCH 027/159] Add Keyboard Theme Switcher Change-Id: If1bf7d20e4f8a47a7c0429d2445431dc73c1b31b --- ...ound.9.png => keyboard_background_1.9.png} | Bin java/res/drawable/btn_keyboard_key2.xml | 36 +++++++ java/res/drawable/btn_keyboard_key3.xml | 36 +++++++ java/res/drawable/btn_keyboard_toggle_off.png | Bin 0 -> 693 bytes java/res/drawable/btn_keyboard_toggle_on.png | Bin 0 -> 812 bytes java/res/drawable/keyboard_background_2.jpg | Bin 0 -> 128041 bytes java/res/drawable/keyboard_background_3.jpg | Bin 0 -> 286941 bytes java/res/drawable/keyboard_background_4.jpg | Bin 0 -> 195645 bytes java/res/drawable/keyboard_background_5.jpg | Bin 0 -> 3715 bytes java/res/layout/input2.xml | 29 +++++ java/res/layout/input3.xml | 29 +++++ java/res/layout/input4.xml | 29 +++++ java/res/layout/input5.xml | 29 +++++ java/res/layout/input6.xml | 29 +++++ java/res/values/colors.xml | 2 +- java/res/values/strings.xml | 26 +++++ java/res/xml/prefs.xml | 11 +- .../inputmethod/latin/KeyboardSwitcher.java | 63 +++++++++-- .../android/inputmethod/latin/LatinIME.java | 102 ++++++++++-------- 19 files changed, 367 insertions(+), 54 deletions(-) rename java/res/drawable-hdpi/{keyboard_background.9.png => keyboard_background_1.9.png} (100%) create mode 100644 java/res/drawable/btn_keyboard_key2.xml create mode 100644 java/res/drawable/btn_keyboard_key3.xml create mode 100644 java/res/drawable/btn_keyboard_toggle_off.png create mode 100644 java/res/drawable/btn_keyboard_toggle_on.png create mode 100644 java/res/drawable/keyboard_background_2.jpg create mode 100644 java/res/drawable/keyboard_background_3.jpg create mode 100755 java/res/drawable/keyboard_background_4.jpg create mode 100644 java/res/drawable/keyboard_background_5.jpg create mode 100755 java/res/layout/input2.xml create mode 100755 java/res/layout/input3.xml create mode 100755 java/res/layout/input4.xml create mode 100755 java/res/layout/input5.xml create mode 100755 java/res/layout/input6.xml diff --git a/java/res/drawable-hdpi/keyboard_background.9.png b/java/res/drawable-hdpi/keyboard_background_1.9.png similarity index 100% rename from java/res/drawable-hdpi/keyboard_background.9.png rename to java/res/drawable-hdpi/keyboard_background_1.9.png diff --git a/java/res/drawable/btn_keyboard_key2.xml b/java/res/drawable/btn_keyboard_key2.xml new file mode 100644 index 000000000..bd745b76e --- /dev/null +++ b/java/res/drawable/btn_keyboard_key2.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + diff --git a/java/res/drawable/btn_keyboard_key3.xml b/java/res/drawable/btn_keyboard_key3.xml new file mode 100644 index 000000000..dbe82d5fd --- /dev/null +++ b/java/res/drawable/btn_keyboard_key3.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + diff --git a/java/res/drawable/btn_keyboard_toggle_off.png b/java/res/drawable/btn_keyboard_toggle_off.png new file mode 100644 index 0000000000000000000000000000000000000000..21399a4f3618f0e6549016cd7b53e75767029de6 GIT binary patch literal 693 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�J;~0 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

7du`FWufl_lx9& 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≤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 literal 0 HcmV?d00001 diff --git a/java/res/drawable/keyboard_background_5.jpg b/java/res/drawable/keyboard_background_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2fe7c5fb8f2207419f2d9f0eb8edf4bec73cd94e GIT binary patch literal 3715 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 + + + diff --git a/java/res/layout/input3.xml b/java/res/layout/input3.xml new file mode 100755 index 000000000..a27d09a5a --- /dev/null +++ b/java/res/layout/input3.xml @@ -0,0 +1,29 @@ + + + + diff --git a/java/res/layout/input4.xml b/java/res/layout/input4.xml new file mode 100755 index 000000000..58dd51e3c --- /dev/null +++ b/java/res/layout/input4.xml @@ -0,0 +1,29 @@ + + + + diff --git a/java/res/layout/input5.xml b/java/res/layout/input5.xml new file mode 100755 index 000000000..5cd0b8d02 --- /dev/null +++ b/java/res/layout/input5.xml @@ -0,0 +1,29 @@ + + + + diff --git a/java/res/layout/input6.xml b/java/res/layout/input6.xml new file mode 100755 index 000000000..19197e1e4 --- /dev/null +++ b/java/res/layout/input6.xml @@ -0,0 +1,29 @@ + + + + diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml index d4bb13829..6eb362bd8 100644 --- a/java/res/values/colors.xml +++ b/java/res/values/colors.xml @@ -26,4 +26,4 @@ #FF808080 #A0000000 #FF000000 - \ No newline at end of file + diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 83e0adb08..579375863 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -328,4 +328,30 @@ Enable user feedback Help improve this input method editor by automatically sending usage statistics and crash reports to Google. + + Keyboard Theme + Basic + Basic (High Contrast) + Blue Ribbon + Dazzle + Blue Ribbon (High Contrast) + Dazzle (High Contrast) + + + @string/layout_basic + @string/layout_high_contrast + @string/layout_blue_ribbon + @string/layout_blue_ribbon_high + @string/layout_dazzle + @string/layout_dazzle_high + + + + 0 + 1 + 2 + 3 + 4 + 5 + diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 7346d0271..7dc9a365e 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -53,6 +53,15 @@ android:defaultValue="@string/voice_mode_main" /> + + @@ -89,5 +98,5 @@ android:dependency="show_suggestions" /> - + diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 1a196448f..3cfd81476 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -21,11 +21,12 @@ import java.util.Locale; import java.util.Map; import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; -import android.inputmethodservice.InputMethodService; +import android.preference.PreferenceManager; -public class KeyboardSwitcher { +public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener { public static final int MODE_TEXT = 1; public static final int MODE_SYMBOLS = 2; @@ -56,10 +57,15 @@ public class KeyboardSwitcher { KEYBOARDMODE_EMAIL, KEYBOARDMODE_IM, KEYBOARDMODE_WEB}; + private static final String PREF_KEYBOARD_LAYOUT = "keyboard_layout"; + private static final int[] LAYOUTS = new int [] { + R.layout.input, R.layout.input2, R.layout.input3, R.layout.input4, R.layout.input5, + R.layout.input6 + }; + private static final String DEFAULT_LAYOUT_ID = "0"; - //LatinIME mContext; Context mContext; - InputMethodService mInputMethodService; + LatinIME mInputMethodService; private KeyboardId mSymbolsId; private KeyboardId mSymbolsShiftedId; @@ -79,14 +85,20 @@ public class KeyboardSwitcher { private int mLastDisplayWidth; private LanguageSwitcher mLanguageSwitcher; private Locale mInputLocale; - private boolean mEnableMultipleLanguages; - KeyboardSwitcher(Context context, InputMethodService ims) { + private int mLayoutId; + + KeyboardSwitcher(Context context, LatinIME ims) { mContext = context; mKeyboards = new HashMap(); mSymbolsId = new KeyboardId(R.xml.kbd_symbols, false); mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift, false); mInputMethodService = ims; + + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ims); + int mLayoutId = Integer.valueOf(prefs.getString(PREF_KEYBOARD_LAYOUT, DEFAULT_LAYOUT_ID)); + prefs.registerOnSharedPreferenceChangeListener(this); + changeLatinKeyboardView(mLayoutId, false); } /** @@ -98,13 +110,12 @@ public class KeyboardSwitcher { void setLanguageSwitcher(LanguageSwitcher languageSwitcher) { mLanguageSwitcher = languageSwitcher; mInputLocale = mLanguageSwitcher.getInputLocale(); - mEnableMultipleLanguages = mLanguageSwitcher.getLocaleCount() > 1; } void setInputView(LatinKeyboardView inputView) { mInputView = inputView; } - + void makeKeyboards(boolean forceCreate) { if (forceCreate) mKeyboards.clear(); // Configuration change is coming after the keyboard gets recreated. So don't rely on that. @@ -140,6 +151,7 @@ public class KeyboardSwitcher { this(xml, 0, false, hasVoice); } + @Override public boolean equals(Object other) { return other instanceof KeyboardId && equals((KeyboardId) other); } @@ -150,6 +162,7 @@ public class KeyboardSwitcher { && other.mEnableShiftLock == this.mEnableShiftLock; } + @Override public int hashCode() { return (mXml + 1) * (mKeyboardMode + 1) * (mEnableShiftLock ? 2 : 1) * (mHasVoice ? 4 : 8); @@ -348,4 +361,38 @@ public class KeyboardSwitcher { } return false; } + + public LatinKeyboardView getInputView() { + return mInputView; + } + + public void recreateInputView() { + changeLatinKeyboardView(mLayoutId, true); + } + + private void changeLatinKeyboardView(int newLayout, boolean forceReset) { + if (mLayoutId != newLayout || mInputView == null || forceReset) { + if (LAYOUTS.length <= newLayout) { + newLayout = Integer.valueOf(DEFAULT_LAYOUT_ID); + } + mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater().inflate( + LAYOUTS[newLayout], null); + mInputView.setOnKeyboardActionListener(mInputMethodService); + mLayoutId = newLayout; + } + mInputMethodService.mHandler.post(new Runnable() { + public void run() { + if (mInputView != null) { + mInputMethodService.setInputView(mInputView); + } + mInputMethodService.updateInputViewShown(); + }}); + } + + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (PREF_KEYBOARD_LAYOUT.equals(key)) { + changeLatinKeyboardView( + Integer.valueOf(sharedPreferences.getString(key, DEFAULT_LAYOUT_ID)), false); + } + } } diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index d500853b3..d96ef888a 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -145,7 +145,7 @@ public class LatinIME extends InputMethodService private static final int POS_SETTINGS = 0; private static final int POS_METHOD = 1; - private LatinKeyboardView mInputView; + //private LatinKeyboardView mInputView; private CandidateViewContainer mCandidateViewContainer; private CandidateView mCandidateView; private Suggest mSuggest; @@ -248,8 +248,9 @@ public class LatinIME extends InputMethodService break; case MSG_START_TUTORIAL: if (mTutorial == null) { - if (mInputView.isShown()) { - mTutorial = new Tutorial(LatinIME.this, mInputView); + if (mKeyboardSwitcher.getInputView().isShown()) { + mTutorial = new Tutorial( + LatinIME.this, mKeyboardSwitcher.getInputView()); mTutorial.start(); } else { // Try again soon if the view is not yet showing @@ -394,15 +395,12 @@ public class LatinIME extends InputMethodService @Override public View onCreateInputView() { - mInputView = (LatinKeyboardView) getLayoutInflater().inflate( - R.layout.input, null); - mKeyboardSwitcher.setInputView(mInputView); + mKeyboardSwitcher.recreateInputView(); mKeyboardSwitcher.makeKeyboards(true); - mInputView.setOnKeyboardActionListener(this); mKeyboardSwitcher.setKeyboardMode( KeyboardSwitcher.MODE_TEXT, 0, shouldShowVoiceButton(makeFieldContext(), getCurrentInputEditorInfo())); - return mInputView; + return mKeyboardSwitcher.getInputView(); } @Override @@ -419,8 +417,9 @@ public class LatinIME extends InputMethodService @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); // In landscape mode, this method gets called without the input view being created. - if (mInputView == null) { + if (inputView == null) { return; } @@ -529,7 +528,7 @@ public class LatinIME extends InputMethodService attribute.imeOptions, enableVoiceButton); updateShiftKeyState(attribute); } - mInputView.closing(); + inputView.closing(); mComposing.setLength(0); mPredicting = false; mDeleteCount = 0; @@ -545,7 +544,7 @@ public class LatinIME extends InputMethodService updateCorrectionMode(); - mInputView.setProximityCorrectionEnabled(true); + inputView.setProximityCorrectionEnabled(true); mPredictionOn = mPredictionOn && (mCorrectionMode > 0 || mShowSuggestions); checkTutorial(attribute.privateImeOptions); if (TRACE) Debug.startMethodTracing("/data/trace/latinime"); @@ -563,8 +562,8 @@ public class LatinIME extends InputMethodService mVoiceInput.flushLogs(); mVoiceInput.cancel(); } - if (mInputView != null) { - mInputView.closing(); + if (mKeyboardSwitcher.getInputView() != null) { + mKeyboardSwitcher.getInputView().closing(); } if (mAutoDictionary != null) mAutoDictionary.flushPendingWrites(); } @@ -708,7 +707,8 @@ public class LatinIME extends InputMethodService // TODO: Remove this if we support candidates with hard keyboard if (onEvaluateInputViewShown()) { // Show the candidates view only if input view is showing - super.setCandidatesViewShown(shown && mInputView != null && mInputView.isShown()); + super.setCandidatesViewShown(shown && mKeyboardSwitcher.getInputView() != null + && mKeyboardSwitcher.getInputView().isShown()); } } @@ -724,8 +724,8 @@ public class LatinIME extends InputMethodService public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: - if (event.getRepeatCount() == 0 && mInputView != null) { - if (mInputView.handleBack()) { + if (event.getRepeatCount() == 0 && mKeyboardSwitcher.getInputView() != null) { + if (mKeyboardSwitcher.getInputView().handleBack()) { return true; } else if (mTutorial != null) { mTutorial.close(); @@ -757,8 +757,10 @@ public class LatinIME extends InputMethodService if (mTutorial != null) { return true; } + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); // Enable shift key and DPAD to do selections - if (mInputView != null && mInputView.isShown() && mInputView.isShifted()) { + if (inputView != null && inputView.isShown() + && inputView.isShifted()) { event = new KeyEvent(event.getDownTime(), event.getEventTime(), event.getAction(), event.getKeyCode(), event.getRepeatCount(), event.getDeviceId(), event.getScanCode(), @@ -791,7 +793,7 @@ public class LatinIME extends InputMethodService mKeyboardSwitcher = new KeyboardSwitcher(this, this); } mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher); - if (mInputView != null) { + if (mKeyboardSwitcher.getInputView() != null) { mKeyboardSwitcher.setVoiceMode(mEnableVoice && mEnableVoiceButton, mVoiceOnPrimary); } mKeyboardSwitcher.makeKeyboards(true); @@ -819,9 +821,10 @@ public class LatinIME extends InputMethodService public void updateShiftKeyState(EditorInfo attr) { InputConnection ic = getCurrentInputConnection(); - if (attr != null && mInputView != null && mKeyboardSwitcher.isAlphabetMode() - && ic != null) { - mInputView.setShifted(mCapsLock || getCursorCapsMode(ic, attr) != 0); + if (attr != null && mKeyboardSwitcher.getInputView() != null + && mKeyboardSwitcher.isAlphabetMode() && ic != null) { + mKeyboardSwitcher.getInputView().setShifted( + mCapsLock || getCursorCapsMode(ic, attr) != 0); } } @@ -1070,7 +1073,8 @@ public class LatinIME extends InputMethodService if (mKeyboardSwitcher.isAlphabetMode()) { // Alphabet keyboard checkToggleCapsLock(); - mInputView.setShifted(mCapsLock || !mInputView.isShifted()); + mKeyboardSwitcher.getInputView().setShifted(mCapsLock + || !mKeyboardSwitcher.getInputView().isShifted()); } else { mKeyboardSwitcher.toggleShift(); } @@ -1093,7 +1097,7 @@ public class LatinIME extends InputMethodService mWord.reset(); } } - if (mInputView.isShifted()) { + if (mKeyboardSwitcher.getInputView().isShifted()) { // 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) { @@ -1102,7 +1106,7 @@ public class LatinIME extends InputMethodService primaryCode = new String(keyCodes, 0, 1).toUpperCase().charAt(0); } if (mPredicting) { - if (mInputView.isShifted() && mComposing.length() == 0) { + if (mKeyboardSwitcher.getInputView().isShifted() && mComposing.length() == 0) { mWord.setCapitalized(true); } mComposing.append((char) primaryCode); @@ -1197,12 +1201,12 @@ public class LatinIME extends InputMethodService mVoiceInput.cancel(); } requestHideSelf(0); - mInputView.closing(); + mKeyboardSwitcher.getInputView().closing(); TextEntryState.endSession(); } private void checkToggleCapsLock() { - if (mInputView.getKeyboard().isShifted()) { + if (mKeyboardSwitcher.getInputView().getKeyboard().isShifted()) { toggleCapsLock(); } } @@ -1210,7 +1214,8 @@ public class LatinIME extends InputMethodService private void toggleCapsLock() { mCapsLock = !mCapsLock; if (mKeyboardSwitcher.isAlphabetMode()) { - ((LatinKeyboard) mInputView.getKeyboard()).setShiftLocked(mCapsLock); + ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setShiftLocked( + mCapsLock); } } @@ -1238,8 +1243,8 @@ public class LatinIME extends InputMethodService mHandler.post(new Runnable() { public void run() { mRecognizing = false; - if (mInputView != null) { - setInputView(mInputView); + if (mKeyboardSwitcher.getInputView() != null) { + setInputView(mKeyboardSwitcher.getInputView()); } updateInputViewShown(); }}); @@ -1338,7 +1343,7 @@ public class LatinIME extends InputMethodService Window window = mVoiceWarningDialog.getWindow(); WindowManager.LayoutParams lp = window.getAttributes(); - lp.token = mInputView.getWindowToken(); + lp.token = mKeyboardSwitcher.getInputView().getWindowToken(); lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; window.setAttributes(lp); window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); @@ -1374,7 +1379,8 @@ public class LatinIME extends InputMethodService final List nBest = new ArrayList(); boolean capitalizeFirstWord = preferCapitalization() - || (mKeyboardSwitcher.isAlphabetMode() && mInputView.isShifted()); + || (mKeyboardSwitcher.isAlphabetMode() + && mKeyboardSwitcher.getInputView().isShifted()); for (String c : mVoiceResults.candidates) { if (capitalizeFirstWord) { c = Character.toUpperCase(c.charAt(0)) + c.substring(1, c.length()); @@ -1432,7 +1438,8 @@ public class LatinIME extends InputMethodService private void updateSuggestions() { mSuggestionShouldReplaceCurrentWord = false; - ((LatinKeyboard) mInputView.getKeyboard()).setPreferredLetters(null); + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); + ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null); // Check if we have a suggestion engine attached. if ((mSuggest == null || !isPredictionOn()) && !mVoiceInputHighlighted) { @@ -1444,17 +1451,20 @@ public class LatinIME extends InputMethodService return; } - List stringList = mSuggest.getSuggestions(mInputView, mWord, false); + List stringList = mSuggest.getSuggestions(inputView, + mWord, false); int[] nextLettersFrequencies = mSuggest.getNextLettersFrequencies(); - ((LatinKeyboard) mInputView.getKeyboard()).setPreferredLetters(nextLettersFrequencies); + ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters( + nextLettersFrequencies); boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasMinimalCorrection(); //|| mCorrectionMode == mSuggest.CORRECTION_FULL; CharSequence typedWord = mWord.getTypedWord(); // If we're in basic correct boolean typedWordValid = mSuggest.isValidWord(typedWord) || - (preferCapitalization() && mSuggest.isValidWord(typedWord.toString().toLowerCase())); + (preferCapitalization() + && mSuggest.isValidWord(typedWord.toString().toLowerCase())); if (mCorrectionMode == Suggest.CORRECTION_FULL) { correctionAvailable |= typedWordValid; } @@ -1556,10 +1566,12 @@ public class LatinIME extends InputMethodService } private void pickSuggestion(CharSequence suggestion) { + LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); if (mCapsLock) { suggestion = suggestion.toString().toUpperCase(); } else if (preferCapitalization() - || (mKeyboardSwitcher.isAlphabetMode() && mInputView.isShifted())) { + || (mKeyboardSwitcher.isAlphabetMode() + && inputView.isShifted())) { suggestion = suggestion.toString().toUpperCase().charAt(0) + suggestion.subSequence(1, suggestion.length()).toString(); } @@ -1574,7 +1586,7 @@ public class LatinIME extends InputMethodService } mPredicting = false; mCommittedLength = suggestion.length(); - ((LatinKeyboard) mInputView.getKeyboard()).setPreferredLetters(null); + ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null); setNextSuggestions(); updateShiftKeyState(getCurrentInputEditorInfo()); } @@ -1674,7 +1686,7 @@ public class LatinIME extends InputMethodService ClipboardManager cm = ((ClipboardManager)getSystemService(CLIPBOARD_SERVICE)); CharSequence text = cm.getText(); if (!TextUtils.isEmpty(text)) { - mInputView.startPlaying(text.toString()); + mKeyboardSwitcher.getInputView().startPlaying(text.toString()); } } } @@ -1725,7 +1737,7 @@ public class LatinIME extends InputMethodService public void onRelease(int primaryCode) { // Reset any drag flags in the keyboard - ((LatinKeyboard) mInputView.getKeyboard()).keyReleased(); + ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).keyReleased(); //vibrate(); } @@ -1777,7 +1789,7 @@ public class LatinIME extends InputMethodService // if mAudioManager is null, we don't have the ringer state yet // mAudioManager will be set by updateRingerMode if (mAudioManager == null) { - if (mInputView != null) { + if (mKeyboardSwitcher.getInputView() != null) { updateRingerMode(); } } @@ -1804,8 +1816,9 @@ public class LatinIME extends InputMethodService if (!mVibrateOn) { return; } - if (mInputView != null) { - mInputView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, + if (mKeyboardSwitcher.getInputView() != null) { + mKeyboardSwitcher.getInputView().performHapticFeedback( + HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); } } @@ -1956,7 +1969,7 @@ public class LatinIME extends InputMethodService mOptionsDialog = builder.create(); Window window = mOptionsDialog.getWindow(); WindowManager.LayoutParams lp = window.getAttributes(); - lp.token = mInputView.getWindowToken(); + lp.token = mKeyboardSwitcher.getInputView().getWindowToken(); lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; window.setAttributes(lp); window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); @@ -1966,7 +1979,8 @@ public class LatinIME extends InputMethodService private void changeKeyboardMode() { mKeyboardSwitcher.toggleSymbols(); if (mCapsLock && mKeyboardSwitcher.isAlphabetMode()) { - ((LatinKeyboard) mInputView.getKeyboard()).setShiftLocked(mCapsLock); + ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setShiftLocked( + mCapsLock); } updateShiftKeyState(getCurrentInputEditorInfo()); From a25324fbe1ab6887d0a4d556d5a8ce924f86f7f9 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Mon, 17 May 2010 17:46:14 +0900 Subject: [PATCH 028/159] Change the package name to override the current LatinIME. Change-Id: I9fa0740ddd47cb3a4ee13bc38e82957b7cc07f13 --- java/AndroidManifest.xml | 2 +- tests/Android.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index d33016a94..5f4791d1f 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.google.android.inputmethod.latin"> diff --git a/tests/Android.mk b/tests/Android.mk index fba7a8d74..e72587ddd 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -12,6 +12,6 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := LatinIMETests -LOCAL_INSTRUMENTATION_FOR := LatinIME +LOCAL_INSTRUMENTATION_FOR := LatinIme2Google include $(BUILD_PACKAGE) From 853083627a72825329d347965abc883dbb61e812 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 17 May 2010 18:27:22 +0900 Subject: [PATCH 029/159] Add logging for UI Change-Id: Ib47919be442feb7a0cb22e886a537ef4ff5b8533 --- java/res/xml/prefs.xml | 2 +- .../inputmethod/latin/KeyboardSwitcher.java | 13 ++++----- .../inputmethod/latin/LatinImeLogger.java | 27 ++++++++++++++----- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 7dc9a365e..d6b7486ee 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -59,7 +59,7 @@ android:persistent="true" android:entryValues="@array/keyboard_layout_modes_values" android:entries="@array/keyboard_layout_modes" - android:defaultValue="2" + android:defaultValue="3" /> (); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); sLogEnabled = prefs.getBoolean(PREF_ENABLE_LOG, DEFAULT_LOG_ENABLED); + mThemeId = prefs.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT, + KeyboardSwitcher.DEFAULT_LAYOUT_ID); prefs.registerOnSharedPreferenceChangeListener(this); } @@ -140,9 +144,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addCountEntry(long time) { - mLogBuffer.add( - new LogEntry (time, ID_DELETE_COUNT, - new String[] {String.valueOf(mDeleteCount)})); + mLogBuffer.add(new LogEntry (time, ID_DELETE_COUNT, + new String[] {String.valueOf(mDeleteCount)})); mLogBuffer.add(new LogEntry (time, ID_INPUT_COUNT, new String[] {String.valueOf(mInputCount)})); mLogBuffer.add(new LogEntry (time, ID_WORD_COUNT, @@ -155,6 +158,11 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mActualCharCount = 0; } + private void addThemeIdEntry(long time) { + mLogBuffer.add(new LogEntry (time, ID_THEME_ID, + new String[] {mThemeId})); + } + private void flushPrivacyLogSafely() { long now = System.currentTimeMillis(); Collections.sort(mPrivacyLogBuffer); @@ -176,6 +184,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (mLastTimeActive - mLastTimeCountEntry > MINIMUMCOUNTINTERVAL || (mDeleteCount == 0 && mInputCount == 0)) { addCountEntry(mLastTimeActive); + addThemeIdEntry(mLastTimeActive); } mDeleteCount += (Integer)data; break; @@ -183,6 +192,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (mLastTimeActive - mLastTimeCountEntry > MINIMUMCOUNTINTERVAL || (mDeleteCount == 0 && mInputCount == 0)) { addCountEntry(mLastTimeActive); + addThemeIdEntry(mLastTimeActive); } mInputCount += (Integer)data; break; @@ -223,14 +233,16 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private void commitInternal() { flushPrivacyLogSafely(); - addCountEntry(System.currentTimeMillis()); + long now = System.currentTimeMillis(); + addCountEntry(now); + addThemeIdEntry(now); String s = LogSerializer.createStringFromEntries(mLogBuffer); if (DBG) { Log.d(TAG, "Commit log: " + s); } mDropBox.addText(TAG, s); reset(); - mLastTimeSend = System.currentTimeMillis(); + mLastTimeSend = now; } private synchronized void sendLogToDropBox(int tag, Object s) { @@ -260,6 +272,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } else { sLogEnabled = false; } + } else if (KeyboardSwitcher.PREF_KEYBOARD_LAYOUT.equals(key)) { + mThemeId = sharedPreferences.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT, + KeyboardSwitcher.DEFAULT_LAYOUT_ID); } } From 07865c053076d4b181469bfd9741fa0eacec01ec Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 17 May 2010 19:08:12 +0900 Subject: [PATCH 030/159] Fix not resource found exception Change-Id: Id94ef1ccbeb9a1566c91e0fcc62dfa51dea71909 --- ...background_1.9.png => keyboard_background.9.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename java/res/drawable-hdpi/{keyboard_background_1.9.png => keyboard_background.9.png} (100%) diff --git a/java/res/drawable-hdpi/keyboard_background_1.9.png b/java/res/drawable-hdpi/keyboard_background.9.png similarity index 100% rename from java/res/drawable-hdpi/keyboard_background_1.9.png rename to java/res/drawable-hdpi/keyboard_background.9.png From bfd3b8bf86273770e37499e8bcc0623e11f118cf Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 18 May 2010 11:01:46 +0900 Subject: [PATCH 031/159] Restore the original-package entry to support overwrite-install with the old package name. Change-Id: I1ddbcb3e1b41ef7d0e4017d7de11b600ec645197 --- java/Android.mk | 2 +- java/AndroidManifest.xml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/java/Android.mk b/java/Android.mk index 97c906f26..9b2e47da4 100755 --- a/java/Android.mk +++ b/java/Android.mk @@ -15,7 +15,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := android-common #LOCAL_AAPT_FLAGS := -0 .dict # The following flag is required because we use a different package name -# com.google.android.inputmethod.latin2 in the LatinIME sandbox. +# com.google.android.inputmethod.latin in the LatinIME sandbox. LOCAL_AAPT_FLAGS := --custom-package com.android.inputmethod.latin LOCAL_SDK_VERSION := current diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 5f4791d1f..f87ce013b 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,8 +1,7 @@ - - + From 01303e39f52daf1ccd931a15ca4ffd5a2e507f9c Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 19 May 2010 14:03:00 +0900 Subject: [PATCH 032/159] Commit on finishInput Change-Id: I26254cfdaecd0d85571be3f930476040de935d6c --- java/res/values/strings.xml | 3 + java/res/xml/prefs.xml | 11 +++- .../android/inputmethod/latin/LatinIME.java | 4 ++ .../inputmethod/latin/LatinImeLogger.java | 65 ++++++++++++------- 4 files changed, 60 insertions(+), 23 deletions(-) diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 579375863..a1b4810bf 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -354,4 +354,7 @@ 4 5 + + Debug (Temporary) + diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index d6b7486ee..8b44dd974 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -38,10 +38,11 @@ /> + + + diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index d96ef888a..1933ad8ba 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -554,6 +554,8 @@ public class LatinIME extends InputMethodService public void onFinishInput() { super.onFinishInput(); + LatinImeLogger.commit(); + if (VOICE_INSTALLED && !mConfigurationChanging) { if (mAfterVoiceInput) { mVoiceInput.flushAllTextModificationCounters(); @@ -655,6 +657,8 @@ public class LatinIME extends InputMethodService @Override public void hideWindow() { + LatinImeLogger.commit(); + if (TRACE) Debug.stopMethodTracing(); if (mOptionsDialog != null && mOptionsDialog.isShowing()) { mOptionsDialog.dismiss(); diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 716932497..54778b9ef 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.DropBoxManager; import android.preference.PreferenceManager; +import android.text.TextUtils; import android.text.format.DateUtils; import android.util.Log; @@ -28,7 +29,7 @@ import java.util.Collections; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIMELogs"; - private static final boolean DBG = false; + private static boolean sDBG = false; // DEFAULT_LOG_ENABLED should be false when released to public. private static final boolean DEFAULT_LOG_ENABLED = true; @@ -44,7 +45,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final int ID_ACTUAL_CHAR_COUNT = 6; private static final int ID_THEME_ID = 7; - private static final String PREF_ENABLE_LOG = "enable_log"; + private static final String PREF_ENABLE_LOG = "enable_logging"; + private static final String PREF_DEBUG_MODE = "debug_mode"; public static boolean sLogEnabled = true; private static LatinImeLogger sLatinImeLogger = new LatinImeLogger(); @@ -107,6 +109,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang sLogEnabled = prefs.getBoolean(PREF_ENABLE_LOG, DEFAULT_LOG_ENABLED); mThemeId = prefs.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT, KeyboardSwitcher.DEFAULT_LAYOUT_ID); + sDBG = prefs.getBoolean(PREF_DEBUG_MODE, sDBG); prefs.registerOnSharedPreferenceChangeListener(this); } @@ -126,6 +129,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang * Check if the input string is safe as an entry or not. */ private static boolean checkStringDataSafe(String s) { + if (sDBG) { + Log.d(TAG, "Check String safety: " + s); + } for (int i = 0; i < s.length(); ++i) { if (!Character.isDigit(s.charAt(i))) { return true; @@ -134,15 +140,6 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang return false; } - private static boolean checkStringsDataSafe(String[] strings) { - for(String s: strings) { - if (!checkStringDataSafe(s)) { - return false; - } - } - return true; - } - private void addCountEntry(long time) { mLogBuffer.add(new LogEntry (time, ID_DELETE_COUNT, new String[] {String.valueOf(mDeleteCount)})); @@ -200,12 +197,18 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang case ID_AUTOSUGGESTION: ++mWordCount; String[] dataStrings = (String[]) data; + if (dataStrings.length != 3) { + if (sDBG) { + Log.e(TAG, "The length of string array is invalid."); + } + break; + } mActualCharCount += dataStrings[1].length(); - if (checkStringsDataSafe(dataStrings)) { + if (checkStringDataSafe(dataStrings[0]) && checkStringDataSafe(dataStrings[1])) { mPrivacyLogBuffer.add( new LogEntry (System.currentTimeMillis(), tag, dataStrings)); } else { - if (DBG) { + if (sDBG) { Log.d(TAG, "Skipped to add an entry because data is unsafe."); } } @@ -213,18 +216,24 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang case ID_AUTOSUGGESTIONCANCELED: --mWordCount; dataStrings = (String[]) data; + if (dataStrings.length != 3) { + if (sDBG) { + Log.e(TAG, "The length of string array is invalid."); + } + break; + } mActualCharCount -= dataStrings[1].length(); - if (checkStringsDataSafe(dataStrings)) { + if (checkStringDataSafe(dataStrings[0]) && checkStringDataSafe(dataStrings[1])) { mPrivacyLogBuffer.add( new LogEntry (System.currentTimeMillis(), tag, dataStrings)); } else { - if (DBG) { + if (sDBG) { Log.d(TAG, "Skipped to add an entry because data is unsafe."); } } break; default: - if (DBG) { + if (sDBG) { Log.e(TAG, "Log Tag is not entried."); } break; @@ -237,19 +246,29 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang addCountEntry(now); addThemeIdEntry(now); String s = LogSerializer.createStringFromEntries(mLogBuffer); - if (DBG) { - Log.d(TAG, "Commit log: " + s); + if (!TextUtils.isEmpty(s)) { + if (sDBG) { + Log.d(TAG, "Commit log: " + s); + } + mDropBox.addText(TAG, s); } - mDropBox.addText(TAG, s); reset(); mLastTimeSend = now; } private synchronized void sendLogToDropBox(int tag, Object s) { long now = System.currentTimeMillis(); - if (DBG) { - Log.d(TAG, "SendLog: " + tag + ";" + s + "," - + (now - mLastTimeSend - MINIMUMSENDINTERVAL) ); + if (sDBG) { + String out = ""; + if (s instanceof String[]) { + for (String str: ((String[]) s)) { + out += str + ","; + } + } else if (s instanceof Integer) { + out += (Integer) s; + } + Log.d(TAG, "SendLog: " + tag + ";" + out + ", will be sent after " + + (- (now - mLastTimeSend - MINIMUMSENDINTERVAL) / 1000) + " sec."); } if (now - mLastTimeActive > MINIMUMSENDINTERVAL) { // Send a log before adding an log entry if the last data is too old. @@ -275,6 +294,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } else if (KeyboardSwitcher.PREF_KEYBOARD_LAYOUT.equals(key)) { mThemeId = sharedPreferences.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT, KeyboardSwitcher.DEFAULT_LAYOUT_ID); + } else if (PREF_DEBUG_MODE.equals(key)) { + sDBG = sharedPreferences.getBoolean(PREF_DEBUG_MODE, sDBG); } } From ed5d613e36d1a67b572c08c19147bded916e2f67 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 21 May 2010 01:28:33 +0900 Subject: [PATCH 033/159] Add versionCode and versionName. versionCode needs to be incremented to keep the unbundled LatinIME even after the reboot. Change-Id: I78f2d7400e71dd011d2d086e035aadeb96b16ce0 --- java/AndroidManifest.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index f87ce013b..baa82a127 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,5 +1,7 @@ + package="com.google.android.inputmethod.latin" + android:versionCode="9" + android:versionName="0.1"> From db8dcd8b024202a131f5ebbf2b685972b044dda1 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Thu, 22 Apr 2010 13:25:47 -0700 Subject: [PATCH 034/159] Only use fullscreen mode if the number of inches in height is less than 2.5in --- java/res/values/dimens.xml | 3 +++ .../com/android/inputmethod/latin/LatinIME.java | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 5b2095c0e..f057c16a7 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -23,4 +23,7 @@ 22dip 42dip 4dip + + 2.5in \ No newline at end of file diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 38313c05c..db0a822ed 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -42,6 +42,7 @@ import android.preference.PreferenceManager; import android.speech.SpeechRecognizer; import android.text.ClipboardManager; import android.text.TextUtils; +import android.util.DisplayMetrics; import android.util.Log; import android.util.PrintWriterPrinter; import android.util.Printer; @@ -718,6 +719,19 @@ public class LatinIME extends InputMethodService } } + @Override + public boolean onEvaluateFullscreenMode() { + DisplayMetrics dm = getResources().getDisplayMetrics(); + float displayHeight = dm.heightPixels; + // If the display is more than X inches high, don't go to fullscreen mode + float dimen = getResources().getDimension(R.dimen.max_height_for_fullscreen); + if (displayHeight > dimen) { + return false; + } else { + return super.onEvaluateFullscreenMode(); + } + } + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { From 107d9dd5c01e727eaae62195e94128722fc05afc Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 21 May 2010 14:00:37 +0900 Subject: [PATCH 035/159] Fix the valid length of a logged data Change-Id: I94abccd9585edc42555ab3ffaed35f09cdfadd44 --- .../inputmethod/latin/LatinImeLogger.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 54778b9ef..dcd1962c0 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -141,6 +141,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addCountEntry(long time) { + if (sDBG) { + Log.d(TAG, "Log counts. (4)"); + } mLogBuffer.add(new LogEntry (time, ID_DELETE_COUNT, new String[] {String.valueOf(mDeleteCount)})); mLogBuffer.add(new LogEntry (time, ID_INPUT_COUNT, @@ -153,14 +156,21 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mInputCount = 0; mWordCount = 0; mActualCharCount = 0; + mLastTimeCountEntry = time; } private void addThemeIdEntry(long time) { + if (sDBG) { + Log.d(TAG, "Log theme Id. (1)"); + } mLogBuffer.add(new LogEntry (time, ID_THEME_ID, new String[] {mThemeId})); } private void flushPrivacyLogSafely() { + if (sDBG) { + Log.d(TAG, "Log theme Id. (" + mPrivacyLogBuffer.size() + ")"); + } long now = System.currentTimeMillis(); Collections.sort(mPrivacyLogBuffer); for (LogEntry l: mPrivacyLogBuffer) { @@ -178,7 +188,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private void addData(int tag, Object data) { switch (tag) { case ID_DELETE_COUNT: - if (mLastTimeActive - mLastTimeCountEntry > MINIMUMCOUNTINTERVAL + if (((mLastTimeActive - mLastTimeCountEntry) > MINIMUMCOUNTINTERVAL) || (mDeleteCount == 0 && mInputCount == 0)) { addCountEntry(mLastTimeActive); addThemeIdEntry(mLastTimeActive); @@ -186,7 +196,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mDeleteCount += (Integer)data; break; case ID_INPUT_COUNT: - if (mLastTimeActive - mLastTimeCountEntry > MINIMUMCOUNTINTERVAL + if (((mLastTimeActive - mLastTimeCountEntry) > MINIMUMCOUNTINTERVAL) || (mDeleteCount == 0 && mInputCount == 0)) { addCountEntry(mLastTimeActive); addThemeIdEntry(mLastTimeActive); @@ -197,9 +207,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang case ID_AUTOSUGGESTION: ++mWordCount; String[] dataStrings = (String[]) data; - if (dataStrings.length != 3) { + if (dataStrings.length < 2) { if (sDBG) { - Log.e(TAG, "The length of string array is invalid."); + Log.e(TAG, "The length of logged string array is invalid."); } break; } @@ -216,9 +226,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang case ID_AUTOSUGGESTIONCANCELED: --mWordCount; dataStrings = (String[]) data; - if (dataStrings.length != 3) { + if (dataStrings.length < 2) { if (sDBG) { - Log.e(TAG, "The length of string array is invalid."); + Log.e(TAG, "The length of logged string array is invalid."); } break; } @@ -241,6 +251,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void commitInternal() { + if (sDBG) { + Log.d(TAG, "Commit (" + mLogBuffer.size() + ")"); + } flushPrivacyLogSafely(); long now = System.currentTimeMillis(); addCountEntry(now); From 90599bd1074b9b82e89f9bb080cf45b49df2876c Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Fri, 21 May 2010 17:03:22 -0700 Subject: [PATCH 036/159] Fix bug: 2693836 - Russian keyboard is missing a letter --- java/res/xml-ru/kbd_qwerty.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml index cbb518f24..9773a305f 100755 --- a/java/res/xml-ru/kbd_qwerty.xml +++ b/java/res/xml-ru/kbd_qwerty.xml @@ -70,7 +70,9 @@ - + Date: Wed, 26 May 2010 18:30:31 +0900 Subject: [PATCH 037/159] Add new UI for Gingerbread refering to Heiko's sample Change-Id: I80db4a52f5bbb25c77dfe7df94bdced69debf831 --- java/res/drawable/background_gradient.xml | 22 +++++++++++ java/res/drawable/btn_keyboard_key_ginger.xml | 36 ++++++++++++++++++ .../btn_keyboard_key_normal_ginger.9.png | Bin 0 -> 2116 bytes .../btn_keyboard_key_normal_off_ginger.9.png | Bin 0 -> 2198 bytes .../btn_keyboard_key_normal_on_ginger.9.png | Bin 0 -> 2242 bytes .../drawable/btn_keyboard_normal_metal.9.png | Bin 0 -> 5069 bytes java/res/drawable/btn_led_off.9.png | Bin 0 -> 505 bytes java/res/drawable/btn_led_on.9.png | Bin 0 -> 575 bytes java/res/layout/input7.xml | 33 ++++++++++++++++ java/res/values/colors.xml | 2 + java/res/values/strings.xml | 3 ++ .../inputmethod/latin/KeyboardSwitcher.java | 4 +- .../inputmethod/latin/LatinKeyboard.java | 2 +- 13 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 java/res/drawable/background_gradient.xml create mode 100644 java/res/drawable/btn_keyboard_key_ginger.xml create mode 100644 java/res/drawable/btn_keyboard_key_normal_ginger.9.png create mode 100644 java/res/drawable/btn_keyboard_key_normal_off_ginger.9.png create mode 100644 java/res/drawable/btn_keyboard_key_normal_on_ginger.9.png create mode 100644 java/res/drawable/btn_keyboard_normal_metal.9.png create mode 100644 java/res/drawable/btn_led_off.9.png create mode 100644 java/res/drawable/btn_led_on.9.png create mode 100755 java/res/layout/input7.xml diff --git a/java/res/drawable/background_gradient.xml b/java/res/drawable/background_gradient.xml new file mode 100644 index 000000000..52e2b16be --- /dev/null +++ b/java/res/drawable/background_gradient.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/java/res/drawable/btn_keyboard_key_ginger.xml b/java/res/drawable/btn_keyboard_key_ginger.xml new file mode 100644 index 000000000..7477037b8 --- /dev/null +++ b/java/res/drawable/btn_keyboard_key_ginger.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + diff --git a/java/res/drawable/btn_keyboard_key_normal_ginger.9.png b/java/res/drawable/btn_keyboard_key_normal_ginger.9.png new file mode 100644 index 0000000000000000000000000000000000000000..46747bde613896d0eca646c780a4876aad065759 GIT binary patch literal 2116 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 QxBvhE07*qoM6N<$f{>$7RsaA1 literal 0 HcmV?d00001 diff --git a/java/res/drawable/btn_keyboard_normal_metal.9.png b/java/res/drawable/btn_keyboard_normal_metal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fe0a8a02ab3721f90cf4d64f855d00de9400fb GIT binary patch literal 5069 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable/btn_led_off.9.png b/java/res/drawable/btn_led_off.9.png new file mode 100644 index 0000000000000000000000000000000000000000..68ce7a67a23f6a4d8a0940bbf77ac34e1b618035 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^MnLSs!3HD`yQJkZFfbnQba4!+xb^m$w>MLu#IeH9 zP1g-$c#K+Fc1?-Q%)Me5d&70bfjzFlz870Py*XBHU2WDl|I&IxTlI5`R5HSkSGCxu zx0D<1w=`aCcmI8jjl6yR??VDk9EvR<;=kM^m*|Y1xQpDoT%|Sk=m^x?$eEk^T6eoB ziT}9g$}AJFHu+@on%AcpE(Rz{@Yp5ob<*8wTw2o5wlLrY-)hD5t1S<*u1{z_9DKz^ zY}JXZ4Dq{1k~TUUuGUeR=&@tRqa^ihs*CnaxG~qZaCT>8s^X5N^EP~W!Wq7=AtaFb z=8W1fF(JNo`3+n4H?uG`>ZKh&OJeP(&yfB3YOVJXPqW!u)hBz#ozdd{ zXrpg1|9tY|iy4R9j(h z`!BikX9do;1nW&-z3#Qzv}gOL?YNa8x^|(>DMjYY6X)yqgToC>%vX>rNANINbqtSm cEBBety?I6NQ?BI;V3aa=y85}Sb4q9e0F9c|%m4rY literal 0 HcmV?d00001 diff --git a/java/res/drawable/btn_led_on.9.png b/java/res/drawable/btn_led_on.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fe77abb08e8a87dc6f49872d4fa1214d04b7c5ff GIT binary patch literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^MnLSs!3HD`yQJkZFfg%sx;TbZ+-(zy2%<+%x z$^|E#UJ9^k{c~LC7uRJ|A|NT!*pYF;F@QzYi-*TXf`8)DvnQ4u<7?_!;CRWXsA*Qf9eM=lH0#C<8gGN zqS*4pcYEJ^m8g{T3Vpqm&GBLFh6x)V^uBP}(e}-E@4my^4>{SbE>{kI-D|S)s_L1Q zrvD!Tb*)SIej>-E&nN%R5|^`UY-1h(#kyy0JtzIH`gP~s<@)=hzx#BSP88Z!0yIy+ z{^sU=$J_MR=R`f9wte1Yp?ZgT6~F(BJ?ejPd)myfI$oaEq;EC*M1P(4GbuRpwmR|| z-;A7ly~|g3-=4c=OYV}&wa3k0n}64|U-LZp+1jmMkC%rQnXIzrv(`SuwW3~qP4<_C zRxXPrEB-PuaVRt}KnM>bg%)X0aD&4fov@rD;Pr7yy;c8B=>^8IO2CA{;OXk;vd$@? F2>{eN1i1hJ literal 0 HcmV?d00001 diff --git a/java/res/layout/input7.xml b/java/res/layout/input7.xml new file mode 100755 index 000000000..111d87ba7 --- /dev/null +++ b/java/res/layout/input7.xml @@ -0,0 +1,33 @@ + + + + + diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml index 6eb362bd8..4581cc961 100644 --- a/java/res/values/colors.xml +++ b/java/res/values/colors.xml @@ -26,4 +26,6 @@ #FF808080 #A0000000 #FF000000 + #FFFFFFFF + #FF000000 diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index a1b4810bf..0ba8dc56f 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -336,6 +336,7 @@ Dazzle Blue Ribbon (High Contrast) Dazzle (High Contrast) + Ginger Bread @string/layout_basic @@ -344,6 +345,7 @@ @string/layout_blue_ribbon_high @string/layout_dazzle @string/layout_dazzle_high + @string/layout_gingerbread @@ -353,6 +355,7 @@ 3 4 5 + 6 Debug (Temporary) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 5a271f264..d90261935 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -46,11 +46,11 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public static final int KEYBOARDMODE_IM = R.id.mode_im; public static final int KEYBOARDMODE_WEB = R.id.mode_webentry; - public static final String DEFAULT_LAYOUT_ID = "3"; + public static final String DEFAULT_LAYOUT_ID = "6"; public static final String PREF_KEYBOARD_LAYOUT = "keyboard_layout"; private static final int[] LAYOUTS = new int [] { R.layout.input, R.layout.input2, R.layout.input3, R.layout.input4, R.layout.input5, - R.layout.input6 + R.layout.input6, R.layout.input7 }; private static final int SYMBOLS_MODE_STATE_NONE = 0; diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index ea6b74e1b..c3be252c8 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -677,7 +677,7 @@ public class LatinKeyboard extends Keyboard { mTextPaint = new TextPaint(); int textSize = getTextSizeFromTheme(android.R.style.TextAppearance_Medium, 18); mTextPaint.setTextSize(textSize); - mTextPaint.setColor(0); + mTextPaint.setColor(R.color.latinkeyboard_transparent); mTextPaint.setTextAlign(Align.CENTER); mTextPaint.setAlpha(255); mTextPaint.setAntiAlias(true); From f22d479e48c2cd951f64e4f4a2b1202e7860c240 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 26 May 2010 22:56:13 +0900 Subject: [PATCH 038/159] Log and UI fix - add Log entry for the setting of auto completion - fix the parameter names - reduce the time to commit - copy popup window's resources from framework - change extention window to use the current layout Change-Id: I5f52c41dc8027c28a874ba8f198471eb3c9bdd1e --- java/res/drawable-hdpi/btn_close_normal.png | Bin 0 -> 1884 bytes java/res/drawable-hdpi/btn_close_pressed.png | Bin 0 -> 2737 bytes java/res/drawable-hdpi/btn_close_selected.png | Bin 0 -> 2807 bytes .../keyboard_popup_panel_background.9.png | Bin 0 -> 1443 bytes ...eyboard_popup_panel_trans_background.9.png | Bin 0 -> 1677 bytes java/res/drawable-mdpi/btn_close_normal.png | Bin 0 -> 1259 bytes java/res/drawable-mdpi/btn_close_pressed.png | Bin 0 -> 1726 bytes java/res/drawable-mdpi/btn_close_selected.png | Bin 0 -> 1716 bytes .../keyboard_popup_panel_background.9.png | Bin 0 -> 996 bytes ...eyboard_popup_panel_trans_background.9.png | Bin 0 -> 3734 bytes java/res/drawable/btn_close.xml | 27 ++++++++++ java/res/drawable/keyboard_background_2.jpg | Bin 128041 -> 0 bytes java/res/drawable/keyboard_background_3.jpg | Bin 286941 -> 0 bytes java/res/drawable/keyboard_background_4.jpg | Bin 195645 -> 0 bytes java/res/drawable/keyboard_background_4.png | Bin 0 -> 11964 bytes java/res/drawable/keyboard_background_5.jpg | Bin 3715 -> 0 bytes java/res/drawable/keyboard_background_5.png | Bin 0 -> 12227 bytes java/res/layout/input7.xml | 4 +- java/res/layout/input7_popup.xml | 50 ++++++++++++++++++ .../inputmethod/latin/KeyboardSwitcher.java | 1 + .../inputmethod/latin/LatinImeLogger.java | 40 +++++++++----- .../inputmethod/latin/LatinKeyboardView.java | 9 +++- 22 files changed, 114 insertions(+), 17 deletions(-) create mode 100644 java/res/drawable-hdpi/btn_close_normal.png create mode 100644 java/res/drawable-hdpi/btn_close_pressed.png create mode 100644 java/res/drawable-hdpi/btn_close_selected.png create mode 100644 java/res/drawable-hdpi/keyboard_popup_panel_background.9.png create mode 100644 java/res/drawable-hdpi/keyboard_popup_panel_trans_background.9.png create mode 100644 java/res/drawable-mdpi/btn_close_normal.png create mode 100644 java/res/drawable-mdpi/btn_close_pressed.png create mode 100644 java/res/drawable-mdpi/btn_close_selected.png create mode 100644 java/res/drawable-mdpi/keyboard_popup_panel_background.9.png create mode 100644 java/res/drawable-mdpi/keyboard_popup_panel_trans_background.9.png create mode 100644 java/res/drawable/btn_close.xml delete mode 100644 java/res/drawable/keyboard_background_2.jpg delete mode 100644 java/res/drawable/keyboard_background_3.jpg delete mode 100755 java/res/drawable/keyboard_background_4.jpg create mode 100644 java/res/drawable/keyboard_background_4.png delete mode 100644 java/res/drawable/keyboard_background_5.jpg create mode 100644 java/res/drawable/keyboard_background_5.png create mode 100755 java/res/layout/input7_popup.xml diff --git a/java/res/drawable-hdpi/btn_close_normal.png b/java/res/drawable-hdpi/btn_close_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..38b49f1a392cba9f79efc7b1815883c6a9b183b9 GIT binary patch literal 1884 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/btn_close_selected.png b/java/res/drawable-hdpi/btn_close_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..870c670f72364b0bb8a013590264b677c5218e34 GIT binary patch literal 2807 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/keyboard_popup_panel_trans_background.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_trans_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fd7366e204321ee317e1a55342d23b95f0a09202 GIT binary patch literal 1677 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 ULR7(SfdBvi07*qoM6N<$g69e{_5c6? literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/btn_close_selected.png b/java/res/drawable-mdpi/btn_close_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..f2bf91a2d716935b05298c513c69457691f93293 GIT binary patch literal 1716 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 + + + + + + + + + + diff --git a/java/res/drawable/keyboard_background_2.jpg b/java/res/drawable/keyboard_background_2.jpg deleted file mode 100644 index 400aa27be459ee774d04dae296a58f2b72bbd177..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128041 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�J;~0 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

7du`FWufl_lx9& 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≤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 diff --git a/java/res/drawable/keyboard_background_4.png b/java/res/drawable/keyboard_background_4.png new file mode 100644 index 0000000000000000000000000000000000000000..74fc2e7627753059f4f1143ec60b702b7dabd936 GIT binary patch literal 11964 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable/keyboard_background_5.jpg b/java/res/drawable/keyboard_background_5.jpg deleted file mode 100644 index 2fe7c5fb8f2207419f2d9f0eb8edf4bec73cd94e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3715 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 - + android:popupLayout="@layout/input7_popup" + /> diff --git a/java/res/layout/input7_popup.xml b/java/res/layout/input7_popup.xml new file mode 100755 index 000000000..56e2fbdc6 --- /dev/null +++ b/java/res/layout/input7_popup.xml @@ -0,0 +1,50 @@ + + + + + + + \ No newline at end of file diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index d90261935..c8e226d75 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -378,6 +378,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater().inflate( LAYOUTS[newLayout], null); + mInputView.setExtentionLayoutResId(LAYOUTS[newLayout]); mInputView.setOnKeyboardActionListener(mInputMethodService); mLayoutId = newLayout; } diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index dcd1962c0..747340eea 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -35,18 +35,21 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final long MINIMUMSENDINTERVAL = 300 * DateUtils.SECOND_IN_MILLIS; // 300 sec private static final long MINIMUMCOUNTINTERVAL = 20 * DateUtils.SECOND_IN_MILLIS; // 20 sec + private static final long MINIMUMSENDSIZE = 40; private static final char SEPARATER = ';'; private static final int ID_CLICKSUGGESTION = 0; - private static final int ID_AUTOSUGGESTION = 1; - private static final int ID_AUTOSUGGESTIONCANCELED = 2; + private static final int ID_AUTOSUGGESTIONCANCELLED = 1; + private static final int ID_AUTOSUGGESTION = 2; private static final int ID_INPUT_COUNT = 3; private static final int ID_DELETE_COUNT = 4; private static final int ID_WORD_COUNT = 5; private static final int ID_ACTUAL_CHAR_COUNT = 6; private static final int ID_THEME_ID = 7; + private static final int ID_SETTING_AUTO_COMPLETE = 8; private static final String PREF_ENABLE_LOG = "enable_logging"; private static final String PREF_DEBUG_MODE = "debug_mode"; + private static final String PREF_AUTO_COMPLETE = "auto_complete"; public static boolean sLogEnabled = true; private static LatinImeLogger sLatinImeLogger = new LatinImeLogger(); @@ -132,12 +135,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (sDBG) { Log.d(TAG, "Check String safety: " + s); } - for (int i = 0; i < s.length(); ++i) { - if (!Character.isDigit(s.charAt(i))) { - return true; - } - } - return false; + return !TextUtils.isDigitsOnly(s); } private void addCountEntry(long time) { @@ -167,6 +165,16 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang new String[] {mThemeId})); } + private void addSettingsEntry(long time) { + if (sDBG) { + Log.d(TAG, "Log settings. (1)"); + } + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); + mLogBuffer.add(new LogEntry (time, ID_SETTING_AUTO_COMPLETE, + new String[] {String.valueOf(prefs.getBoolean(PREF_AUTO_COMPLETE, + mContext.getResources().getBoolean(R.bool.enable_autocorrect)))})); + } + private void flushPrivacyLogSafely() { if (sDBG) { Log.d(TAG, "Log theme Id. (" + mPrivacyLogBuffer.size() + ")"); @@ -191,7 +199,6 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (((mLastTimeActive - mLastTimeCountEntry) > MINIMUMCOUNTINTERVAL) || (mDeleteCount == 0 && mInputCount == 0)) { addCountEntry(mLastTimeActive); - addThemeIdEntry(mLastTimeActive); } mDeleteCount += (Integer)data; break; @@ -199,7 +206,6 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (((mLastTimeActive - mLastTimeCountEntry) > MINIMUMCOUNTINTERVAL) || (mDeleteCount == 0 && mInputCount == 0)) { addCountEntry(mLastTimeActive); - addThemeIdEntry(mLastTimeActive); } mInputCount += (Integer)data; break; @@ -223,7 +229,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } break; - case ID_AUTOSUGGESTIONCANCELED: + case ID_AUTOSUGGESTIONCANCELLED: --mWordCount; dataStrings = (String[]) data; if (dataStrings.length < 2) { @@ -258,6 +264,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang long now = System.currentTimeMillis(); addCountEntry(now); addThemeIdEntry(now); + addSettingsEntry(now); String s = LogSerializer.createStringFromEntries(mLogBuffer); if (!TextUtils.isEmpty(s)) { if (sDBG) { @@ -307,6 +314,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } else if (KeyboardSwitcher.PREF_KEYBOARD_LAYOUT.equals(key)) { mThemeId = sharedPreferences.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT, KeyboardSwitcher.DEFAULT_LAYOUT_ID); + addThemeIdEntry(mLastTimeActive); } else if (PREF_DEBUG_MODE.equals(key)) { sDBG = sharedPreferences.getBoolean(PREF_DEBUG_MODE, sDBG); } @@ -318,7 +326,11 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void commit() { if (sLogEnabled) { - sLatinImeLogger.commitInternal(); + if (System.currentTimeMillis() - sLatinImeLogger.mLastTimeActive > MINIMUMCOUNTINTERVAL + || (sLatinImeLogger.mLogBuffer.size() + + sLatinImeLogger.mPrivacyLogBuffer.size() > MINIMUMSENDSIZE)) { + sLatinImeLogger.commitInternal(); + } } } @@ -337,7 +349,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang sLastAutoSuggestBefore = before; sLastAutoSuggestAfter = after; } - sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTIONCANCELED, strings); + sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTION, strings); } } @@ -345,7 +357,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (sLogEnabled) { if (sLastAutoSuggestBefore != null && sLastAutoSuggestAfter != null) { String[] strings = new String[] {sLastAutoSuggestBefore, sLastAutoSuggestAfter}; - sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTION, strings); + sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTIONCANCELLED, strings); } } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index 323f4bf6b..6e3226ae5 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -65,6 +65,8 @@ public class LatinKeyboardView extends KeyboardView { /** The y coordinate of the last row */ private int mLastRowY; + private int mExtensionLayoutResId = 0; + public LatinKeyboardView(Context context, AttributeSet attrs) { super(context, attrs); } @@ -77,6 +79,10 @@ public class LatinKeyboardView extends KeyboardView { mPhoneKeyboard = phoneKeyboard; } + public void setExtentionLayoutResId (int id) { + mExtensionLayoutResId = id; + } + @Override public void setKeyboard(Keyboard k) { super.setKeyboard(k); @@ -294,7 +300,8 @@ public class LatinKeyboardView extends KeyboardView { mExtensionPopup.setBackgroundDrawable(null); LayoutInflater li = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); - mExtension = (LatinKeyboardView) li.inflate(R.layout.input_trans, null); + mExtension = (LatinKeyboardView) li.inflate(mExtensionLayoutResId == 0 ? + R.layout.input_trans : mExtensionLayoutResId, null); mExtension.setExtensionType(true); mExtension.setOnKeyboardActionListener( new ExtensionKeyboardListener(getOnKeyboardActionListener())); From bf336cb4a2a94d305d25f2a8a6ce638364f236c9 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 27 May 2010 21:26:23 +0900 Subject: [PATCH 039/159] Change symbol to use black icons Change-Id: I834efd322b4ef6e99707028d38223d837a3d4e36 --- .../drawable-hdpi/sym_bkeyboard_123_mic.png | Bin 0 -> 2576 bytes .../drawable-hdpi/sym_bkeyboard_delete.png | Bin 0 -> 2314 bytes java/res/drawable-hdpi/sym_bkeyboard_done.png | Bin 0 -> 1588 bytes .../res/drawable-hdpi/sym_bkeyboard_globe.png | Bin 0 -> 2136 bytes java/res/drawable-hdpi/sym_bkeyboard_mic.png | Bin 0 -> 1410 bytes java/res/drawable-hdpi/sym_bkeyboard_num0.png | Bin 0 -> 1903 bytes java/res/drawable-hdpi/sym_bkeyboard_num1.png | Bin 0 -> 792 bytes java/res/drawable-hdpi/sym_bkeyboard_num2.png | Bin 0 -> 3241 bytes java/res/drawable-hdpi/sym_bkeyboard_num3.png | Bin 0 -> 2829 bytes java/res/drawable-hdpi/sym_bkeyboard_num4.png | Bin 0 -> 2638 bytes java/res/drawable-hdpi/sym_bkeyboard_num5.png | Bin 0 -> 2532 bytes java/res/drawable-hdpi/sym_bkeyboard_num6.png | Bin 0 -> 3568 bytes java/res/drawable-hdpi/sym_bkeyboard_num7.png | Bin 0 -> 3687 bytes java/res/drawable-hdpi/sym_bkeyboard_num8.png | Bin 0 -> 2952 bytes java/res/drawable-hdpi/sym_bkeyboard_num9.png | Bin 0 -> 3887 bytes .../drawable-hdpi/sym_bkeyboard_numalt.png | Bin 0 -> 2971 bytes .../drawable-hdpi/sym_bkeyboard_numpound.png | Bin 0 -> 1577 bytes .../drawable-hdpi/sym_bkeyboard_numstar.png | Bin 0 -> 1742 bytes .../drawable-hdpi/sym_bkeyboard_return.png | Bin 0 -> 1111 bytes .../drawable-hdpi/sym_bkeyboard_search.png | Bin 0 -> 1612 bytes .../res/drawable-hdpi/sym_bkeyboard_shift.png | Bin 0 -> 1474 bytes .../sym_bkeyboard_shift_locked.png | Bin 0 -> 1115 bytes .../res/drawable-hdpi/sym_bkeyboard_space.png | Bin 0 -> 358 bytes java/res/drawable-hdpi/sym_bkeyboard_tab.png | Bin 0 -> 1008 bytes .../drawable-hdpi/sym_bkeyboard_tabprev.png | Bin 0 -> 1026 bytes ...eyboard_mic.png => sym_bbkeyboard_mic.png} | Bin .../drawable-mdpi/sym_bkeyboard_123_mic.png | Bin 0 -> 1520 bytes .../drawable-mdpi/sym_bkeyboard_delete.png | Bin 0 -> 800 bytes java/res/drawable-mdpi/sym_bkeyboard_done.png | Bin 0 -> 775 bytes .../res/drawable-mdpi/sym_bkeyboard_globe.png | Bin 0 -> 1303 bytes java/res/drawable-mdpi/sym_bkeyboard_mic.png | Bin 0 -> 838 bytes java/res/drawable-mdpi/sym_bkeyboard_num0.png | Bin 0 -> 1148 bytes java/res/drawable-mdpi/sym_bkeyboard_num1.png | Bin 0 -> 493 bytes java/res/drawable-mdpi/sym_bkeyboard_num2.png | Bin 0 -> 1785 bytes java/res/drawable-mdpi/sym_bkeyboard_num3.png | Bin 0 -> 1675 bytes java/res/drawable-mdpi/sym_bkeyboard_num4.png | Bin 0 -> 1530 bytes java/res/drawable-mdpi/sym_bkeyboard_num5.png | Bin 0 -> 1411 bytes java/res/drawable-mdpi/sym_bkeyboard_num6.png | Bin 0 -> 1943 bytes java/res/drawable-mdpi/sym_bkeyboard_num7.png | Bin 0 -> 2040 bytes java/res/drawable-mdpi/sym_bkeyboard_num8.png | Bin 0 -> 1618 bytes java/res/drawable-mdpi/sym_bkeyboard_num9.png | Bin 0 -> 2167 bytes .../drawable-mdpi/sym_bkeyboard_numalt.png | Bin 0 -> 1670 bytes .../drawable-mdpi/sym_bkeyboard_numpound.png | Bin 0 -> 910 bytes .../drawable-mdpi/sym_bkeyboard_numstar.png | Bin 0 -> 943 bytes .../drawable-mdpi/sym_bkeyboard_return.png | Bin 0 -> 834 bytes .../drawable-mdpi/sym_bkeyboard_search.png | Bin 0 -> 1042 bytes .../res/drawable-mdpi/sym_bkeyboard_shift.png | Bin 0 -> 998 bytes .../sym_bkeyboard_shift_locked.png | Bin 0 -> 787 bytes .../res/drawable-mdpi/sym_bkeyboard_space.png | Bin 0 -> 411 bytes java/res/drawable-mdpi/sym_bkeyboard_tab.png | Bin 0 -> 627 bytes .../drawable-mdpi/sym_bkeyboard_tabprev.png | Bin 0 -> 605 bytes .../inputmethod/latin/KeyboardSwitcher.java | 18 +++++++--- .../inputmethod/latin/LatinKeyboard.java | 31 ++++++++++++++---- 53 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_123_mic.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_delete.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_done.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_globe.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_mic.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_num0.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_num1.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_num2.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_num3.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_num4.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_num5.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_num6.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_num7.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_num8.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_num9.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_numalt.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_numpound.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_numstar.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_return.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_search.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_shift.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_space.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_tab.png create mode 100644 java/res/drawable-hdpi/sym_bkeyboard_tabprev.png rename java/res/drawable-mdpi/{sym_keyboard_mic.png => sym_bbkeyboard_mic.png} (100%) create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_123_mic.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_delete.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_done.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_globe.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_mic.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_num0.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_num1.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_num2.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_num3.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_num4.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_num5.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_num6.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_num7.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_num8.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_num9.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_numalt.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_numpound.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_numstar.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_return.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_search.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_shift.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_shift_locked.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_space.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_tab.png create mode 100644 java/res/drawable-mdpi/sym_bkeyboard_tabprev.png diff --git a/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png b/java/res/drawable-hdpi/sym_bkeyboard_123_mic.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4eff698b2e8ee2edfe92e3b5c31d199f51503e GIT binary patch literal 2576 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_mic.png b/java/res/drawable-hdpi/sym_bkeyboard_mic.png new file mode 100644 index 0000000000000000000000000000000000000000..512f46080022eb99c3af40d970362a783264a78b GIT binary patch literal 1410 zcmV-|1%3L7P)zyT;`=CMM^ z4tRlLKH2E#=q;Iu3{G-oW#tw0y9VR~Zdy=U32A^2CVvuTqkWGqRne^2oS6BBcDTU00mX4E86iS8<16OKmYv1GD z{C@vWJcj{2z|CZNjH9%)^jGxj2VMkPL_JC+P(&&~GtO^MktQ5DIXMR>OGP0IX=Zed z%jJsFSI6w^tY2;-5f?X|C`m;638}KOGA^_-*4Njs(!)5hSY>79FUbfsHa7lD&(Y@R z=dbWORaGNWZZj>=7zwce@Ho&c%-!4D`x$=s@mI01uyD)ibnYd2T{nT(f!<&+_yeym zE-t=}-%kN$BxN+S@*^gT_44xa?|9|-_;`!hnGFpM8*_7WAJo^^FN;Ch+1cA&U0vU- zuC9JWW0kS7vBIULr6+iMb93|8(sPgE?J}0&I>t^~hU;ekV`8)7skl zDG9IZC@*6&7m*VEc4-1mChf4iI^#t*z}Vhr_We`u6nngwXaha23di;qzn+dw`6Tuo$xa}tP62|Hi%2~}E9G0alW*yX ziHQ&_^am$`9rq&-2dIAyXak<4EuKeYoJ5A5_SB)%E;t~^jgVtT#1Xl(vvb4kcArFL z5ZgvL_>&xVj~sYMa`?kk7Z7G-gwQWXL~LKm*ztBs%+Ob4_L!O55VN{Qmp=74B;|4_ z5!K_2P0QI{A!p=%P*7c6{cfsk&(YV{*G}8qLt%ua^W-Y6A@yxL#KBHMLBZcvZ`7E{ zn|x+af0qC+i7gk^+vs&gCFkEJr{0r%E^YTi@{Wtp@2Dhkcwa%>V!Z literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num0.png b/java/res/drawable-hdpi/sym_bkeyboard_num0.png new file mode 100644 index 0000000000000000000000000000000000000000..678a790ded5d6dfccdb79fa5470e371ce893f498 GIT binary patch literal 1903 zcmV-#2ax!QP)DwKc{QIIQAWznQm$s(U!y9iQIBV|o@sVY@!7m1o~vO(&i3fn-Xs8uMX zqC|C7goz@4B?$%s{u|r9*SbR=4`T)+rA+d!bTp&!edC$)?z^9NM@pqqdxZQyA_?*Z z`GR~Qf_y=~5JA2mUx*-IkT2xLlP__Q1qUaY^XxZ~q!;>fyWOz1B40z$0`veKK_b#u z32{Jzt|bNeJ0o8r(vfH*zznd^F^?t#$&LX+fFK>CG#SZED?yOIHTg2}XzBR?J76!M z==SZ~N5;m+4$jTZ6_%8gEV|w9$DN&>f5UHn!gHF47)_2Kf2#-NpaGZw`v6A(ZC9>b z`OapuJtu2khoYjQ`Kwp2egk^%0S*I-0YJC;OEUFXP;~b3eei z7C;3cpSS)T$d`z0TuC;7oq*41px>mIh5S5n8*ksabLVr7Mw8?THk-{cr_(u~pPwJ) zf75EUs{;cApTPKffP?P06Y{m>0{7B{)&gn(<+Qpox;HhFj}~O6mppa!=+Pmb+=_~d zd7sbs1^oWmUjmF5#%uFW*UmI(gIgpR> zXFsmQ+S=Ot@_!sVb`0IyTeM2^)JndFE2uENG~c>)t3DhKn^=;Hi;I^oUApuuoK6BB z1ExAUI{qjtE1PHaB9VvzTvk2R1O~cqt|C8^1t!%XUj)}@qPj!JRoto)4VT}ii>lGl z(Q00?va)gp4vT;VCa+&`xm=HV-I0-zS~!@fAX7>{TiEGo;!HG&);thd(Evg2eS>a9rDqN3#h6_;;lsT0WkbE^1%h6UKx$E(Ig<20Lw&rOih+AFMDk~9@q1V zcDp^mZJwpi3knK?ye^DqiI)_TpSE&xmn+e0*&+4i67I+uPeO#$vH3 z3LIk)Yoce)ocX?|r{`zJ`c-53YZCy$)|e?VVUF^760)KQuSnxH+YGkp;0h_M%j@;F zXH$Ii=#d@4UvFq=_z4a}H1WIM?`w8?18@f^1y-$it0|dG=4`DncGvs)Y?d$Q>KpuJ zB9YK=jg|EI^78VARRRHVmCOH?2)eOIQ&ZD#z~R>xi^YrrE6WV$*1LD_y2r-Gicqn! zvGJdlmX<$Zg#|(+fj}Sx`Ts*^TRWvD^5w2n0<3uh`70|c7S4~S;{y<2;B|4Efr$@F zNJx^84qm%6cd9f2JeG|gM;NV`Bha_(>HG1=!4T4N_hj6@hsDpw(7{2gJ`_4 zuyB!A1Piw^8H}73>imAcJwtF_%GOlLV)OmQNcG)I;#|D zGxieHKz{lKprD%O6=!E>_fh_>XNnpl)C48GZfR-hQzk72mi)^yfs+xeCk_#2L+wJ2Or>3ULm>hf!KA*3G*R8Iuo+RHJS4jRkx3}lN zzHp3)4YK58YDw-T!u-#6UEQuCKPmTQFI>3r5Q649zYiAfxOeZ~8(8pQ!HY!>ZX-a- zSH|BI_k73|#I`~HX0aemH0JU0MToCqHTia>0T*8;1XZiQzP^5RXlUpiR{8q%>t|bA zTm3|=sjI826EYKt+lH8KYisinIXf+MQe@qW$B!THbvm8D&--{bN8<#M^6X7aP$-QC#FeHTzd-6lyiQ(izD5iD~Y#(9XO0>059+K9>< z=&uKZ!4D1{I^i{`_EbbMpl5BvYehWwR1L(??UU@`t)xeJ+?sd+Zk4TW4E?DI!_^TrfaIkz8Sl z&joWNe?xnx3-W~s@&)-q6v)2<3;-<9{-f0=)gu4^002ovPDHLkV1oFfkDvem literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num1.png b/java/res/drawable-hdpi/sym_bkeyboard_num1.png new file mode 100644 index 0000000000000000000000000000000000000000..4e68e35b353a9279a835b5ba6d2d3f32f9e08077 GIT binary patch literal 792 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 bj{pMz=XRrFDd<8s00000NkvXXu0mjfw6-Mm literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num3.png b/java/res/drawable-hdpi/sym_bkeyboard_num3.png new file mode 100644 index 0000000000000000000000000000000000000000..57f9a8d8ebe93657ad2c8c514d8ceffeae6dde1f GIT binary patch literal 2829 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%0AQQr(ouI!PFtX(#F2uwg@;dNEK`rPS9?B=~HA|S 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num7.png b/java/res/drawable-hdpi/sym_bkeyboard_num7.png new file mode 100644 index 0000000000000000000000000000000000000000..fff6f27bfb23d3767ef3323209256a280c64ae00 GIT binary patch literal 3687 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 FV1h7%Dslh- literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_num8.png b/java/res/drawable-hdpi/sym_bkeyboard_num8.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc1a955ee5b2d91039f5af5292acbeb7971e45f GIT binary patch literal 2952 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 Rg0cVr002ovPDHLkV1h%v+3)}W literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numpound.png b/java/res/drawable-hdpi/sym_bkeyboard_numpound.png new file mode 100644 index 0000000000000000000000000000000000000000..0a46122b2ba72f4b100efdd11c8add1eb8bc4de0 GIT binary patch literal 1577 zcmV+^2G;qBP);?5JgeJ+yB#)oB~chC!aS? zJ|~|yPCh4}H%>k$pEpkaThY{M@;LLN*mLUx@7R08|ZBPai!O$E>ZbO-@S zjRIoWM~nAVNcIhav^XdK{!vc|H3BjLW;~AoE&*ZelL5#A=#lIzyq}P*6t4OAAfH5Z z=Gxj?nNq1-5d>kmu&{6v$u=PIxwW;m&*9z+z%RqY!!0;r%m$b`O(cg%N~Xu-X%a(b3Tpye@FJ^RUP#u)DkKq!;`8`u34j@;~UOr>9-`^zggQU zsf2VBzP8WK&b~)GHa0e%6T)S(nR{?>AnCnMr;BxTbP$4VNH`hy9IaoTV6US(0%4V`ezEW1hp&s9aw$pfYbo7LD zvREuvb#-;uvRuHhyu9q7gVfj8ALBR_f-K8ruCC7#`8p)qg1Vmr$lu!9a$R0tO0rT` zRu)8mpTvl^?C?xJv*x1;I(P;Gj@LwiBY`5EA%+1YBVzL!ujeJ%- zz7~)Nr~${a_gMbk;c)x_W4ZuV%p+LJYnbx+(s#0t>G5GBW>V`}D=CX;Ghc(g_XGbV zBYg&NXJ=;<=c9nEHwfon1HJ%!4j3C58TpY8;C8#eg=<5Ar}+L4U_bbhHE++N<|j~> zukf5~mincorFS4{GGHZB?%zq!#1|G8?)HPWwzd^G_y8xk$wtw#MsQ-2ocw?G_mm*A z`C5pFryVLPDz@O@$8422Bje`gCdq&mX0tie+}up=A7XYJlKJ`stJ1>~`IICj%0$fT z^%l#@$iJd>d`%|F=kuu`vy~>NsHkWc?@?x1|)cn-XBz^a~v$InqMTlA*8yFZ^ zM+uSidunQ`oPL>JQc|*m+I}M|ODH(`52*9_{r*yNVzpZLa&mG47}3(In4h1&%WPdP z*9z_zHwuQovt_-ub4R?#;~|BzIf#07d3pIV)@*2|dMyaTk<;n?p1h&IzkeR(CauU9 z82l+HsoUtW)L_B@xkXu_T23}xGaf~}9+IsLkw^Z+Y$tu*l0KIiQ~dp0COucnoYF1J z301m~FSngHDRLyrUdL0j<8&gPW%9*;q1_2Znm7LA2u?mHpEpiEC!aS?J|~|yPX621 b{uE#US~VAG)0yuL00000NkvXXu0mjf=4k^% literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_numstar.png b/java/res/drawable-hdpi/sym_bkeyboard_numstar.png new file mode 100644 index 0000000000000000000000000000000000000000..ca22bd53509a2feddcc2a22fa872c14f249e7174 GIT binary patch literal 1742 zcmV;<1~K`GP)347+aJLCM)6}3N0;kzeCQ=ZU{OdS^B2;B)`y}-gjw#@7#0G`Ms+}qfv{p z*qBvOpvYI`D^uhv@|7v_75T~(`HFmHiu^~y;!XO!Gzr3@5*8XSUl*NsjUs;$#MAeR z19XYZFfao|<`Js#3Krw(@2oU-hTkjlA2JmZiB7=5uZhG-MwH*nGm6g@n-rl|r@0at< zGw;4elCp`Q0S1uP*x0z+;c)orE2gKX55Tt#cotX==sY$aNCdKg%_SuzU($5 z6}9j^4LAX-$$sY?%o-J1RaMm}NSsSABO@bg4jnr58b|*!z{U};^J+-x=;$cy?d^Sq z#z!I%yU*vlZTf1?gb_hey%H#BXlSSx`P$`j-MxJI@;>qdselXc06D?Z7j@6ToU<3s%V&VoY*!vVU-J z@Gbb)0xP5xrO01I-lyn(?!tu&hix`nh=|oRZKkcQtq%Sdcm_F0x#~`wd-3!ZbnANZ}3$CyMevy*RTIcd{$6U&<9@`uZ$!! zN4;6dw=&s8lnthAsIsrG z?@7848|(C~TeoPO1*vDazrVi&FNc7?fO{-QSh(AzJtF{6`FV#s-|1M(4zZROG$z`O zN~R_d2&^^?!xjg_<~kRd^cowk4SqXZy0}mfKldYGWo2bAg+ig=G;9VYKAVN1?vDh6 z!BAmg;WyZ@&+&~3KknL&h;BQ|!_A|kqrRm~a_Q2gmApD0XsM~GKjTjqr@NS^9W!)* zl=o&3p#ORPqgBAE#uOr3ya|Y>+&fuYTYDVbq@j~_>bh>z*znpwCF4#=NbsCLe|~Li zYisWON%rj7Ggw(!*^jj4pPHJw8xDskU_E z@DAQsoxB0ZOZx$B!s$0}-dvNLoBN*M?{{(v3BpHJlEvwChEQgM21Cabu!v-1NKJ>m&gw7I#t9sc*v zoH_HU>_^k}u_P_Hq^2rPnqN~L?t^cJ&bqyi6icL&Uj)G@7fC{R6DS8>FE20uUVN68 zmiEWwu<*KgXeVZ#qny6GW(pB2mHESN20O@G^t9Xq}gV^J0La_)ahJxo~~ z`IK@p8X6k*k$z8PBKpU!UcLIZ^c2hBbYkNbuojij?v#|28H4`=k4Wcos7xL6cs$pS9Xr-!wOS*FVT=cZ!D-W!l>f8S z3zVy~k>e}!^77g^e`j!-kt-Pa1Oug*+^t);9zT8h^iEDkD|kLrrkz-Kxc3v<4DNdE z+z5uaITD@e>;l(_@j9oT5Rac;;FOy>v35U^jfoSd)HEr@%r2n8i)*I%x;XZWV}dgl zlb+W!<8i@RiBJ*Q|90F@Rw^~=rdTZMpzM-XKy(S$n3`-e>iLhYDe@KhihN~?d_}%8 kMZO|mnIiwuv%dux0N#8ijHTuha{vGU07*qoM6N<$f~G=Oa{vGU literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_return.png b/java/res/drawable-hdpi/sym_bkeyboard_return.png new file mode 100644 index 0000000000000000000000000000000000000000..426e1599ee26dcb27c8129fbea70f6df334d0746 GIT binary patch literal 1111 zcmV-d1gQIoP)b`DT0 zwl7tM+I?**l{%W+u)4ZxLG?UXHXDOe;tgJd22X6@4>5R9*FvtAjAd0IxebX#LWlFK z%R&rEY0x%~purPk|4xh@+LHy6%V)T1k#>3FSQaUwI;O6!t_Lj3ey~_9Pa}~?6MW-n zHX^%7bRG;q3pfe5Y_r*X*~UIPI_iS&O#rrl_3Hqa3GJa>Z>o)z{Z|cV=ehnut1)HCWL5G{xK`KItJ|odCykY==8k ztJ4@pHsvJ7lOpci;B-3g1cSlBd;@Ag;7vC23yGBUAOq;xu6G#m~)FlMrH5jzAh zx3sh@?G>^9{{9!RhqC}ZCI(fP-R}^q)w(b_Ir)s3Es6UyE}xbdG1h2%dwZaqgftpW za%gDC6AFdy!Ot)Ff=*Knu0-cyG#WpF>b(NbJBaGnfOgK%=CKUrE0}lpb?EMI`+U9| zVuOZTo#Tikd44w-@6t}_rk^)xuvX002ovPDHLkV1lx1|FQr8 literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_search.png b/java/res/drawable-hdpi/sym_bkeyboard_search.png new file mode 100644 index 0000000000000000000000000000000000000000..1b6f884fa39a191cf08aca04df2bae8d77bb08de GIT binary patch literal 1612 zcmV-S2DABzP)-s{8k1Z^_wzkDrk(NfpYK4LdS}arx^-rvIRiveCi?;itR4i0WUw`~pQ0VH? zVuhkuUnpz+;i|>@enj2$oN@+kheVCZCRxeAhvPkW&fM=l&iU@0a5kGwauF}7f#S?QtN+5driS$RL36e*`!H>@heZ!Zu$dhNKh# z6+jCJ85|rm^z`&xpPikJvs$fKE>S2HyGEmNy1cynZgzI|eJEN3tOIrd)<;4PCDl10 z1*ia#fV8%@ws#E%!xS~rA!1@;X0R?kL(i(nm&BcLg_If)J3l}FVp3Alucr|b1E0ZX z(FggGdYc$Wy&O9*Fz{+*WaNEEjhD;ihX_Y@d=`BWITiW#8ZiYRVrgk9J32agUfftH z`>U?5?vt6Bnb)A+^9a1hGPK#LKaal9C;9dYF`O<>08%nDGk<0q$n*SBUS8f0+uPeO zfc+{U8W2vv`>SZn&(Hr6>$1kd-|iYUXV+FRAQ`TEY>%7G=3XKdN)6-eL|=|pj%62mESX=`iirc$Zg5gMe^>DE?OR&v1><%pCWa?$WiUT|>mmf#0{g6|vn z4tGpPXS5#!n=5?lVGt}K4g8MPbhzm z-obe~L8DN87G%*kY@;A_ua1q4y$&`bKqIIQQU1a*E!G(t8YQv=8(NX0 z9=%dqTiYg9>Zl}Om;5EF3aFC>NF`*guCC^nmX?0Sstp14_4VIDotFUykYf;E8}hf)i^=A{pD#((;Z> zCbK#s7Z@103+wTHsGCH}L~$B9w-a+x&hfN<;u{+qEhmvfTUAxn$0Pvs)L}kLOqjwr z#gZBt8gAJOJnW&5*=)Xz!HVRaZxR!c!%;}Csj2zsByu=%i;IgHv|fFhm_SZW>nEkM zvhuc6Dt&knh>6LiLVD=5N3N)-=nmMQc^syqy`+y?F%|OL7c8m5!osgfREL}vJX}rC zcnPs~ruPmH<#6<`3zwR7fLeJ+#$0000< KMNUMnLSTZ*I|x|- literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_shift.png b/java/res/drawable-hdpi/sym_bkeyboard_shift.png new file mode 100644 index 0000000000000000000000000000000000000000..5a22dd30970f4bd04822e15ad7721ac16df176d5 GIT binary patch literal 1474 zcmV;z1wHzSP)TYtC9r#%8xifRW@6MSyXXdUV7!1ao#-fZl zr6npXDl952D(px_{Q_SgK><*F3GnZU7Dj^fKrEmIynq|niln$>yP`s&2nik`5@j10 z7`S4$+kcpunQ`FS0_gaDWC~>-$H4*pDgZt3>fGGi?SzDcIWniEr9FbJ07wFKTrVcv zh=?#It7Gy7nVFe?u-omRu&}Tn_N%~oKpP2hVHd_EwM_adi6FCDt@c(`RsAN2tE{a2 z9``Q;RzMwYabXq4|GLaXAG&D4{!}d-|Nyz|RV-5!D>+8RQ?Gj+-cCrQ>jg5`n=U2V*k1`p7zl?bB9XkfxOj`m5lNLwd#9T3EY7jrE;JNtK`kD8jAZ^SR=MF|t$Ha#?_wzl?L zfe_D=8{%~7f6}?Vw2M~Cq@<(;!IfKDT0Uo2HXS7l97PyCqAXSu- zAClhL+4-?fr`zNe&@(hN^d0OU0JLo10&eg^kii19q7gdJ!J6XRO|DPv?hOtOK0x61 zQNQu=@k^tlqi@5WDy*!L5Vn`t4i69CHJi;(#ffbw;LSfpo7Z{ds1NhV$VkCq+7c*` z&(6-?l)6$%j#uO3;~999PYz4WXf!Ufdz!hAa}yI2cMjX0keZtMQ0k~j-a)suwIyd| zW&L8YSd4nTUZ+Ia+qI&=J#{XZ>q2jD?{&e(J7*!5so-ilai7=${22%YTz(YM!m?95 z9*@`Qbh^vS%X9ks`$r;mG~ff_NBDirTYc5OT`*nSdU|?_1YwHZt@K&I%J(hMZWMRg z)z$R?8&K+V4cOlQOg>6j2mFx|=I4iaLTu})KOf%kGw~?mCxt~hNhIc7vbfRK*48q9 z{sxwwa}E+@vHnO23yQ?~#b+MkREdPc72SeuWo5;PI`M zudlnLG;+J$E_OND9>0;xcq=L@9>d)}MM$t{wOW0s%3iN`b9Hrf1?kk16gPWWC&9s# zloW4pceD2LKE6fZ%p)GzLZOs6MfExN4BLTDBt}dFH#{Sy0oT{a-4&JC6>B9;^xgVO zxeNPG8567Eq6+@@c;J{4bEu=-J8UIFOv#?RL$Ul^8r1AmC1=b8BWEKqNF**^?h=8MUTVb_^Yw8@qMIJ2HLZQs)(%Kv$nS8r24#L z2wPD^;4epN-dM)*S4-6abptHO&7W}nau%i#x%pu}#Rf(5D=24SvMA9%utbGLg++xO csr)Oz08I+^|Dt*_O#lD@07*qoM6N<$f?sgP(EtDd literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png b/java/res/drawable-hdpi/sym_bkeyboard_shift_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..5664491267bfe10b0660f1b0b0474b99cc174e0d GIT binary patch literal 1115 zcmV-h1f=_kP)xl&P!d!$alsfC!a`h#izYZQnK0-?oE=CQG%>Kq1i^tsBa18=1_#8DFlZt~ zqEzS~dbFJ1pZtzAL`YxzPET_$`Q+NWcklf^cdz&UToql{Oa8~?DEUv5EoO_^VzyX8 zN&SNtkWc{iFInFH(_$p#0cF4iG>`-vX37=a6ct6;6TU+vRW&g&akj3m?%DkOd>G#Y zz|F_aNi^~(hJDIafCn63TwJ_fQ&Y1@yF;PSJM3!(M}V92mB_{vF%H(v!M8>tk++)^&i*Q*Ds@-qcXYy8B!F)vE}9EYZP1|QU)z8Ew52l3piYCH&CpUi-Wij zjYi)TBW2Lh(eWJRodZ>%v{1QXq)NH+a}U1j{t*=rsdt|Yz3w4Tb_#1;M_ zQs~CU#y4y}gO%R|t+Q-~k-nIt=g4Jp*F18kEhLVnm=qC9rBZYu))^@aJhImnDX7i0 zwY7xENy%i=XkwOKexoL%b#`{np@Y4LE+K%)q-U?pnx>^zS69DBB9Rr5X7;yMg7wNJS|f4u?PW_xInzkm>-<+4dRL zr(>~LobvOGL0VEw_{)*XuVlUa*3!98-Yg3x`4w))%3?}RGtcK$te*4x(yc6JKkjWY hTg(>wchgS+1_0s_B03J8U}fi7AzZCsS=07#KM`T^vIyZoQf1$aPpjz;*J32j_ehR?98C{`PEDm)>1Z zg|LIIEH0}vZhx@jVdk{hS6C8bA(h;woh7BGb%24H#{eJkhG~}Z0rBiZ)ywbB`u6X| zgddB3Xd0N$*s`ti{gO3%_gwEi*!6h%ftY1xnoo`YteCRvx8v5o;ikpbVWEF6*=}Q* z$)(zS>BYt*`Q!7AvSM6}Za#jX*=H}#Rw5Z~?6op1JLTvq|D!YV4!Y%ON*>ALPc#4g z_`dX)iw`~YC;EN8Aadj0!aH5NTINTGBtM!s!@|_#BeV9@s|$h?o@<}o{(hSKyQx`E iBIOerOs_^aFfwr6bvj~Sc{Ldra15TVelF{r5}E+NRg;GR literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/sym_bkeyboard_tab.png b/java/res/drawable-hdpi/sym_bkeyboard_tab.png new file mode 100644 index 0000000000000000000000000000000000000000..3466e127101007166179df2ea81967b68ccd10ee GIT binary patch literal 1008 zcmV9C|8f55XR!;-T$Pi-C%V2)&CvNv}nE)LcSoOTh@0wx_0eC`Ay|vv?4p6)Z^6 zek5IOn$7xNcq7vw&4z9_5i{^7yP3`GZ{NK6&+LR*mL)Y)k)pB8Rnx^rHsUnA4Ks<*u0+BpW;KN60(-0t;IF!nb zp%A3pGDcU8kvv8cMv6uLWHkba2@Wg^o&ubf2~g!m04Zd2Dz#^l`yK++QN2)30O3@i z4-XID2nK`N{QUe|I5$9fbYg^ZGpRXHAQTE+%x1IcR4R2B&SRkS=*$#3MRen{p6#&> zJraooP195}narbNv3O}_X6A(ea!AK@0r3P?1j#mj9|pApP=rREJUcs^+}qphSX^9u zM(ylUo+);L7#(}b&UI?QTLa2N-EslCEGkwkEiK*b@9z()g>>4?=Eg*$J zu;Fv`FN29%jG6JJ3GH)TV*JAfGiF~k@^YRCR1Z40P#_lFBA&# z>dHhS@osf>^$Co!Eowhp50FU)c0@pSeF#UTyuZJ{BUV82zFJ;hehP=!{X1kMZFYe~ zD3hS<8f&H7cA?O+qnu18vvYHE&k5!mO}1fb`^={f?1}^6$%Dm|Mn^}drl+TK)aBbW z$uc`IP5@c_{R+BlYh+~P0l*xa?Wx|w7jA9=8IUiz>h%!TVHd(kw|yTcfDqspK``N6 zy&)?`OLz@#iZ!)(V@LLvTkmDf0>pEz1f}9fWwrFIhapONAE*eu9qe*uVHm*>KC~8!S zeNG=U<9ExsWSl^m+B&VFH~BJ;-gbU-?m6e4dn>4_YH6h=T3W2Nf!aWApd$xl)0_(= zk;KjwNYxxwvw_&PgJgxuPzfqP@_s;qAk+n*pDAp*;d4S>$OqX8BugNY**?Tx)ddAY zq0m#j`P=U9?uWQOPWMH#fkYZAugm3Pma=#}9+$>iLNkEa5W1{r?1t0nbkH!`ngO&2 zg;oIq7l#y&Y#wUq#8_(+D35U8QYkN~%>WW9aq`U0v$+C5r5-5TU&7ca`t0-@WlEyO zdZ!p$jYDK52p`EiIy!n$lBE3n{Cu21WV4*wN{Q1Coq$eHOibK}#bRNkiBO{wsI3NY zKIt-;(Ae16_1W3kTksh%7z{E<5A^GwMwzfXm9su>y4As8Mn*>NEG#Tsxp;YF2*^njYydjh*VlJzsv-QMsZVRQ}L|b2Pj^pd^&ptG8HzL~=uC zpsPJSJqh+90AAwy=ElaxcxPwlx+bLSmc!vlPft(Z#_xw9A7o`5q5%uphlYm60d=mC zQ$(>?^u^=xOBB7Lp|Drb*!aSMBe2lBMgj!_fsX?N1FvgxYIV2Z&3AQm?X0YIZRicdhP*D?Q5|6M$hm0&#ptsp_yWQ){%gc|4hlgKj`=wGT7Aao|XtRnw zL7$;-WSz8rMPmf0Ou2$VeStnKE-pU792P~IstnBz8V=jkCx!cmDFfx9l74w*bm~yZ z%o3kK=jP^~A#^t*k;oKy(t2MoW44#cAyWjH4~N6CTrRhc5YA9?E7iNYtp!Ncm^V!p zOGl&8=VY0p*+BZaNTDJ8qhf3ZkVW_4mZ+&42GCxY)eFRYql{K5)MZ&#D1ww`0P%-Q z0I2{K3I#srl+D;Z+Yg8VWU;Ja5EdjosZj~f@LEf=rN)c-{dUkYlyhV=xAYVO;N^jK wkFj`=g&O^DlGZ{ku?s7-|1bOBfPM=w0I|fwgfS3Df&c&j07*qoM6N<$f_ppV)Bpeg literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_keyboard_mic.png b/java/res/drawable-mdpi/sym_bbkeyboard_mic.png similarity index 100% rename from java/res/drawable-mdpi/sym_keyboard_mic.png rename to java/res/drawable-mdpi/sym_bbkeyboard_mic.png diff --git a/java/res/drawable-mdpi/sym_bkeyboard_123_mic.png b/java/res/drawable-mdpi/sym_bkeyboard_123_mic.png new file mode 100644 index 0000000000000000000000000000000000000000..0749b5fc64a5ea60e92536000f36501b3be65f33 GIT binary patch literal 1520 zcmV#Mk~=a%J?KyQ7TphEh1=ZEyb5M4+?_fgT4eLsS8>yA}(!RP^47aYU_(8Mg+II zAn91OYD`*f(~09UPQN2(!q1?SF=^A1&V`Tr|L30n-gEB#?m1^hq}S`MUd3i@^@=u& zV;09Oj#(VDIQGAA%;qGaNF;jch8PtJwBZs!3Y=rv9-svdfTQPf>|bsoc18wxb5HFz zV1s*dQ2)%G`Ws*khyfc0y^D-=L}ut%@t7x|ijIyRV+Zu~Ofnv`d6rG)7){1V0cXG! za0F}x&e#L)KmefRUe0o{;CnZ~54gyB3ZB!}$U)M*oR^o^XmH8^lF=CJn6%r*45~T+ zZcGV!{~g!@{se3RccM&hZ*S=A?5v-wtLt`QVc|GrzW|SbL%<18OioTJ`}_ODY2wn- z(mPBo!Va)6So8e$_Vxv1V_0_HtSe-~Ya2eHa2T8u8X7u7>hbaMUqE&Va3WeXHa4dD z`uffbcQ!CEaA{&<;%$uk1G2upzH0#i0e4P0fhfR*8DPcpzLAlU@q@8G$!Lsqo|}qx zKwwW#&$|kRV#6?bN=nMtY>W)>iHeG9Cb?3n{D~H(6Qg&PN;QP>*8ne~pP!%KsK3Ae z0_j9VL_FPy?(Xh9nuj-1%(PaSa7@KI;#2OZNh(rgk_-$CcxGi~eX_s5Zx81-*Vos* zY|#WESc{XnnVp?|zpbr}j19=o&);imYI+m8L>oH}&5u`BRz5`U36R_yDW!}in4X^Y zO;1l3b9lF9%Db2#nJep1*xwaU*sKIiJETiWN_v2uZ|&^tycHK0w?G3&XskoM2H1pC zE$G#B_tw_doM})dlRe_a_gIg@^kaGlHN8kjDwS%>%gZNN@A$qZBqV&)-rj!wG_N{3 zI<7n>-dDlt*xz>hlhuc^~%c1TIqYv zIkbWLu&}Tj8ja@a^78UU&~X6)v|6pSprD{7IXQWp9Xm8)!tqH>O-+SV zRaM3Et`iN#OkJz7v9S=G%Fo6Ik!)^m&JZo7yrE}yOwT(>96rQB9i8wkIpu@JVz6ih z-ND4f#JlzN^YKHdRmIU2X5OLzL=L5hkKHN4Mn8GxljBeB^51rDK<8?ohGNA6Ex+L5K!tz zV*?Ce1C&KYMeiU>XoO?f`CZWPQ;c8Za*K?Va5)wOypL+8o^mLGo=L`Ia@IZ7Zjl-P zD@wQ|a^uTQ-2RnmKonCj%^U=G^9cuzO{N%)`BYa|NAK+H$S7qXYL4>wCYNc3d~_U) zP?qIyZEeLMDo1kQnDp@QxK~qC)5vAm6H^twIgVNL9XQ94OUK3@vD}Wwg!k1Dbawe! z!p=Fco{kOEu+E{tNQ!nIs8l{jPK*^Ag3@htb#*n1YgMhu-##ztpI{NgS`eaj0%{sF z#F48McYe0w)I$N|0Y4x77aTk5-xZP*m~hBU*)``^w8-+`y~Qz$V;09OjtSad0t^5` Wi?!l27&M3g0000=hT|3J+u7g0#) zIF3_e-$VC>m7&e(VDt`r@V$HQx%Yd{efPX4*KW7RM#*GjBW98yNsuIH*v9uUhGW8c zhK#js)~En}1#9egy&pleupCSR4NwE+fHK|EUpO3|DHe;TcvyQA z<(-4cU|(RhTCH9#m+!DFt$xoN=I#Oq1h5;J6N$tPrBb=V(mYULGhmOnHs2#N2UDrk ztk36LY&M%po6Yvd<#Ij4bz>bi4wK8}0+J?>BZ6*$HA;dY2nuxbbPsD0v^oNtP^nZq z1A%~}QmIVAZ97|UtXqbD%1knuye($NYPG&X+XZkE90y0i2{2nKm9D4L>ASeTMEAf6 zu6R72NBF(SvM|kj?BJ@wU|3=qItTWP8u}7ru~=TBZ5|u~8VVFlfW5I;%!zC)D-?=G zCX>0xL|rzU%`eE;WHLQrerlj#i_h!z`gcsw**^)QhjkZ4-9^kC(1A%H>j;1rnKl}Y z&uJ|A6bgkXw)QpMlgLmgbd4=2upOa*9Xg%vZ7)F-wJsWsE{bAkVzjw{;TJKTJ_o>p zC_;qh$mMbmDBC~_#{X6jEqF|=R)3^{TCKK<`EA`&E6m6DceXLq6c=4#to_taa~?Zzg23l*E_UIjixhj zr7eE{&%DdTZxwn2e+El#xBF?M(WnpOZI7l8p!uV}$J|@~J;e19?3R8pa?)RENsuJy ee-rdgfB^t1-yZ!LiDf_l00008)<)t=s zU>=-4ZqnwS+;`r+_tlJ|$k?WlGq!Bp5V|3>?yvw8$O8qS$T^>p|0xgx0q3bj=eL0x zvB$_o#3qJG%z#Va7cnxBhf09cZnvM7%jLd8Bol~F@hu#Li;0gaZak<|DqnoxKWH|a z-&?JgJDE&E+?#DAJf@kmZM)FvbewLtdmp4O27|#v-1=%!Gy6iOUa$XjUH1cQ7wB(z z$s`a?qtSTQ>-Fvl2jLQHNM@r{D*eWE4txVVYN)Ih9k-rP<(r3KE@|H?_ zhJk4a3;>_I?iO&suLPWnDeXR=AMhoI^f|ZflZGv!#hQN-1DZOa2F_C2kGZRYq&&28 z)M_>Vf7+`OBQZ2%;->Ufr z_8aCKZ4Fr|m%6}AYcENJ6Xu-EH1v)gLedyzsv#7|VbX6B*4Gt2a`PoHyyWZnOWF&>Y_!66@5V^!WE426J%eN3$^ z+YIuZI}7=4hc6OQgNO8Kki%8SD6EIllSmujIL>jF{gC(+-z>V}R(6cmHucm(Xsb>g zW{N)>V)C|<1VbfZE?%E%B}NELiw#~NJ~mZJ;F2At!L7VUB7I(;>i9@gI<5%8$wv}= zuapVtE}!uFQJjZ##ibje0vmJ(&R_7_XKv?5v|sb&A_s*~Cqiim#Y@&8sgs5KXC(83 z5z<<+T*{p>qC=MimXgV0$>y}g<*O>k9B+|~PK5pnFaTA7#}cCJrUw83002ovPDHLk FV1mm!XCnXr literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_globe.png b/java/res/drawable-mdpi/sym_bkeyboard_globe.png new file mode 100644 index 0000000000000000000000000000000000000000..c6595cf623b8f87ac4a769f707582ad55eb0785b GIT binary patch literal 1303 zcmV+y1?c*TP)1ksDZdNG+|JA_)M8xph{ ztxg0@7)zWsOQ$xPI-5OjIiLGXyU8xfVD!Ml`OZ1td7t;Z-}^r2<2)XZ&+BX=pV!>p z5d8N9ewVCsfG>N`kBzCF0e`UmIpF!X1avYn5CBMlKtRIYCu7e57jOt10Vj;ma~T2e zF&Pd4BG%T{RAXaf@2#(|$BNKUHy)`}dX%4^zfxUYy@+@0z^}j)z|BtdSEE8>-~cfY z0%%rOS3iW2?;h-8s?VOu2l7BV2Zy}kYR$;pWX8=v&{_C7G1&C2fX?pdro z#{7xPZ_Dr<9*}{Bg@v^G`uZw7h6DcR8ONB&`;^++S|d%x$H(t9 zHa31kJ)I^oG0|L5Q1ER`Ow49#YU&TUxw-el!^3}}H98@kg!a)Gc8Y*^Sjf+Fn;7Mj zlao3kH5!d~5S}fI#o|JLR904IUR+!Zwb^VkcyCEdOS8_-&JKr#g?%LYCnrk~W-I0#l)568^H-6M5q7&hA~G^^7e;NEd+KyLuPBvDTVY|Lt*x!i41zkQ0fzrP=a7&kGaJ_iQ} zq07t5T7~+1uNTN=ZriBt1Rd3I~*|IPWsyI~5k1 zn3ebkadB~!4IZScotK22ot+M>)g$H;Jv}|Wc>a{+gNl*BYf@KN*XJaZKp?M2LM^?pgT$L{w<1YC(A>tF7Ng!`umA0GyZ&IRQO584ib^@A3H`5zJixM}R`ihTK=A28T+e z((%p-p69jcbb1<>I*L1l(@-7CK|SUbi5rOynx1lmN@p*5u?QdvIWN zb@eQZM?4;X)oI-0@st9AKxJ)h&0eWgEO?9e^!zWWTEtR*4ESv}+XgEK`F#Ek##gi1 z>=KN=b-7&SnVFfFxOW}gn3$M&!_4GzxjBqoKr2^^bl}*+!op4VpxJExw7k50j|>W2 z19MYTQ|oMv-|v5cv5z*VloL>aQE)06jouduo6qN4Po+|iA^ac~i#;=$Okda>T(f~{ zdlBpHw0llYfGyB~ad4WwiNoR8?5w6nqp=zag`Q%~dElhVtLU{{3nF7w^TXwG`Ig|4 zm6eqx+`9tK02>)scC#gxrEHf!K#h*e8eCCBJifBYNF?$ZT^;ODa`AtCJv|(mZOUv_ zFc`e7*XxfKi$yz|n4O&sRI61tzN#nl^YdF$)wGur&DH6D0k7A4mtr+2W<&1KXN7B* z9h>M6)9Jv5^4 QegFUf07*qoM6N<$f{;RzLI3~& literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_num0.png b/java/res/drawable-mdpi/sym_bkeyboard_num0.png new file mode 100644 index 0000000000000000000000000000000000000000..7188f9ca54ce6fe689b4a23006ba736ae38eb8a0 GIT binary patch literal 1148 zcmV-?1cUpDP)X)SWVDK5HrUA!({7k_GsL8VXP z{$OANM($q*9ER^iv6vJyyi6o>)QAdJW6zyufvvtY@00*+mwS!N_) z0vEuos;a8z@$vC47U-pRU0vN%jOBqi5GUnv29~62qY-}t8?X&D$ z4?Wavc=>^W0jtO3F)4#s?%z@UAb}2t;|uCy>YtjLqG%Ao;_2Kqm1_qIA=AjwBQ6+4 zxjgvIVRMzE#|mFdlPDq!bx><-Yl=7s!6O{v=InO+PjL*sA)AHCJ6Ree0vbVCuc7!X48Qy=sORZDdOzEUuR+Yi!a@o}ehlYj{#NX4?(`KGb z&G$Ub^g7Cxy*oHK7?GNqYUFmLI7SxRWq;ECovo>BzB@`Z?Fn&h zQc_alQQFFZxw*OTNeG|gZy}Kr6%`c?ZnvBK#~4rEk$9`4y=w(Gb8>QewtKPRl(z`P z^S<^sy`}4ibABJg>8|mprBes=e9Kq+nIt;TMxI(K-1cUg9@910!qc+|-bK z9$e-epYrzeeSLklwzf9P!U9T5OF!eKgdEf;@7Dz}t@Ztqa~%E*kyIX1=F~Klzv7sL zJv+~$SA6sN)rp2rvNV3sRb4kR;Xs O0000L8FJA4%^LS1wB z9{f0x-157-ymyyKWm(ol4Y?+8kUYtgJjn|a%L|@M*k=V;#d{MV2gbmZS9uwQ>wtzW z+Z3e002l%VkMc{v8qfgt9mhHIeZM`0&@}Ba48u#DeXiss6yE@LfCJmMFS_0C$xjCe zXtsf8-rjj8z6tC_QFPSlbgugS{^76D`IcYDzFcK{CRF!4@6 z7dRG0{)3e;5P!ksCyBJf8zZx&o{PA*FA+M}kUYtgyb$s%;pIh9%xC

Sy`?$g{ft zo~G$=b|Z&?<_-9)y1caDrv>|hvxUdo1`ZYzPk`5|?*SIc%QyfEBH@gWu$}NMPuZU2 jNuK0Mp5!YYUjhsO_^ftO71TET00000NkvXXu0mjfy$9y; literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_num2.png b/java/res/drawable-mdpi/sym_bkeyboard_num2.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e9cc9b137f9f2cc255503e270b659482c90595 GIT binary patch literal 1785 zcmVjgE$DC)LgiWBU^O7(3-TTgc?|x?=keEy+i)ZzcT0Fy-nY@|2 znY@|&GjqviP>38*Fa#L`pl3V;CdHd163IVK=4s2en7oAN%K!&p1&`MJTmy^%w}DYW z2N?g;rYCJNWPl?O)YjIPmXwtAy_=ic5Qz}ze&^1ewRj!}ya1>GiLn1)#${d*Pn1OJ z@ZrPxN~KaOke&)3AD`E=x``H&Q_WJtwIdrC<79db6743|C6@W8f3s|udh{SSUCuMr@=)~)CmXq;2NbY&y zMfSdxfDJ!?Y9)xXJ;kr~^y$+_6bgklFfj1v?(Xh)J3BiI)M|Ax6fhG>cwHdcM^+_~sSnNOopaz&8Nqm)tt z^{A?etPPsE#4D%HrQO`E15(HgbTV_u<-ZyzYQyP|h$A(yv4$mZtRcDIFg9i`3COkyR8$NaF zR3+E?*~nW8Jp;TZ+}+*1FD@=lJuxw%fU9p2VpYQ35swr~awzDLqW%2*h}iPM!NE0- zj*deh-iUb@&;k4c{3arAS_<+KCQjDzNl8h`Zf$M#6CM^87M5V>W6M9B<=sTY{_54M z>qbXM-6A3))Cma*y*4&B_dqU!!$~ETN=Zo;$BrFKkBNyn3VehS#rwd418)jRjxNO4m%DfGCbt_Vx0^-V5)K)M zvuDpH(E>>8E?&Io1ro!zZr$1lm!?c@3-VGSB%-6E8wjMJ+S=L}c#Nx%$*rxewL)xz z_>y#0vT5cvfLBFD#r6{?PP`&K*t&IV3+9x4d)ey7Ib5C+nFGq@dRn0JBo?@E;X+hS zPEH-X{gLHSO|B!ET_=LD{I%@t?Dvq(!-9i@Ympap!^6X?xa8R)2Wj~GCLSjjVtwf} z2lhmQN!YVzPmb^)JUmMM^;sFGL!LqI+wRaq6;OLMXXlgz;6Jr0@-9)Wa=1F z4u~naF*0)O8gM_!Yc!5~dwc&hG&HpO#*G_+RO`79SPi(cv1E(2Jh_+C&6_tvV3D_U zI-OD=j#5*@ZtTt)G4JO* zp$QEQttRsDuplU+lZ5N)>f#?C3JMDg3oA`ePbZ~~qT#s>1$=-|%q=f3&z$m|q8Yqz z&PyWd%c-mdAqIb#&&IsGy!Q(V3O>i}An8N=d!BwIarUU5&<7cAp-!Ci$mSHYoY zjR*_w00000NkvXXu0mjfxZh^N literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_num3.png b/java/res/drawable-mdpi/sym_bkeyboard_num3.png new file mode 100644 index 0000000000000000000000000000000000000000..e9987668cc7eb1776775e1da6611be282b2e9e26 GIT binary patch literal 1675 zcmV;626Xv}P)`9X(>A8V;)^shvOZ+PXoV=ya^zqpOO22;Zpz+$gny;@LMSXdty7dJ?^g;9Uw#*Gc_?d|LETpTQz z=c%4|p(OV3v?hLNU}0OfZ24TL(><1ho@z^$EV_?zwQ@%Zr&#pFUl@bLY=?6fEZRc0Kn7}I-7)bqJ^^pc z$jJDkt*z|~Sp-6(qM~#wSFY?hb?Q_$JscDiWaAgkblwT9p`f7PJCn(j_~eBF0oLWq zm;btJ*RHSQ7?B2b*6Ki~fHQtin3l0u$KYR9U4o82^ zsgA%r=BtA}J)ff%+}hfjARf%j%=`_PagO42jiR&=V6|akVGkgdXFwn6%9Sf=H*Vbc zaPQu|i46@6MdWkuT%##rz>Wq5cvf*#1q%IY|Bg&Q|6Wm1QFD2Dd0}&Nb6#a--F~h z{QOSz2VnP^GIn2r7ZD3Nc<|s?^1;y1(6Ne&ipH&5w{|nT@@KoScO5P-~+qP}nrsKzt zQ{?X_B_-WsQF6_Oo`2f;dE)43L`1|*yWKvi@BmMMREG{7+C(PiwzRao&wG?`)I$y& zIFN6%*(_$W`B7wKWJ^g&Nu#eguaa%jh&^ZF`ud3zC*DP2lK@fr2rt%y`>8m>U-tF& zZQ`TKz#!9es_Q2U<*O z2L$f-+}zw&=Cz6EIS~jCB0W@FTU&$vAXCW1QFlKpc=1)I;ncK{bF-ekPLchaUIZl` zmQU>L?0l2?C(VLgVopa=-9&{{Sy|b7r_-sAiHW&RRA5aYiik`j3KvOG$K&x(e~1e! za)6P+&sp#Yd@w{Vt+=?@!sB8S#LK0nrKRcei7QsDxT_#YQ+2~Z8wa=bNNevo9FE5q zE?mg!?d{Dp7!18oddeCu;xSF=>FIgng-#D@__6Hl?7qRlLBpj>mzEOO#Uv_wQGj%DT`(PZa@@Gf<#OPNM^sl= zZ|4HZl$MrOUsY9AjV_%gH8@UbOV!lWv>KPyvNd)9{56~s2lr>IEuN~0+MakA1y7fq zKY#v{nI<6L+G=WQN|CSY(fy0lo>FbE;{r*Pw^}|8c3F9A=2JIQdFx?%c{#U_^BO*j zJn_kzo}PXgkxm^L7>H2+*HvHC)PuQ+lK8(W6J-Mmb6Xs6zS~+q`-6b^ascf$W3g3Fj3e|G)n)Lx7jq0a_Ng zd93&WGXC0_9yafE0{60j_y2Y62k!^(2k!^}vbBE%7yysa VKp-sFe8vC(002ovPDHLkV1lSbLp%Tg literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_num4.png b/java/res/drawable-mdpi/sym_bkeyboard_num4.png new file mode 100644 index 0000000000000000000000000000000000000000..7f0f3cccc18a707ed940e095341d14777c205fc9 GIT binary patch literal 1530 zcmVAb zEf}>LwbcY2XA+~%`*!c?KH+9M#>Ye|ItLba?z#7zbJyPM?7fe2f*?rFYLiONaPyG& zkoS=HkUuj`egNah015&&E5JloJA0Aixc`mBQPcIS$Risba2^muS6syaSO+`;&PYkw>}v0V3<`>x*7u@Gp5EQpSFbqcxN?#+zaX65a)DlY-c{*eRA+$w<6t z9gfDzX*`ZIlKSkgi##r-280(E7vGqho4a_#EWtijO)(>IetupvG&FSCZnxV~Qc`}8 zi;J5h1K@lrfQ4eob28X@GMJ6#J4f^3{RYJz+fm6oBr1Xwa1QX6R;#_^<>iIm5kf*j z*2vmIOiauoJkJ6IiO0H_Qw|6OyxZK|T$7!htxHc&7sMzpFaI9b0$j!Wl9H02;dd;+ z7ZBFa&~Ov`8yg#M!~J#fScpUSp)VAmbmDMe$X&=C_j6QfY3WU)(dgyp=Vt&f&2)Bl zY7S{v^ju&|OUs9CZEfH2JZ~&0DEP_S+k4Yuv6x3jM&5zBmq>jVaDb1GkBU62Ly!AH zqkiBA4GA(?L99eS%no96@A9!UQtn@otT(-XlUpR^gYE7hAnlE(k8|NFB}Ah!S&yyJs+S}s{{*{##4fNl}N^fjz?3O6k ziW@4yoR*e03&BnTWHl5|biKX3U%~YX821~S%_gJm;V@Ekbo63PO-(!e{0jxs*VmVd zy!ckmhPI|~`jl_Zh;Ze(QS8thyB)YR0~)z#G~NSPK<@xlrw zDXa2KCesdF76BL^0=Kuf<3)2S$WRyn6{3Pk>TZ#P`&J(w9{x}X&G{wtyk4(&cpqay zSXkI&@cf_Tbyo``86>ivm6g@p)6?@c*<2zWot? zKA?QO*Wm`s&-JphvfuCqQr?&C?d@LxUc3+y5%G|!G{?sSS&Zgel)`qOL8E?*EjyW+ znH_jPIy#z_mzSr8Z_0P)ZxS3;XEIR@&Wk3*eHsZ1-R#2H&f^wTen$R^IB!aL;Mnkv(rCn4F%Y zCwP#(?u9#{Q9v^6bEFmMxt^4z1H#Jyo}L*+2OB{oU#lp6TAdCyJVAW0vAOGc$tzBG znCdj-Jt>i1B~m6=f63WnPIjE-PRfyXKk_UxD+wIikItp#0mz@Y#(Dl-+dl#f03`gP>uxc1TL1t607*qoM6N<$f{lIO`~Uy| literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_num5.png b/java/res/drawable-mdpi/sym_bkeyboard_num5.png new file mode 100644 index 0000000000000000000000000000000000000000..5f748b416e94cd2ac0a55f3aaade64043a0b2d7b GIT binary patch literal 1411 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_num7.png b/java/res/drawable-mdpi/sym_bkeyboard_num7.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb874c472ff7e3897f34286328007d227b7c874 GIT binary patch literal 2040 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 QivR!s07*qoM6N<$f+{HftN;K2 literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_num9.png b/java/res/drawable-mdpi/sym_bkeyboard_num9.png new file mode 100644 index 0000000000000000000000000000000000000000..f348c92af468aa676ec39e4c0768100c08f97825 GIT binary patch literal 2167 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 Q;s5{u07*qoM6N<$f-K}G4gdfE literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_numpound.png b/java/res/drawable-mdpi/sym_bkeyboard_numpound.png new file mode 100644 index 0000000000000000000000000000000000000000..9126eed0df3672c0f2dc95a9405cabc83dd051e0 GIT binary patch literal 910 zcmV;919AL`P)LdtRMN26igbXQk(Lr=_7P>eDSI2a4)IgS2Eh4d+z_9`zp6uEvZ+VN$TNdh&RL=;tlaV)B69z z_nCnLeuDP#HRd=qgu7+h<-thbV zk1#$C+`wnCSkfaSBT0@a-In$T;!~;A3=M+8;AeCWU`-?vv-Ns?KvmT;XMw5P#M7Q0 zEEbDC8ca+~eB`}u+1%U=@r2~q3-&u*yom){Ngx;oo@_Sjr-$Kicn{q%TIo`$KGh9f))b&(Sx3%uBv+1Q3yqz8=I?e>JtW~***Z$HGiKtjDyUI9+v2N%H2SS*&JuUuJKd4ll`u%N{j7Z;ym z90Or62He2hi7PL2PiFO#iTzFB2 z*RQMQoInMqVRm=f?CxXyh0QL`W_JhUm*744uA6{XryX^4e%m9F$aM%i??f}BRjXAi ziH}C3SF~Rw;T*e+=NC~2>?|)YKbV`FdxOU{k>W+|Cks$Rq0r-hb$Vice*PNo`96_* zUZmN%*tllE(jl{30=LQJbY^!8%z|^k0|tPp6Ah1yt^&UCC1pr6yUEGP4K89F>+9<$ zD2AFo%f$`#d%V}{LQ`JwQ77@rsUU)5zG$^tEBHAI&Voy*0p4=#DmW=R%?~5`_C!Zs zUox2-hLO2&W!>VE^`K_QF{hGvj#Y&hHEq7nllaEk+8SL}Bvg9Oxt`yP$Kz_PR8(y4zb*_x7gNP2y#)B^2(p_jWB^T)Vn9+MV{Y@xMAl kydmBYZ;0=K_D6sL0NR>bF!`{hzW@LL07*qoM6N<$g6(RvvH$=8 literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_numstar.png b/java/res/drawable-mdpi/sym_bkeyboard_numstar.png new file mode 100644 index 0000000000000000000000000000000000000000..9b9f1b9869ee3bdf98bb48df6ca3b01d1a72810d GIT binary patch literal 943 zcmV;g15o^lP)7xtrW*Nra6kQOC^LymL1?iStbGeG=T(trRaDqnA0{q~% z-|vr6?8wN-9HGxP#w4dj`Z(n?tXj=~MT19LZf!N7k*mD;T)pk!^xE2*7c2X)-EPk? zd3Sf$hDGjKAQ0fZ|HLNQ=C;8%kQ6`n-wO~8#8-h+0|Nu$jg5^#E6fZlPT1PoYRY6X zHu^T3Ez{cC`nfoshhRV0&1cOsEEcUUqnLOdS#{4Lhp z-0YTGKq;3BkEQ9((9qCx4DVPC%<{*q4u_*&Q55so*x1cfD%HSbEO_51CnsNE1m@G} z^p9LFmj$_PnA`3CAk|*JT*R|P-42Jt?{JLDG_Xn~cXo7ibdbV>!Qgu)udJ+e;m$W; z%j4n~2R~)b@5x+G%V(BNg~zSR0xD(CZUDYmEH;ce&IL_fU0r=b=(CM6=18th`dYNy z_DZqOQ$Q2wgT0|x9&vt)9BAv4T#H_coNCZHF){J5aF?Ue=v}$XKKg~xz#QgEA6+9=-jCFK$yk1yX2*`ttqL&97&f`vA1RUE$oLQjXF0u2HTUClXuaw{)n+n zFauhk34Q@-(t=q06W|OuO}}@*Ciq6ey6XuiNL2TvPN$`7LkSWns100>Mx)_m zGU;bIVKf@=d%fN_m=}8p((oR7lscrmCg#i~BaLJl)^o#8?7$^*Z_QnMWE# zkmAfT68LsF9DaybWK!Q$DwWvoxhsm|t|UqAE;WLngD;l|Y(GZX z*if;zQmNESe64}TKYi?wSH^nKS~{J6G76Vi43Ee2wp=dz5O)Pwczui^^f=@nZ1-F) zcPA2wJmw`elKr*I<=WyUHH(Wm2`+yR27_g)=-brg8&usj{Wzq!WT1|G4Wgd&oPzyX zT)zdbvQ403joi2h>|g;HdpYyJ<|@;+WI6Q7@AtnVM;>)L)o3(+;^Q-@g1sJbBtquq z%m9^IEouX`MF@pL2Q{f)ukW&tjuYV6&(vL_d_La>`dOM?Kw}kg*!n<%q>-I@`~2ss zG+8ShM=d1u3;0S&Dos+5`oKOz?(Na5YERms=^w?ZpsAo?#~%R(00fM{sqz{yw*UYD M07*qoM6N<$f{*2V{Qv*} literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_search.png b/java/res/drawable-mdpi/sym_bkeyboard_search.png new file mode 100644 index 0000000000000000000000000000000000000000..1f180155de4ec28736757f86cb34aa322e1a6cb9 GIT binary patch literal 1042 zcmV+t1nv8YP)_S}H zht(+Z!nAU^{!ct7PRH4%XAJ`n{5b46@6P*wpZ9(K@4E?+NMzk=x>V~{*|jDp)}>J} z5S3&=v=D#rJ(4Uz0=L(JbVkeZFqi|ge4l55|4fjYh3J717H8wWh#&>rEJr7K=AbLp_IBd7upGZ5as;YWCHa1p|XAW=zR5v#_cTjeunWC)H zfPgj;g6Jg$SQF=^V%%=`L&Q&k5|9r})D9dOA0PKfML8UfM~Ls`X;&;L1C-X()cC~? zXxb2S@&ZriEDF3%jNoWPL&JSp`(q$GUO|6z>J*THQEwIl6%`dPaC^h$O_^BW&Z)eo z!P};$rUzpCsi~@f-Mp%)FO*osbAYH2Sd7 zXq*-U!C)|lM;omZH9t$^%t+r8NrWJphFOcn@=6T&{eCNMdFyrL;N%-r{~~ge}Dfqxp@u@4BW)CgTTOBkf7A5)2PJBi=_S{mNXe8Ar&k_?mam< zd4tWf7;IvD5R?c~^XN)_KHn9&s92CF65H0+c8RxFVmbPU|d|C?Sqt9pb?(17racgcWvocOM7@0tGk^2@n#3M+ICi*K=w+ zF)>kMHk+?XUjk8I+uPf3Ih{^&{vaD^c#$P6<7lAb-JjON7O;b-VGpo^Ldm{nk9IoX zOnLddL|NCYWXj|S{30Fick6laYkAGl9#@E+-nEpd&d$!uXtSN$Di#z^A#9}60H*ZZ zQli)n^vMtuQxsKSvIYGi3Ps=+MNxKO0~eDyWzj?x4-O7GDl02}Jv}`xeBQ~$p;<}U zE4}Cxkj9&DDsS2|e2iIC_Ck{W{SbfU3M^oOS!{Z1f5-f9f_@4x04GMJTf2sK^VBXl9jaV%jhPQBBG*l3QB>55M*8Em4pVVAR1I4L>JL*c)b;c;0VRYoZIpy z%cfh+t^Z@sVjHIIY?>E7@Z+5Keb0H{|DNZ0KhA`3IGnbTOqRC6Y*Wx`CZ^~|349GP z;r}Hl9jL$-?#mD6K|rb~S(2V1AsV~gZmg-PX~(@D30u%xZg(o6re0=-{>Mk@lH$R~|64lq& zcMEmpU)?d9YR5<-JDG&IB~uPiFrPnb-mB~g_0 zD4zsn+%6;|hz8k4Zg)DJS1Dg;kk;1L=cqda_ORy^>_rt%c{8{YdERU`zef2ePlgqj zgVhAlKqYYdxk%?#RaI|Mcb5jFnZ`Mi%XvZxzYm-O*C!_@??v8gX=!;%`3G`VN^->1mO}AU} z>U25{E{gROMDHo-Mz7a@92*-O{Np;zJcLnXL9+D{6yiKe^Z9(r-rnArqz;8bVabPm ziAUHxa47nu7>(6xea8D-W}Gc&3R=BzYsb6J!$3BVqI3k4-^I+AjeH0OY}t UMiorL=>Px#07*qoM6N<$g7NjrSpWb4 literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_shift_locked.png b/java/res/drawable-mdpi/sym_bkeyboard_shift_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..b8cebd060d38b74b2c504e83008194da63fca8ec GIT binary patch literal 787 zcmV+u1MK{XP)jytrO@cq zAOF;*GkxFkgh9p~XS8V#KKSq(o%#Ld`+L9N`@N@vs;YA*$sBVh%w~d&%r&J+5du(v z%I$v<|7%MBVT zkw`qn=N%ve2?%D#wjzdJ;sqPvb}$(Hz{_()GMRja?{9%M;5IADiWm<#4|XGw$UChV zkH^y`ipAn1+}{Q(!1b>L2|Qz3j-7Nm{X#2dSXiM@*vE5QV9AUqvtm}k&1^RNWR#cz zKA*2ytJNOh`K#bGa86T@i`~DC4ogL`66ljy(>H1X1S;l}hEFRWSonsnm0fbptFPx1Wpz zk&CZjhOZ_OGa!@6Jj8hGKpgeXaZ-oUY&OqKBa=584YyH_6AUUw8i2&eU==KKLR|sp z1VPx->lBN{-j+(G*SP!yx}0pk0b2I2pauF?vV9Ny0EgfUKTk<>4O}zmODW|eznsdE zKj0UmSS>#k%^+H%!IwsLYPDKF(R^lFcGN@U?ruJxe=LfkXZWVy?|;u;RqQIzXxYSE zF1M?9GZYH-qS5FZD>ad8f=bg{uh%#9ZUzE@bq)x@u8Psg)uMiAy4?~Ba@ZwE2#>j@7TGi=@@9n(J~ig@yI3>?2|J@5fBgg!Wf}0RYS{?%)ZY R>IDD*002ovPDHLkV1l1CZ1Dg9 literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_space.png b/java/res/drawable-mdpi/sym_bkeyboard_space.png new file mode 100644 index 0000000000000000000000000000000000000000..4da7ee86eb85c43ec31a1ef0b24c91b73df0c0af GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8n!3HGFBdc41lw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#21Z*?7srr_TW@AKdL4F;B}KmL7Sa$RPUyy?ZG`VTXn@b9TP`9%K2jAfZ>%a^=-a%71E z7b-ez^7#tS>*obWW;O4BkZ158CT3qy}8)% znWxV2pvPMSSf9#PId_|05uK#6^XP_$mv=ZQ%v{E69A#L2u=*?0rs5UaM+)~GDqxR4 zc-uii`}~ofuru3g8(pje%O^em=^QBX-FesYRjYp1?ck~1y=LyTUF%k_3z+uw?2NT% zbDn1l$WNGX{l|~EOD45_i%#@$KAv;iYulZ}->3DYe@{NepLaGa_T5_f=E?{B+y3n4 zKgFJMqi>qRX2I|;vf|FipZ)l0o$L0!z3)YM10%x>uf%_GSNP8XLz}_V)z4*}Q$iB} DhOWNL literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_tab.png b/java/res/drawable-mdpi/sym_bkeyboard_tab.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb991cbf1918f6ec7604af8c6881a19e98ab6cf GIT binary patch literal 627 zcmV-(0*w8MP)yK?#-O?XP znjC~uED1RWDipB^xg{4tO3pb-#X>JRi=;O}z2?|Jh*|=<$G;=qEHQ^9hnSz6=x)Cg zMp%oh5uT(e9r)mTE6n%3c{8(bg=JZ;QJUf!vHcf#d;yOnKW^Y0xAds z9o&L*&?Es_AsPddLWqNCH2MwWm%JlsXW#?RX`t(R06+eYZ$;u6JiCvTs`^+^`RlSs zVca}#GnOm?H^(->LRa7d7_thDQt@>x7F$mw5??V6gK>_%@(=-GD;Tv0wDPH1t+re$ zmC|2en9qfk%ilRvYCi#$SMoNK$t-G` z=10+VtqAF-dA;5)CzVQNA(cuU=kxiWPGR!c3gs1i?hl)Wg+k%8X_{^9X#Y{WDK)55 zyq`Y}3Q;zjU8>jX)1Buy>urQ+*H$0hMlXHf27d4cyaTgf?hihKwNNN@$i-!))9D>N zTL2%x3O$R*<3BK-2SM`fu~j7%&JFFvA#{{Qq6MQ#GMU`U<#L-C9&iTggDTmwm47dz zR6GiY!+ViP#K58MVEzl7fC;CTF-)tVmT*$7RyTUI3R6ZeYO}-ZQ8hc0Y5kMemNsXg z%P@>vt}9cf069FPL9^MUbGqyZ2uZhV&EeY8k|p4H@e)t|`{1_#0|2h1)~3BmGjad` N002ovPDHLkV1k4b6GQ+2 literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/sym_bkeyboard_tabprev.png b/java/res/drawable-mdpi/sym_bkeyboard_tabprev.png new file mode 100644 index 0000000000000000000000000000000000000000..5298291d5f7127aed9b30267f96c04f856184339 GIT binary patch literal 605 zcmV-j0;2tiP)Mihb;h4>p39|Z1$79zBcR{e@12wIfkL}V(CV@}_Zb72Y}#f((Y zfscFd+&kyH=W);6k#t?R4N_#=faRay=Lv=kMARP!B%ldsz?+o>PGAxk0m{HDP_xQK zwDTFS*LxsI(lz??z?hXWpmxILayfZC#gN5;<<>M! zTUAx{!zssyORv>x)p$I9f#EGsYF7gKq5+e@ir?=);kA3=aQK9G`fWg#foanHW9Oin z$z;xCS+=Ls=`Hcl= 0); + } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index c3be252c8..abc4992f5 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -81,8 +81,10 @@ public class LatinKeyboard extends Keyboard { private int mPrefLetterY; private int mPrefDistance; - private int mExtensionResId; - + private int mExtensionResId; + // TODO: generalize for any keyboardId + private boolean mIsBlackSym; + private static final int SHIFT_OFF = 0; private static final int SHIFT_ON = 1; private static final int SHIFT_LOCKED = 2; @@ -177,8 +179,8 @@ public class LatinKeyboard extends Keyboard { case EditorInfo.IME_ACTION_SEARCH: mEnterKey.iconPreview = res.getDrawable( R.drawable.sym_keyboard_feedback_search); - mEnterKey.icon = res.getDrawable( - R.drawable.sym_keyboard_search); + mEnterKey.icon = res.getDrawable(mIsBlackSym ? + R.drawable.sym_bkeyboard_search : R.drawable.sym_keyboard_search); mEnterKey.label = null; break; case EditorInfo.IME_ACTION_SEND: @@ -196,8 +198,8 @@ public class LatinKeyboard extends Keyboard { } else { mEnterKey.iconPreview = res.getDrawable( R.drawable.sym_keyboard_feedback_return); - mEnterKey.icon = res.getDrawable( - R.drawable.sym_keyboard_return); + mEnterKey.icon = res.getDrawable(mIsBlackSym ? + R.drawable.sym_bkeyboard_return : R.drawable.sym_keyboard_return); mEnterKey.label = null; } break; @@ -279,6 +281,23 @@ public class LatinKeyboard extends Keyboard { return mExtensionResId; } + public void setBlackFlag(boolean f) { + mIsBlackSym = f; + if (f) { + mShiftLockIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_shift_locked); + mSpaceIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_space); + mMicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic); + m123MicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_123_mic); + mF1Key.icon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic); + } else { + mShiftLockIcon = mRes.getDrawable(R.drawable.sym_keyboard_shift_locked); + mSpaceIcon = mRes.getDrawable(R.drawable.sym_keyboard_space); + mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic); + m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic); + mF1Key.icon = mRes.getDrawable(R.drawable.sym_keyboard_mic); + } + } + private void setDefaultBounds(Drawable drawable) { drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); } From 574a7cc82d7320638669e99e25f232b1963f2f41 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 28 May 2010 01:01:19 +0900 Subject: [PATCH 040/159] Fix the bug that black symbols are shown when only one lanugage is selected. Change-Id: I15f83fc43d91c2c9d74b40fdcecdfe239242d565 --- java/res/xml-de/kbd_qwerty_black.xml | 189 +++++++++++++++ java/res/xml-fr/kbd_qwerty_black.xml | 192 ++++++++++++++++ java/res/xml-iw/kbd_qwerty_black.xml | 164 +++++++++++++ java/res/xml-ru/kbd_qwerty_black.xml | 173 ++++++++++++++ java/res/xml-sv/kbd_qwerty_black.xml | 215 ++++++++++++++++++ java/res/xml/kbd_qwerty_black.xml | 207 +++++++++++++++++ .../inputmethod/latin/KeyboardSwitcher.java | 7 +- .../inputmethod/latin/LatinKeyboard.java | 14 +- 8 files changed, 1157 insertions(+), 4 deletions(-) create mode 100755 java/res/xml-de/kbd_qwerty_black.xml create mode 100644 java/res/xml-fr/kbd_qwerty_black.xml create mode 100755 java/res/xml-iw/kbd_qwerty_black.xml create mode 100755 java/res/xml-ru/kbd_qwerty_black.xml create mode 100644 java/res/xml-sv/kbd_qwerty_black.xml create mode 100755 java/res/xml/kbd_qwerty_black.xml diff --git a/java/res/xml-de/kbd_qwerty_black.xml b/java/res/xml-de/kbd_qwerty_black.xml new file mode 100755 index 000000000..366f87134 --- /dev/null +++ b/java/res/xml-de/kbd_qwerty_black.xml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-fr/kbd_qwerty_black.xml b/java/res/xml-fr/kbd_qwerty_black.xml new file mode 100644 index 000000000..1b799a51d --- /dev/null +++ b/java/res/xml-fr/kbd_qwerty_black.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-iw/kbd_qwerty_black.xml b/java/res/xml-iw/kbd_qwerty_black.xml new file mode 100755 index 000000000..0dcf513e3 --- /dev/null +++ b/java/res/xml-iw/kbd_qwerty_black.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-ru/kbd_qwerty_black.xml b/java/res/xml-ru/kbd_qwerty_black.xml new file mode 100755 index 000000000..e500b97f2 --- /dev/null +++ b/java/res/xml-ru/kbd_qwerty_black.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ¯ + , + + + + + diff --git a/java/res/xml-sv/kbd_qwerty_black.xml b/java/res/xml-sv/kbd_qwerty_black.xml new file mode 100644 index 000000000..6604bc87c --- /dev/null +++ b/java/res/xml-sv/kbd_qwerty_black.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_qwerty_black.xml b/java/res/xml/kbd_qwerty_black.xml new file mode 100755 index 000000000..d013ae01b --- /dev/null +++ b/java/res/xml/kbd_qwerty_black.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index ccf4c19aa..864bf73fa 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -215,6 +215,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha keyboard.setShifted(false); keyboard.setShiftLocked(keyboard.isShiftLocked()); keyboard.setImeOptions(mContext.getResources(), mMode, imeOptions); + keyboard.setBlackFlag(isBlackSym()); } private LatinKeyboard getKeyboard(KeyboardId id) { @@ -227,8 +228,8 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha LatinKeyboard keyboard = new LatinKeyboard( mContext, id.mXml, id.mKeyboardMode); keyboard.setVoiceMode(hasVoiceButton(id.mXml == R.xml.kbd_symbols), mHasVoice); - keyboard.setBlackFlag(isBlackSym()); keyboard.setLanguageSwitcher(mLanguageSwitcher); + keyboard.setBlackFlag(isBlackSym()); if (id.mKeyboardMode == KEYBOARDMODE_NORMAL || id.mKeyboardMode == KEYBOARDMODE_URL || id.mKeyboardMode == KEYBOARDMODE_IM @@ -403,6 +404,8 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha // TODO: Generalize for any theme public boolean isBlackSym () { - return (mLayoutId == 6 && mLanguageSwitcher.getInputLanguage().indexOf("en_") >= 0); + return (mLayoutId == 6 && (mLanguageSwitcher == null + || mLanguageSwitcher.getEnabledLanguages() == null + || mLanguageSwitcher.getInputLanguage().startsWith("en_"))); } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index abc4992f5..eba0ec04e 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -288,13 +288,23 @@ public class LatinKeyboard extends Keyboard { mSpaceIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_space); mMicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic); m123MicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_123_mic); - mF1Key.icon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic); + if (mF1Key != null) { + mF1Key.icon = mMicIcon; + } + if (mSpaceKey != null) { + mSpaceKey.icon = mSpaceIcon; + } } else { mShiftLockIcon = mRes.getDrawable(R.drawable.sym_keyboard_shift_locked); mSpaceIcon = mRes.getDrawable(R.drawable.sym_keyboard_space); mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic); m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic); - mF1Key.icon = mRes.getDrawable(R.drawable.sym_keyboard_mic); + if (mF1Key != null) { + mF1Key.icon = mMicIcon; + } + if (mSpaceKey != null) { + mSpaceKey.icon = mSpaceIcon; + } } } From 2776a9f2c3affd6449d81dab8642170f9dc5cdee Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 28 May 2010 02:18:09 +0900 Subject: [PATCH 041/159] Change default theme to Ginger Bread "6" Change-Id: I68d5519c03dba0f8b6344a103c5bcf4f9b18e760 --- java/res/xml/prefs.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 8b44dd974..0984a36e2 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -60,7 +60,7 @@ android:persistent="true" android:entryValues="@array/keyboard_layout_modes_values" android:entries="@array/keyboard_layout_modes" - android:defaultValue="3" + android:defaultValue="6" /> Date: Fri, 28 May 2010 02:23:32 +0900 Subject: [PATCH 042/159] Change version to v0.11 from v0.10 Change-Id: I88f14f1ab5c325a82589fc8a3becd1a7a56e2cd3 --- java/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index baa82a127..096b86315 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionName="0.11"> From cddf47121082a2c35a078881cdc1caa197e2c626 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 31 May 2010 13:05:46 +0900 Subject: [PATCH 044/159] Fix the name drawable Change-Id: Idf359a81b59522c030839e00ea5287bad5069677 --- ...{sym_bbkeyboard_mic.png => sym_keyboard_mic.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename java/res/drawable-mdpi/{sym_bbkeyboard_mic.png => sym_keyboard_mic.png} (100%) diff --git a/java/res/drawable-mdpi/sym_bbkeyboard_mic.png b/java/res/drawable-mdpi/sym_keyboard_mic.png similarity index 100% rename from java/res/drawable-mdpi/sym_bbkeyboard_mic.png rename to java/res/drawable-mdpi/sym_keyboard_mic.png From 352f8bc9a3b4348fa1dc8e7abb1407cc34a298c5 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 31 May 2010 17:47:33 +0900 Subject: [PATCH 045/159] Fix log dupplication of auto suggest Change-Id: Ic2af15adff64631cc275b07113b42991363c92f8 --- .../com/android/inputmethod/latin/LatinIME.java | 11 ++++++----- .../android/inputmethod/latin/TextEntryState.java | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index a02a59e8c..3bf8238a8 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1172,8 +1172,7 @@ public class LatinIME extends InputMethodService (mJustRevertedSeparator == null || mJustRevertedSeparator.length() == 0 || mJustRevertedSeparator.charAt(0) != primaryCode)) { - pickDefaultSuggestion(); - pickedDefault = true; + pickedDefault = pickDefaultSuggestion(); // Picked the suggestion by the space key. We consider this // as "added an auto space". if (primaryCode == KEYCODE_SPACE) { @@ -1204,8 +1203,8 @@ public class LatinIME extends InputMethodService //else if (TextEntryState.STATE_SPACE_AFTER_ACCEPTED) { doubleSpace(); } - if (pickedDefault && mBestWord != null) { - TextEntryState.acceptedDefault(mWord.getTypedWord(), mBestWord); + if (pickedDefault) { + TextEntryState.backToAcceptedDefault(); } updateShiftKeyState(getCurrentInputEditorInfo()); if (ic != null) { @@ -1502,7 +1501,7 @@ public class LatinIME extends InputMethodService setCandidatesViewShown(isCandidateStripVisible() || mCompletionOn); } - private void pickDefaultSuggestion() { + private boolean pickDefaultSuggestion() { // Complete any pending candidate query first if (mHandler.hasMessages(MSG_UPDATE_SUGGESTIONS)) { mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS); @@ -1514,7 +1513,9 @@ public class LatinIME extends InputMethodService pickSuggestion(mBestWord); // Add the word to the auto dictionary if it's not a known word checkAddToDictionary(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED); + return true; } + return false; } public void pickSuggestionManually(int index, CharSequence suggestion) { diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java index d291af651..e2f949e4b 100644 --- a/java/src/com/android/inputmethod/latin/TextEntryState.java +++ b/java/src/com/android/inputmethod/latin/TextEntryState.java @@ -132,7 +132,20 @@ public class TextEntryState { sState = STATE_ACCEPTED_DEFAULT; LatinImeLogger.logOnAutoSuggestion(typedWord.toString(), actualWord.toString()); } - + + // STATE_ACCEPTED_DEFAULT will be changed to other sub-states + // (see "case STATE_ACCEPTED_DEFAULT" in typedCharacter() below), + // and should be restored back to STATE_ACCEPTED_DEFAULT after processing for each sub-state. + public static void backToAcceptedDefault() { + switch (sState) { + case STATE_SPACE_AFTER_ACCEPTED: + case STATE_PUNCTUATION_AFTER_ACCEPTED: + case STATE_IN_WORD: + sState = STATE_ACCEPTED_DEFAULT; + break; + } + } + public static void acceptedTyped(CharSequence typedWord) { sWordNotInDictionaryCount++; sState = STATE_PICKED_SUGGESTION; From faeed22612626d0c2a863fa2994569a8209817a3 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 31 May 2010 18:52:54 +0900 Subject: [PATCH 046/159] Add black resources Change-Id: Ibd1ac2610b70693975011f85e232348388245553 --- java/res/xml/kbd_symbols_black.xml | 141 ++++++++++++++++++ java/res/xml/kbd_symbols_shift_black.xml | 104 +++++++++++++ .../inputmethod/latin/KeyboardSwitcher.java | 38 +++-- .../inputmethod/latin/LatinKeyboard.java | 3 +- 4 files changed, 270 insertions(+), 16 deletions(-) create mode 100755 java/res/xml/kbd_symbols_black.xml create mode 100755 java/res/xml/kbd_symbols_shift_black.xml diff --git a/java/res/xml/kbd_symbols_black.xml b/java/res/xml/kbd_symbols_black.xml new file mode 100755 index 000000000..5652f7fca --- /dev/null +++ b/java/res/xml/kbd_symbols_black.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black.xml b/java/res/xml/kbd_symbols_shift_black.xml new file mode 100755 index 000000000..dc8425125 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_black.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 864bf73fa..fefe1cc42 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -91,14 +91,15 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha KeyboardSwitcher(Context context, LatinIME ims) { mContext = context; - mKeyboards = new HashMap(); - mSymbolsId = new KeyboardId(R.xml.kbd_symbols, false); - mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift, false); - mInputMethodService = ims; final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ims); - int mLayoutId = Integer.valueOf(prefs.getString(PREF_KEYBOARD_LAYOUT, DEFAULT_LAYOUT_ID)); + mLayoutId = Integer.valueOf(prefs.getString(PREF_KEYBOARD_LAYOUT, DEFAULT_LAYOUT_ID)); prefs.registerOnSharedPreferenceChangeListener(this); + + mKeyboards = new HashMap(); + mSymbolsId = makeSymbolsId(false); + mSymbolsShiftedId = makeSymbolsShiftedId(false); + mInputMethodService = ims; changeLatinKeyboardView(mLayoutId, false); } @@ -117,6 +118,16 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mInputView = inputView; } + private KeyboardId makeSymbolsId(boolean hasVoice) { + return new KeyboardId( + isBlackSym() ? R.xml.kbd_symbols_black : R.xml.kbd_symbols, hasVoice); + } + + private KeyboardId makeSymbolsShiftedId(boolean hasVoice) { + return new KeyboardId( + isBlackSym() ? R.xml.kbd_symbols_shift_black : R.xml.kbd_symbols_shift, hasVoice); + } + void makeKeyboards(boolean forceCreate) { if (forceCreate) mKeyboards.clear(); // Configuration change is coming after the keyboard gets recreated. So don't rely on that. @@ -126,9 +137,8 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha if (displayWidth == mLastDisplayWidth) return; mLastDisplayWidth = displayWidth; if (!forceCreate) mKeyboards.clear(); - mSymbolsId = new KeyboardId(R.xml.kbd_symbols, mHasVoice && !mVoiceOnPrimary); - mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift, - mHasVoice && !mVoiceOnPrimary); + mSymbolsId = makeSymbolsId(mHasVoice && !mVoiceOnPrimary); + mSymbolsShiftedId = makeSymbolsShiftedId(mHasVoice && !mVoiceOnPrimary); } /** @@ -227,7 +237,8 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha orig.updateConfiguration(conf, null); LatinKeyboard keyboard = new LatinKeyboard( mContext, id.mXml, id.mKeyboardMode); - keyboard.setVoiceMode(hasVoiceButton(id.mXml == R.xml.kbd_symbols), mHasVoice); + keyboard.setVoiceMode(hasVoiceButton(id.mXml == R.xml.kbd_symbols + || id.mXml == R.xml.kbd_symbols_black), mHasVoice); keyboard.setLanguageSwitcher(mLanguageSwitcher); keyboard.setBlackFlag(isBlackSym()); if (id.mKeyboardMode == KEYBOARDMODE_NORMAL @@ -256,8 +267,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha int keyboardRowsResId = isBlackSym() ? R.xml.kbd_qwerty_black : R.xml.kbd_qwerty; if (isSymbols) { return (mode == MODE_PHONE) - ? new KeyboardId(R.xml.kbd_phone_symbols, hasVoice) - : new KeyboardId(R.xml.kbd_symbols, hasVoice); + ? new KeyboardId(R.xml.kbd_phone_symbols, hasVoice) : makeSymbolsId(hasVoice); } switch (mode) { case MODE_TEXT: @@ -268,7 +278,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } break; case MODE_SYMBOLS: - return new KeyboardId(R.xml.kbd_symbols, hasVoice); + return makeSymbolsId(hasVoice); case MODE_PHONE: return new KeyboardId(R.xml.kbd_phone, hasVoice); case MODE_URL: @@ -404,8 +414,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha // TODO: Generalize for any theme public boolean isBlackSym () { - return (mLayoutId == 6 && (mLanguageSwitcher == null - || mLanguageSwitcher.getEnabledLanguages() == null - || mLanguageSwitcher.getInputLanguage().startsWith("en_"))); + return (mLayoutId == 6); } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index eba0ec04e..1a9350a83 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -123,7 +123,8 @@ public class LatinKeyboard extends Keyboard { setDefaultBounds(m123MicPreviewIcon); sSpacebarVerticalCorrection = res.getDimensionPixelOffset( R.dimen.spacebar_vertical_correction); - mIsAlphaKeyboard = xmlLayoutResId == R.xml.kbd_qwerty; + mIsAlphaKeyboard = xmlLayoutResId == R.xml.kbd_qwerty + || xmlLayoutResId == R.xml.kbd_qwerty_black; mSpaceKeyIndex = indexOf((int) ' '); } From c03c7cb2680841e7a80977a0efecd7923e98cd70 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 31 May 2010 20:20:48 +0900 Subject: [PATCH 047/159] Logging issues - Swap user's input and auto suggested words if they are same - Set user's input blank if punctuation is selected - Not count when user's input has one or more digit Change-Id: I8bbe1cb43287c06f8e284ada0712b1b9ec714dc3 --- java/src/com/android/inputmethod/latin/LatinIME.java | 4 ++-- .../com/android/inputmethod/latin/LatinImeLogger.java | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 3bf8238a8..b15de6bd5 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1551,9 +1551,9 @@ public class LatinIME extends InputMethodService // If this is a punctuation, apply it through the normal key press if (suggestion.length() == 1 && isWordSeparator(suggestion.charAt(0))) { // Word separators are suggested before the user inputs something. - // So, LatinImeLogger logs suggestion.charAt(0) as a user's input. + // So, LatinImeLogger logs "" as a user's input. LatinImeLogger.logOnClickSuggestion( - suggestion.toString(), suggestion.toString(), index); + "", suggestion.toString(), index); onKey(suggestion.charAt(0), null); if (ic != null) { ic.endBatchEdit(); diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 747340eea..002a3441e 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -135,7 +135,12 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (sDBG) { Log.d(TAG, "Check String safety: " + s); } - return !TextUtils.isDigitsOnly(s); + for (int i = 0; i < s.length(); ++i) { + if (Character.isDigit(s.charAt(i))) { + return false; + } + } + return true; } private void addCountEntry(long time) { @@ -344,6 +349,10 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void logOnAutoSuggestion(String before, String after) { if (sLogEnabled) { + if (before.equals(after)) { + before = ""; + after = ""; + } String[] strings = new String[] {before, after}; synchronized (LatinImeLogger.class) { sLastAutoSuggestBefore = before; From 1d2acf6ac4c0c5117749019a4650074d7feba097 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 31 May 2010 21:04:13 +0900 Subject: [PATCH 048/159] Change name of default theme Change-Id: Iee11ad318126793291b6acada35ee6c6c865ef48 --- java/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 0ba8dc56f..e310da7f6 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -336,7 +336,7 @@ Dazzle Blue Ribbon (High Contrast) Dazzle (High Contrast) - Ginger Bread + Default @string/layout_basic @@ -345,7 +345,7 @@ @string/layout_blue_ribbon_high @string/layout_dazzle @string/layout_dazzle_high - @string/layout_gingerbread + @string/layout_stone From f4973b3d41b5b3335fe64f188a8fb64677010840 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 31 May 2010 21:07:39 +0900 Subject: [PATCH 049/159] Clear user's input and manually picked suggestion Change-Id: I7bbad73b87a9341440621489db7fbdb4ad81c7f6 --- java/src/com/android/inputmethod/latin/LatinImeLogger.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 002a3441e..fd2ae22f5 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -342,6 +342,10 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang // TODO: Handle CharSequence instead of String public static void logOnClickSuggestion(String before, String after, int position) { if (sLogEnabled) { + if (before.equals(after)) { + before = ""; + after = ""; + } String[] strings = new String[] {before, after, String.valueOf(position)}; sLatinImeLogger.sendLogToDropBox(ID_CLICKSUGGESTION, strings); } From 7c00957e4635a8edd6a5f0525b12acac5e627a07 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 31 May 2010 20:37:27 +0900 Subject: [PATCH 050/159] Log version of IME Change-Id: I6e6dc751da05cdc94d38a2a819f659b9f1885414 --- .../inputmethod/latin/LatinImeLogger.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index fd2ae22f5..a871b4aff 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -18,6 +18,8 @@ package com.android.inputmethod.latin; import android.content.Context; import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager.NameNotFoundException; import android.os.DropBoxManager; import android.preference.PreferenceManager; import android.text.TextUtils; @@ -46,6 +48,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final int ID_ACTUAL_CHAR_COUNT = 6; private static final int ID_THEME_ID = 7; private static final int ID_SETTING_AUTO_COMPLETE = 8; + private static final int ID_VERSION = 9; private static final String PREF_ENABLE_LOG = "enable_logging"; private static final String PREF_DEBUG_MODE = "debug_mode"; @@ -180,6 +183,20 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mContext.getResources().getBoolean(R.bool.enable_autocorrect)))})); } + private void addVersionNameEntry(long time) { + if (sDBG) { + Log.d(TAG, "Log Version. (1)"); + } + try { + PackageInfo info = mContext.getPackageManager().getPackageInfo( + mContext.getPackageName(), 0); + mLogBuffer.add(new LogEntry (time, ID_VERSION, + new String[] {String.valueOf(info.versionCode), info.versionName})); + } catch (NameNotFoundException e) { + Log.e(TAG, "Could not find version name."); + } + } + private void flushPrivacyLogSafely() { if (sDBG) { Log.d(TAG, "Log theme Id. (" + mPrivacyLogBuffer.size() + ")"); @@ -270,6 +287,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang addCountEntry(now); addThemeIdEntry(now); addSettingsEntry(now); + addVersionNameEntry(now); String s = LogSerializer.createStringFromEntries(mLogBuffer); if (!TextUtils.isEmpty(s)) { if (sDBG) { From a146069dbd9fb3f0ecdbd2d80a43225ed9f48d66 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 31 May 2010 22:28:06 +0900 Subject: [PATCH 051/159] change version Change-Id: Ie43ec5fab87eeb5494b05fc5683c616937b5c444 --- java/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 096b86315..10be866af 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionName="0.12"> From e607db631d33b15c4ce451782023f8c5f7ef5044 Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 1 Jun 2010 16:13:29 +0900 Subject: [PATCH 052/159] Get the log of exceptions. And delete the gradient background. - Add a logger of Exception - Catch RuntimeException where bug reported. - Delete gradient background. Change-Id: I98b5fbc4a51163de7e56bee4f8312585d8e98eb7 --- java/res/drawable/background_gradient.xml | 22 --------- java/res/layout/input7.xml | 6 +-- java/res/layout/input7_popup.xml | 2 +- .../inputmethod/latin/KeyboardSwitcher.java | 39 ++++++++-------- .../inputmethod/latin/LatinImeLogger.java | 45 +++++++++++++++++++ .../inputmethod/latin/LatinKeyboardView.java | 6 ++- 6 files changed, 72 insertions(+), 48 deletions(-) delete mode 100644 java/res/drawable/background_gradient.xml diff --git a/java/res/drawable/background_gradient.xml b/java/res/drawable/background_gradient.xml deleted file mode 100644 index 52e2b16be..000000000 --- a/java/res/drawable/background_gradient.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/java/res/layout/input7.xml b/java/res/layout/input7.xml index 91697b656..6279f5d08 100755 --- a/java/res/layout/input7.xml +++ b/java/res/layout/input7.xml @@ -24,10 +24,10 @@ android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="@drawable/keyboard_background" android:keyBackground="@drawable/btn_keyboard_key_ginger" - android:background="@drawable/background_gradient" + android:keyTextSize="22dip" android:keyTextColor="@color/latinkeyboard_key_color_black" android:shadowColor="@color/latinkeyboard_key_color_white" - android:keyTextSize="22dip" android:popupLayout="@layout/input7_popup" - /> + /> diff --git a/java/res/layout/input7_popup.xml b/java/res/layout/input7_popup.xml index 56e2fbdc6..d1261b8cc 100755 --- a/java/res/layout/input7_popup.xml +++ b/java/res/layout/input7_popup.xml @@ -32,7 +32,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:keyBackground="@drawable/btn_keyboard_key_ginger" - android:background="@drawable/background_gradient" + android:background="@drawable/keyboard_background" android:keyTextColor="@color/latinkeyboard_key_color_black" android:shadowColor="@color/latinkeyboard_key_color_white" android:keyTextSize="22dip" diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index fefe1cc42..3eb135ebe 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -212,8 +212,12 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mInputView.setPreviewEnabled(true); KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols); - - LatinKeyboard keyboard = getKeyboard(id); + LatinKeyboard keyboard = null; + try { + keyboard = getKeyboard(id); + } catch (RuntimeException e) { + LatinImeLogger.logOnException(mode + "," + imeOptions + "," + isSymbols, e); + } if (mode == MODE_PHONE) { mInputView.setPhoneKeyboard(keyboard); @@ -271,12 +275,11 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } switch (mode) { case MODE_TEXT: - if (mTextMode == MODE_TEXT_QWERTY) { - return new KeyboardId(keyboardRowsResId, KEYBOARDMODE_NORMAL, true, hasVoice); - } else if (mTextMode == MODE_TEXT_ALPHA) { + if (mTextMode == MODE_TEXT_ALPHA) { return new KeyboardId(R.xml.kbd_alpha, KEYBOARDMODE_NORMAL, true, hasVoice); } - break; + // Normally mTextMode should be MODE_TEXT_QWERTY. + return new KeyboardId(keyboardRowsResId, KEYBOARDMODE_NORMAL, true, hasVoice); case MODE_SYMBOLS: return makeSymbolsId(hasVoice); case MODE_PHONE: @@ -301,19 +304,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha return mMode == MODE_TEXT; } - int getTextMode() { - return mTextMode; - } - - void setTextMode(int position) { - if (position < MODE_TEXT_COUNT && position >= 0) { - mTextMode = position; - } - if (isTextMode()) { - setKeyboardMode(MODE_TEXT, mImeOptions, mHasVoice); - } - } - int getTextModeCount() { return MODE_TEXT_COUNT; } @@ -387,11 +377,18 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private void changeLatinKeyboardView(int newLayout, boolean forceReset) { if (mLayoutId != newLayout || mInputView == null || forceReset) { + if (mInputView != null) { + mInputView.closing(); + } if (LAYOUTS.length <= newLayout) { newLayout = Integer.valueOf(DEFAULT_LAYOUT_ID); } - mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater().inflate( - LAYOUTS[newLayout], null); + try { + mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater().inflate( + LAYOUTS[newLayout], null); + } catch (RuntimeException e) { + LatinImeLogger.logOnException(mLayoutId + "," + newLayout, e); + } mInputView.setExtentionLayoutResId(LAYOUTS[newLayout]); mInputView.setOnKeyboardActionListener(mInputMethodService); mLayoutId = newLayout; diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index a871b4aff..b497c0c66 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -26,12 +26,16 @@ import android.text.TextUtils; import android.text.format.DateUtils; import android.util.Log; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; import java.util.ArrayList; import java.util.Collections; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIMELogs"; private static boolean sDBG = false; + // SUPPRESS_EXCEPTION should be true when released to public. + private static final boolean SUPPRESS_EXCEPTION = false; // DEFAULT_LOG_ENABLED should be false when released to public. private static final boolean DEFAULT_LOG_ENABLED = true; @@ -49,6 +53,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final int ID_THEME_ID = 7; private static final int ID_SETTING_AUTO_COMPLETE = 8; private static final int ID_VERSION = 9; + private static final int ID_EXCEPTION = 10; private static final String PREF_ENABLE_LOG = "enable_logging"; private static final String PREF_DEBUG_MODE = "debug_mode"; @@ -197,6 +202,13 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } + private void addExceptionEntry(long time, String[] data) { + if (sDBG) { + Log.d(TAG, "Log Exception. (1)"); + } + mLogBuffer.add(new LogEntry(time, ID_EXCEPTION, data)); + } + private void flushPrivacyLogSafely() { if (sDBG) { Log.d(TAG, "Log theme Id. (" + mPrivacyLogBuffer.size() + ")"); @@ -270,6 +282,16 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } break; + case ID_EXCEPTION: + dataStrings = (String[]) data; + if (dataStrings.length < 2) { + if (sDBG) { + Log.e(TAG, "The length of logged string array is invalid."); + } + break; + } + addExceptionEntry(System.currentTimeMillis(), dataStrings); + break; default: if (sDBG) { Log.e(TAG, "Log Tag is not entried."); @@ -299,6 +321,12 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mLastTimeSend = now; } + private void commitInternalAndStopSelf() { + Log.e(TAG, "Exception was caused and let's die."); + commitInternal(); + ((LatinIME) mContext).stopSelf(); + } + private synchronized void sendLogToDropBox(int tag, Object s) { long now = System.currentTimeMillis(); if (sDBG) { @@ -405,6 +433,23 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } + public static void logOnException(String metaData, RuntimeException e) { + if (sLogEnabled) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(baos); + e.printStackTrace(ps); + String exceptionString = new String(baos.toByteArray()); + sLatinImeLogger.sendLogToDropBox( + ID_EXCEPTION, new String[] {metaData, exceptionString}); + Log.e(TAG, "Exception: " + exceptionString); + if (SUPPRESS_EXCEPTION) { + sLatinImeLogger.commitInternalAndStopSelf(); + } else { + throw e; + } + } + } + private static class LogSerializer { private static void appendWithLength(StringBuffer sb, String data) { sb.append(data.length()); diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index 6e3226ae5..46f04b8a2 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -472,7 +472,11 @@ public class LatinKeyboardView extends KeyboardView { @Override public void draw(Canvas c) { - super.draw(c); + try { + super.draw(c); + } catch (RuntimeException e) { + LatinImeLogger.logOnException("draw in LatinKeybaordView", e); + } if (DEBUG_AUTO_PLAY) { if (mPlaying) { mHandler2.removeMessages(MSG_TOUCH_DOWN); From 928ebfeaf867341fd4a0ee03b0cf55e006688f1a Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 1 Jun 2010 19:58:36 +0900 Subject: [PATCH 053/159] Add aggressive cancellation for auto suggestion - Add ring buffer - Count separator for auto suggestion - Add a test for ring buffer Change-Id: Id4a0aa00ceb1b055b8fc96c45e100d318cceb2ab --- java/AndroidManifest.xml | 2 +- .../android/inputmethod/latin/LatinIME.java | 6 +- .../inputmethod/latin/LatinImeLogger.java | 134 ++++++++++++++---- tests/Android.mk | 2 +- tests/AndroidManifest.xml | 2 +- .../inputmethod/latin/ImeLoggerTests.java | 59 ++++++++ .../inputmethod/latin/tests/SuggestTests.java | 9 +- 7 files changed, 176 insertions(+), 38 deletions(-) create mode 100644 tests/src/com/android/inputmethod/latin/ImeLoggerTests.java diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 10be866af..b4a5ab60c 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionName="0.14"> diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index b15de6bd5..35edb8ae7 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -219,7 +219,7 @@ public class LatinIME extends InputMethodService private final float FX_VOLUME = -1.0f; private boolean mSilentMode; - private String mWordSeparators; + /* package */ String mWordSeparators; private String mSentenceSeparators; private VoiceInput mVoiceInput; private VoiceResults mVoiceResults = new VoiceResults(); @@ -955,7 +955,7 @@ public class LatinIME extends InputMethodService case Keyboard.KEYCODE_DELETE: handleBackspace(); mDeleteCount++; - LatinImeLogger.logOnDelete(1); + LatinImeLogger.logOnDelete(); break; case Keyboard.KEYCODE_SHIFT: handleShift(); @@ -996,12 +996,12 @@ public class LatinIME extends InputMethodService if (primaryCode != KEYCODE_ENTER) { mJustAddedAutoSpace = false; } + LatinImeLogger.logOnInputChar((char)primaryCode); if (isWordSeparator(primaryCode)) { handleSeparator(primaryCode); } else { handleCharacter(primaryCode, keyCodes); } - LatinImeLogger.logOnInputChar(1); // Cancel the just reverted state mJustRevertedSeparator = null; } diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index b497c0c66..736b0af54 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -33,7 +33,8 @@ import java.util.Collections; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIMELogs"; - private static boolean sDBG = false; + private static final boolean DBG = true; + private static boolean sLOGPRINT = false; // SUPPRESS_EXCEPTION should be true when released to public. private static final boolean SUPPRESS_EXCEPTION = false; // DEFAULT_LOG_ENABLED should be false when released to public. @@ -43,6 +44,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final long MINIMUMCOUNTINTERVAL = 20 * DateUtils.SECOND_IN_MILLIS; // 20 sec private static final long MINIMUMSENDSIZE = 40; private static final char SEPARATER = ';'; + private static final char NULL_CHAR = '\uFFFC'; private static final int ID_CLICKSUGGESTION = 0; private static final int ID_AUTOSUGGESTIONCANCELLED = 1; private static final int ID_AUTOSUGGESTION = 2; @@ -60,14 +62,17 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final String PREF_AUTO_COMPLETE = "auto_complete"; public static boolean sLogEnabled = true; - private static LatinImeLogger sLatinImeLogger = new LatinImeLogger(); + /* package */ static LatinImeLogger sLatinImeLogger = new LatinImeLogger(); // Store the last auto suggested word. // This is required for a cancellation log of auto suggestion of that word. - private static String sLastAutoSuggestBefore; - private static String sLastAutoSuggestAfter; + /* package */ static String sLastAutoSuggestBefore; + /* package */ static String sLastAutoSuggestAfter; + /* package */ static String sLastAutoSuggestSeparator; private ArrayList mLogBuffer = null; private ArrayList mPrivacyLogBuffer = null; + /* package */ RingCharBuffer mRingCharBuffer = null; + private Context mContext = null; private DropBoxManager mDropBox = null; private long mLastTimeActive; @@ -116,11 +121,12 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mActualCharCount = 0; mLogBuffer = new ArrayList(); mPrivacyLogBuffer = new ArrayList(); + mRingCharBuffer = new RingCharBuffer(context); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); sLogEnabled = prefs.getBoolean(PREF_ENABLE_LOG, DEFAULT_LOG_ENABLED); mThemeId = prefs.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT, KeyboardSwitcher.DEFAULT_LAYOUT_ID); - sDBG = prefs.getBoolean(PREF_DEBUG_MODE, sDBG); + sLOGPRINT = prefs.getBoolean(PREF_DEBUG_MODE, sLOGPRINT); prefs.registerOnSharedPreferenceChangeListener(this); } @@ -134,13 +140,14 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mActualCharCount = 0; mLogBuffer.clear(); mPrivacyLogBuffer.clear(); + mRingCharBuffer.reset(); } /** * Check if the input string is safe as an entry or not. */ private static boolean checkStringDataSafe(String s) { - if (sDBG) { + if (DBG) { Log.d(TAG, "Check String safety: " + s); } for (int i = 0; i < s.length(); ++i) { @@ -152,7 +159,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addCountEntry(long time) { - if (sDBG) { + if (sLOGPRINT) { Log.d(TAG, "Log counts. (4)"); } mLogBuffer.add(new LogEntry (time, ID_DELETE_COUNT, @@ -171,7 +178,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addThemeIdEntry(long time) { - if (sDBG) { + if (sLOGPRINT) { Log.d(TAG, "Log theme Id. (1)"); } mLogBuffer.add(new LogEntry (time, ID_THEME_ID, @@ -179,7 +186,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addSettingsEntry(long time) { - if (sDBG) { + if (sLOGPRINT) { Log.d(TAG, "Log settings. (1)"); } final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); @@ -189,7 +196,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addVersionNameEntry(long time) { - if (sDBG) { + if (sLOGPRINT) { Log.d(TAG, "Log Version. (1)"); } try { @@ -203,15 +210,15 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addExceptionEntry(long time, String[] data) { - if (sDBG) { + if (sLOGPRINT) { Log.d(TAG, "Log Exception. (1)"); } mLogBuffer.add(new LogEntry(time, ID_EXCEPTION, data)); } private void flushPrivacyLogSafely() { - if (sDBG) { - Log.d(TAG, "Log theme Id. (" + mPrivacyLogBuffer.size() + ")"); + if (sLOGPRINT) { + Log.d(TAG, "Log obfuscated data. (" + mPrivacyLogBuffer.size() + ")"); } long now = System.currentTimeMillis(); Collections.sort(mPrivacyLogBuffer); @@ -248,7 +255,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang ++mWordCount; String[] dataStrings = (String[]) data; if (dataStrings.length < 2) { - if (sDBG) { + if (DBG) { Log.e(TAG, "The length of logged string array is invalid."); } break; @@ -258,7 +265,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mPrivacyLogBuffer.add( new LogEntry (System.currentTimeMillis(), tag, dataStrings)); } else { - if (sDBG) { + if (DBG) { Log.d(TAG, "Skipped to add an entry because data is unsafe."); } } @@ -267,7 +274,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang --mWordCount; dataStrings = (String[]) data; if (dataStrings.length < 2) { - if (sDBG) { + if (DBG) { Log.e(TAG, "The length of logged string array is invalid."); } break; @@ -277,7 +284,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mPrivacyLogBuffer.add( new LogEntry (System.currentTimeMillis(), tag, dataStrings)); } else { - if (sDBG) { + if (DBG) { Log.d(TAG, "Skipped to add an entry because data is unsafe."); } } @@ -285,7 +292,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang case ID_EXCEPTION: dataStrings = (String[]) data; if (dataStrings.length < 2) { - if (sDBG) { + if (DBG) { Log.e(TAG, "The length of logged string array is invalid."); } break; @@ -293,7 +300,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang addExceptionEntry(System.currentTimeMillis(), dataStrings); break; default: - if (sDBG) { + if (DBG) { Log.e(TAG, "Log Tag is not entried."); } break; @@ -301,7 +308,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void commitInternal() { - if (sDBG) { + if (sLOGPRINT) { Log.d(TAG, "Commit (" + mLogBuffer.size() + ")"); } flushPrivacyLogSafely(); @@ -312,7 +319,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang addVersionNameEntry(now); String s = LogSerializer.createStringFromEntries(mLogBuffer); if (!TextUtils.isEmpty(s)) { - if (sDBG) { + if (sLOGPRINT) { Log.d(TAG, "Commit log: " + s); } mDropBox.addText(TAG, s); @@ -329,7 +336,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private synchronized void sendLogToDropBox(int tag, Object s) { long now = System.currentTimeMillis(); - if (sDBG) { + if (DBG) { String out = ""; if (s instanceof String[]) { for (String str: ((String[]) s)) { @@ -367,7 +374,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang KeyboardSwitcher.DEFAULT_LAYOUT_ID); addThemeIdEntry(mLastTimeActive); } else if (PREF_DEBUG_MODE.equals(key)) { - sDBG = sharedPreferences.getBoolean(PREF_DEBUG_MODE, sDBG); + sLOGPRINT = sharedPreferences.getBoolean(PREF_DEBUG_MODE, sLOGPRINT); } } @@ -403,7 +410,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang before = ""; after = ""; } - String[] strings = new String[] {before, after}; + sLastAutoSuggestSeparator = + String.valueOf(sLatinImeLogger.mRingCharBuffer.getLastChar()); + String[] strings = new String[] {before, after, sLastAutoSuggestSeparator}; synchronized (LatinImeLogger.class) { sLastAutoSuggestBefore = before; sLastAutoSuggestAfter = after; @@ -415,21 +424,33 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void logOnAutoSuggestionCanceled() { if (sLogEnabled) { if (sLastAutoSuggestBefore != null && sLastAutoSuggestAfter != null) { - String[] strings = new String[] {sLastAutoSuggestBefore, sLastAutoSuggestAfter}; + String[] strings = new String[] { + sLastAutoSuggestBefore, sLastAutoSuggestAfter, sLastAutoSuggestSeparator}; sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTIONCANCELLED, strings); } + synchronized (LatinImeLogger.class) { + sLastAutoSuggestBefore = ""; + sLastAutoSuggestAfter = ""; + } } } - public static void logOnDelete(int length) { + public static void logOnDelete() { if (sLogEnabled) { - sLatinImeLogger.sendLogToDropBox(ID_DELETE_COUNT, length); + String mLastWord = sLatinImeLogger.mRingCharBuffer.getLastString(); + if (!TextUtils.isEmpty(mLastWord) + && mLastWord.equalsIgnoreCase(sLastAutoSuggestBefore)) { + logOnAutoSuggestionCanceled(); + } + sLatinImeLogger.mRingCharBuffer.pop(); + sLatinImeLogger.sendLogToDropBox(ID_DELETE_COUNT, 1); } } - public static void logOnInputChar(int length) { + public static void logOnInputChar(char c) { if (sLogEnabled) { - sLatinImeLogger.sendLogToDropBox(ID_INPUT_COUNT, length); + sLatinImeLogger.mRingCharBuffer.push(c); + sLatinImeLogger.sendLogToDropBox(ID_INPUT_COUNT, 1); } } @@ -478,4 +499,59 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang return sb.toString(); } } + + /* package */ static class RingCharBuffer { + final int BUFSIZE = 20; + private Context mContext; + private int mEnd = 0; + /* package */ int length = 0; + private char[] mCharBuf = new char[BUFSIZE]; + + public RingCharBuffer(Context context) { + mContext = context; + } + + private int normalize(int in) { + int ret = in % BUFSIZE; + return ret < 0 ? ret + BUFSIZE : ret; + } + public void push(char c) { + mCharBuf[mEnd] = c; + mEnd = normalize(mEnd + 1); + if (length < BUFSIZE) { + ++length; + } + } + public char pop() { + if (length < 1) { + return NULL_CHAR; + } else { + mEnd = normalize(mEnd - 1); + --length; + return mCharBuf[mEnd]; + } + } + public char getLastChar() { + if (length < 1) { + return NULL_CHAR; + } else { + return mCharBuf[normalize(mEnd - 1)]; + } + } + public String getLastString() { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; ++i) { + char c = mCharBuf[normalize(mEnd - 1 - i)]; + if (!((LatinIME)mContext).isWordSeparator(c)) { + sb.append(c); + } else { + break; + } + } + return sb.reverse().toString(); + } + public void reset() { + length = 0; + } + } } diff --git a/tests/Android.mk b/tests/Android.mk index e72587ddd..60e82d5c2 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -10,7 +10,7 @@ LOCAL_JAVA_LIBRARIES := android.test.runner # Include all test java files. LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_PACKAGE_NAME := LatinIMETests +LOCAL_PACKAGE_NAME := LatinIME2Tests LOCAL_INSTRUMENTATION_FOR := LatinIme2Google diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml index 210e81489..66cecee8b 100644 --- a/tests/AndroidManifest.xml +++ b/tests/AndroidManifest.xml @@ -27,7 +27,7 @@ diff --git a/tests/src/com/android/inputmethod/latin/ImeLoggerTests.java b/tests/src/com/android/inputmethod/latin/ImeLoggerTests.java new file mode 100644 index 000000000..234559bb7 --- /dev/null +++ b/tests/src/com/android/inputmethod/latin/ImeLoggerTests.java @@ -0,0 +1,59 @@ +package com.android.inputmethod.latin; + +import android.test.ServiceTestCase; + +public class ImeLoggerTests extends ServiceTestCase { + + private static final String WORD_SEPARATORS + = ".\u0009\u0020,;:!?\n()[]*&@{}<>;_+=|\\u0022"; + + public ImeLoggerTests() { + super(LatinIME.class); + } + static LatinImeLogger sLogger; + @Override + protected void setUp() { + try { + super.setUp(); + } catch (Exception e) { + e.printStackTrace(); + } + setupService(); + // startService(null); // can't be started because VoiceInput can't be found. + final LatinIME context = getService(); + context.mWordSeparators = WORD_SEPARATORS; + LatinImeLogger.init(context); + sLogger = LatinImeLogger.sLatinImeLogger; + } + /*********************** Tests *********************/ + public void testRingBuffer() { + for (int i = 0; i < sLogger.mRingCharBuffer.BUFSIZE * 2; ++i) { + LatinImeLogger.logOnDelete(); + } + assertEquals("", sLogger.mRingCharBuffer.getLastString()); + LatinImeLogger.logOnInputChar('t'); + LatinImeLogger.logOnInputChar('g'); + LatinImeLogger.logOnInputChar('i'); + LatinImeLogger.logOnInputChar('s'); + LatinImeLogger.logOnInputChar(' '); + LatinImeLogger.logOnAutoSuggestion("tgis", "this"); + LatinImeLogger.logOnInputChar(' '); + LatinImeLogger.logOnDelete(); + assertEquals("", sLogger.mRingCharBuffer.getLastString()); + LatinImeLogger.logOnDelete(); + assertEquals("tgis", sLogger.mRingCharBuffer.getLastString()); + assertEquals("tgis", LatinImeLogger.sLastAutoSuggestBefore); + LatinImeLogger.logOnAutoSuggestionCanceled(); + assertEquals("", LatinImeLogger.sLastAutoSuggestBefore); + LatinImeLogger.logOnDelete(); + assertEquals("tgi", sLogger.mRingCharBuffer.getLastString()); + for (int i = 0; i < sLogger.mRingCharBuffer.BUFSIZE * 2; ++i) { + LatinImeLogger.logOnDelete(); + } + assertEquals("", sLogger.mRingCharBuffer.getLastString()); + for (int i = 0; i < sLogger.mRingCharBuffer.BUFSIZE * 2; ++i) { + LatinImeLogger.logOnInputChar('a'); + } + assertEquals(sLogger.mRingCharBuffer.BUFSIZE, sLogger.mRingCharBuffer.length); + } +} diff --git a/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java b/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java index 9401d926a..0d3babfbc 100644 --- a/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java +++ b/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java @@ -241,8 +241,11 @@ public class SuggestTests extends AndroidTestCase { * Are accented forms of words suggested as corrections? */ public void testAccents() { - assertTrue(isDefaultCorrection("nino", "ni\u00F1o")); // nio - assertTrue(isDefaultCorrection("nimo", "ni\u00F1o")); // nio - assertTrue(isDefaultCorrection("maria", "Mar\u00EDa")); // Mara + // nio + assertTrue(isDefaultCorrection("nino", "ni\u00F1o")); + // nio + assertTrue(isDefaultCorrection("nimo", "ni\u00F1o")); + // Mara + assertTrue(isDefaultCorrection("maria", "Mar\u00EDa")); } } From 7f96616c7595c69ea6ce9192d869a0c40ddb752e Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 2 Jun 2010 13:20:18 +0900 Subject: [PATCH 054/159] Add minSdkVersion Change-Id: Id0d95983b98dcb3eda52705cc709356ce53991c6 --- java/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index b4a5ab60c..53044fca9 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -3,6 +3,8 @@ android:versionCode="9" android:versionName="0.14"> + + From 4ee3676cf38f3f9b2587f37e259b6d7511ef4ab1 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 2 Jun 2010 18:30:27 +0900 Subject: [PATCH 055/159] Check suggested words whether they are from mainDic or not - Added counters for suggestions by dictionarys - Added a counter for cancelled suggestions Change-Id: Ia7d3a73855b1e82b60a010f18dba4e1c0fe1c2bb --- .../inputmethod/latin/AutoDictionary.java | 4 +- .../inputmethod/latin/BinaryDictionary.java | 10 ++-- .../inputmethod/latin/ContactsDictionary.java | 19 +++---- .../android/inputmethod/latin/Dictionary.java | 3 +- .../latin/ExpandableDictionary.java | 11 ++-- .../latin/InputLanguageSelection.java | 2 +- .../android/inputmethod/latin/LatinIME.java | 4 +- .../inputmethod/latin/LatinImeLogger.java | 51 +++++++++++++++++++ .../android/inputmethod/latin/Suggest.java | 21 ++++++-- .../inputmethod/latin/UserDictionary.java | 3 +- 10 files changed, 98 insertions(+), 30 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/AutoDictionary.java b/java/src/com/android/inputmethod/latin/AutoDictionary.java index 93f1985ca..94331d3f2 100644 --- a/java/src/com/android/inputmethod/latin/AutoDictionary.java +++ b/java/src/com/android/inputmethod/latin/AutoDictionary.java @@ -85,8 +85,8 @@ public class AutoDictionary extends ExpandableDictionary { private static DatabaseHelper mOpenHelper = null; - public AutoDictionary(Context context, LatinIME ime, String locale) { - super(context); + public AutoDictionary(Context context, LatinIME ime, String locale, int dicTypeId) { + super(context, dicTypeId); mIme = ime; mLocale = locale; if (mOpenHelper == null) { diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 5d3df4e6c..9e7dfa3a1 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -24,7 +24,6 @@ import java.nio.channels.Channels; import java.util.Arrays; import android.content.Context; -import android.content.res.AssetManager; import android.util.Log; /** @@ -40,6 +39,7 @@ public class BinaryDictionary extends Dictionary { private static final int TYPED_LETTER_MULTIPLIER = 2; private static final boolean ENABLE_MISSED_CHARACTERS = true; + private int mDicTypeId; private int mNativeDict; private int mDictLength; private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES]; @@ -62,10 +62,11 @@ public class BinaryDictionary extends Dictionary { * @param context application context for reading resources * @param resId the resource containing the raw binary dictionary */ - public BinaryDictionary(Context context, int resId) { + public BinaryDictionary(Context context, int resId, int dicTypeId) { if (resId != 0) { loadDictionary(context, resId); } + mDicTypeId = dicTypeId; } /** @@ -73,7 +74,7 @@ public class BinaryDictionary extends Dictionary { * @param context application context for reading resources * @param resId the resource containing the raw binary dictionary */ - public BinaryDictionary(Context context, ByteBuffer byteBuffer) { + public BinaryDictionary(Context context, ByteBuffer byteBuffer, int dicTypeId) { if (byteBuffer != null) { if (byteBuffer.isDirect()) { mNativeDictDirectBuffer = byteBuffer; @@ -86,6 +87,7 @@ public class BinaryDictionary extends Dictionary { mNativeDict = openNative(mNativeDictDirectBuffer, TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); } + mDicTypeId = dicTypeId; } private native int openNative(ByteBuffer bb, int typedLetterMultiplier, int fullWordMultiplier); @@ -166,7 +168,7 @@ public class BinaryDictionary extends Dictionary { len++; } if (len > 0) { - callback.addWord(mOutputChars, start, len, mFrequencies[j]); + callback.addWord(mOutputChars, start, len, mFrequencies[j], mDicTypeId); } } } diff --git a/java/src/com/android/inputmethod/latin/ContactsDictionary.java b/java/src/com/android/inputmethod/latin/ContactsDictionary.java index 15edb706a..f5ff865c4 100644 --- a/java/src/com/android/inputmethod/latin/ContactsDictionary.java +++ b/java/src/com/android/inputmethod/latin/ContactsDictionary.java @@ -20,7 +20,6 @@ import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; -import android.os.AsyncTask; import android.os.SystemClock; import android.provider.ContactsContract.Contacts; @@ -37,21 +36,23 @@ public class ContactsDictionary extends ExpandableDictionary { private long mLastLoadedContacts; - public ContactsDictionary(Context context) { - super(context); + public ContactsDictionary(Context context, int dicTypeId) { + super(context, dicTypeId); // 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) { - setRequiresReload(true); - } - }); + cres.registerContentObserver( + Contacts.CONTENT_URI, true,mObserver = new ContentObserver(null) { + @Override + public void onChange(boolean self) { + setRequiresReload(true); + } + }); loadDictionary(); } + @Override public synchronized void close() { if (mObserver != null) { getContext().getContentResolver().unregisterContentObserver(mObserver); diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java index e7b526663..e38a32fa1 100644 --- a/java/src/com/android/inputmethod/latin/Dictionary.java +++ b/java/src/com/android/inputmethod/latin/Dictionary.java @@ -45,9 +45,10 @@ abstract public class Dictionary { * @param wordLength length of valid characters in the character array * @param frequency the frequency of occurence. This is normalized between 1 and 255, but * can exceed those limits + * @param dicTypeId of the dictionary where word was from * @return true if the word was added, false if no more words are required */ - boolean addWord(char[] word, int wordOffset, int wordLength, int frequency); + boolean addWord(char[] word, int wordOffset, int wordLength, int frequency, int dicTypeId); } /** diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java index 46bc41c42..e2a812796 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java @@ -16,11 +16,8 @@ package com.android.inputmethod.latin; -import com.android.inputmethod.latin.Dictionary.WordCallback; - import android.content.Context; import android.os.AsyncTask; -import android.os.SystemClock; /** * Base class for an in-memory dictionary that can grow dynamically and can @@ -29,6 +26,7 @@ import android.os.SystemClock; public class ExpandableDictionary extends Dictionary { private Context mContext; private char[] mWordBuilder = new char[MAX_WORD_LENGTH]; + private int mDicTypeId; private int mMaxDepth; private int mInputLength; private int[] mNextLettersFrequencies; @@ -75,10 +73,11 @@ public class ExpandableDictionary extends Dictionary { private int[][] mCodes; - ExpandableDictionary(Context context) { + ExpandableDictionary(Context context, int dicTypeId) { mContext = context; clearDictionary(); mCodes = new int[MAX_WORD_LENGTH][]; + mDicTypeId = dicTypeId; } public void loadDictionary() { @@ -267,7 +266,7 @@ public class ExpandableDictionary extends Dictionary { if (completion) { word[depth] = c; if (terminal) { - if (!callback.addWord(word, 0, depth + 1, freq * snr)) { + if (!callback.addWord(word, 0, depth + 1, freq * snr, mDicTypeId)) { return; } // Add to frequency of next letters for predictive correction @@ -305,7 +304,7 @@ public class ExpandableDictionary extends Dictionary { || !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); + callback.addWord(word, 0, depth + 1, finalFreq, mDicTypeId); } } if (children != null) { diff --git a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java index 5e835e543..718fda18d 100644 --- a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java +++ b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java @@ -99,7 +99,7 @@ public class InputLanguageSelection extends PreferenceActivity { boolean haveDictionary = false; conf.locale = locale; res.updateConfiguration(conf, res.getDisplayMetrics()); - BinaryDictionary bd = new BinaryDictionary(this, R.raw.main); + BinaryDictionary bd = new BinaryDictionary(this, R.raw.main, Suggest.DIC_MAIN); // Is the dictionary larger than a placeholder? Arbitrarily chose a lower limit of // 4000-5000 words, whereas the LARGE_DICTIONARY is about 20000+ words. if (bd.getSize() > Suggest.LARGE_DICTIONARY_THRESHOLD / 4) { diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 35edb8ae7..93c69ee71 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -331,12 +331,12 @@ public class LatinIME extends InputMethodService if (mUserDictionary != null) mUserDictionary.close(); mUserDictionary = new UserDictionary(this, mInputLocale); if (mContactsDictionary == null) { - mContactsDictionary = new ContactsDictionary(this); + mContactsDictionary = new ContactsDictionary(this, Suggest.DIC_CONTACTS); } if (mAutoDictionary != null) { mAutoDictionary.close(); } - mAutoDictionary = new AutoDictionary(this, this, mInputLocale); + mAutoDictionary = new AutoDictionary(this, this, mInputLocale, Suggest.DIC_AUTO); mSuggest.setUserDictionary(mUserDictionary); mSuggest.setContactsDictionary(mContactsDictionary); mSuggest.setAutoDictionary(mAutoDictionary); diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 736b0af54..4f757d721 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -29,7 +29,9 @@ import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIMELogs"; @@ -56,6 +58,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final int ID_SETTING_AUTO_COMPLETE = 8; private static final int ID_VERSION = 9; private static final int ID_EXCEPTION = 10; + private static final int ID_SUGGESTIONCOUNT = 11; private static final String PREF_ENABLE_LOG = "enable_logging"; private static final String PREF_DEBUG_MODE = "debug_mode"; @@ -68,6 +71,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang /* package */ static String sLastAutoSuggestBefore; /* package */ static String sLastAutoSuggestAfter; /* package */ static String sLastAutoSuggestSeparator; + private static HashMap sSuggestDicMap = new HashMap(); private ArrayList mLogBuffer = null; private ArrayList mPrivacyLogBuffer = null; @@ -83,6 +87,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private int mDeleteCount; private int mInputCount; private int mWordCount; + private int[] mAutoSuggestCountPerDic = new int[Suggest.DIC_TYPE_LAST_ID + 1]; + private int mAutoCancelledCount; // ActualCharCount includes all characters that were completed. private int mActualCharCount; @@ -119,6 +125,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mInputCount = 0; mWordCount = 0; mActualCharCount = 0; + Arrays.fill(mAutoSuggestCountPerDic, 0); + mAutoCancelledCount = 0; mLogBuffer = new ArrayList(); mPrivacyLogBuffer = new ArrayList(); mRingCharBuffer = new RingCharBuffer(context); @@ -138,6 +146,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mInputCount = 0; mWordCount = 0; mActualCharCount = 0; + Arrays.fill(mAutoSuggestCountPerDic, 0); + mAutoCancelledCount = 0; mLogBuffer.clear(); mPrivacyLogBuffer.clear(); mRingCharBuffer.reset(); @@ -177,6 +187,18 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mLastTimeCountEntry = time; } + private void addSuggestionCountEntry(long time) { + if (sLOGPRINT) { + Log.d(TAG, "log suggest counts. (1)"); + } + String[] s = new String[mAutoSuggestCountPerDic.length + 1]; + s[0] = String.valueOf(mAutoCancelledCount); + for (int i = 1; i < s.length; ++i) { + s[i] = String.valueOf(mAutoSuggestCountPerDic[i - 1]); + } + mLogBuffer.add(new LogEntry(time, ID_SUGGESTIONCOUNT, s)); + } + private void addThemeIdEntry(long time) { if (sLOGPRINT) { Log.d(TAG, "Log theme Id. (1)"); @@ -317,6 +339,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang addThemeIdEntry(now); addSettingsEntry(now); addVersionNameEntry(now); + addSuggestionCountEntry(now); String s = LogSerializer.createStringFromEntries(mLogBuffer); if (!TextUtils.isEmpty(s)) { if (sLOGPRINT) { @@ -406,6 +429,21 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void logOnAutoSuggestion(String before, String after) { if (sLogEnabled) { + if (!sSuggestDicMap.containsKey(after)) { + if (DBG) { + Log.e(TAG, "logOnAutoSuggestion was cancelled: came from unknown source."); + } + return; + } + int dicId = sSuggestDicMap.get(after); + sLatinImeLogger.mAutoSuggestCountPerDic[dicId]++; + sSuggestDicMap.clear(); + if (dicId != Suggest.DIC_MAIN) { + if (DBG) { + Log.d(TAG, "logOnAutoSuggestion was cancelled: didn't come from main dic."); + } + return; + } if (before.equals(after)) { before = ""; after = ""; @@ -423,6 +461,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void logOnAutoSuggestionCanceled() { if (sLogEnabled) { + sLatinImeLogger.mAutoCancelledCount++; if (sLastAutoSuggestBefore != null && sLastAutoSuggestAfter != null) { String[] strings = new String[] { sLastAutoSuggestBefore, sLastAutoSuggestAfter, sLastAutoSuggestSeparator}; @@ -471,6 +510,18 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } + public static void onStartSuggestion() { + if (sLogEnabled) { + sSuggestDicMap.clear(); + } + } + + public static void onAddSuggestedWord(String word, int typeId) { + if (sLogEnabled) { + sSuggestDicMap.put(word, typeId); + } + } + private static class LogSerializer { private static void appendWithLength(StringBuffer sb, String data) { sb.append(data.length()); diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 010913d6d..8ef6c07f8 100755 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -38,6 +38,14 @@ public class Suggest implements Dictionary.WordCallback { public static final int CORRECTION_BASIC = 1; public static final int CORRECTION_FULL = 2; + public static final int DIC_USER_TYPED = 0; + public static final int DIC_MAIN = 1; + public static final int DIC_USER = 2; + public static final int DIC_AUTO = 3; + public static final int DIC_CONTACTS = 4; + // If you add a type of dictionary, increment DIC_TYPE_LAST_ID + public static final int DIC_TYPE_LAST_ID = 4; + static final int LARGE_DICTIONARY_THRESHOLD = 200 * 1000; private BinaryDictionary mMainDict; @@ -69,12 +77,12 @@ public class Suggest implements Dictionary.WordCallback { private int mCorrectionMode = CORRECTION_BASIC; public Suggest(Context context, int dictionaryResId) { - mMainDict = new BinaryDictionary(context, dictionaryResId); + mMainDict = new BinaryDictionary(context, dictionaryResId, DIC_MAIN); initPool(); } public Suggest(Context context, ByteBuffer byteBuffer) { - mMainDict = new BinaryDictionary(context, byteBuffer); + mMainDict = new BinaryDictionary(context, byteBuffer, DIC_MAIN); initPool(); } @@ -177,6 +185,7 @@ public class Suggest implements Dictionary.WordCallback { */ public List getSuggestions(View view, WordComposer wordComposer, boolean includeTypedWordIfValid) { + LatinImeLogger.onStartSuggestion(); mHaveCorrection = false; mCapitalize = wordComposer.isCapitalized(); collectGarbage(); @@ -191,6 +200,7 @@ public class Suggest implements Dictionary.WordCallback { } else { mLowerOriginalWord = ""; } + LatinImeLogger.onAddSuggestedWord(mOriginalWord.toString(), Suggest.DIC_USER_TYPED); // Search the dictionary only if there are at least 2 characters if (wordComposer.size() > 1) { if (mUserDictionary != null || mContactsDictionary != null) { @@ -301,7 +311,8 @@ public class Suggest implements Dictionary.WordCallback { return false; } - public boolean addWord(final char[] word, final int offset, final int length, final int freq) { + public boolean addWord(final char[] word, final int offset, final int length, + final int freq, final int dicTypeId) { int pos = 0; final int[] priorities = mPriorities; final int prefMaxSuggestions = mPrefMaxSuggestions; @@ -320,7 +331,7 @@ public class Suggest implements Dictionary.WordCallback { pos++; } } - + if (pos >= prefMaxSuggestions) { return true; } @@ -345,6 +356,8 @@ public class Suggest implements Dictionary.WordCallback { if (garbage instanceof StringBuilder) { mStringPool.add(garbage); } + } else { + LatinImeLogger.onAddSuggestedWord(sb.toString(), dicTypeId); } return true; } diff --git a/java/src/com/android/inputmethod/latin/UserDictionary.java b/java/src/com/android/inputmethod/latin/UserDictionary.java index e8ca33af3..3315cf6c9 100644 --- a/java/src/com/android/inputmethod/latin/UserDictionary.java +++ b/java/src/com/android/inputmethod/latin/UserDictionary.java @@ -38,7 +38,7 @@ public class UserDictionary extends ExpandableDictionary { private String mLocale; public UserDictionary(Context context, String locale) { - super(context); + super(context, Suggest.DIC_USER); mLocale = locale; // Perform a managed query. The Activity will handle closing and requerying the cursor // when needed. @@ -54,6 +54,7 @@ public class UserDictionary extends ExpandableDictionary { loadDictionary(); } + @Override public synchronized void close() { if (mObserver != null) { getContext().getContentResolver().unregisterContentObserver(mObserver); From 0175d7da21f62a97fdae88ca5343c1b5127f8529 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 2 Jun 2010 20:16:38 +0900 Subject: [PATCH 056/159] Add additional punctuations to suggestion strip. Bug: 2729632 Change-Id: I5a3d47fee2a09da06b395529c4eccce6d14ecb9d --- java/res/values/donottranslate.xml | 4 ++-- .../android/inputmethod/latin/LatinIME.java | 20 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml index d5017353d..b7bfd9c3a 100644 --- a/java/res/values/donottranslate.xml +++ b/java/res/values/donottranslate.xml @@ -21,9 +21,9 @@ .\u0009\u0020,;:!?\n()[]*&@{}/<>_+=|\u0022 - .,!? + .,!?) - !?,@_ + !?,\u0022\u0027:()-/@_ diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 93c69ee71..50b1d38cd 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -221,6 +221,7 @@ public class LatinIME extends InputMethodService /* package */ String mWordSeparators; private String mSentenceSeparators; + private String mSuggestPuncs; private VoiceInput mVoiceInput; private VoiceResults mVoiceResults = new VoiceResults(); private long mSwipeTriggerTimeMillis; @@ -1116,7 +1117,7 @@ public class LatinIME extends InputMethodService } } if (mKeyboardSwitcher.getInputView().isShifted()) { - // TODO: This doesn't work with ß, need to fix it in the next release. + // TODO: This doesn't work with [beta], need to fix it in the next release. if (keyCodes == null || keyCodes[0] < Character.MIN_CODE_POINT || keyCodes[0] > Character.MAX_CODE_POINT) { return; @@ -1549,7 +1550,8 @@ public class LatinIME extends InputMethodService } // If this is a punctuation, apply it through the normal key press - if (suggestion.length() == 1 && isWordSeparator(suggestion.charAt(0))) { + if (suggestion.length() == 1 && (isWordSeparator(suggestion.charAt(0)) + || isSuggestedPunctuation(suggestion.charAt(0)))) { // Word separators are suggested before the user inputs something. // So, LatinImeLogger logs "" as a user's input. LatinImeLogger.logOnClickSuggestion( @@ -1681,7 +1683,7 @@ public class LatinIME extends InputMethodService return separators.contains(String.valueOf((char)code)); } - public boolean isSentenceSeparator(int code) { + private boolean isSentenceSeparator(int code) { return mSentenceSeparators.contains(String.valueOf((char)code)); } @@ -1952,14 +1954,18 @@ public class LatinIME extends InputMethodService private void initSuggestPuncList() { mSuggestPuncList = new ArrayList(); - String suggestPuncs = mResources.getString(R.string.suggested_punctuations); - if (suggestPuncs != null) { - for (int i = 0; i < suggestPuncs.length(); i++) { - mSuggestPuncList.add(suggestPuncs.subSequence(i, i + 1)); + mSuggestPuncs = mResources.getString(R.string.suggested_punctuations); + if (mSuggestPuncs != null) { + for (int i = 0; i < mSuggestPuncs.length(); i++) { + mSuggestPuncList.add(mSuggestPuncs.subSequence(i, i + 1)); } } } + private boolean isSuggestedPunctuation(int code) { + return mSuggestPuncs.contains(String.valueOf((char)code)); + } + private void showOptionsMenu() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setCancelable(true); From dd58fe92d1276e683e6c5842414131b36401f525 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 2 Jun 2010 20:16:31 +0900 Subject: [PATCH 057/159] Add candidates of manually picked suggestions Change-Id: Ieed585be5f4e88509cdcc31f5d82474cb06add6a --- .../inputmethod/latin/CandidateView.java | 11 ++-- .../android/inputmethod/latin/LatinIME.java | 9 +-- .../inputmethod/latin/LatinImeLogger.java | 64 +++++++++++++++---- 3 files changed, 64 insertions(+), 20 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index 3234e2484..e0de96543 100755 --- a/java/src/com/android/inputmethod/latin/CandidateView.java +++ b/java/src/com/android/inputmethod/latin/CandidateView.java @@ -83,7 +83,6 @@ public class CandidateView extends View { private int mDescent; private boolean mScrolled; private boolean mShowingAddToDictionary; - private CharSequence mWordToAddToDictionary; private CharSequence mAddToDictionaryHint; private int mTargetScrollX; @@ -220,7 +219,6 @@ public class CandidateView extends View { } int x = 0; final int count = Math.min(mSuggestions.size(), MAX_SUGGESTIONS); - final int width = getWidth(); final Rect bgPadding = mBgPadding; final Paint paint = mPaint; final int touchX = mTouchX; @@ -325,7 +323,6 @@ public class CandidateView extends View { } public void showAddToDictionaryHint(CharSequence word) { - mWordToAddToDictionary = word; ArrayList suggestions = new ArrayList(); suggestions.add(word); suggestions.add(mAddToDictionaryHint); @@ -376,8 +373,14 @@ public class CandidateView extends View { mScrolled = true; } } - + + /* package */ List getSuggestions() { + return mSuggestions; + } + public void clear() { + // Don't call mSuggestions.clear() because it's being used for logging + // in LatinIME.pickSuggestionManually(). mSuggestions = EMPTY_LIST; mTouchX = OUT_OF_BOUNDS; mSelectedString = null; diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 50b1d38cd..46fca372c 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1521,6 +1521,7 @@ public class LatinIME extends InputMethodService public void pickSuggestionManually(int index, CharSequence suggestion) { if (mAfterVoiceInput && mShowingVoiceSuggestions) mVoiceInput.logNBestChoose(index); + List suggestions = mCandidateView.getSuggestions(); if (mAfterVoiceInput && !mShowingVoiceSuggestions) { mVoiceInput.flushAllTextModificationCounters(); @@ -1554,8 +1555,8 @@ public class LatinIME extends InputMethodService || isSuggestedPunctuation(suggestion.charAt(0)))) { // Word separators are suggested before the user inputs something. // So, LatinImeLogger logs "" as a user's input. - LatinImeLogger.logOnClickSuggestion( - "", suggestion.toString(), index); + LatinImeLogger.logOnManualSuggestion( + "", suggestion.toString(), index, suggestions); onKey(suggestion.charAt(0), null); if (ic != null) { ic.endBatchEdit(); @@ -1568,8 +1569,8 @@ public class LatinIME extends InputMethodService if (index == 0) { checkAddToDictionary(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED); } - LatinImeLogger.logOnClickSuggestion( - mComposing.toString(), suggestion.toString(), index); + LatinImeLogger.logOnManualSuggestion(mComposing.toString(), suggestion.toString(), + index, suggestions); TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion); // Follow it with a space if (mAutoSpace) { diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 4f757d721..53b15dd09 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.List; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIMELogs"; @@ -47,7 +48,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final long MINIMUMSENDSIZE = 40; private static final char SEPARATER = ';'; private static final char NULL_CHAR = '\uFFFC'; - private static final int ID_CLICKSUGGESTION = 0; + private static final int ID_MANUALSUGGESTION = 0; private static final int ID_AUTOSUGGESTIONCANCELLED = 1; private static final int ID_AUTOSUGGESTION = 2; private static final int ID_INPUT_COUNT = 3; @@ -58,7 +59,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final int ID_SETTING_AUTO_COMPLETE = 8; private static final int ID_VERSION = 9; private static final int ID_EXCEPTION = 10; - private static final int ID_SUGGESTIONCOUNT = 11; + private static final int ID_MANUALSUGGESTIONCOUNT = 11; + private static final int ID_AUTOSUGGESTIONCANCELLEDCOUNT = 12; + private static final int ID_AUTOSUGGESTIONCOUNT = 13; private static final String PREF_ENABLE_LOG = "enable_logging"; private static final String PREF_DEBUG_MODE = "debug_mode"; @@ -88,6 +91,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private int mInputCount; private int mWordCount; private int[] mAutoSuggestCountPerDic = new int[Suggest.DIC_TYPE_LAST_ID + 1]; + private int[] mManualSuggestCountPerDic = new int[Suggest.DIC_TYPE_LAST_ID + 1]; private int mAutoCancelledCount; // ActualCharCount includes all characters that were completed. private int mActualCharCount; @@ -126,6 +130,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mWordCount = 0; mActualCharCount = 0; Arrays.fill(mAutoSuggestCountPerDic, 0); + Arrays.fill(mManualSuggestCountPerDic, 0); mAutoCancelledCount = 0; mLogBuffer = new ArrayList(); mPrivacyLogBuffer = new ArrayList(); @@ -147,6 +152,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mWordCount = 0; mActualCharCount = 0; Arrays.fill(mAutoSuggestCountPerDic, 0); + Arrays.fill(mManualSuggestCountPerDic, 0); mAutoCancelledCount = 0; mLogBuffer.clear(); mPrivacyLogBuffer.clear(); @@ -191,12 +197,22 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (sLOGPRINT) { Log.d(TAG, "log suggest counts. (1)"); } - String[] s = new String[mAutoSuggestCountPerDic.length + 1]; - s[0] = String.valueOf(mAutoCancelledCount); - for (int i = 1; i < s.length; ++i) { - s[i] = String.valueOf(mAutoSuggestCountPerDic[i - 1]); + String[] s = new String[mAutoSuggestCountPerDic.length]; + for (int i = 0; i < s.length; ++i) { + s[i] = String.valueOf(mAutoSuggestCountPerDic[i]); } - mLogBuffer.add(new LogEntry(time, ID_SUGGESTIONCOUNT, s)); + mLogBuffer.add(new LogEntry(time, ID_AUTOSUGGESTIONCOUNT, s)); + + mLogBuffer.add(new LogEntry(time, ID_AUTOSUGGESTIONCANCELLEDCOUNT, + new String[] {String.valueOf(mAutoCancelledCount)})); + s = new String[mManualSuggestCountPerDic.length]; + for (int i = 0; i < s.length; ++i) { + s[i] = String.valueOf(mManualSuggestCountPerDic[i]); + } + mLogBuffer.add(new LogEntry(time, ID_MANUALSUGGESTIONCOUNT, s)); + Arrays.fill(mAutoSuggestCountPerDic, 0); + Arrays.fill(mManualSuggestCountPerDic, 0); + mAutoCancelledCount = 0; } private void addThemeIdEntry(long time) { @@ -272,7 +288,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } mInputCount += (Integer)data; break; - case ID_CLICKSUGGESTION: + case ID_MANUALSUGGESTION: case ID_AUTOSUGGESTION: ++mWordCount; String[] dataStrings = (String[]) data; @@ -354,7 +370,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private void commitInternalAndStopSelf() { Log.e(TAG, "Exception was caused and let's die."); commitInternal(); - ((LatinIME) mContext).stopSelf(); + LatinIME ime = ((LatinIME) mContext); + ime.hideWindow(); + ime.stopSelf(); } private synchronized void sendLogToDropBox(int tag, Object s) { @@ -416,14 +434,36 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } // TODO: Handle CharSequence instead of String - public static void logOnClickSuggestion(String before, String after, int position) { + public static void logOnManualSuggestion(String before, String after, int position + , List suggestions) { if (sLogEnabled) { + if (!sSuggestDicMap.containsKey(after)) { + if (DBG) { + Log.e(TAG, "logOnManualSuggestion was cancelled: came from unknown source."); + } + return; + } + int dicTypeId = sSuggestDicMap.get(after); + sLatinImeLogger.mManualSuggestCountPerDic[dicTypeId]++; + sSuggestDicMap.clear(); + if (dicTypeId != Suggest.DIC_MAIN) { + if (DBG) { + Log.d(TAG, "logOnManualSuggestion was cancelled: didn't come from main dic."); + } + return; + } if (before.equals(after)) { before = ""; after = ""; } - String[] strings = new String[] {before, after, String.valueOf(position)}; - sLatinImeLogger.sendLogToDropBox(ID_CLICKSUGGESTION, strings); + String[] strings = new String[3 + suggestions.size()]; + strings[0] = before; + strings[1] = after; + strings[2] = String.valueOf(position); + for (int i = 0; i < suggestions.size(); ++i) { + strings[i + 3] = suggestions.get(i).toString(); + } + sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION, strings); } } From 219d9d52e54571dbc974083d6a57e405fd94153b Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 3 Jun 2010 11:48:33 +0900 Subject: [PATCH 058/159] Flush before re-throwing exception in logOnException Change-Id: I061738c5b1a1509015344c2c27848bac1e29d833 --- java/src/com/android/inputmethod/latin/LatinImeLogger.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 53b15dd09..7ad0ec63b 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -510,6 +510,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang synchronized (LatinImeLogger.class) { sLastAutoSuggestBefore = ""; sLastAutoSuggestAfter = ""; + sLastAutoSuggestSeparator = ""; } } } @@ -545,6 +546,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (SUPPRESS_EXCEPTION) { sLatinImeLogger.commitInternalAndStopSelf(); } else { + sLatinImeLogger.commitInternal(); throw e; } } From 4ff7bbcb97a6b71d84c927e3e4a30dd4dd2494b9 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 3 Jun 2010 14:54:35 +0900 Subject: [PATCH 059/159] Fix a bug that force closing happens even when SUPPRESS_EXCEPTION flag is on. Change-Id: I927b11da1e62b147813fbbf01e2afce5915aed73 --- .../inputmethod/latin/KeyboardSwitcher.java | 16 +++++++++------- .../com/android/inputmethod/latin/LatinIME.java | 2 +- .../inputmethod/latin/LatinImeLogger.java | 15 +++++++++++---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 3eb135ebe..948fe5aa6 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -197,8 +197,14 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha void setKeyboardMode(int mode, int imeOptions, boolean enableVoice) { mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; mPreferSymbols = mode == MODE_SYMBOLS; - setKeyboardMode(mode == MODE_SYMBOLS ? MODE_TEXT : mode, imeOptions, enableVoice, - mPreferSymbols); + if (mode == MODE_SYMBOLS) { + mode = MODE_TEXT; + } + try { + setKeyboardMode(mode, imeOptions, enableVoice, mPreferSymbols); + } catch (RuntimeException e) { + LatinImeLogger.logOnException(mode + "," + imeOptions + "," + mPreferSymbols, e); + } } void setKeyboardMode(int mode, int imeOptions, boolean enableVoice, boolean isSymbols) { @@ -213,11 +219,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mInputView.setPreviewEnabled(true); KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols); LatinKeyboard keyboard = null; - try { - keyboard = getKeyboard(id); - } catch (RuntimeException e) { - LatinImeLogger.logOnException(mode + "," + imeOptions + "," + isSymbols, e); - } + keyboard = getKeyboard(id); if (mode == MODE_PHONE) { mInputView.setPhoneKeyboard(keyboard); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 46fca372c..edc2e087f 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -275,6 +275,7 @@ public class LatinIME extends InputMethodService }; @Override public void onCreate() { + LatinImeLogger.init(this); super.onCreate(); //setStatusIcon(R.drawable.ime_qwerty); mResources = getResources(); @@ -311,7 +312,6 @@ public class LatinIME extends InputMethodService }); } prefs.registerOnSharedPreferenceChangeListener(this); - LatinImeLogger.init(this); } private void initSuggest(String locale) { diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 7ad0ec63b..474281058 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -39,7 +39,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final boolean DBG = true; private static boolean sLOGPRINT = false; // SUPPRESS_EXCEPTION should be true when released to public. - private static final boolean SUPPRESS_EXCEPTION = false; + private static final boolean SUPPRESS_EXCEPTION = true; // DEFAULT_LOG_ENABLED should be false when released to public. private static final boolean DEFAULT_LOG_ENABLED = true; @@ -48,6 +48,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final long MINIMUMSENDSIZE = 40; private static final char SEPARATER = ';'; private static final char NULL_CHAR = '\uFFFC'; + private static final int EXCEPTION_MAX_LENGTH = 400; + private static final int ID_MANUALSUGGESTION = 0; private static final int ID_AUTOSUGGESTIONCANCELLED = 1; private static final int ID_AUTOSUGGESTION = 2; @@ -368,7 +370,9 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void commitInternalAndStopSelf() { - Log.e(TAG, "Exception was caused and let's die."); + if (DBG) { + Log.e(TAG, "Exception was thrown and let's die."); + } commitInternal(); LatinIME ime = ((LatinIME) mContext); ime.hideWindow(); @@ -539,10 +543,13 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); e.printStackTrace(ps); - String exceptionString = new String(baos.toByteArray()); + String exceptionString = new String(baos.toByteArray(), 0, + Math.min(EXCEPTION_MAX_LENGTH, baos.size())); sLatinImeLogger.sendLogToDropBox( ID_EXCEPTION, new String[] {metaData, exceptionString}); - Log.e(TAG, "Exception: " + exceptionString); + if (DBG) { + Log.e(TAG, "Exception: " + new String(baos.toByteArray())); + } if (SUPPRESS_EXCEPTION) { sLatinImeLogger.commitInternalAndStopSelf(); } else { From 518643a2c54818597f3d3c6c23926f5d44044a2c Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 3 Jun 2010 16:36:29 +0900 Subject: [PATCH 060/159] Remove non-main dictionary candidates Change-Id: I9f33da674c2c2a0101671ba24424640ba3e695e5 --- .../inputmethod/latin/LatinImeLogger.java | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 474281058..c81da55ce 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -441,33 +441,38 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void logOnManualSuggestion(String before, String after, int position , List suggestions) { if (sLogEnabled) { - if (!sSuggestDicMap.containsKey(after)) { + // log punctuation + if (before.length() == 0 && after.length() == 1) { + sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION, new String[] { + before, after, String.valueOf(position), ""}); + } else if (!sSuggestDicMap.containsKey(after)) { if (DBG) { Log.e(TAG, "logOnManualSuggestion was cancelled: came from unknown source."); } - return; - } - int dicTypeId = sSuggestDicMap.get(after); - sLatinImeLogger.mManualSuggestCountPerDic[dicTypeId]++; - sSuggestDicMap.clear(); - if (dicTypeId != Suggest.DIC_MAIN) { - if (DBG) { - Log.d(TAG, "logOnManualSuggestion was cancelled: didn't come from main dic."); + } else { + int dicTypeId = sSuggestDicMap.get(after); + sLatinImeLogger.mManualSuggestCountPerDic[dicTypeId]++; + if (dicTypeId != Suggest.DIC_MAIN) { + if (DBG) { + Log.d(TAG, "logOnManualSuggestion was cancelled: didn't come from main dic."); + } + } else { + if (before.equals(after)) { + before = ""; + after = ""; + } + String[] strings = new String[3 + suggestions.size()]; + strings[0] = before; + strings[1] = after; + strings[2] = String.valueOf(position); + for (int i = 0; i < suggestions.size(); ++i) { + String s = suggestions.get(i).toString(); + strings[i + 3] = sSuggestDicMap.containsKey(s) ? s : ""; + } + sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION, strings); } - return; } - if (before.equals(after)) { - before = ""; - after = ""; - } - String[] strings = new String[3 + suggestions.size()]; - strings[0] = before; - strings[1] = after; - strings[2] = String.valueOf(position); - for (int i = 0; i < suggestions.size(); ++i) { - strings[i + 3] = suggestions.get(i).toString(); - } - sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION, strings); + sSuggestDicMap.clear(); } } From 8edbaf0433fd88c3cb31b6fe750955570ed386f8 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 3 Jun 2010 17:10:59 +0900 Subject: [PATCH 061/159] Hide debug mode - Tap feedback option 10 times, then debug mode will be enabled. - Change default value of KeyboardMode to avoid NPE - Update version code Change-Id: I3a4e64db0d3aa9a08f0e3b3ad1669e728e32cddf --- java/AndroidManifest.xml | 2 +- java/res/xml/prefs.xml | 1 - .../inputmethod/latin/KeyboardSwitcher.java | 2 +- .../inputmethod/latin/LatinIMESettings.java | 38 +++++++++++--- .../inputmethod/latin/LatinImeLogger.java | 50 +++++++++++++------ 5 files changed, 68 insertions(+), 25 deletions(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 53044fca9..105eb042a 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionName="0.15"> diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 0984a36e2..b50588a9e 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -107,5 +107,4 @@ android:persistent="true" android:defaultValue="false" /> - diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 948fe5aa6..56342930e 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -74,7 +74,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private KeyboardId mCurrentId; private Map mKeyboards; - private int mMode; /** One of the MODE_XXX values */ + private int mMode = MODE_TEXT; /** One of the MODE_XXX values */ private int mImeOptions; private int mTextMode = MODE_TEXT_QWERTY; private boolean mIsSymbols; diff --git a/java/src/com/android/inputmethod/latin/LatinIMESettings.java b/java/src/com/android/inputmethod/latin/LatinIMESettings.java index 21b967420..806ef00af 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMESettings.java +++ b/java/src/com/android/inputmethod/latin/LatinIMESettings.java @@ -24,13 +24,13 @@ import android.app.Dialog; import android.app.backup.BackupManager; import android.content.DialogInterface; import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; -import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceGroup; -import android.preference.Preference.OnPreferenceClickListener; import android.speech.SpeechRecognizer; import android.text.AutoText; import android.util.Log; @@ -43,11 +43,9 @@ public class LatinIMESettings extends PreferenceActivity DialogInterface.OnDismissListener { private static final String QUICK_FIXES_KEY = "quick_fixes"; - private static final String SHOW_SUGGESTIONS_KEY = "show_suggestions"; private static final String PREDICTION_SETTINGS_KEY = "prediction_settings"; private static final String VOICE_SETTINGS_KEY = "voice_mode"; - private static final String VOICE_ON_PRIMARY_KEY = "voice_on_main"; - private static final String VOICE_SERVER_KEY = "voice_server_url"; + private static final String DEBUG_MODE_KEY = "debug_mode"; private static final String TAG = "LatinIMESettings"; @@ -55,7 +53,7 @@ public class LatinIMESettings extends PreferenceActivity private static final int VOICE_INPUT_CONFIRM_DIALOG = 0; private CheckBoxPreference mQuickFixes; - private CheckBoxPreference mShowSuggestions; + private CheckBoxPreference mDebugMode; private ListPreference mVoicePreference; private boolean mVoiceOn; @@ -69,7 +67,6 @@ public class LatinIMESettings extends PreferenceActivity super.onCreate(icicle); addPreferencesFromResource(R.xml.prefs); mQuickFixes = (CheckBoxPreference) findPreference(QUICK_FIXES_KEY); - mShowSuggestions = (CheckBoxPreference) findPreference(SHOW_SUGGESTIONS_KEY); mVoicePreference = (ListPreference) findPreference(VOICE_SETTINGS_KEY); SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); prefs.registerOnSharedPreferenceChangeListener(this); @@ -77,6 +74,9 @@ public class LatinIMESettings extends PreferenceActivity mVoiceModeOff = getString(R.string.voice_mode_off); mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); mLogger = VoiceInputLogger.getLogger(this); + + mDebugMode = (CheckBoxPreference) findPreference(DEBUG_MODE_KEY); + updateDebugMode(mDebugMode.isChecked()); } @Override @@ -110,11 +110,35 @@ public class LatinIMESettings extends PreferenceActivity .equals(mVoiceModeOff)) { showVoiceConfirmation(); } + } else if (key.equals(DEBUG_MODE_KEY)) { + updateDebugMode(prefs.getBoolean(DEBUG_MODE_KEY, false)); } mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); updateVoiceModeSummary(); } + private void updateDebugMode(boolean isDebugMode) { + if (mDebugMode == null) { + return; + } + String version = ""; + try { + PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0); + version = "Version " + info.versionName; + } catch (NameNotFoundException e) { + Log.e(TAG, "Could not find version info."); + } + if (!isDebugMode) { + mDebugMode.setEnabled(false); + mDebugMode.setTitle(version); + mDebugMode.setSummary(""); + } else { + mDebugMode.setEnabled(true); + mDebugMode.setTitle(getResources().getString(R.string.prefs_debug_mode)); + mDebugMode.setSummary(version); + } + } + private void showVoiceConfirmation() { mOkClicked = false; showDialog(VOICE_INPUT_CONFIRM_DIALOG); diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index c81da55ce..9a02eb133 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -36,7 +36,7 @@ import java.util.List; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIMELogs"; - private static final boolean DBG = true; + private static boolean sDBG = false; private static boolean sLOGPRINT = false; // SUPPRESS_EXCEPTION should be true when released to public. private static final boolean SUPPRESS_EXCEPTION = true; @@ -77,6 +77,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang /* package */ static String sLastAutoSuggestAfter; /* package */ static String sLastAutoSuggestSeparator; private static HashMap sSuggestDicMap = new HashMap(); + private static DebugKeyEnabler sDebugKeyEnabler = new DebugKeyEnabler(); private ArrayList mLogBuffer = null; private ArrayList mPrivacyLogBuffer = null; @@ -142,6 +143,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mThemeId = prefs.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT, KeyboardSwitcher.DEFAULT_LAYOUT_ID); sLOGPRINT = prefs.getBoolean(PREF_DEBUG_MODE, sLOGPRINT); + sDBG = sLOGPRINT; prefs.registerOnSharedPreferenceChangeListener(this); } @@ -165,7 +167,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang * Check if the input string is safe as an entry or not. */ private static boolean checkStringDataSafe(String s) { - if (DBG) { + if (sDBG) { Log.d(TAG, "Check String safety: " + s); } for (int i = 0; i < s.length(); ++i) { @@ -295,7 +297,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang ++mWordCount; String[] dataStrings = (String[]) data; if (dataStrings.length < 2) { - if (DBG) { + if (sDBG) { Log.e(TAG, "The length of logged string array is invalid."); } break; @@ -305,7 +307,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mPrivacyLogBuffer.add( new LogEntry (System.currentTimeMillis(), tag, dataStrings)); } else { - if (DBG) { + if (sDBG) { Log.d(TAG, "Skipped to add an entry because data is unsafe."); } } @@ -314,7 +316,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang --mWordCount; dataStrings = (String[]) data; if (dataStrings.length < 2) { - if (DBG) { + if (sDBG) { Log.e(TAG, "The length of logged string array is invalid."); } break; @@ -324,7 +326,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mPrivacyLogBuffer.add( new LogEntry (System.currentTimeMillis(), tag, dataStrings)); } else { - if (DBG) { + if (sDBG) { Log.d(TAG, "Skipped to add an entry because data is unsafe."); } } @@ -332,7 +334,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang case ID_EXCEPTION: dataStrings = (String[]) data; if (dataStrings.length < 2) { - if (DBG) { + if (sDBG) { Log.e(TAG, "The length of logged string array is invalid."); } break; @@ -340,7 +342,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang addExceptionEntry(System.currentTimeMillis(), dataStrings); break; default: - if (DBG) { + if (sDBG) { Log.e(TAG, "Log Tag is not entried."); } break; @@ -370,7 +372,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void commitInternalAndStopSelf() { - if (DBG) { + if (sDBG) { Log.e(TAG, "Exception was thrown and let's die."); } commitInternal(); @@ -381,7 +383,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private synchronized void sendLogToDropBox(int tag, Object s) { long now = System.currentTimeMillis(); - if (DBG) { + if (sDBG) { String out = ""; if (s instanceof String[]) { for (String str: ((String[]) s)) { @@ -414,12 +416,16 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } else { sLogEnabled = false; } + if (sDebugKeyEnabler.check()) { + sharedPreferences.edit().putBoolean(PREF_DEBUG_MODE, true).commit(); + } } else if (KeyboardSwitcher.PREF_KEYBOARD_LAYOUT.equals(key)) { mThemeId = sharedPreferences.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT, KeyboardSwitcher.DEFAULT_LAYOUT_ID); addThemeIdEntry(mLastTimeActive); } else if (PREF_DEBUG_MODE.equals(key)) { sLOGPRINT = sharedPreferences.getBoolean(PREF_DEBUG_MODE, sLOGPRINT); + sDBG = sLOGPRINT; } } @@ -446,14 +452,14 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION, new String[] { before, after, String.valueOf(position), ""}); } else if (!sSuggestDicMap.containsKey(after)) { - if (DBG) { + if (sDBG) { Log.e(TAG, "logOnManualSuggestion was cancelled: came from unknown source."); } } else { int dicTypeId = sSuggestDicMap.get(after); sLatinImeLogger.mManualSuggestCountPerDic[dicTypeId]++; if (dicTypeId != Suggest.DIC_MAIN) { - if (DBG) { + if (sDBG) { Log.d(TAG, "logOnManualSuggestion was cancelled: didn't come from main dic."); } } else { @@ -479,7 +485,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang public static void logOnAutoSuggestion(String before, String after) { if (sLogEnabled) { if (!sSuggestDicMap.containsKey(after)) { - if (DBG) { + if (sDBG) { Log.e(TAG, "logOnAutoSuggestion was cancelled: came from unknown source."); } return; @@ -488,7 +494,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang sLatinImeLogger.mAutoSuggestCountPerDic[dicId]++; sSuggestDicMap.clear(); if (dicId != Suggest.DIC_MAIN) { - if (DBG) { + if (sDBG) { Log.d(TAG, "logOnAutoSuggestion was cancelled: didn't come from main dic."); } return; @@ -552,7 +558,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang Math.min(EXCEPTION_MAX_LENGTH, baos.size())); sLatinImeLogger.sendLogToDropBox( ID_EXCEPTION, new String[] {metaData, exceptionString}); - if (DBG) { + if (sDBG) { Log.e(TAG, "Exception: " + new String(baos.toByteArray())); } if (SUPPRESS_EXCEPTION) { @@ -659,4 +665,18 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang length = 0; } } + + private static class DebugKeyEnabler { + private int mCounter = 0; + private long mLastTime = 0; + public boolean check() { + if (System.currentTimeMillis() - mLastTime > 10 * 1000) { + mCounter = 0; + mLastTime = System.currentTimeMillis(); + } else if (++mCounter >= 10) { + return true; + } + return false; + } + } } From 0eaca7aa99b052abcc0cf9edb701b6c597b2e311 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 3 Jun 2010 20:00:45 +0900 Subject: [PATCH 062/159] Fix NPE and addded logOnWarning Change-Id: I4cca905ce044c014490ada6d00a76d79a20ed885 --- .../com/android/inputmethod/latin/KeyboardSwitcher.java | 7 ++++++- java/src/com/android/inputmethod/latin/LatinIME.java | 3 ++- java/src/com/android/inputmethod/latin/LatinImeLogger.java | 7 +++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 56342930e..48451e783 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -28,6 +28,7 @@ import android.preference.PreferenceManager; public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener { + public static final int MODE_NONE = 0; public static final int MODE_TEXT = 1; public static final int MODE_SYMBOLS = 2; public static final int MODE_PHONE = 3; @@ -74,7 +75,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private KeyboardId mCurrentId; private Map mKeyboards; - private int mMode = MODE_TEXT; /** One of the MODE_XXX values */ + private int mMode = MODE_NONE; /** One of the MODE_XXX values */ private int mImeOptions; private int mTextMode = MODE_TEXT_QWERTY; private boolean mIsSymbols; @@ -276,6 +277,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha ? new KeyboardId(R.xml.kbd_phone_symbols, hasVoice) : makeSymbolsId(hasVoice); } switch (mode) { + case MODE_NONE: + LatinImeLogger.logOnWarning( + "getKeyboardId:" + mode + "," + imeOptions + "," + isSymbols); + /* fall through */ case MODE_TEXT: if (mTextMode == MODE_TEXT_ALPHA) { return new KeyboardId(R.xml.kbd_alpha, KEYBOARDMODE_NORMAL, true, hasVoice); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index edc2e087f..520974580 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -812,7 +812,8 @@ public class LatinIME extends InputMethodService mKeyboardSwitcher = new KeyboardSwitcher(this, this); } mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher); - if (mKeyboardSwitcher.getInputView() != null) { + if (mKeyboardSwitcher.getInputView() != null + && mKeyboardSwitcher.getKeyboardMode() != KeyboardSwitcher.MODE_NONE) { mKeyboardSwitcher.setVoiceMode(mEnableVoice && mEnableVoiceButton, mVoiceOnPrimary); } mKeyboardSwitcher.makeKeyboards(true); diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 9a02eb133..0cc4fa62c 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -570,6 +570,13 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } + public static void logOnWarning(String warning) { + if (sLogEnabled) { + sLatinImeLogger.sendLogToDropBox( + ID_EXCEPTION, new String[] {warning, ""}); + } + } + public static void onStartSuggestion() { if (sLogEnabled) { sSuggestDicMap.clear(); From c6bc1a93a341774175be4a82f5c046c48b733620 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 3 Jun 2010 20:16:33 +0900 Subject: [PATCH 063/159] URL encode a log of exception Change-Id: I50c08d58b4ce8555d88c68cae44c12600ae93221 --- java/src/com/android/inputmethod/latin/LatinImeLogger.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 0cc4fa62c..ebcbcdbd9 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -28,6 +28,7 @@ import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -557,7 +558,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang String exceptionString = new String(baos.toByteArray(), 0, Math.min(EXCEPTION_MAX_LENGTH, baos.size())); sLatinImeLogger.sendLogToDropBox( - ID_EXCEPTION, new String[] {metaData, exceptionString}); + ID_EXCEPTION, new String[] {metaData, URLEncoder.encode(exceptionString)}); if (sDBG) { Log.e(TAG, "Exception: " + new String(baos.toByteArray())); } From 0f97599f1a58fcce5cc34bc3f399a9d7d7bcf21b Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 3 Jun 2010 20:37:08 +0900 Subject: [PATCH 064/159] Delete extra inflating view - this is not called in froyo-LatinIME, so it can be removed Change-Id: I3a761145dd30a93ba71d39df9fa504383c5425a5 --- java/src/com/android/inputmethod/latin/KeyboardSwitcher.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 48451e783..ef3fb8e1e 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -101,7 +101,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mSymbolsId = makeSymbolsId(false); mSymbolsShiftedId = makeSymbolsShiftedId(false); mInputMethodService = ims; - changeLatinKeyboardView(mLayoutId, false); } /** From e4c7ad30978bd26b8c77c94276ec88c566afdbc6 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 3 Jun 2010 20:55:42 +0900 Subject: [PATCH 065/159] Show encoded log Change-Id: I59a8c1506409097a1e8864b51051d969edaf2680 --- .../src/com/android/inputmethod/latin/LatinImeLogger.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index ebcbcdbd9..83a791c13 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -555,12 +555,12 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); e.printStackTrace(ps); - String exceptionString = new String(baos.toByteArray(), 0, - Math.min(EXCEPTION_MAX_LENGTH, baos.size())); + String exceptionString = URLEncoder.encode(new String(baos.toByteArray(), 0, + Math.min(EXCEPTION_MAX_LENGTH, baos.size()))); sLatinImeLogger.sendLogToDropBox( - ID_EXCEPTION, new String[] {metaData, URLEncoder.encode(exceptionString)}); + ID_EXCEPTION, new String[] {metaData, exceptionString}); if (sDBG) { - Log.e(TAG, "Exception: " + new String(baos.toByteArray())); + Log.e(TAG, "Exception: " + new String(baos.toByteArray())+ ":" + exceptionString); } if (SUPPRESS_EXCEPTION) { sLatinImeLogger.commitInternalAndStopSelf(); From dac53d9c7db2f948e3d51686e383e65b076ce51d Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 3 Jun 2010 23:56:33 +0900 Subject: [PATCH 066/159] Change RuntimeErrot to OutOfMemoryError Change-Id: Ic237bc7f0631dcb192be7203379bdf4c5d832b28 --- java/AndroidManifest.xml | 2 +- .../com/android/inputmethod/latin/KeyboardSwitcher.java | 2 +- java/src/com/android/inputmethod/latin/LatinIME.java | 6 +++++- .../src/com/android/inputmethod/latin/LatinImeLogger.java | 8 ++++++-- .../com/android/inputmethod/latin/LatinKeyboardView.java | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 105eb042a..d1b56c26c 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionName="0.16"> diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index ef3fb8e1e..a8be2fd44 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -392,7 +392,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha try { mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater().inflate( LAYOUTS[newLayout], null); - } catch (RuntimeException e) { + } catch (OutOfMemoryError e) { LatinImeLogger.logOnException(mLayoutId + "," + newLayout, e); } mInputView.setExtentionLayoutResId(LAYOUTS[newLayout]); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 520974580..6d620968a 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -291,7 +291,11 @@ public class LatinIME extends InputMethodService if (inputLanguage == null) { inputLanguage = conf.locale.toString(); } - initSuggest(inputLanguage); + try { + initSuggest(inputLanguage); + } catch (OutOfMemoryError e) { + LatinImeLogger.logOnException(inputLanguage, e); + } mOrientation = conf.orientation; initSuggestPuncList(); diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 83a791c13..5a8b61dbc 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -550,7 +550,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } - public static void logOnException(String metaData, RuntimeException e) { + public static void logOnException(String metaData, Throwable e) { if (sLogEnabled) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); @@ -566,7 +566,11 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang sLatinImeLogger.commitInternalAndStopSelf(); } else { sLatinImeLogger.commitInternal(); - throw e; + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } else if (e instanceof Error) { + throw (Error) e; + } } } } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index 46f04b8a2..014d773ab 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -474,7 +474,7 @@ public class LatinKeyboardView extends KeyboardView { public void draw(Canvas c) { try { super.draw(c); - } catch (RuntimeException e) { + } catch (OutOfMemoryError e) { LatinImeLogger.logOnException("draw in LatinKeybaordView", e); } if (DEBUG_AUTO_PLAY) { From 88327fb73b517e7723ab419cfc4f65ff65126c98 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 4 Jun 2010 00:51:17 +0900 Subject: [PATCH 067/159] Fix NPE onDestroy Change-Id: I6aa1951fd3d69e07d1fbc7712fe2526dd9a5ef57 --- java/src/com/android/inputmethod/latin/LatinIME.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 6d620968a..e4f096628 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -355,10 +355,14 @@ public class LatinIME extends InputMethodService @Override public void onDestroy() { - mUserDictionary.close(); - mContactsDictionary.close(); + if (mUserDictionary != null) { + mUserDictionary.close(); + } + if (mContactsDictionary != null) { + mContactsDictionary.close(); + } unregisterReceiver(mReceiver); - if (VOICE_INSTALLED) { + if (VOICE_INSTALLED && mVoiceInput != null) { mVoiceInput.destroy(); } LatinImeLogger.commit(); From 03d88c0b1fe382118d37896b78add3bccfb8d52c Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 4 Jun 2010 10:15:50 +0900 Subject: [PATCH 068/159] Show a current locale in the space bar Change-Id: I317a0b0b20c3065f2e7454f7b44654a34b97500d --- .../inputmethod/latin/LatinKeyboard.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 1a9350a83..2dd03389c 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -292,9 +292,6 @@ public class LatinKeyboard extends Keyboard { if (mF1Key != null) { mF1Key.icon = mMicIcon; } - if (mSpaceKey != null) { - mSpaceKey.icon = mSpaceIcon; - } } else { mShiftLockIcon = mRes.getDrawable(R.drawable.sym_keyboard_shift_locked); mSpaceIcon = mRes.getDrawable(R.drawable.sym_keyboard_space); @@ -303,9 +300,10 @@ public class LatinKeyboard extends Keyboard { if (mF1Key != null) { mF1Key.icon = mMicIcon; } - if (mSpaceKey != null) { - mSpaceKey.icon = mSpaceIcon; - } + } + if (mSpaceKey != null) { + mSpaceKey.icon = mSpaceIcon; + updateSpaceBarForLocale(f); } } @@ -346,7 +344,7 @@ public class LatinKeyboard extends Keyboard { } } - private void updateSpaceBarForLocale() { + private void updateSpaceBarForLocale(boolean isBlack) { if (mLocale != null) { // Create the graphic for spacebar Bitmap buffer = Bitmap.createBitmap(mSpaceKey.width, mSpaceIcon.getIntrinsicHeight(), @@ -356,7 +354,8 @@ public class LatinKeyboard extends Keyboard { mSpaceKey.icon = new BitmapDrawable(mRes, buffer); mSpaceKey.repeatable = mLanguageSwitcher.getLocaleCount() < 2; } else { - mSpaceKey.icon = mRes.getDrawable(R.drawable.sym_keyboard_space); + mSpaceKey.icon = isBlack ? mRes.getDrawable(R.drawable.sym_bkeyboard_space) + : mRes.getDrawable(R.drawable.sym_keyboard_space); mSpaceKey.repeatable = true; } } @@ -461,7 +460,7 @@ public class LatinKeyboard extends Keyboard { } if (mLocale != null && mLocale.equals(locale)) return; mLocale = locale; - updateSpaceBarForLocale(); + updateSpaceBarForLocale(mIsBlackSym); } boolean isCurrentlyInSpace() { From d8dac11374c30998ea728802faaac82db1f05db1 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 4 Jun 2010 11:17:39 +0900 Subject: [PATCH 069/159] Ver up to v0.17 Change-Id: I88a5033f5573b738315755813a2d5c52f8704da7 --- java/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index d1b56c26c..960e7593e 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionName="0.17"> From cf325a403198a83178190e9bef17e0aeb7f1ad07 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Mon, 7 Jun 2010 23:26:27 +0900 Subject: [PATCH 070/159] Bump the versionCode for the next release modified: java/AndroidManifest.xml Change-Id: I4084dbad22f000e793b635615130c92f46f477cc --- java/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 960e7593e..9a41667af 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionCode="10" + android:versionName="0.18"> From 71a0e3f5511477b3af8f07a8ee7b62a7eaa4c45c Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Mon, 7 Jun 2010 23:49:22 +0900 Subject: [PATCH 071/159] Update the cert to catch up with a bug fix - https://android-git.corp.google.com/g/53188 Change-Id: I144a80be8f47aac292f320e9a6cdb9a970886d38 --- java/Android.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/Android.mk b/java/Android.mk index 9b2e47da4..a6dc49b2b 100755 --- a/java/Android.mk +++ b/java/Android.mk @@ -7,7 +7,7 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := LatinIme2Google -LOCAL_CERTIFICATE := shared +LOCAL_CERTIFICATE := vendor/google/certs/app LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime2 From 297444953ccc0cab0d908da09bb3a00ff05684a6 Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 7 Jun 2010 17:46:22 +0900 Subject: [PATCH 072/159] Fix logging issues - send non-main dic words after filling blank - send cancellation counts per dic Change-Id: I010794cc810339d7b04d64f7b0a6fa5d5cbf8826 --- .../inputmethod/latin/LatinImeLogger.java | 79 +++++++++++-------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 5a8b61dbc..5f07fce4c 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -77,6 +77,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang /* package */ static String sLastAutoSuggestBefore; /* package */ static String sLastAutoSuggestAfter; /* package */ static String sLastAutoSuggestSeparator; + private static int sLastAutoSuggestDicTypeId; private static HashMap sSuggestDicMap = new HashMap(); private static DebugKeyEnabler sDebugKeyEnabler = new DebugKeyEnabler(); @@ -96,8 +97,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private int mWordCount; private int[] mAutoSuggestCountPerDic = new int[Suggest.DIC_TYPE_LAST_ID + 1]; private int[] mManualSuggestCountPerDic = new int[Suggest.DIC_TYPE_LAST_ID + 1]; - private int mAutoCancelledCount; - // ActualCharCount includes all characters that were completed. + private int[] mAutoCancelledCountPerDic = new int[Suggest.DIC_TYPE_LAST_ID + 1]; private int mActualCharCount; private static class LogEntry implements Comparable { @@ -135,7 +135,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mActualCharCount = 0; Arrays.fill(mAutoSuggestCountPerDic, 0); Arrays.fill(mManualSuggestCountPerDic, 0); - mAutoCancelledCount = 0; + Arrays.fill(mAutoCancelledCountPerDic, 0); mLogBuffer = new ArrayList(); mPrivacyLogBuffer = new ArrayList(); mRingCharBuffer = new RingCharBuffer(context); @@ -158,7 +158,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mActualCharCount = 0; Arrays.fill(mAutoSuggestCountPerDic, 0); Arrays.fill(mManualSuggestCountPerDic, 0); - mAutoCancelledCount = 0; + Arrays.fill(mAutoCancelledCountPerDic, 0); mLogBuffer.clear(); mPrivacyLogBuffer.clear(); mRingCharBuffer.reset(); @@ -208,16 +208,21 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } mLogBuffer.add(new LogEntry(time, ID_AUTOSUGGESTIONCOUNT, s)); - mLogBuffer.add(new LogEntry(time, ID_AUTOSUGGESTIONCANCELLEDCOUNT, - new String[] {String.valueOf(mAutoCancelledCount)})); + s = new String[mAutoCancelledCountPerDic.length]; + for (int i = 0; i < s.length; ++i) { + s[i] = String.valueOf(mAutoCancelledCountPerDic[i]); + } + mLogBuffer.add(new LogEntry(time, ID_AUTOSUGGESTIONCANCELLEDCOUNT, s)); + s = new String[mManualSuggestCountPerDic.length]; for (int i = 0; i < s.length; ++i) { s[i] = String.valueOf(mManualSuggestCountPerDic[i]); } mLogBuffer.add(new LogEntry(time, ID_MANUALSUGGESTIONCOUNT, s)); + Arrays.fill(mAutoSuggestCountPerDic, 0); Arrays.fill(mManualSuggestCountPerDic, 0); - mAutoCancelledCount = 0; + Arrays.fill(mAutoCancelledCountPerDic, 0); } private void addThemeIdEntry(long time) { @@ -454,16 +459,20 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang before, after, String.valueOf(position), ""}); } else if (!sSuggestDicMap.containsKey(after)) { if (sDBG) { - Log.e(TAG, "logOnManualSuggestion was cancelled: came from unknown source."); + Log.e(TAG, "logOnManualSuggestion was cancelled: from unknown dic."); } } else { int dicTypeId = sSuggestDicMap.get(after); sLatinImeLogger.mManualSuggestCountPerDic[dicTypeId]++; if (dicTypeId != Suggest.DIC_MAIN) { if (sDBG) { - Log.d(TAG, "logOnManualSuggestion was cancelled: didn't come from main dic."); + Log.d(TAG, "logOnManualSuggestion was cancelled: not from main dic."); } - } else { + before = ""; + after = ""; + } + // TODO: Don't send a log if this doesn't come from Main Dictionary. + { if (before.equals(after)) { before = ""; after = ""; @@ -487,37 +496,41 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (sLogEnabled) { if (!sSuggestDicMap.containsKey(after)) { if (sDBG) { - Log.e(TAG, "logOnAutoSuggestion was cancelled: came from unknown source."); + Log.e(TAG, "logOnAutoSuggestion was cancelled: from unknown dic."); + } + } else { + String separator = String.valueOf(sLatinImeLogger.mRingCharBuffer.getLastChar()); + sLastAutoSuggestDicTypeId = sSuggestDicMap.get(after); + sLatinImeLogger.mAutoSuggestCountPerDic[sLastAutoSuggestDicTypeId]++; + if (sLastAutoSuggestDicTypeId != Suggest.DIC_MAIN) { + if (sDBG) { + Log.d(TAG, "logOnAutoSuggestion was cancelled: not from main dic."); + } + before = ""; + after = ""; + } + // TODO: Not to send a log if this doesn't come from Main Dictionary. + { + if (before.equals(after)) { + before = ""; + after = ""; + } + String[] strings = new String[] {before, after, separator}; + sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTION, strings); + } + synchronized (LatinImeLogger.class) { + sLastAutoSuggestBefore = before; + sLastAutoSuggestAfter = after; + sLastAutoSuggestSeparator = separator; } - return; } - int dicId = sSuggestDicMap.get(after); - sLatinImeLogger.mAutoSuggestCountPerDic[dicId]++; sSuggestDicMap.clear(); - if (dicId != Suggest.DIC_MAIN) { - if (sDBG) { - Log.d(TAG, "logOnAutoSuggestion was cancelled: didn't come from main dic."); - } - return; - } - if (before.equals(after)) { - before = ""; - after = ""; - } - sLastAutoSuggestSeparator = - String.valueOf(sLatinImeLogger.mRingCharBuffer.getLastChar()); - String[] strings = new String[] {before, after, sLastAutoSuggestSeparator}; - synchronized (LatinImeLogger.class) { - sLastAutoSuggestBefore = before; - sLastAutoSuggestAfter = after; - } - sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTION, strings); } } public static void logOnAutoSuggestionCanceled() { if (sLogEnabled) { - sLatinImeLogger.mAutoCancelledCount++; + sLatinImeLogger.mAutoCancelledCountPerDic[sLastAutoSuggestDicTypeId]++; if (sLastAutoSuggestBefore != null && sLastAutoSuggestAfter != null) { String[] strings = new String[] { sLastAutoSuggestBefore, sLastAutoSuggestAfter, sLastAutoSuggestSeparator}; From acbe38f3e12ce5af668c687296908a1787c85ad9 Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 8 Jun 2010 11:45:21 +0900 Subject: [PATCH 073/159] Try GC at OutOfMemoryError Change-Id: Icfaecc6a0e8858622649ce9115ab94b00e240cc2 --- .../inputmethod/latin/KeyboardSwitcher.java | 17 +++-- .../android/inputmethod/latin/LatinIME.java | 15 +++-- .../inputmethod/latin/LatinIMEUtil.java | 63 +++++++++++++++++++ .../inputmethod/latin/LatinImeLogger.java | 2 +- .../inputmethod/latin/LatinKeyboardView.java | 13 ++-- 5 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 java/src/com/android/inputmethod/latin/LatinIMEUtil.java diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index a8be2fd44..ba78a902d 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -389,11 +389,18 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha if (LAYOUTS.length <= newLayout) { newLayout = Integer.valueOf(DEFAULT_LAYOUT_ID); } - try { - mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater().inflate( - LAYOUTS[newLayout], null); - } catch (OutOfMemoryError e) { - LatinImeLogger.logOnException(mLayoutId + "," + newLayout, e); + + LatinIMEUtil.GCUtils.getInstance().reset(); + boolean tryGC = true; + for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { + try { + mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater( + ).inflate(LAYOUTS[newLayout], null); + tryGC = false; + } catch (OutOfMemoryError e) { + tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait( + mLayoutId + "," + newLayout, e); + } } mInputView.setExtentionLayoutResId(LAYOUTS[newLayout]); mInputView.setOnKeyboardActionListener(mInputMethodService); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index e4f096628..18e5b4106 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -291,11 +291,18 @@ public class LatinIME extends InputMethodService if (inputLanguage == null) { inputLanguage = conf.locale.toString(); } - try { - initSuggest(inputLanguage); - } catch (OutOfMemoryError e) { - LatinImeLogger.logOnException(inputLanguage, e); + + LatinIMEUtil.GCUtils.getInstance().reset(); + boolean tryGC = true; + for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { + try { + initSuggest(inputLanguage); + tryGC = false; + } catch (OutOfMemoryError e) { + tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait(inputLanguage, e); + } } + mOrientation = conf.orientation; initSuggestPuncList(); diff --git a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java new file mode 100644 index 000000000..c870b0185 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2010 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.text.format.DateUtils; +import android.util.Log; + +public class LatinIMEUtil { + public static class GCUtils { + private static final String TAG = "GCUtils"; + public static final int GC_TRY_COUNT = 2; + // GC_TRY_LOOP_MAX is used for the hard limit of GC wait, + // GC_TRY_LOOP_MAX should be GC_TRY_COUNT. + public static final int GC_TRY_LOOP_MAX = 5; + private static final long GC_INTERVAL = DateUtils.SECOND_IN_MILLIS; + private static GCUtils sInstance = new GCUtils(); + private int mGCTryCount = 0; + + public static GCUtils getInstance() { + return sInstance; + } + + public void reset() { + mGCTryCount = 0; + } + + public boolean tryGCOrWait(String metaData, OutOfMemoryError oome) { + if (LatinImeLogger.sDBG) { + Log.d(TAG, "Encountered Out of memory Error. Try GC."); + } + if (mGCTryCount == 0) { + System.gc(); + } + if (++mGCTryCount > GC_TRY_COUNT) { + LatinImeLogger.logOnException(metaData, oome); + return false; + } else { + try { + Thread.sleep(GC_INTERVAL); + return true; + } catch (InterruptedException e) { + Log.e(TAG, "Sleep was interrupted."); + LatinImeLogger.logOnException(metaData, oome); + return false; + } + } + } + } +} diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 5f07fce4c..3ffbe1ba6 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -37,7 +37,7 @@ import java.util.List; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIMELogs"; - private static boolean sDBG = false; + public static boolean sDBG = false; private static boolean sLOGPRINT = false; // SUPPRESS_EXCEPTION should be true when released to public. private static final boolean SUPPRESS_EXCEPTION = true; diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index 014d773ab..e99977d21 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -472,10 +472,15 @@ public class LatinKeyboardView extends KeyboardView { @Override public void draw(Canvas c) { - try { - super.draw(c); - } catch (OutOfMemoryError e) { - LatinImeLogger.logOnException("draw in LatinKeybaordView", e); + LatinIMEUtil.GCUtils.getInstance().reset(); + boolean tryGC = true; + for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { + try { + super.draw(c); + tryGC = false; + } catch (OutOfMemoryError e) { + tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait("LatinKeyboardView", e); + } } if (DEBUG_AUTO_PLAY) { if (mPlaying) { From d5d61c34858473b1f920dd9ffbed2a0a58673a72 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 9 Jun 2010 00:49:44 +0900 Subject: [PATCH 074/159] Catch inflate exception Change-Id: Ia5a384f5cbd2d0063904c2959ccbeb987198616b --- .../android/inputmethod/latin/KeyboardSwitcher.java | 4 ++++ .../com/android/inputmethod/latin/LatinIMEUtil.java | 10 +++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index ba78a902d..3c0ab5a4e 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -25,6 +25,7 @@ import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; import android.preference.PreferenceManager; +import android.view.InflateException; public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -400,6 +401,9 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } catch (OutOfMemoryError e) { tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait( mLayoutId + "," + newLayout, e); + } catch (InflateException e) { + tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait( + mLayoutId + "," + newLayout, e); } } mInputView.setExtentionLayoutResId(LAYOUTS[newLayout]); diff --git a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java index c870b0185..962af47db 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java +++ b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java @@ -24,7 +24,7 @@ public class LatinIMEUtil { private static final String TAG = "GCUtils"; public static final int GC_TRY_COUNT = 2; // GC_TRY_LOOP_MAX is used for the hard limit of GC wait, - // GC_TRY_LOOP_MAX should be GC_TRY_COUNT. + // GC_TRY_LOOP_MAX should be greater than GC_TRY_COUNT. public static final int GC_TRY_LOOP_MAX = 5; private static final long GC_INTERVAL = DateUtils.SECOND_IN_MILLIS; private static GCUtils sInstance = new GCUtils(); @@ -38,15 +38,15 @@ public class LatinIMEUtil { mGCTryCount = 0; } - public boolean tryGCOrWait(String metaData, OutOfMemoryError oome) { + public boolean tryGCOrWait(String metaData, Throwable t) { if (LatinImeLogger.sDBG) { - Log.d(TAG, "Encountered Out of memory Error. Try GC."); + Log.d(TAG, "Encountered Exception or Error. Try GC."); } if (mGCTryCount == 0) { System.gc(); } if (++mGCTryCount > GC_TRY_COUNT) { - LatinImeLogger.logOnException(metaData, oome); + LatinImeLogger.logOnException(metaData, t); return false; } else { try { @@ -54,7 +54,7 @@ public class LatinIMEUtil { return true; } catch (InterruptedException e) { Log.e(TAG, "Sleep was interrupted."); - LatinImeLogger.logOnException(metaData, oome); + LatinImeLogger.logOnException(metaData, t); return false; } } From b373d460c7f768561587368e6383594ae0c93929 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 16 Jun 2010 07:40:58 +0900 Subject: [PATCH 075/159] Log the current launguage and enabled languages Change-Id: Ie504961be7c90bdcabe73ca3bddf98cac61f3d3b --- .../inputmethod/latin/LatinImeLogger.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 3ffbe1ba6..55e859869 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -65,6 +65,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final int ID_MANUALSUGGESTIONCOUNT = 11; private static final int ID_AUTOSUGGESTIONCANCELLEDCOUNT = 12; private static final int ID_AUTOSUGGESTIONCOUNT = 13; + private static final int ID_LANGUAGES = 14; private static final String PREF_ENABLE_LOG = "enable_logging"; private static final String PREF_DEBUG_MODE = "debug_mode"; @@ -92,6 +93,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private long mLastTimeCountEntry; private String mThemeId; + private String mSelectedLanguages; + private String mCurrentLanguage; private int mDeleteCount; private int mInputCount; private int mWordCount; @@ -143,6 +146,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang sLogEnabled = prefs.getBoolean(PREF_ENABLE_LOG, DEFAULT_LOG_ENABLED); mThemeId = prefs.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT, KeyboardSwitcher.DEFAULT_LAYOUT_ID); + mSelectedLanguages = prefs.getString(LatinIME.PREF_SELECTED_LANGUAGES, ""); + mCurrentLanguage = prefs.getString(LatinIME.PREF_INPUT_LANGUAGE, ""); sLOGPRINT = prefs.getBoolean(PREF_DEBUG_MODE, sLOGPRINT); sDBG = sLOGPRINT; prefs.registerOnSharedPreferenceChangeListener(this); @@ -233,6 +238,19 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang new String[] {mThemeId})); } + private void addLanguagesEntry(long time) { + if (sLOGPRINT) { + Log.d(TAG, "Log language settings. (1)"); + } + // CurrentLanguage and SelectedLanguages will be blank if user doesn't use multi-language + // switching. + if (TextUtils.isEmpty(mCurrentLanguage)) { + mCurrentLanguage = mContext.getResources().getConfiguration().locale.toString(); + } + mLogBuffer.add(new LogEntry (time, ID_LANGUAGES, + new String[] {mCurrentLanguage , mSelectedLanguages})); + } + private void addSettingsEntry(long time) { if (sLOGPRINT) { Log.d(TAG, "Log settings. (1)"); @@ -363,6 +381,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang long now = System.currentTimeMillis(); addCountEntry(now); addThemeIdEntry(now); + addLanguagesEntry(now); addSettingsEntry(now); addVersionNameEntry(now); addSuggestionCountEntry(now); @@ -432,6 +451,11 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } else if (PREF_DEBUG_MODE.equals(key)) { sLOGPRINT = sharedPreferences.getBoolean(PREF_DEBUG_MODE, sLOGPRINT); sDBG = sLOGPRINT; + } else if (LatinIME.PREF_INPUT_LANGUAGE.equals(key)) { + mCurrentLanguage = sharedPreferences.getString(LatinIME.PREF_INPUT_LANGUAGE, ""); + addLanguagesEntry(mLastTimeActive); + } else if (LatinIME.PREF_INPUT_LANGUAGE.equals(key)) { + mSelectedLanguages = sharedPreferences.getString(LatinIME.PREF_SELECTED_LANGUAGES, ""); } } From 9512706adfa16d7e56660185c0a2a7f0cb5b0d0e Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 16 Jun 2010 08:50:40 +0900 Subject: [PATCH 076/159] Make DropBox.addText AsyncTask in IMELogger Change-Id: I84d5915a3197a67cda6bec8b0ef3343df2e510be --- .../android/inputmethod/latin/LatinIME.java | 1 + .../inputmethod/latin/LatinIMEUtil.java | 15 +++++ .../inputmethod/latin/LatinImeLogger.java | 67 ++++++++++++++----- 3 files changed, 66 insertions(+), 17 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 18e5b4106..8186154a5 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -373,6 +373,7 @@ public class LatinIME extends InputMethodService mVoiceInput.destroy(); } LatinImeLogger.commit(); + LatinImeLogger.onDestroy(); super.onDestroy(); } diff --git a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java index 962af47db..838b4fe10 100644 --- a/java/src/com/android/inputmethod/latin/LatinIMEUtil.java +++ b/java/src/com/android/inputmethod/latin/LatinIMEUtil.java @@ -16,10 +16,25 @@ package com.android.inputmethod.latin; +import android.os.AsyncTask; import android.text.format.DateUtils; import android.util.Log; public class LatinIMEUtil { + + /** + * Cancel an {@link AsyncTask}. + * + * @param mayInterruptIfRunning true if the thread executing this + * task should be interrupted; otherwise, in-progress tasks are allowed + * to complete. + */ + public static void cancelTask(AsyncTask task, boolean mayInterruptIfRunning) { + if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) { + task.cancel(mayInterruptIfRunning); + } + } + public static class GCUtils { private static final String TAG = "GCUtils"; public static final int GC_TRY_COUNT = 2; diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 55e859869..1e467d9a6 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; +import android.os.AsyncTask; import android.os.DropBoxManager; import android.preference.PreferenceManager; import android.text.TextUtils; @@ -88,6 +89,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private Context mContext = null; private DropBoxManager mDropBox = null; + private AddTextToDropBoxTask mAddTextToDropBoxTask; private long mLastTimeActive; private long mLastTimeSend; private long mLastTimeCountEntry; @@ -126,6 +128,29 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } + private class AddTextToDropBoxTask extends AsyncTask { + private final DropBoxManager mDropBox; + private final long mTime; + private final String mData; + public AddTextToDropBoxTask(DropBoxManager db, long time, String data) { + mDropBox = db; + mTime = time; + mData = data; + } + @Override + protected Void doInBackground(Void... params) { + if (sLOGPRINT) { + Log.d(TAG, "Commit log: " + mData); + } + mDropBox.addText(TAG, mData); + return null; + } + @Override + protected void onPostExecute(Void v) { + mLastTimeSend = mTime; + } + } + private void initInternal(Context context) { mContext = context; mDropBox = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE); @@ -169,6 +194,10 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang mRingCharBuffer.reset(); } + public void destroy() { + LatinIMEUtil.cancelTask(mAddTextToDropBoxTask, false); + } + /** * Check if the input string is safe as an entry or not. */ @@ -374,26 +403,25 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void commitInternal() { - if (sLOGPRINT) { - Log.d(TAG, "Commit (" + mLogBuffer.size() + ")"); - } - flushPrivacyLogSafely(); - long now = System.currentTimeMillis(); - addCountEntry(now); - addThemeIdEntry(now); - addLanguagesEntry(now); - addSettingsEntry(now); - addVersionNameEntry(now); - addSuggestionCountEntry(now); - String s = LogSerializer.createStringFromEntries(mLogBuffer); - if (!TextUtils.isEmpty(s)) { + // if there is no log entry in mLogBuffer, will not send logs to DropBox. + if (!mLogBuffer.isEmpty() && (mAddTextToDropBoxTask == null + || mAddTextToDropBoxTask.getStatus() == AsyncTask.Status.FINISHED)) { if (sLOGPRINT) { - Log.d(TAG, "Commit log: " + s); + Log.d(TAG, "Commit (" + mLogBuffer.size() + ")"); } - mDropBox.addText(TAG, s); + flushPrivacyLogSafely(); + long now = System.currentTimeMillis(); + addCountEntry(now); + addThemeIdEntry(now); + addLanguagesEntry(now); + addSettingsEntry(now); + addVersionNameEntry(now); + addSuggestionCountEntry(now); + String s = LogSerializer.createStringFromEntries(mLogBuffer); + reset(); + mAddTextToDropBoxTask = (AddTextToDropBoxTask) new AddTextToDropBoxTask( + mDropBox, now, s).execute(); } - reset(); - mLastTimeSend = now; } private void commitInternalAndStopSelf() { @@ -473,6 +501,11 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } + public static void onDestroy() { + sLatinImeLogger.commitInternal(); + sLatinImeLogger.destroy(); + } + // TODO: Handle CharSequence instead of String public static void logOnManualSuggestion(String before, String after, int position , List suggestions) { From c9e1a333eaa34b142fbd1c59293877e949813596 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 18 Jun 2010 03:02:00 +0900 Subject: [PATCH 077/159] Copy KeyboardView.java to temp folder for showing diff of LatinKeyboardViewBase.java Change-Id: I7e0a8fd37a7cd6196e35865451621cccf49e77cc --- temp/KeyboardView.java | 1467 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1467 insertions(+) create mode 100644 temp/KeyboardView.java diff --git a/temp/KeyboardView.java b/temp/KeyboardView.java new file mode 100644 index 000000000..4b484092d --- /dev/null +++ b/temp/KeyboardView.java @@ -0,0 +1,1467 @@ +/* + * Copyright (C) 2008-2009 Google Inc. + * + * 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 android.inputmethodservice; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.graphics.Paint.Align; +import android.graphics.Region.Op; +import android.graphics.drawable.Drawable; +import android.inputmethodservice.Keyboard.Key; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.GestureDetector; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup.LayoutParams; +import android.widget.PopupWindow; +import android.widget.TextView; + +import com.android.internal.R; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * A view that renders a virtual {@link Keyboard}. It handles rendering of keys and + * detecting key presses and touch movements. + * + * @attr ref android.R.styleable#KeyboardView_keyBackground + * @attr ref android.R.styleable#KeyboardView_keyPreviewLayout + * @attr ref android.R.styleable#KeyboardView_keyPreviewOffset + * @attr ref android.R.styleable#KeyboardView_labelTextSize + * @attr ref android.R.styleable#KeyboardView_keyTextSize + * @attr ref android.R.styleable#KeyboardView_keyTextColor + * @attr ref android.R.styleable#KeyboardView_verticalCorrection + * @attr ref android.R.styleable#KeyboardView_popupLayout + */ +public class KeyboardView extends View implements View.OnClickListener { + + /** + * Listener for virtual keyboard events. + */ + public interface OnKeyboardActionListener { + + /** + * Called when the user presses a key. This is sent before the {@link #onKey} is called. + * For keys that repeat, this is only called once. + * @param primaryCode the unicode of the key being pressed. If the touch is not on a valid + * key, the value will be zero. + */ + void onPress(int primaryCode); + + /** + * Called when the user releases a key. This is sent after the {@link #onKey} is called. + * For keys that repeat, this is only called once. + * @param primaryCode the code of the key that was released + */ + void onRelease(int primaryCode); + + /** + * Send a key press to the listener. + * @param primaryCode this is the key that was pressed + * @param keyCodes the codes for all the possible alternative keys + * with the primary code being the first. If the primary key code is + * a single character such as an alphabet or number or symbol, the alternatives + * will include other characters that may be on the same key or adjacent keys. + * These codes are useful to correct for accidental presses of a key adjacent to + * the intended key. + */ + void onKey(int primaryCode, int[] keyCodes); + + /** + * Sends a sequence of characters to the listener. + * @param text the sequence of characters to be displayed. + */ + void onText(CharSequence text); + + /** + * Called when the user quickly moves the finger from right to left. + */ + void swipeLeft(); + + /** + * Called when the user quickly moves the finger from left to right. + */ + void swipeRight(); + + /** + * Called when the user quickly moves the finger from up to down. + */ + void swipeDown(); + + /** + * Called when the user quickly moves the finger from down to up. + */ + void swipeUp(); + } + + private static final boolean DEBUG = false; + private static final int NOT_A_KEY = -1; + private static final int[] KEY_DELETE = { Keyboard.KEYCODE_DELETE }; + private static final int[] LONG_PRESSABLE_STATE_SET = { R.attr.state_long_pressable }; + + private Keyboard mKeyboard; + private int mCurrentKeyIndex = NOT_A_KEY; + private int mLabelTextSize; + private int mKeyTextSize; + private int mKeyTextColor; + private float mShadowRadius; + private int mShadowColor; + private float mBackgroundDimAmount; + + private TextView mPreviewText; + private PopupWindow mPreviewPopup; + private int mPreviewTextSizeLarge; + private int mPreviewOffset; + private int mPreviewHeight; + private int[] mOffsetInWindow; + + private PopupWindow mPopupKeyboard; + private View mMiniKeyboardContainer; + private KeyboardView mMiniKeyboard; + private boolean mMiniKeyboardOnScreen; + private View mPopupParent; + private int mMiniKeyboardOffsetX; + private int mMiniKeyboardOffsetY; + private Map mMiniKeyboardCache; + private int[] mWindowOffset; + private Key[] mKeys; + + /** Listener for {@link OnKeyboardActionListener}. */ + private OnKeyboardActionListener mKeyboardActionListener; + + private static final int MSG_SHOW_PREVIEW = 1; + private static final int MSG_REMOVE_PREVIEW = 2; + private static final int MSG_REPEAT = 3; + private static final int MSG_LONGPRESS = 4; + + private static final int DELAY_BEFORE_PREVIEW = 0; + private static final int DELAY_AFTER_PREVIEW = 70; + private static final int DEBOUNCE_TIME = 70; + + private int mVerticalCorrection; + private int mProximityThreshold; + + private boolean mPreviewCentered = false; + private boolean mShowPreview = true; + private boolean mShowTouchPoints = true; + private int mPopupPreviewX; + private int mPopupPreviewY; + private int mWindowY; + + private int mLastX; + private int mLastY; + private int mStartX; + private int mStartY; + + private boolean mProximityCorrectOn; + + private Paint mPaint; + private Rect mPadding; + + private long mDownTime; + private long mLastMoveTime; + private int mLastKey; + private int mLastCodeX; + private int mLastCodeY; + private int mCurrentKey = NOT_A_KEY; + private int mDownKey = NOT_A_KEY; + private long mLastKeyTime; + private long mCurrentKeyTime; + private int[] mKeyIndices = new int[12]; + private GestureDetector mGestureDetector; + private int mPopupX; + private int mPopupY; + private int mRepeatKeyIndex = NOT_A_KEY; + private int mPopupLayout; + private boolean mAbortKey; + private Key mInvalidatedKey; + private Rect mClipRegion = new Rect(0, 0, 0, 0); + private boolean mPossiblePoly; + private SwipeTracker mSwipeTracker = new SwipeTracker(); + private int mSwipeThreshold; + private boolean mDisambiguateSwipe; + + // Variables for dealing with multiple pointers + private int mOldPointerCount = 1; + private float mOldPointerX; + private float mOldPointerY; + + private Drawable mKeyBackground; + + private static final int REPEAT_INTERVAL = 50; // ~20 keys per second + private static final int REPEAT_START_DELAY = 400; + private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout(); + + private static int MAX_NEARBY_KEYS = 12; + private int[] mDistances = new int[MAX_NEARBY_KEYS]; + + // For multi-tap + private int mLastSentIndex; + private int mTapCount; + private long mLastTapTime; + private boolean mInMultiTap; + private static final int MULTITAP_INTERVAL = 800; // milliseconds + private StringBuilder mPreviewLabel = new StringBuilder(1); + + /** Whether the keyboard bitmap needs to be redrawn before it's blitted. **/ + private boolean mDrawPending; + /** The dirty region in the keyboard bitmap */ + private Rect mDirtyRect = new Rect(); + /** The keyboard bitmap for faster updates */ + private Bitmap mBuffer; + /** Notes if the keyboard just changed, so that we could possibly reallocate the mBuffer. */ + private boolean mKeyboardChanged; + /** The canvas for the above mutable keyboard bitmap */ + private Canvas mCanvas; + + Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_SHOW_PREVIEW: + showKey(msg.arg1); + break; + case MSG_REMOVE_PREVIEW: + mPreviewText.setVisibility(INVISIBLE); + break; + case MSG_REPEAT: + if (repeatKey()) { + Message repeat = Message.obtain(this, MSG_REPEAT); + sendMessageDelayed(repeat, REPEAT_INTERVAL); + } + break; + case MSG_LONGPRESS: + openPopupIfRequired((MotionEvent) msg.obj); + break; + } + } + }; + + public KeyboardView(Context context, AttributeSet attrs) { + this(context, attrs, com.android.internal.R.attr.keyboardViewStyle); + } + + public KeyboardView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = + context.obtainStyledAttributes( + attrs, android.R.styleable.KeyboardView, defStyle, 0); + + LayoutInflater inflate = + (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + int previewLayout = 0; + int keyTextSize = 0; + + int n = a.getIndexCount(); + + for (int i = 0; i < n; i++) { + int attr = a.getIndex(i); + + switch (attr) { + case com.android.internal.R.styleable.KeyboardView_keyBackground: + mKeyBackground = a.getDrawable(attr); + break; + case com.android.internal.R.styleable.KeyboardView_verticalCorrection: + mVerticalCorrection = a.getDimensionPixelOffset(attr, 0); + break; + case com.android.internal.R.styleable.KeyboardView_keyPreviewLayout: + previewLayout = a.getResourceId(attr, 0); + break; + case com.android.internal.R.styleable.KeyboardView_keyPreviewOffset: + mPreviewOffset = a.getDimensionPixelOffset(attr, 0); + break; + case com.android.internal.R.styleable.KeyboardView_keyPreviewHeight: + mPreviewHeight = a.getDimensionPixelSize(attr, 80); + break; + case com.android.internal.R.styleable.KeyboardView_keyTextSize: + mKeyTextSize = a.getDimensionPixelSize(attr, 18); + break; + case com.android.internal.R.styleable.KeyboardView_keyTextColor: + mKeyTextColor = a.getColor(attr, 0xFF000000); + break; + case com.android.internal.R.styleable.KeyboardView_labelTextSize: + mLabelTextSize = a.getDimensionPixelSize(attr, 14); + break; + case com.android.internal.R.styleable.KeyboardView_popupLayout: + mPopupLayout = a.getResourceId(attr, 0); + break; + case com.android.internal.R.styleable.KeyboardView_shadowColor: + mShadowColor = a.getColor(attr, 0); + break; + case com.android.internal.R.styleable.KeyboardView_shadowRadius: + mShadowRadius = a.getFloat(attr, 0f); + break; + } + } + + a = mContext.obtainStyledAttributes( + com.android.internal.R.styleable.Theme); + mBackgroundDimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f); + + mPreviewPopup = new PopupWindow(context); + if (previewLayout != 0) { + mPreviewText = (TextView) inflate.inflate(previewLayout, null); + mPreviewTextSizeLarge = (int) mPreviewText.getTextSize(); + mPreviewPopup.setContentView(mPreviewText); + mPreviewPopup.setBackgroundDrawable(null); + } else { + mShowPreview = false; + } + + mPreviewPopup.setTouchable(false); + + mPopupKeyboard = new PopupWindow(context); + mPopupKeyboard.setBackgroundDrawable(null); + //mPopupKeyboard.setClippingEnabled(false); + + mPopupParent = this; + //mPredicting = true; + + mPaint = new Paint(); + mPaint.setAntiAlias(true); + mPaint.setTextSize(keyTextSize); + mPaint.setTextAlign(Align.CENTER); + mPaint.setAlpha(255); + + mPadding = new Rect(0, 0, 0, 0); + mMiniKeyboardCache = new HashMap(); + mKeyBackground.getPadding(mPadding); + + mSwipeThreshold = (int) (500 * getResources().getDisplayMetrics().density); + mDisambiguateSwipe = getResources().getBoolean( + com.android.internal.R.bool.config_swipeDisambiguation); + resetMultiTap(); + initGestureDetector(); + } + + private void initGestureDetector() { + mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onFling(MotionEvent me1, MotionEvent me2, + float velocityX, float velocityY) { + if (mPossiblePoly) return false; + final float absX = Math.abs(velocityX); + final float absY = Math.abs(velocityY); + float deltaX = me2.getX() - me1.getX(); + float deltaY = me2.getY() - me1.getY(); + int travelX = getWidth() / 2; // Half the keyboard width + int travelY = getHeight() / 2; // Half the keyboard height + mSwipeTracker.computeCurrentVelocity(1000); + final float endingVelocityX = mSwipeTracker.getXVelocity(); + final float endingVelocityY = mSwipeTracker.getYVelocity(); + boolean sendDownKey = false; + if (velocityX > mSwipeThreshold && absY < absX && deltaX > travelX) { + if (mDisambiguateSwipe && endingVelocityX < velocityX / 4) { + sendDownKey = true; + } else { + swipeRight(); + return true; + } + } else if (velocityX < -mSwipeThreshold && absY < absX && deltaX < -travelX) { + if (mDisambiguateSwipe && endingVelocityX > velocityX / 4) { + sendDownKey = true; + } else { + swipeLeft(); + return true; + } + } else if (velocityY < -mSwipeThreshold && absX < absY && deltaY < -travelY) { + if (mDisambiguateSwipe && endingVelocityY > velocityY / 4) { + sendDownKey = true; + } else { + swipeUp(); + return true; + } + } else if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) { + if (mDisambiguateSwipe && endingVelocityY < velocityY / 4) { + sendDownKey = true; + } else { + swipeDown(); + return true; + } + } + + if (sendDownKey) { + detectAndSendKey(mDownKey, mStartX, mStartY, me1.getEventTime()); + } + return false; + } + }); + + mGestureDetector.setIsLongpressEnabled(false); + } + + public void setOnKeyboardActionListener(OnKeyboardActionListener listener) { + mKeyboardActionListener = listener; + } + + /** + * Returns the {@link OnKeyboardActionListener} object. + * @return the listener attached to this keyboard + */ + protected OnKeyboardActionListener getOnKeyboardActionListener() { + return mKeyboardActionListener; + } + + /** + * Attaches a keyboard to this view. The keyboard can be switched at any time and the + * view will re-layout itself to accommodate the keyboard. + * @see Keyboard + * @see #getKeyboard() + * @param keyboard the keyboard to display in this view + */ + public void setKeyboard(Keyboard keyboard) { + if (mKeyboard != null) { + showPreview(NOT_A_KEY); + } + // Remove any pending messages + removeMessages(); + mKeyboard = keyboard; + List keys = mKeyboard.getKeys(); + mKeys = keys.toArray(new Key[keys.size()]); + requestLayout(); + // Hint to reallocate the buffer if the size changed + mKeyboardChanged = true; + invalidateAllKeys(); + computeProximityThreshold(keyboard); + mMiniKeyboardCache.clear(); // Not really necessary to do every time, but will free up views + // Switching to a different keyboard should abort any pending keys so that the key up + // doesn't get delivered to the old or new keyboard + mAbortKey = true; // Until the next ACTION_DOWN + } + + /** + * Returns the current keyboard being displayed by this view. + * @return the currently attached keyboard + * @see #setKeyboard(Keyboard) + */ + public Keyboard getKeyboard() { + return mKeyboard; + } + + /** + * Sets the state of the shift key of the keyboard, if any. + * @param shifted whether or not to enable the state of the shift key + * @return true if the shift key state changed, false if there was no change + * @see KeyboardView#isShifted() + */ + public boolean setShifted(boolean shifted) { + if (mKeyboard != null) { + if (mKeyboard.setShifted(shifted)) { + // The whole keyboard probably needs to be redrawn + invalidateAllKeys(); + return true; + } + } + return false; + } + + /** + * Returns the state of the shift key of the keyboard, if any. + * @return true if the shift is in a pressed state, false otherwise. If there is + * no shift key on the keyboard or there is no keyboard attached, it returns false. + * @see KeyboardView#setShifted(boolean) + */ + public boolean isShifted() { + if (mKeyboard != null) { + return mKeyboard.isShifted(); + } + return false; + } + + /** + * Enables or disables the key feedback popup. This is a popup that shows a magnified + * version of the depressed key. By default the preview is enabled. + * @param previewEnabled whether or not to enable the key feedback popup + * @see #isPreviewEnabled() + */ + public void setPreviewEnabled(boolean previewEnabled) { + mShowPreview = previewEnabled; + } + + /** + * Returns the enabled state of the key feedback popup. + * @return whether or not the key feedback popup is enabled + * @see #setPreviewEnabled(boolean) + */ + public boolean isPreviewEnabled() { + return mShowPreview; + } + + public void setVerticalCorrection(int verticalOffset) { + + } + public void setPopupParent(View v) { + mPopupParent = v; + } + + public void setPopupOffset(int x, int y) { + mMiniKeyboardOffsetX = x; + mMiniKeyboardOffsetY = y; + if (mPreviewPopup.isShowing()) { + mPreviewPopup.dismiss(); + } + } + + /** + * When enabled, calls to {@link OnKeyboardActionListener#onKey} will include key + * codes for adjacent keys. When disabled, only the primary key code will be + * reported. + * @param enabled whether or not the proximity correction is enabled + */ + public void setProximityCorrectionEnabled(boolean enabled) { + mProximityCorrectOn = enabled; + } + + /** + * Returns true if proximity correction is enabled. + */ + public boolean isProximityCorrectionEnabled() { + return mProximityCorrectOn; + } + + /** + * Popup keyboard close button clicked. + * @hide + */ + public void onClick(View v) { + dismissPopupKeyboard(); + } + + private CharSequence adjustCase(CharSequence label) { + if (mKeyboard.isShifted() && label != null && label.length() < 3 + && Character.isLowerCase(label.charAt(0))) { + label = label.toString().toUpperCase(); + } + return label; + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // Round up a little + if (mKeyboard == null) { + setMeasuredDimension(mPaddingLeft + mPaddingRight, mPaddingTop + mPaddingBottom); + } else { + int width = mKeyboard.getMinWidth() + mPaddingLeft + mPaddingRight; + if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) { + width = MeasureSpec.getSize(widthMeasureSpec); + } + setMeasuredDimension(width, mKeyboard.getHeight() + mPaddingTop + mPaddingBottom); + } + } + + /** + * Compute the average distance between adjacent keys (horizontally and vertically) + * and square it to get the proximity threshold. We use a square here and in computing + * the touch distance from a key's center to avoid taking a square root. + * @param keyboard + */ + private void computeProximityThreshold(Keyboard keyboard) { + if (keyboard == null) return; + final Key[] keys = mKeys; + if (keys == null) return; + int length = keys.length; + int dimensionSum = 0; + for (int i = 0; i < length; i++) { + Key key = keys[i]; + dimensionSum += Math.min(key.width, key.height) + key.gap; + } + if (dimensionSum < 0 || length == 0) return; + mProximityThreshold = (int) (dimensionSum * 1.4f / length); + mProximityThreshold *= mProximityThreshold; // Square it + } + + @Override + public void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + // Release the buffer, if any and it will be reallocated on the next draw + mBuffer = null; + } + + @Override + public void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (mDrawPending || mBuffer == null || mKeyboardChanged) { + onBufferDraw(); + } + canvas.drawBitmap(mBuffer, 0, 0, null); + } + + private void onBufferDraw() { + if (mBuffer == null || mKeyboardChanged) { + if (mBuffer == null || mKeyboardChanged && + (mBuffer.getWidth() != getWidth() || mBuffer.getHeight() != getHeight())) { + // Make sure our bitmap is at least 1x1 + final int width = Math.max(1, getWidth()); + final int height = Math.max(1, getHeight()); + mBuffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + mCanvas = new Canvas(mBuffer); + } + invalidateAllKeys(); + mKeyboardChanged = false; + } + final Canvas canvas = mCanvas; + canvas.clipRect(mDirtyRect, Op.REPLACE); + + if (mKeyboard == null) return; + + final Paint paint = mPaint; + final Drawable keyBackground = mKeyBackground; + final Rect clipRegion = mClipRegion; + final Rect padding = mPadding; + final int kbdPaddingLeft = mPaddingLeft; + final int kbdPaddingTop = mPaddingTop; + final Key[] keys = mKeys; + final Key invalidKey = mInvalidatedKey; + + paint.setColor(mKeyTextColor); + boolean drawSingleKey = false; + if (invalidKey != null && canvas.getClipBounds(clipRegion)) { + // Is clipRegion completely contained within the invalidated key? + if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left && + invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top && + invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right && + invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) { + drawSingleKey = true; + } + } + canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR); + final int keyCount = keys.length; + for (int i = 0; i < keyCount; i++) { + final Key key = keys[i]; + if (drawSingleKey && invalidKey != key) { + continue; + } + int[] drawableState = key.getCurrentDrawableState(); + keyBackground.setState(drawableState); + + // Switch the character to uppercase if shift is pressed + String label = key.label == null? null : adjustCase(key.label).toString(); + + final Rect bounds = keyBackground.getBounds(); + if (key.width != bounds.right || + key.height != bounds.bottom) { + keyBackground.setBounds(0, 0, key.width, key.height); + } + canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop); + keyBackground.draw(canvas); + + if (label != null) { + // For characters, use large font. For labels like "Done", use small font. + if (label.length() > 1 && key.codes.length < 2) { + paint.setTextSize(mLabelTextSize); + paint.setTypeface(Typeface.DEFAULT_BOLD); + } else { + paint.setTextSize(mKeyTextSize); + paint.setTypeface(Typeface.DEFAULT); + } + // Draw a drop shadow for the text + paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor); + // Draw the text + canvas.drawText(label, + (key.width - padding.left - padding.right) / 2 + + padding.left, + (key.height - padding.top - padding.bottom) / 2 + + (paint.getTextSize() - paint.descent()) / 2 + padding.top, + paint); + // Turn off drop shadow + paint.setShadowLayer(0, 0, 0, 0); + } else if (key.icon != null) { + final int drawableX = (key.width - padding.left - padding.right + - key.icon.getIntrinsicWidth()) / 2 + padding.left; + final int drawableY = (key.height - padding.top - padding.bottom + - key.icon.getIntrinsicHeight()) / 2 + padding.top; + canvas.translate(drawableX, drawableY); + key.icon.setBounds(0, 0, + key.icon.getIntrinsicWidth(), key.icon.getIntrinsicHeight()); + key.icon.draw(canvas); + canvas.translate(-drawableX, -drawableY); + } + canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop); + } + mInvalidatedKey = null; + // Overlay a dark rectangle to dim the keyboard + if (mMiniKeyboardOnScreen) { + paint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24); + canvas.drawRect(0, 0, getWidth(), getHeight(), paint); + } + + if (DEBUG && mShowTouchPoints) { + paint.setAlpha(128); + paint.setColor(0xFFFF0000); + canvas.drawCircle(mStartX, mStartY, 3, paint); + canvas.drawLine(mStartX, mStartY, mLastX, mLastY, paint); + paint.setColor(0xFF0000FF); + canvas.drawCircle(mLastX, mLastY, 3, paint); + paint.setColor(0xFF00FF00); + canvas.drawCircle((mStartX + mLastX) / 2, (mStartY + mLastY) / 2, 2, paint); + } + + mDrawPending = false; + mDirtyRect.setEmpty(); + } + + private int getKeyIndices(int x, int y, int[] allKeys) { + final Key[] keys = mKeys; + int primaryIndex = NOT_A_KEY; + int closestKey = NOT_A_KEY; + int closestKeyDist = mProximityThreshold + 1; + java.util.Arrays.fill(mDistances, Integer.MAX_VALUE); + int [] nearestKeyIndices = mKeyboard.getNearestKeys(x, y); + final int keyCount = nearestKeyIndices.length; + for (int i = 0; i < keyCount; i++) { + final Key key = keys[nearestKeyIndices[i]]; + int dist = 0; + boolean isInside = key.isInside(x,y); + if (isInside) { + primaryIndex = nearestKeyIndices[i]; + } + + if (((mProximityCorrectOn + && (dist = key.squaredDistanceFrom(x, y)) < mProximityThreshold) + || isInside) + && key.codes[0] > 32) { + // Find insertion point + final int nCodes = key.codes.length; + if (dist < closestKeyDist) { + closestKeyDist = dist; + closestKey = nearestKeyIndices[i]; + } + + if (allKeys == null) continue; + + for (int j = 0; j < mDistances.length; j++) { + if (mDistances[j] > dist) { + // Make space for nCodes codes + System.arraycopy(mDistances, j, mDistances, j + nCodes, + mDistances.length - j - nCodes); + System.arraycopy(allKeys, j, allKeys, j + nCodes, + allKeys.length - j - nCodes); + for (int c = 0; c < nCodes; c++) { + allKeys[j + c] = key.codes[c]; + mDistances[j + c] = dist; + } + break; + } + } + } + } + if (primaryIndex == NOT_A_KEY) { + primaryIndex = closestKey; + } + return primaryIndex; + } + + private void detectAndSendKey(int index, int x, int y, long eventTime) { + if (index != NOT_A_KEY && index < mKeys.length) { + final Key key = mKeys[index]; + if (key.text != null) { + mKeyboardActionListener.onText(key.text); + mKeyboardActionListener.onRelease(NOT_A_KEY); + } else { + int code = key.codes[0]; + //TextEntryState.keyPressedAt(key, x, y); + int[] codes = new int[MAX_NEARBY_KEYS]; + Arrays.fill(codes, NOT_A_KEY); + getKeyIndices(x, y, codes); + // Multi-tap + if (mInMultiTap) { + if (mTapCount != -1) { + mKeyboardActionListener.onKey(Keyboard.KEYCODE_DELETE, KEY_DELETE); + } else { + mTapCount = 0; + } + code = key.codes[mTapCount]; + } + mKeyboardActionListener.onKey(code, codes); + mKeyboardActionListener.onRelease(code); + } + mLastSentIndex = index; + mLastTapTime = eventTime; + } + } + + /** + * Handle multi-tap keys by producing the key label for the current multi-tap state. + */ + private CharSequence getPreviewText(Key key) { + if (mInMultiTap) { + // Multi-tap + mPreviewLabel.setLength(0); + mPreviewLabel.append((char) key.codes[mTapCount < 0 ? 0 : mTapCount]); + return adjustCase(mPreviewLabel); + } else { + return adjustCase(key.label); + } + } + + private void showPreview(int keyIndex) { + int oldKeyIndex = mCurrentKeyIndex; + final PopupWindow previewPopup = mPreviewPopup; + + mCurrentKeyIndex = keyIndex; + // Release the old key and press the new key + final Key[] keys = mKeys; + if (oldKeyIndex != mCurrentKeyIndex) { + if (oldKeyIndex != NOT_A_KEY && keys.length > oldKeyIndex) { + keys[oldKeyIndex].onReleased(mCurrentKeyIndex == NOT_A_KEY); + invalidateKey(oldKeyIndex); + } + if (mCurrentKeyIndex != NOT_A_KEY && keys.length > mCurrentKeyIndex) { + keys[mCurrentKeyIndex].onPressed(); + invalidateKey(mCurrentKeyIndex); + } + } + // If key changed and preview is on ... + if (oldKeyIndex != mCurrentKeyIndex && mShowPreview) { + mHandler.removeMessages(MSG_SHOW_PREVIEW); + if (previewPopup.isShowing()) { + if (keyIndex == NOT_A_KEY) { + mHandler.sendMessageDelayed(mHandler + .obtainMessage(MSG_REMOVE_PREVIEW), + DELAY_AFTER_PREVIEW); + } + } + if (keyIndex != NOT_A_KEY) { + if (previewPopup.isShowing() && mPreviewText.getVisibility() == VISIBLE) { + // Show right away, if it's already visible and finger is moving around + showKey(keyIndex); + } else { + mHandler.sendMessageDelayed( + mHandler.obtainMessage(MSG_SHOW_PREVIEW, keyIndex, 0), + DELAY_BEFORE_PREVIEW); + } + } + } + } + + private void showKey(final int keyIndex) { + final PopupWindow previewPopup = mPreviewPopup; + final Key[] keys = mKeys; + if (keyIndex < 0 || keyIndex >= mKeys.length) return; + Key key = keys[keyIndex]; + if (key.icon != null) { + mPreviewText.setCompoundDrawables(null, null, null, + key.iconPreview != null ? key.iconPreview : key.icon); + mPreviewText.setText(null); + } else { + mPreviewText.setCompoundDrawables(null, null, null, null); + mPreviewText.setText(getPreviewText(key)); + if (key.label.length() > 1 && key.codes.length < 2) { + mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyTextSize); + mPreviewText.setTypeface(Typeface.DEFAULT_BOLD); + } else { + mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge); + mPreviewText.setTypeface(Typeface.DEFAULT); + } + } + mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + int popupWidth = Math.max(mPreviewText.getMeasuredWidth(), key.width + + mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight()); + final int popupHeight = mPreviewHeight; + LayoutParams lp = mPreviewText.getLayoutParams(); + if (lp != null) { + lp.width = popupWidth; + lp.height = popupHeight; + } + if (!mPreviewCentered) { + mPopupPreviewX = key.x - mPreviewText.getPaddingLeft() + mPaddingLeft; + mPopupPreviewY = key.y - popupHeight + mPreviewOffset; + } else { + // TODO: Fix this if centering is brought back + mPopupPreviewX = 160 - mPreviewText.getMeasuredWidth() / 2; + mPopupPreviewY = - mPreviewText.getMeasuredHeight(); + } + mHandler.removeMessages(MSG_REMOVE_PREVIEW); + if (mOffsetInWindow == null) { + mOffsetInWindow = new int[2]; + getLocationInWindow(mOffsetInWindow); + mOffsetInWindow[0] += mMiniKeyboardOffsetX; // Offset may be zero + mOffsetInWindow[1] += mMiniKeyboardOffsetY; // Offset may be zero + int[] mWindowLocation = new int[2]; + getLocationOnScreen(mWindowLocation); + mWindowY = mWindowLocation[1]; + } + // Set the preview background state + mPreviewText.getBackground().setState( + key.popupResId != 0 ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET); + mPopupPreviewX += mOffsetInWindow[0]; + mPopupPreviewY += mOffsetInWindow[1]; + + // If the popup cannot be shown above the key, put it on the side + if (mPopupPreviewY + mWindowY < 0) { + // If the key you're pressing is on the left side of the keyboard, show the popup on + // the right, offset by enough to see at least one key to the left/right. + if (key.x + key.width <= getWidth() / 2) { + mPopupPreviewX += (int) (key.width * 2.5); + } else { + mPopupPreviewX -= (int) (key.width * 2.5); + } + mPopupPreviewY += popupHeight; + } + + if (previewPopup.isShowing()) { + previewPopup.update(mPopupPreviewX, mPopupPreviewY, + popupWidth, popupHeight); + } else { + previewPopup.setWidth(popupWidth); + previewPopup.setHeight(popupHeight); + previewPopup.showAtLocation(mPopupParent, Gravity.NO_GRAVITY, + mPopupPreviewX, mPopupPreviewY); + } + mPreviewText.setVisibility(VISIBLE); + } + + /** + * Requests a redraw of the entire keyboard. Calling {@link #invalidate} is not sufficient + * because the keyboard renders the keys to an off-screen buffer and an invalidate() only + * draws the cached buffer. + * @see #invalidateKey(int) + */ + public void invalidateAllKeys() { + mDirtyRect.union(0, 0, getWidth(), getHeight()); + mDrawPending = true; + invalidate(); + } + + /** + * Invalidates a key so that it will be redrawn on the next repaint. Use this method if only + * one key is changing it's content. Any changes that affect the position or size of the key + * may not be honored. + * @param keyIndex the index of the key in the attached {@link Keyboard}. + * @see #invalidateAllKeys + */ + public void invalidateKey(int keyIndex) { + if (mKeys == null) return; + if (keyIndex < 0 || keyIndex >= mKeys.length) { + return; + } + final Key key = mKeys[keyIndex]; + mInvalidatedKey = key; + mDirtyRect.union(key.x + mPaddingLeft, key.y + mPaddingTop, + key.x + key.width + mPaddingLeft, key.y + key.height + mPaddingTop); + onBufferDraw(); + invalidate(key.x + mPaddingLeft, key.y + mPaddingTop, + key.x + key.width + mPaddingLeft, key.y + key.height + mPaddingTop); + } + + private boolean openPopupIfRequired(MotionEvent me) { + // Check if we have a popup layout specified first. + if (mPopupLayout == 0) { + return false; + } + if (mCurrentKey < 0 || mCurrentKey >= mKeys.length) { + return false; + } + + Key popupKey = mKeys[mCurrentKey]; + boolean result = onLongPress(popupKey); + if (result) { + mAbortKey = true; + showPreview(NOT_A_KEY); + } + return result; + } + + /** + * Called when a key is long pressed. By default this will open any popup keyboard associated + * with this key through the attributes popupLayout and popupCharacters. + * @param popupKey the key that was long pressed + * @return true if the long press is handled, false otherwise. Subclasses should call the + * method on the base class if the subclass doesn't wish to handle the call. + */ + protected boolean onLongPress(Key popupKey) { + int popupKeyboardId = popupKey.popupResId; + + if (popupKeyboardId != 0) { + mMiniKeyboardContainer = mMiniKeyboardCache.get(popupKey); + if (mMiniKeyboardContainer == null) { + LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( + Context.LAYOUT_INFLATER_SERVICE); + mMiniKeyboardContainer = inflater.inflate(mPopupLayout, null); + mMiniKeyboard = (KeyboardView) mMiniKeyboardContainer.findViewById( + com.android.internal.R.id.keyboardView); + View closeButton = mMiniKeyboardContainer.findViewById( + com.android.internal.R.id.closeButton); + if (closeButton != null) closeButton.setOnClickListener(this); + mMiniKeyboard.setOnKeyboardActionListener(new OnKeyboardActionListener() { + public void onKey(int primaryCode, int[] keyCodes) { + mKeyboardActionListener.onKey(primaryCode, keyCodes); + dismissPopupKeyboard(); + } + + public void onText(CharSequence text) { + mKeyboardActionListener.onText(text); + dismissPopupKeyboard(); + } + + public void swipeLeft() { } + public void swipeRight() { } + public void swipeUp() { } + public void swipeDown() { } + public void onPress(int primaryCode) { + mKeyboardActionListener.onPress(primaryCode); + } + public void onRelease(int primaryCode) { + mKeyboardActionListener.onRelease(primaryCode); + } + }); + //mInputView.setSuggest(mSuggest); + Keyboard keyboard; + if (popupKey.popupCharacters != null) { + keyboard = new Keyboard(getContext(), popupKeyboardId, + popupKey.popupCharacters, -1, getPaddingLeft() + getPaddingRight()); + } else { + keyboard = new Keyboard(getContext(), popupKeyboardId); + } + mMiniKeyboard.setKeyboard(keyboard); + mMiniKeyboard.setPopupParent(this); + mMiniKeyboardContainer.measure( + MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), + MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); + + mMiniKeyboardCache.put(popupKey, mMiniKeyboardContainer); + } else { + mMiniKeyboard = (KeyboardView) mMiniKeyboardContainer.findViewById( + com.android.internal.R.id.keyboardView); + } + if (mWindowOffset == null) { + mWindowOffset = new int[2]; + getLocationInWindow(mWindowOffset); + } + mPopupX = popupKey.x + mPaddingLeft; + mPopupY = popupKey.y + mPaddingTop; + mPopupX = mPopupX + popupKey.width - mMiniKeyboardContainer.getMeasuredWidth(); + mPopupY = mPopupY - mMiniKeyboardContainer.getMeasuredHeight(); + final int x = mPopupX + mMiniKeyboardContainer.getPaddingRight() + mWindowOffset[0]; + final int y = mPopupY + mMiniKeyboardContainer.getPaddingBottom() + mWindowOffset[1]; + mMiniKeyboard.setPopupOffset(x < 0 ? 0 : x, y); + mMiniKeyboard.setShifted(isShifted()); + mPopupKeyboard.setContentView(mMiniKeyboardContainer); + mPopupKeyboard.setWidth(mMiniKeyboardContainer.getMeasuredWidth()); + mPopupKeyboard.setHeight(mMiniKeyboardContainer.getMeasuredHeight()); + mPopupKeyboard.showAtLocation(this, Gravity.NO_GRAVITY, x, y); + mMiniKeyboardOnScreen = true; + //mMiniKeyboard.onTouchEvent(getTranslatedEvent(me)); + invalidateAllKeys(); + return true; + } + return false; + } + + private long mOldEventTime; + private boolean mUsedVelocity; + + @Override + public boolean onTouchEvent(MotionEvent me) { + // Convert multi-pointer up/down events to single up/down events to + // deal with the typical multi-pointer behavior of two-thumb typing + final int pointerCount = me.getPointerCount(); + final int action = me.getAction(); + boolean result = false; + final long now = me.getEventTime(); + + if (pointerCount != mOldPointerCount) { + if (pointerCount == 1) { + // Send a down event for the latest pointer + MotionEvent down = MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN, + me.getX(), me.getY(), me.getMetaState()); + result = onModifiedTouchEvent(down, false); + down.recycle(); + // If it's an up action, then deliver the up as well. + if (action == MotionEvent.ACTION_UP) { + result = onModifiedTouchEvent(me, true); + } + } else { + // Send an up event for the last pointer + MotionEvent up = MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, + mOldPointerX, mOldPointerY, me.getMetaState()); + result = onModifiedTouchEvent(up, true); + up.recycle(); + } + } else { + if (pointerCount == 1) { + result = onModifiedTouchEvent(me, false); + mOldPointerX = me.getX(); + mOldPointerY = me.getY(); + } else { + // Don't do anything when 2 pointers are down and moving. + result = true; + } + } + mOldPointerCount = pointerCount; + + return result; + } + + private boolean onModifiedTouchEvent(MotionEvent me, boolean possiblePoly) { + int touchX = (int) me.getX() - mPaddingLeft; + int touchY = (int) me.getY() + mVerticalCorrection - mPaddingTop; + final int action = me.getAction(); + final long eventTime = me.getEventTime(); + mOldEventTime = eventTime; + int keyIndex = getKeyIndices(touchX, touchY, null); + mPossiblePoly = possiblePoly; + + // Track the last few movements to look for spurious swipes. + if (action == MotionEvent.ACTION_DOWN) mSwipeTracker.clear(); + mSwipeTracker.addMovement(me); + + // Ignore all motion events until a DOWN. + if (mAbortKey + && action != MotionEvent.ACTION_DOWN && action != MotionEvent.ACTION_CANCEL) { + return true; + } + + if (mGestureDetector.onTouchEvent(me)) { + showPreview(NOT_A_KEY); + mHandler.removeMessages(MSG_REPEAT); + mHandler.removeMessages(MSG_LONGPRESS); + return true; + } + + // Needs to be called after the gesture detector gets a turn, as it may have + // displayed the mini keyboard + if (mMiniKeyboardOnScreen && action != MotionEvent.ACTION_CANCEL) { + return true; + } + + switch (action) { + case MotionEvent.ACTION_DOWN: + mAbortKey = false; + mStartX = touchX; + mStartY = touchY; + mLastCodeX = touchX; + mLastCodeY = touchY; + mLastKeyTime = 0; + mCurrentKeyTime = 0; + mLastKey = NOT_A_KEY; + mCurrentKey = keyIndex; + mDownKey = keyIndex; + mDownTime = me.getEventTime(); + mLastMoveTime = mDownTime; + checkMultiTap(eventTime, keyIndex); + mKeyboardActionListener.onPress(keyIndex != NOT_A_KEY ? + mKeys[keyIndex].codes[0] : 0); + if (mCurrentKey >= 0 && mKeys[mCurrentKey].repeatable) { + mRepeatKeyIndex = mCurrentKey; + Message msg = mHandler.obtainMessage(MSG_REPEAT); + mHandler.sendMessageDelayed(msg, REPEAT_START_DELAY); + repeatKey(); + // Delivering the key could have caused an abort + if (mAbortKey) { + mRepeatKeyIndex = NOT_A_KEY; + break; + } + } + if (mCurrentKey != NOT_A_KEY) { + Message msg = mHandler.obtainMessage(MSG_LONGPRESS, me); + mHandler.sendMessageDelayed(msg, LONGPRESS_TIMEOUT); + } + showPreview(keyIndex); + break; + + case MotionEvent.ACTION_MOVE: + boolean continueLongPress = false; + if (keyIndex != NOT_A_KEY) { + if (mCurrentKey == NOT_A_KEY) { + mCurrentKey = keyIndex; + mCurrentKeyTime = eventTime - mDownTime; + } else { + if (keyIndex == mCurrentKey) { + mCurrentKeyTime += eventTime - mLastMoveTime; + continueLongPress = true; + } else if (mRepeatKeyIndex == NOT_A_KEY) { + resetMultiTap(); + mLastKey = mCurrentKey; + mLastCodeX = mLastX; + mLastCodeY = mLastY; + mLastKeyTime = + mCurrentKeyTime + eventTime - mLastMoveTime; + mCurrentKey = keyIndex; + mCurrentKeyTime = 0; + } + } + } + if (!continueLongPress) { + // Cancel old longpress + mHandler.removeMessages(MSG_LONGPRESS); + // Start new longpress if key has changed + if (keyIndex != NOT_A_KEY) { + Message msg = mHandler.obtainMessage(MSG_LONGPRESS, me); + mHandler.sendMessageDelayed(msg, LONGPRESS_TIMEOUT); + } + } + showPreview(mCurrentKey); + mLastMoveTime = eventTime; + break; + + case MotionEvent.ACTION_UP: + removeMessages(); + if (keyIndex == mCurrentKey) { + mCurrentKeyTime += eventTime - mLastMoveTime; + } else { + resetMultiTap(); + mLastKey = mCurrentKey; + mLastKeyTime = mCurrentKeyTime + eventTime - mLastMoveTime; + mCurrentKey = keyIndex; + mCurrentKeyTime = 0; + } + if (mCurrentKeyTime < mLastKeyTime && mCurrentKeyTime < DEBOUNCE_TIME + && mLastKey != NOT_A_KEY) { + mCurrentKey = mLastKey; + touchX = mLastCodeX; + touchY = mLastCodeY; + } + showPreview(NOT_A_KEY); + Arrays.fill(mKeyIndices, NOT_A_KEY); + // If we're not on a repeating key (which sends on a DOWN event) + if (mRepeatKeyIndex == NOT_A_KEY && !mMiniKeyboardOnScreen && !mAbortKey) { + detectAndSendKey(mCurrentKey, touchX, touchY, eventTime); + } + invalidateKey(keyIndex); + mRepeatKeyIndex = NOT_A_KEY; + break; + case MotionEvent.ACTION_CANCEL: + removeMessages(); + dismissPopupKeyboard(); + mAbortKey = true; + showPreview(NOT_A_KEY); + invalidateKey(mCurrentKey); + break; + } + mLastX = touchX; + mLastY = touchY; + return true; + } + + private boolean repeatKey() { + Key key = mKeys[mRepeatKeyIndex]; + detectAndSendKey(mCurrentKey, key.x, key.y, mLastTapTime); + return true; + } + + protected void swipeRight() { + mKeyboardActionListener.swipeRight(); + } + + protected void swipeLeft() { + mKeyboardActionListener.swipeLeft(); + } + + protected void swipeUp() { + mKeyboardActionListener.swipeUp(); + } + + protected void swipeDown() { + mKeyboardActionListener.swipeDown(); + } + + public void closing() { + if (mPreviewPopup.isShowing()) { + mPreviewPopup.dismiss(); + } + removeMessages(); + + dismissPopupKeyboard(); + mBuffer = null; + mCanvas = null; + mMiniKeyboardCache.clear(); + } + + private void removeMessages() { + mHandler.removeMessages(MSG_REPEAT); + mHandler.removeMessages(MSG_LONGPRESS); + mHandler.removeMessages(MSG_SHOW_PREVIEW); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + closing(); + } + + private void dismissPopupKeyboard() { + if (mPopupKeyboard.isShowing()) { + mPopupKeyboard.dismiss(); + mMiniKeyboardOnScreen = false; + invalidateAllKeys(); + } + } + + public boolean handleBack() { + if (mPopupKeyboard.isShowing()) { + dismissPopupKeyboard(); + return true; + } + return false; + } + + private void resetMultiTap() { + mLastSentIndex = NOT_A_KEY; + mTapCount = 0; + mLastTapTime = -1; + mInMultiTap = false; + } + + private void checkMultiTap(long eventTime, int keyIndex) { + if (keyIndex == NOT_A_KEY) return; + Key key = mKeys[keyIndex]; + if (key.codes.length > 1) { + mInMultiTap = true; + if (eventTime < mLastTapTime + MULTITAP_INTERVAL + && keyIndex == mLastSentIndex) { + mTapCount = (mTapCount + 1) % key.codes.length; + return; + } else { + mTapCount = -1; + return; + } + } + if (eventTime > mLastTapTime + MULTITAP_INTERVAL || keyIndex != mLastSentIndex) { + resetMultiTap(); + } + } + + private static class SwipeTracker { + + static final int NUM_PAST = 4; + static final int LONGEST_PAST_TIME = 200; + + final float mPastX[] = new float[NUM_PAST]; + final float mPastY[] = new float[NUM_PAST]; + final long mPastTime[] = new long[NUM_PAST]; + + float mYVelocity; + float mXVelocity; + + public void clear() { + mPastTime[0] = 0; + } + + public void addMovement(MotionEvent ev) { + long time = ev.getEventTime(); + final int N = ev.getHistorySize(); + for (int i=0; i= 0) { + final int start = drop+1; + final int count = NUM_PAST-drop-1; + System.arraycopy(pastX, start, pastX, 0, count); + System.arraycopy(pastY, start, pastY, 0, count); + System.arraycopy(pastTime, start, pastTime, 0, count); + i -= (drop+1); + } + pastX[i] = x; + pastY[i] = y; + pastTime[i] = time; + i++; + if (i < NUM_PAST) { + pastTime[i] = 0; + } + } + + public void computeCurrentVelocity(int units) { + computeCurrentVelocity(units, Float.MAX_VALUE); + } + + public void computeCurrentVelocity(int units, float maxVelocity) { + final float[] pastX = mPastX; + final float[] pastY = mPastY; + final long[] pastTime = mPastTime; + + final float oldestX = pastX[0]; + final float oldestY = pastY[0]; + final long oldestTime = pastTime[0]; + float accumX = 0; + float accumY = 0; + int N=0; + while (N < NUM_PAST) { + if (pastTime[N] == 0) { + break; + } + N++; + } + + for (int i=1; i < N; i++) { + final int dur = (int)(pastTime[i] - oldestTime); + if (dur == 0) continue; + float dist = pastX[i] - oldestX; + float vel = (dist/dur) * units; // pixels/frame. + if (accumX == 0) accumX = vel; + else accumX = (accumX + vel) * .5f; + + dist = pastY[i] - oldestY; + vel = (dist/dur) * units; // pixels/frame. + if (accumY == 0) accumY = vel; + else accumY = (accumY + vel) * .5f; + } + mXVelocity = accumX < 0.0f ? Math.max(accumX, -maxVelocity) + : Math.min(accumX, maxVelocity); + mYVelocity = accumY < 0.0f ? Math.max(accumY, -maxVelocity) + : Math.min(accumY, maxVelocity); + } + + public float getXVelocity() { + return mXVelocity; + } + + public float getYVelocity() { + return mYVelocity; + } + } +} From a62f7c18f9cb8feb179bd865fc9caa65cfc80b4a Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Sat, 27 Feb 2010 07:53:56 -0800 Subject: [PATCH 078/159] Remember typed words for auto-corrections Change-Id: I475c2fa7604f91659100510079fa13c7615177e9 --- .../{voice => latin}/EditingUtil.java | 48 ++-- .../android/inputmethod/latin/LatinIME.java | 232 +++++++++++++++++- .../inputmethod/latin/TextEntryState.java | 26 +- .../inputmethod/latin/WordComposer.java | 7 + 4 files changed, 279 insertions(+), 34 deletions(-) rename java/src/com/android/inputmethod/{voice => latin}/EditingUtil.java (78%) diff --git a/java/src/com/android/inputmethod/voice/EditingUtil.java b/java/src/com/android/inputmethod/latin/EditingUtil.java similarity index 78% rename from java/src/com/android/inputmethod/voice/EditingUtil.java rename to java/src/com/android/inputmethod/latin/EditingUtil.java index 6316d8ccf..7571f1daf 100644 --- a/java/src/com/android/inputmethod/voice/EditingUtil.java +++ b/java/src/com/android/inputmethod/latin/EditingUtil.java @@ -14,7 +14,7 @@ * the License. */ -package com.android.inputmethod.voice; +package com.android.inputmethod.latin; import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; @@ -75,9 +75,21 @@ public class EditingUtil { * represents the cursor, then "hello " will be returned. */ public static String getWordAtCursor( - InputConnection connection, String separators) { - Range range = getWordRangeAtCursor(connection, separators); - return (range == null) ? null : range.word; + InputConnection connection, String separators) { + return getWordAtCursor(connection, separators, null); + } + + /** + * @param connection connection to the current text field. + * @param sep characters which may separate words + * @return the word that surrounds the cursor, including up to one trailing + * separator. For example, if the field contains "he|llo world", where | + * represents the cursor, then "hello " will be returned. + */ + public static String getWordAtCursor( + InputConnection connection, String separators, Range range) { + Range r = getWordRangeAtCursor(connection, separators, range); + return (r == null) ? null : r.word; } /** @@ -87,7 +99,7 @@ public class EditingUtil { public static void deleteWordAtCursor( InputConnection connection, String separators) { - Range range = getWordRangeAtCursor(connection, separators); + Range range = getWordRangeAtCursor(connection, separators, null); if (range == null) return; connection.finishComposingText(); @@ -101,18 +113,20 @@ public class EditingUtil { /** * Represents a range of text, relative to the current cursor position. */ - private static class Range { + public static class Range { /** Characters before selection start */ - int charsBefore; + public int charsBefore; /** * Characters after selection start, including one trailing word * separator. */ - int charsAfter; + public int charsAfter; /** The actual characters that make up a word */ - String word; + public String word; + + public Range() {} public Range(int charsBefore, int charsAfter, String word) { if (charsBefore < 0 || charsAfter < 0) { @@ -125,7 +139,7 @@ public class EditingUtil { } private static Range getWordRangeAtCursor( - InputConnection connection, String sep) { + InputConnection connection, String sep, Range range) { if (connection == null || sep == null) { return null; } @@ -137,20 +151,22 @@ public class EditingUtil { // Find first word separator before the cursor int start = before.length(); - while (--start > 0 && !isWhitespace(before.charAt(start - 1), sep)); + while (start > 0 && !isWhitespace(before.charAt(start - 1), sep)) start--; // Find last word separator after the cursor int end = -1; while (++end < after.length() && !isWhitespace(after.charAt(end), sep)); - if (end < after.length() - 1) { - end++; // Include trailing space, if it exists, in word - } int cursor = getCursorPosition(connection); if (start >= 0 && cursor + end <= after.length() + before.length()) { String word = before.toString().substring(start, before.length()) - + after.toString().substring(0, end); - return new Range(before.length() - start, end, word); + + after.toString().substring(0, end); + + Range returnRange = range != null? range : new Range(); + returnRange.charsBefore = before.length() - start; + returnRange.charsAfter = end; + returnRange.word = word; + return returnRange; } return null; diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index db0a822ed..a89265e76 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -16,7 +16,6 @@ package com.android.inputmethod.latin; -import com.android.inputmethod.voice.EditingUtil; import com.android.inputmethod.voice.FieldContext; import com.android.inputmethod.voice.SettingsUtil; import com.android.inputmethod.voice.VoiceInput; @@ -128,6 +127,7 @@ public class LatinIME extends InputMethodService private static final int MSG_UPDATE_SHIFT_STATE = 2; private static final int MSG_VOICE_RESULTS = 3; private static final int MSG_START_LISTENING_AFTER_SWIPE = 4; + private static final int MSG_UPDATE_OLD_SUGGESTIONS = 5; // If we detect a swipe gesture within N ms of typing, then swipe is // ignored, since it may in fact be two key presses in quick succession. @@ -205,6 +205,12 @@ public class LatinIME extends InputMethodService private boolean mVoiceOnPrimary; private int mOrientation; private List mSuggestPuncList; + // Keep track of the last selection range to decide if we need to show word alternatives + private int mLastSelectionStart; + private int mLastSelectionEnd; + + // Input type is such that we should not auto-correct + private boolean mInputTypeNoAutoCorrect; // Indicates whether the suggestion strip is to be on in landscape private boolean mJustAccepted; @@ -228,17 +234,66 @@ public class LatinIME extends InputMethodService // Keeps track of most recently inserted text (multi-character key) for reverting private CharSequence mEnteredText; + private boolean mRefreshKeyboardRequired; // For each word, a list of potential replacements, usually from voice. private Map> mWordToSuggestions = new HashMap>(); + private ArrayList mWordHistory = new ArrayList(); + private class VoiceResults { List candidates; Map> alternatives; } + + public abstract static class WordAlternatives { + protected CharSequence mChosenWord; - private boolean mRefreshKeyboardRequired; + public WordAlternatives() { + // Nothing + } + + public WordAlternatives(CharSequence chosenWord) { + mChosenWord = chosenWord; + } + + @Override + public int hashCode() { + return mChosenWord.hashCode(); + } + + public abstract CharSequence getOriginalWord(); + + public CharSequence getChosenWord() { + return mChosenWord; + } + + public abstract List getAlternatives(); + } + + public class TypedWordAlternatives extends WordAlternatives { + private WordComposer word; + + public TypedWordAlternatives() { + // Nothing + } + + public TypedWordAlternatives(CharSequence chosenWord, WordComposer wordComposer) { + super(chosenWord); + word = wordComposer; + } + + @Override + public CharSequence getOriginalWord() { + return word.getTypedWord(); + } + + @Override + public List getAlternatives() { + return getTypedSuggestions(word); + } + } Handler mHandler = new Handler() { @Override @@ -247,6 +302,9 @@ public class LatinIME extends InputMethodService case MSG_UPDATE_SUGGESTIONS: updateSuggestions(); break; + case MSG_UPDATE_OLD_SUGGESTIONS: + setOldSuggestions(); + break; case MSG_START_TUTORIAL: if (mTutorial == null) { if (mInputView.isShown()) { @@ -606,10 +664,11 @@ public class LatinIME extends InputMethodService // clear whatever candidate text we have. if ((((mComposing.length() > 0 && mPredicting) || mVoiceInputHighlighted) && (newSelStart != candidatesEnd - || newSelEnd != candidatesEnd))) { + || newSelEnd != candidatesEnd) + && mLastSelectionStart != newSelStart)) { mComposing.setLength(0); mPredicting = false; - updateSuggestions(); + postUpdateSuggestions(); TextEntryState.reset(); InputConnection ic = getCurrentInputConnection(); if (ic != null) { @@ -629,6 +688,21 @@ public class LatinIME extends InputMethodService mJustAccepted = false; postUpdateShiftKeyState(); + // Make a note of the cursor position + mLastSelectionStart = newSelStart; + mLastSelectionEnd = newSelEnd; + + + // If a word is selected + if ((candidatesStart == candidatesEnd || newSelStart != oldSelStart) + && (newSelStart < newSelEnd - 1 || (!mPredicting)) + && !mVoiceInputHighlighted) { + abortCorrection(false); + if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) { + postUpdateOldSuggestions(); + } + } + if (VOICE_INSTALLED) { if (mShowingVoiceSuggestions) { if (mImmediatelyAfterVoiceSuggestions) { @@ -671,6 +745,7 @@ public class LatinIME extends InputMethodService mVoiceInput.cancel(); } } + mWordHistory.clear(); super.hideWindow(); TextEntryState.endSession(); } @@ -695,7 +770,6 @@ public class LatinIME extends InputMethodService CompletionInfo ci = completions[i]; if (ci != null) stringList.add(ci.getText()); } - //CharSequence typedWord = mWord.getTypedWord(); setSuggestions(stringList, true, true, true); mBestWord = null; setCandidatesViewShown(isCandidateStripVisible() || mCompletionOn); @@ -1007,6 +1081,7 @@ public class LatinIME extends InputMethodService } InputConnection ic = getCurrentInputConnection(); if (ic == null) return; + abortCorrection(false); ic.beginBatchEdit(); if (mPredicting) { commitTyped(ic); @@ -1086,6 +1161,13 @@ public class LatinIME extends InputMethodService } } + private void abortCorrection(boolean force) { + if (force || TextEntryState.isCorrecting()) { + getCurrentInputConnection().finishComposingText(); + setSuggestions(null, false, false, false); + } + } + private void handleCharacter(int primaryCode, int[] keyCodes) { if (VOICE_INSTALLED && mVoiceInputHighlighted) { commitVoiceInput(); @@ -1095,11 +1177,13 @@ public class LatinIME extends InputMethodService // Assume input length is 1. This assumption fails for smiley face insertions. mVoiceInput.incrementTextModificationInsertCount(1); } + abortCorrection(false); if (isAlphabet(primaryCode) && isPredictionOn() && !isCursorTouchingWord()) { if (!mPredicting) { mPredicting = true; mComposing.setLength(0); + saveWordInHistory(mBestWord); mWord.reset(); } } @@ -1150,6 +1234,7 @@ public class LatinIME extends InputMethodService InputConnection ic = getCurrentInputConnection(); if (ic != null) { ic.beginBatchEdit(); + abortCorrection(false); } if (mPredicting) { // In certain languages where single quote is a separator, it's better @@ -1189,7 +1274,6 @@ public class LatinIME extends InputMethodService && primaryCode != KEYCODE_ENTER) { swapPunctuationAndSpace(); } else if (isPredictionOn() && primaryCode == KEYCODE_SPACE) { - //else if (TextEntryState.STATE_SPACE_AFTER_ACCEPTED) { doubleSpace(); } if (pickedDefault && mBestWord != null) { @@ -1211,6 +1295,17 @@ public class LatinIME extends InputMethodService TextEntryState.endSession(); } + private void saveWordInHistory(CharSequence result) { + if (mWord.size() <= 1) { + mWord.reset(); + return; + } + TypedWordAlternatives entry = new TypedWordAlternatives(result, mWord); + // Create a new WordComposer as the old one is being saved for later use + mWord = new WordComposer(mWord); + mWordHistory.add(entry); + } + private void checkToggleCapsLock() { if (mInputView.getKeyboard().isShifted()) { toggleCapsLock(); @@ -1229,6 +1324,11 @@ public class LatinIME extends InputMethodService mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SUGGESTIONS), 100); } + private void postUpdateOldSuggestions() { + mHandler.removeMessages(MSG_UPDATE_OLD_SUGGESTIONS); + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_OLD_SUGGESTIONS), 300); + } + private boolean isPredictionOn() { boolean predictionOn = mPredictionOn; return predictionOn; @@ -1453,24 +1553,45 @@ public class LatinIME extends InputMethodService setNextSuggestions(); return; } + showSuggestions(mWord); + } - List stringList = mSuggest.getSuggestions(mInputView, mWord, false); + private List getTypedSuggestions(WordComposer word) { + List stringList = mSuggest.getSuggestions(mInputView, word, false); + return stringList; + } + + private void showCorrections(WordAlternatives alternatives) { + List stringList = alternatives.getAlternatives(); + ((LatinKeyboard) mInputView.getKeyboard()).setPreferredLetters(null); + showSuggestions(stringList, alternatives.getOriginalWord(), false, false); + } + + private void showSuggestions(WordComposer word) { + List stringList = mSuggest.getSuggestions(mInputView, word, false); int[] nextLettersFrequencies = mSuggest.getNextLettersFrequencies(); ((LatinKeyboard) mInputView.getKeyboard()).setPreferredLetters(nextLettersFrequencies); boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasMinimalCorrection(); //|| mCorrectionMode == mSuggest.CORRECTION_FULL; - CharSequence typedWord = mWord.getTypedWord(); + CharSequence typedWord = word.getTypedWord(); // If we're in basic correct boolean typedWordValid = mSuggest.isValidWord(typedWord) || - (preferCapitalization() && mSuggest.isValidWord(typedWord.toString().toLowerCase())); + (preferCapitalization() + && mSuggest.isValidWord(typedWord.toString().toLowerCase())); if (mCorrectionMode == Suggest.CORRECTION_FULL) { correctionAvailable |= typedWordValid; } // Don't auto-correct words with multiple capital letter - correctionAvailable &= !mWord.isMostlyCaps(); + correctionAvailable &= !word.isMostlyCaps(); + correctionAvailable &= !TextEntryState.isCorrecting(); + showSuggestions(stringList, typedWord, typedWordValid, correctionAvailable); + } + + private void showSuggestions(List stringList, CharSequence typedWord, + boolean typedWordValid, boolean correctionAvailable) { setSuggestions(stringList, false, typedWordValid, correctionAvailable); if (stringList.size() > 0) { if (correctionAvailable && !typedWordValid && stringList.size() > 1) { @@ -1508,6 +1629,7 @@ public class LatinIME extends InputMethodService mVoiceInput.logTextModifiedByChooseSuggestion(suggestion.length()); } + final boolean correcting = TextEntryState.isCorrecting(); InputConnection ic = getCurrentInputConnection(); if (ic != null) { ic.beginBatchEdit(); @@ -1545,10 +1667,11 @@ public class LatinIME extends InputMethodService } TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion); // Follow it with a space - if (mAutoSpace) { + if (mAutoSpace && !correcting) { sendSpace(); mJustAddedAutoSpace = true; } + // Fool the state watcher so that a subsequent backspace will not do a revert TextEntryState.typedCharacter((char) KEYCODE_SPACE, true); if (index == 0 && mCorrectionMode > 0 && !mSuggest.isValidWord(suggestion)) { @@ -1576,6 +1699,7 @@ public class LatinIME extends InputMethodService ic.commitText(suggestion, 1); } } + saveWordInHistory(suggestion); mPredicting = false; mCommittedLength = suggestion.length(); ((LatinKeyboard) mInputView.getKeyboard()).setPreferredLetters(null); @@ -1583,16 +1707,99 @@ public class LatinIME extends InputMethodService updateShiftKeyState(getCurrentInputEditorInfo()); } + private void setOldSuggestions() { + // TODO: Inefficient to check if touching word and then get the touching word. Do it + // in one go. + InputConnection ic = getCurrentInputConnection(); + if (ic == null) return; + ic.beginBatchEdit(); + // If there is a selection, then undo the selection first. Unfortunately this causes + // a flicker. TODO: Add getSelectionText() to InputConnection API. + if (mLastSelectionStart < mLastSelectionEnd) { + ic.setSelection(mLastSelectionStart, mLastSelectionStart); + } + if (!mPredicting && isCursorTouchingWord()) { + EditingUtil.Range range = new EditingUtil.Range(); + CharSequence touching = + EditingUtil.getWordAtCursor(getCurrentInputConnection(), mWordSeparators, + range); + if (touching != null && touching.length() > 1) { + if (mWordSeparators.indexOf(touching.charAt(touching.length() - 1)) > 0) { + touching = touching.toString().substring(0, touching.length() - 1); + } + // Search for result in word history + WordComposer foundWord = null; + WordAlternatives alternatives = null; + for (WordAlternatives entry : mWordHistory) { + if (TextUtils.equals(entry.getChosenWord(), touching)) { + if (entry instanceof TypedWordAlternatives) { + foundWord = ((TypedWordAlternatives)entry).word; + } + alternatives = entry; + break; + } + } + // If we didn't find a match, at least suggest completions + if (foundWord == null && mSuggest.isValidWord(touching)) { + foundWord = new WordComposer(); + for (int i = 0; i < touching.length(); i++) { + foundWord.add(touching.charAt(i), new int[] { touching.charAt(i) }); + } + } + // Found a match, show suggestions + if (foundWord != null || alternatives != null) { + mSuggestionShouldReplaceCurrentWord = true; + underlineWord(touching, range.charsBefore, range.charsAfter); + TextEntryState.selectedForCorrection(); + if (alternatives == null) alternatives = new TypedWordAlternatives(touching, + foundWord); + showCorrections(alternatives); + if (foundWord != null) { + mWord = foundWord; + } else { + mWord.reset(); + } + // Revert the selection + if (mLastSelectionStart < mLastSelectionEnd) { + ic.setSelection(mLastSelectionStart, mLastSelectionEnd); + } + ic.endBatchEdit(); + return; + } + abortCorrection(true); + } else { + abortCorrection(true); + setNextSuggestions(); + } + } else { + abortCorrection(true); + } + // Revert the selection + if (mLastSelectionStart < mLastSelectionEnd) { + ic.setSelection(mLastSelectionStart, mLastSelectionEnd); + } + ic.endBatchEdit(); + } + private void setNextSuggestions() { setSuggestions(mSuggestPuncList, false, false, false); } + private void underlineWord(CharSequence word, int left, int right) { + InputConnection ic = getCurrentInputConnection(); + if (ic == null) return; + ic.deleteSurroundingText(left, right); + ic.setComposingText(word, 1); + ic.setSelection(mLastSelectionStart, mLastSelectionStart); + } + private void checkAddToDictionary(CharSequence suggestion, int frequencyDelta) { + if (suggestion == null || suggestion.length() < 1) return; // Only auto-add to dictionary if auto-correct is ON. Otherwise we'll be // adding words in situations where the user or application really didn't // want corrections enabled or learned. if (!(mCorrectionMode == Suggest.CORRECTION_FULL)) return; - if (mAutoDictionary.isValidWord(suggestion) + if (suggestion != null && mAutoDictionary.isValidWord(suggestion) || (!mSuggest.isValidWord(suggestion.toString()) && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) { mAutoDictionary.addWord(suggestion.toString(), frequencyDelta); @@ -2008,7 +2215,6 @@ public class LatinIME extends InputMethodService private static final int CPS_BUFFER_SIZE = 16; private long[] mCpsIntervals = new long[CPS_BUFFER_SIZE]; private int mCpsIndex; - private boolean mInputTypeNoAutoCorrect; private void measureCps() { long now = System.currentTimeMillis(); diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java index d056ceb16..8fd9b7129 100644 --- a/java/src/com/android/inputmethod/latin/TextEntryState.java +++ b/java/src/com/android/inputmethod/latin/TextEntryState.java @@ -69,9 +69,11 @@ public class TextEntryState { public static final int STATE_SPACE_AFTER_ACCEPTED = 7; public static final int STATE_SPACE_AFTER_PICKED = 8; public static final int STATE_UNDO_COMMIT = 9; - + public static final int STATE_CORRECTING = 10; + public static final int STATE_PICKED_CORRECTION = 11; + private static int sState = STATE_UNKNOWN; - + private static FileOutputStream sKeyLocationFile; private static FileOutputStream sUserActionFile; @@ -139,12 +141,17 @@ public class TextEntryState { public static void acceptedSuggestion(CharSequence typedWord, CharSequence actualWord) { sManualSuggestCount++; + int oldState = sState; if (typedWord.equals(actualWord)) { acceptedTyped(typedWord); } - sState = STATE_PICKED_SUGGESTION; + sState = oldState == STATE_CORRECTING ? STATE_PICKED_CORRECTION : STATE_PICKED_SUGGESTION; } - + + public static void selectedForCorrection() { + sState = STATE_CORRECTING; + } + public static void typedCharacter(char c, boolean isSeparator) { boolean isSpace = c == ' '; switch (sState) { @@ -166,6 +173,7 @@ public class TextEntryState { } break; case STATE_PICKED_SUGGESTION: + case STATE_PICKED_CORRECTION: if (isSpace) { sState = STATE_SPACE_AFTER_PICKED; } else if (isSeparator) { @@ -192,6 +200,10 @@ public class TextEntryState { } else { sState = STATE_IN_WORD; } + break; + case STATE_CORRECTING: + sState = STATE_START; + break; } } @@ -212,7 +224,11 @@ public class TextEntryState { public static int getState() { return sState; } - + + public static boolean isCorrecting() { + return sState == STATE_CORRECTING || sState == STATE_PICKED_CORRECTION; + } + public static void keyPressedAt(Key key, int x, int y) { if (LOGGING && sKeyLocationFile != null && key.codes[0] >= 32) { String out = diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index 2547aa133..e2573a0a9 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -49,6 +49,13 @@ public class WordComposer { mTypedWord = new StringBuilder(20); } + WordComposer(WordComposer copy) { + mCodes = (ArrayList) copy.mCodes.clone(); + mPreferredWord = copy.mPreferredWord; + mTypedWord = new StringBuilder(copy.mTypedWord); + mCapsCount = copy.mCapsCount; + mAutoCapitalized = copy.mAutoCapitalized; + } /** * Clear out the keys registered so far. */ From 2b2db815d29358d6ec6f023b09bb33d40cbefee0 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 17 Jun 2010 11:18:54 +0900 Subject: [PATCH 079/159] Move KeyboardView in the framework to LatinKeyboardViewBase Change-Id: I99e3ea5eb1f1f5e5f9b36306930cdf0f50acfb01 --- .../keyboard_key_feedback_background.9.png | Bin 0 -> 1372 bytes ...eyboard_key_feedback_more_background.9.png | Bin 0 -> 1637 bytes .../keyboard_key_feedback_background.9.png | Bin 0 -> 1182 bytes ...eyboard_key_feedback_more_background.9.png | Bin 0 -> 1385 bytes java/res/drawable/keyboard_key_feedback.xml | 22 ++ java/res/layout/input.xml | 4 +- java/res/layout/input2.xml | 5 +- java/res/layout/input3.xml | 4 +- java/res/layout/input4.xml | 4 +- java/res/layout/input5.xml | 4 +- java/res/layout/input6.xml | 4 +- java/res/layout/input7.xml | 14 +- java/res/layout/input7_popup.xml | 14 +- java/res/layout/input_trans.xml | 4 +- java/res/layout/keyboard_key_preview.xml | 29 ++ java/res/layout/keyboard_popup_keyboard.xml | 48 +++ java/res/values/attrs.xml | 57 +++ java/res/values/bools.xml | 1 + java/res/values/styles.xml | 34 ++ .../android/inputmethod/latin/LatinIME.java | 3 +- .../latin/LatinKeyboardBaseView.java | 355 +++++++++--------- .../inputmethod/latin/LatinKeyboardView.java | 3 +- 22 files changed, 412 insertions(+), 197 deletions(-) create mode 100644 java/res/drawable-hdpi/keyboard_key_feedback_background.9.png create mode 100644 java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png create mode 100644 java/res/drawable-mdpi/keyboard_key_feedback_background.9.png create mode 100755 java/res/drawable-mdpi/keyboard_key_feedback_more_background.9.png create mode 100644 java/res/drawable/keyboard_key_feedback.xml create mode 100644 java/res/layout/keyboard_key_preview.xml create mode 100644 java/res/layout/keyboard_popup_keyboard.xml create mode 100644 java/res/values/attrs.xml create mode 100644 java/res/values/styles.xml rename temp/KeyboardView.java => java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java (87%) diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba42db8237727d5d67b629bd60384fc014df3ab GIT binary patch literal 1372 zcmV-i1*7_jP);@F8{2|+b#-mc(%F;!iKC^Zi6gDRq zd1I+mdc3!{cUO0J_nyAKzP;sg`5C;Yr)Pf_&Rzm&UweD|(;XchyY;+Nacu`QfXWJ_ z6{c`H@@>Up@ks(xP%kKumlW750_au!d|E%B(a*1^?d*ehc6Pp|^`zG0S`RCZ=Q%8a zw*yuIQknqWXA2v`5Cw8j0iM$OuGWtg)K#sYX)Wq^B|VqZcJ?uE)4r`*FX{K^^!%p4 zIR;3u8ivPMl&o28DUd=?nG*sO`KJQv%Sxs4`|$Aaom#u%xH&jD_=`Xpumd}z=NH@B z+Ma^#X)vgPRDv-8L;47m3wj=r-5MPojdJMs6!XuD^_swW%UHe}29W`YA!E1EHcKTK zb3s)7iU4v7%zYP|{!+ZxNi%t~73)G$?4i~a_)yR%mGnHk7MSVj>1cj_K3ZH{tf|k= z&PL$9}dIQqjQ1UA(aJR!|b8~Z1-Ys5#NG+?G&2-RJ_dL*#TZ+z?s!uNw zHsfUSZm>JVtM4(b?{Jp7L#apv9D7CJm7rM9;HU_HukUc4*9$#Au>m+6|KW|7H+!+; z{iRgT;Pm(R|DZ$uQ03tW;B0W6KO8u8#r7guc5og5j=cq!>%8Xt7{IYk*}-ve92^J7 z!EtaL90$k2ac~@*{{>Fu;5ay*Rt}DXRn|4IEX!i%A#s;Y>r`{Da3EoIXK@U;MQRuLQh?_J_ltNGX;nx(e%c_Sy))eJveb) zpxE*aqDjUP5)m(O()!^G{(j^mYW0S3{E=VjUS7xyx(>vl=EF-dZ&{P){^$QjR{yb)^0}VjLaXZ z=6N_oH|yUNVHBh`q{cK~Q_^EaVGym6e6`6uI_6Kb`S{S#&>!(Slmk$1i`g?a7{|QB zaT}}LL9Iz+Ag#gDD*$wWIRdS3bH&@F+!(!tnyv5XMseO}((5b{?4c3GOa^n4naceDBZKrrR{Sz?*kPkW%>croQ6ITP!tiUFj9GV5*ivm}gqjnA zz5qt!i1Vj`v^?yAvnOEC`2vU?Ud?99{{vP4EDYjjyQ`# literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_more_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4d0b60109987c866268d42f30d8148829a1af76a GIT binary patch literal 1637 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_more_background.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_more_background.9.png new file mode 100755 index 0000000000000000000000000000000000000000..29aa285bd5446fa30710c24efe602ec948b44ea4 GIT binary patch literal 1385 zcmV-v1(y1WP)5 z5Nte%g=ke4${rN8T5zJgq%!0(vNTS$a{dfr z653z;Oy!f~cA=9CT~yUAPE+(Tj6pvTyahNh)JaHtl;Vff{UG29GqV6EhNoU9mVQxz z<0lqJtG77;c)(r8m2~yYHj}*cqb(&6r1FqqD3ev9Yo7k}>vOr&kcq^M2ag z-27ft8_0>a(P-jE;7!02AnWVvF9qA*Lcf`r8J^8%c_x$LeSLj?T(ISGnG}mfS|}9g z;o%_#JYp1HZEbBS2O1^^Y~V3)wz#+`aAuC7&;0y+V_{*Tt|^MWTr0czeBRyL+e-i@ z;n0`4T&@U%VR8WaP@5vf`rzQ;3upkw1@M|w<{_nV<)c2(4|c$ww40DZwMC)jC1VPk zCiBT;@)6UgJX_pzm6CFI!98%z2F-f1omm+jLH1j)ExU}O)yDkDx zTVK$`w=u7Vi-}GH&?qJ+?*QX%BOvWK(k??-tjuEvS|;o*_8<2dLijy|nYYHgal$&? zEq9u**nw_?r;7QOq zgQ_!VKq~3pA*7)1pf&B5&R?gu7EdXup*a>iwjmRms|8+US1|Z zw5$Pzz7h8JRxB(aM|kT4$icxu&&kP2N}NCa)z#H&I2E0rpS$^dJ`L^SfL$3K9jycK zot>ReYqc7gn3%Yko13dfIGD8Iqyee8W~xDy4=TSB2EJ4(HQ5DFS65e5v5rRop3nw; z@NaM)$NAUr2SdK5#UUCpOuSmH{ss+#!O(-r?CflHXlTd-Hiw6Yn+NHssi~Whk&!wG z)Zsg5gFes~euH%=JJK$;#-pPnmdoXOI=Om)ey{^|X}1x? zKC^@kS4p7b}lasG|dwajx-``J)7^T^4wk{@~r_vNLbCpzt3KNXG036bIVotmU zyIQWYZN*W!N_=txhmul&=}&~D*Vfj45MaOV^x7?)`FVSL`$tiQQ2QIgAJzaVD)Gf3 zS&6|D1YS9ilG1cwe0)4JHa7NLI58pS!556N&*FmhJnzp+rSiJ~eFC9!dU{$!z;C4B z94VKHRv%}Hsm8u51v}6qMSbU@lw87g$~Py(+aR@(ngxFL@Lo)t0Caba>@^S-75w?+20~0?y^{)J9y_3qgbDOr zuQE+e=zt?Juapwa0fLlJY2YF6VSU@K*Ty_?+AnYka^@j#z-`<0|M!0n;{NO7w(U_4 rIDzdgc;o)x200#C(S2p<{t;jRaYXaV8UYj(00000NkvXXu0mjfEPjx} literal 0 HcmV?d00001 diff --git a/java/res/drawable/keyboard_key_feedback.xml b/java/res/drawable/keyboard_key_feedback.xml new file mode 100644 index 000000000..159ba8686 --- /dev/null +++ b/java/res/drawable/keyboard_key_feedback.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/java/res/layout/input.xml b/java/res/layout/input.xml index 1d7c6f746..039fdd8df 100755 --- a/java/res/layout/input.xml +++ b/java/res/layout/input.xml @@ -20,10 +20,12 @@ diff --git a/java/res/layout/input2.xml b/java/res/layout/input2.xml index 2e90c2c6b..3c9ec2fdf 100755 --- a/java/res/layout/input2.xml +++ b/java/res/layout/input2.xml @@ -20,10 +20,13 @@ diff --git a/java/res/layout/input3.xml b/java/res/layout/input3.xml index a27d09a5a..a4295f7f4 100755 --- a/java/res/layout/input3.xml +++ b/java/res/layout/input3.xml @@ -20,10 +20,12 @@ diff --git a/java/res/layout/input4.xml b/java/res/layout/input4.xml index 58dd51e3c..b5da9d48f 100755 --- a/java/res/layout/input4.xml +++ b/java/res/layout/input4.xml @@ -20,10 +20,12 @@ diff --git a/java/res/layout/input5.xml b/java/res/layout/input5.xml index 5cd0b8d02..2de11dfff 100755 --- a/java/res/layout/input5.xml +++ b/java/res/layout/input5.xml @@ -20,10 +20,12 @@ diff --git a/java/res/layout/input6.xml b/java/res/layout/input6.xml index 19197e1e4..54f31044f 100755 --- a/java/res/layout/input6.xml +++ b/java/res/layout/input6.xml @@ -20,10 +20,12 @@ diff --git a/java/res/layout/input7.xml b/java/res/layout/input7.xml index 6279f5d08..1290eb8ca 100755 --- a/java/res/layout/input7.xml +++ b/java/res/layout/input7.xml @@ -20,14 +20,16 @@ diff --git a/java/res/layout/input7_popup.xml b/java/res/layout/input7_popup.xml index d1261b8cc..2056757fa 100755 --- a/java/res/layout/input7_popup.xml +++ b/java/res/layout/input7_popup.xml @@ -25,18 +25,20 @@ android:orientation="horizontal" android:background="@drawable/keyboard_popup_panel_background" > - diff --git a/java/res/layout/keyboard_key_preview.xml b/java/res/layout/keyboard_key_preview.xml new file mode 100644 index 000000000..64eaa6579 --- /dev/null +++ b/java/res/layout/keyboard_key_preview.xml @@ -0,0 +1,29 @@ + + + + diff --git a/java/res/layout/keyboard_popup_keyboard.xml b/java/res/layout/keyboard_popup_keyboard.xml new file mode 100644 index 000000000..e6b3a411f --- /dev/null +++ b/java/res/layout/keyboard_popup_keyboard.xml @@ -0,0 +1,48 @@ + + + + + + \ No newline at end of file diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml new file mode 100644 index 000000000..2468e9df0 --- /dev/null +++ b/java/res/values/attrs.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml index ebe2f04e5..a0cebbb94 100644 --- a/java/res/values/bools.xml +++ b/java/res/values/bools.xml @@ -25,4 +25,5 @@ false true + true diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml new file mode 100644 index 000000000..a59a15083 --- /dev/null +++ b/java/res/values/styles.xml @@ -0,0 +1,34 @@ + + + + + + diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 8186154a5..5b10e2ce7 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -32,7 +32,6 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.inputmethodservice.InputMethodService; import android.inputmethodservice.Keyboard; -import android.inputmethodservice.KeyboardView; import android.media.AudioManager; import android.os.Debug; import android.os.Handler; @@ -74,7 +73,7 @@ import java.util.Map; * Input method implementation for Qwerty'ish keyboard. */ public class LatinIME extends InputMethodService - implements KeyboardView.OnKeyboardActionListener, + implements LatinKeyboardBaseView.OnKeyboardActionListener, VoiceInput.UiListener, SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIME"; diff --git a/temp/KeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java similarity index 87% rename from temp/KeyboardView.java rename to java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 4b484092d..64299b626 100644 --- a/temp/KeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -1,20 +1,20 @@ /* - * Copyright (C) 2008-2009 Google Inc. - * - * 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 - * + * Copyright (C) 2010 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. + * 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 android.inputmethodservice; +package com.android.inputmethod.latin; import android.content.Context; import android.content.res.TypedArray; @@ -27,6 +27,7 @@ import android.graphics.Typeface; import android.graphics.Paint.Align; import android.graphics.Region.Op; import android.graphics.drawable.Drawable; +import android.inputmethodservice.Keyboard; import android.inputmethodservice.Keyboard.Key; import android.os.Handler; import android.os.Message; @@ -42,81 +43,91 @@ import android.view.ViewGroup.LayoutParams; import android.widget.PopupWindow; import android.widget.TextView; -import com.android.internal.R; - import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** - * A view that renders a virtual {@link Keyboard}. It handles rendering of keys and + * A view that renders a virtual {@link LatinKeyboard}. It handles rendering of keys and * detecting key presses and touch movements. - * - * @attr ref android.R.styleable#KeyboardView_keyBackground - * @attr ref android.R.styleable#KeyboardView_keyPreviewLayout - * @attr ref android.R.styleable#KeyboardView_keyPreviewOffset - * @attr ref android.R.styleable#KeyboardView_labelTextSize - * @attr ref android.R.styleable#KeyboardView_keyTextSize - * @attr ref android.R.styleable#KeyboardView_keyTextColor - * @attr ref android.R.styleable#KeyboardView_verticalCorrection - * @attr ref android.R.styleable#KeyboardView_popupLayout + * + * @attr ref R.styleable#LatinKeyboardBaseView_keyBackground + * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewLayout + * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewOffset + * @attr ref R.styleable#LatinKeyboardBaseView_labelTextSize + * @attr ref R.styleable#LatinKeyboardBaseView_keyTextSize + * @attr ref R.styleable#LatinKeyboardBaseView_keyTextColor + * @attr ref R.styleable#LatinKeyboardBaseView_verticalCorrection + * @attr ref R.styleable#LatinKeyboardBaseView_popupLayout */ -public class KeyboardView extends View implements View.OnClickListener { +public class LatinKeyboardBaseView extends View implements View.OnClickListener { - /** - * Listener for virtual keyboard events. - */ public interface OnKeyboardActionListener { - + /** - * Called when the user presses a key. This is sent before the {@link #onKey} is called. - * For keys that repeat, this is only called once. - * @param primaryCode the unicode of the key being pressed. If the touch is not on a valid - * key, the value will be zero. + * Called when the user presses a key. This is sent before the + * {@link #onKey} is called. For keys that repeat, this is only + * called once. + * + * @param primaryCode + * the unicode of the key being pressed. If the touch is + * not on a valid key, the value will be zero. */ void onPress(int primaryCode); - + /** - * Called when the user releases a key. This is sent after the {@link #onKey} is called. - * For keys that repeat, this is only called once. - * @param primaryCode the code of the key that was released + * Called when the user releases a key. This is sent after the + * {@link #onKey} is called. For keys that repeat, this is only + * called once. + * + * @param primaryCode + * the code of the key that was released */ void onRelease(int primaryCode); /** * Send a key press to the listener. - * @param primaryCode this is the key that was pressed - * @param keyCodes the codes for all the possible alternative keys - * with the primary code being the first. If the primary key code is - * a single character such as an alphabet or number or symbol, the alternatives - * will include other characters that may be on the same key or adjacent keys. - * These codes are useful to correct for accidental presses of a key adjacent to - * the intended key. + * + * @param primaryCode + * this is the key that was pressed + * @param keyCodes + * the codes for all the possible alternative keys with + * the primary code being the first. If the primary key + * code is a single character such as an alphabet or + * number or symbol, the alternatives will include other + * characters that may be on the same key or adjacent + * keys. These codes are useful to correct for + * accidental presses of a key adjacent to the intended + * key. */ void onKey(int primaryCode, int[] keyCodes); /** * Sends a sequence of characters to the listener. - * @param text the sequence of characters to be displayed. + * + * @param text + * the sequence of characters to be displayed. */ void onText(CharSequence text); - + /** - * Called when the user quickly moves the finger from right to left. + * Called when the user quickly moves the finger from right to + * left. */ void swipeLeft(); - + /** - * Called when the user quickly moves the finger from left to right. + * Called when the user quickly moves the finger from left to + * right. */ void swipeRight(); - + /** * Called when the user quickly moves the finger from up to down. */ void swipeDown(); - + /** * Called when the user quickly moves the finger from down to up. */ @@ -126,8 +137,8 @@ public class KeyboardView extends View implements View.OnClickListener { private static final boolean DEBUG = false; private static final int NOT_A_KEY = -1; private static final int[] KEY_DELETE = { Keyboard.KEYCODE_DELETE }; - private static final int[] LONG_PRESSABLE_STATE_SET = { R.attr.state_long_pressable }; - + private static final int[] LONG_PRESSABLE_STATE_SET = { android.R.attr.state_long_pressable }; + private Keyboard mKeyboard; private int mCurrentKeyIndex = NOT_A_KEY; private int mLabelTextSize; @@ -136,7 +147,7 @@ public class KeyboardView extends View implements View.OnClickListener { private float mShadowRadius; private int mShadowColor; private float mBackgroundDimAmount; - + private TextView mPreviewText; private PopupWindow mPreviewPopup; private int mPreviewTextSizeLarge; @@ -146,7 +157,7 @@ public class KeyboardView extends View implements View.OnClickListener { private PopupWindow mPopupKeyboard; private View mMiniKeyboardContainer; - private KeyboardView mMiniKeyboard; + private LatinKeyboardBaseView mMiniKeyboard; private boolean mMiniKeyboardOnScreen; private View mPopupParent; private int mMiniKeyboardOffsetX; @@ -157,7 +168,7 @@ public class KeyboardView extends View implements View.OnClickListener { /** Listener for {@link OnKeyboardActionListener}. */ private OnKeyboardActionListener mKeyboardActionListener; - + private static final int MSG_SHOW_PREVIEW = 1; private static final int MSG_REMOVE_PREVIEW = 2; private static final int MSG_REPEAT = 3; @@ -166,7 +177,7 @@ public class KeyboardView extends View implements View.OnClickListener { private static final int DELAY_BEFORE_PREVIEW = 0; private static final int DELAY_AFTER_PREVIEW = 70; private static final int DEBOUNCE_TIME = 70; - + private int mVerticalCorrection; private int mProximityThreshold; @@ -183,10 +194,10 @@ public class KeyboardView extends View implements View.OnClickListener { private int mStartY; private boolean mProximityCorrectOn; - + private Paint mPaint; private Rect mPadding; - + private long mDownTime; private long mLastMoveTime; private int mLastKey; @@ -242,7 +253,7 @@ public class KeyboardView extends View implements View.OnClickListener { private boolean mKeyboardChanged; /** The canvas for the above mutable keyboard bitmap */ private Canvas mCanvas; - + Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { @@ -256,7 +267,7 @@ public class KeyboardView extends View implements View.OnClickListener { case MSG_REPEAT: if (repeatKey()) { Message repeat = Message.obtain(this, MSG_REPEAT); - sendMessageDelayed(repeat, REPEAT_INTERVAL); + sendMessageDelayed(repeat, REPEAT_INTERVAL); } break; case MSG_LONGPRESS: @@ -266,69 +277,65 @@ public class KeyboardView extends View implements View.OnClickListener { } }; - public KeyboardView(Context context, AttributeSet attrs) { - this(context, attrs, com.android.internal.R.attr.keyboardViewStyle); + public LatinKeyboardBaseView(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.keyboardViewStyle); } - public KeyboardView(Context context, AttributeSet attrs, int defStyle) { + public LatinKeyboardBaseView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - TypedArray a = - context.obtainStyledAttributes( - attrs, android.R.styleable.KeyboardView, defStyle, 0); - + TypedArray a = context.obtainStyledAttributes( + attrs, R.styleable.LatinKeyboardBaseView, defStyle, R.style.LatinKeyboardBaseView); LayoutInflater inflate = - (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - + (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); int previewLayout = 0; int keyTextSize = 0; int n = a.getIndexCount(); - + for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { - case com.android.internal.R.styleable.KeyboardView_keyBackground: + case R.styleable.LatinKeyboardBaseView_keyBackground: mKeyBackground = a.getDrawable(attr); break; - case com.android.internal.R.styleable.KeyboardView_verticalCorrection: + case R.styleable.LatinKeyboardBaseView_verticalCorrection: mVerticalCorrection = a.getDimensionPixelOffset(attr, 0); break; - case com.android.internal.R.styleable.KeyboardView_keyPreviewLayout: + case R.styleable.LatinKeyboardBaseView_keyPreviewLayout: previewLayout = a.getResourceId(attr, 0); break; - case com.android.internal.R.styleable.KeyboardView_keyPreviewOffset: + case R.styleable.LatinKeyboardBaseView_keyPreviewOffset: mPreviewOffset = a.getDimensionPixelOffset(attr, 0); break; - case com.android.internal.R.styleable.KeyboardView_keyPreviewHeight: + case R.styleable.LatinKeyboardBaseView_keyPreviewHeight: mPreviewHeight = a.getDimensionPixelSize(attr, 80); break; - case com.android.internal.R.styleable.KeyboardView_keyTextSize: + case R.styleable.LatinKeyboardBaseView_keyTextSize: mKeyTextSize = a.getDimensionPixelSize(attr, 18); break; - case com.android.internal.R.styleable.KeyboardView_keyTextColor: + case R.styleable.LatinKeyboardBaseView_keyTextColor: mKeyTextColor = a.getColor(attr, 0xFF000000); break; - case com.android.internal.R.styleable.KeyboardView_labelTextSize: + case R.styleable.LatinKeyboardBaseView_labelTextSize: mLabelTextSize = a.getDimensionPixelSize(attr, 14); break; - case com.android.internal.R.styleable.KeyboardView_popupLayout: + case R.styleable.LatinKeyboardBaseView_popupLayout: mPopupLayout = a.getResourceId(attr, 0); break; - case com.android.internal.R.styleable.KeyboardView_shadowColor: + case R.styleable.LatinKeyboardBaseView_shadowColor: mShadowColor = a.getColor(attr, 0); break; - case com.android.internal.R.styleable.KeyboardView_shadowRadius: + case R.styleable.LatinKeyboardBaseView_shadowRadius: mShadowRadius = a.getFloat(attr, 0f); break; + // TODO: Use Theme (android.R.styleable.Theme_backgroundDimAmount) + case R.styleable.LatinKeyboardBaseView_backgroundDimAmount: + mBackgroundDimAmount = a.getFloat(attr, 0.5f); + break; } } - - a = mContext.obtainStyledAttributes( - com.android.internal.R.styleable.Theme); - mBackgroundDimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f); mPreviewPopup = new PopupWindow(context); if (previewLayout != 0) { @@ -339,16 +346,16 @@ public class KeyboardView extends View implements View.OnClickListener { } else { mShowPreview = false; } - + mPreviewPopup.setTouchable(false); - + mPopupKeyboard = new PopupWindow(context); mPopupKeyboard.setBackgroundDrawable(null); //mPopupKeyboard.setClippingEnabled(false); - + mPopupParent = this; //mPredicting = true; - + mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setTextSize(keyTextSize); @@ -360,16 +367,17 @@ public class KeyboardView extends View implements View.OnClickListener { mKeyBackground.getPadding(mPadding); mSwipeThreshold = (int) (500 * getResources().getDisplayMetrics().density); - mDisambiguateSwipe = getResources().getBoolean( - com.android.internal.R.bool.config_swipeDisambiguation); + // TODO: Refer frameworks/base/core/res/res/values/config.xml + mDisambiguateSwipe = getResources().getBoolean(R.bool.config_swipeDisambiguation); resetMultiTap(); initGestureDetector(); } private void initGestureDetector() { - mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { + mGestureDetector = new GestureDetector( + getContext(), new GestureDetector.SimpleOnGestureListener() { @Override - public boolean onFling(MotionEvent me1, MotionEvent me2, + public boolean onFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) { if (mPossiblePoly) return false; final float absX = Math.abs(velocityX); @@ -455,7 +463,8 @@ public class KeyboardView extends View implements View.OnClickListener { mKeyboardChanged = true; invalidateAllKeys(); computeProximityThreshold(keyboard); - mMiniKeyboardCache.clear(); // Not really necessary to do every time, but will free up views + mMiniKeyboardCache.clear(); + // Not really necessary to do every time, but will free up views // Switching to a different keyboard should abort any pending keys so that the key up // doesn't get delivered to the old or new keyboard mAbortKey = true; // Until the next ACTION_DOWN @@ -469,12 +478,11 @@ public class KeyboardView extends View implements View.OnClickListener { public Keyboard getKeyboard() { return mKeyboard; } - + /** * Sets the state of the shift key of the keyboard, if any. * @param shifted whether or not to enable the state of the shift key * @return true if the shift key state changed, false if there was no change - * @see KeyboardView#isShifted() */ public boolean setShifted(boolean shifted) { if (mKeyboard != null) { @@ -491,7 +499,6 @@ public class KeyboardView extends View implements View.OnClickListener { * Returns the state of the shift key of the keyboard, if any. * @return true if the shift is in a pressed state, false otherwise. If there is * no shift key on the keyboard or there is no keyboard attached, it returns false. - * @see KeyboardView#setShifted(boolean) */ public boolean isShifted() { if (mKeyboard != null) { @@ -502,7 +509,7 @@ public class KeyboardView extends View implements View.OnClickListener { /** * Enables or disables the key feedback popup. This is a popup that shows a magnified - * version of the depressed key. By default the preview is enabled. + * version of the depressed key. By default the preview is enabled. * @param previewEnabled whether or not to enable the key feedback popup * @see #isPreviewEnabled() */ @@ -518,14 +525,14 @@ public class KeyboardView extends View implements View.OnClickListener { public boolean isPreviewEnabled() { return mShowPreview; } - + public void setVerticalCorrection(int verticalOffset) { - } + public void setPopupParent(View v) { mPopupParent = v; } - + public void setPopupOffset(int x, int y) { mMiniKeyboardOffsetX = x; mMiniKeyboardOffsetY = y; @@ -551,9 +558,9 @@ public class KeyboardView extends View implements View.OnClickListener { return mProximityCorrectOn; } - /** + /** * Popup keyboard close button clicked. - * @hide + * @hide */ public void onClick(View v) { dismissPopupKeyboard(); @@ -571,13 +578,15 @@ public class KeyboardView extends View implements View.OnClickListener { public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Round up a little if (mKeyboard == null) { - setMeasuredDimension(mPaddingLeft + mPaddingRight, mPaddingTop + mPaddingBottom); + setMeasuredDimension( + getPaddingLeft() + getPaddingRight(), getPaddingTop() + getPaddingBottom()); } else { - int width = mKeyboard.getMinWidth() + mPaddingLeft + mPaddingRight; + int width = mKeyboard.getMinWidth() + getPaddingLeft() + getPaddingRight(); if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) { width = MeasureSpec.getSize(widthMeasureSpec); } - setMeasuredDimension(width, mKeyboard.getHeight() + mPaddingTop + mPaddingBottom); + setMeasuredDimension( + width, mKeyboard.getHeight() + getPaddingTop() + getPaddingBottom()); } } @@ -633,15 +642,15 @@ public class KeyboardView extends View implements View.OnClickListener { } final Canvas canvas = mCanvas; canvas.clipRect(mDirtyRect, Op.REPLACE); - + if (mKeyboard == null) return; - + final Paint paint = mPaint; final Drawable keyBackground = mKeyBackground; final Rect clipRegion = mClipRegion; final Rect padding = mPadding; - final int kbdPaddingLeft = mPaddingLeft; - final int kbdPaddingTop = mPaddingTop; + final int kbdPaddingLeft = getPaddingLeft(); + final int kbdPaddingTop = getPaddingTop(); final Key[] keys = mKeys; final Key invalidKey = mInvalidatedKey; @@ -668,15 +677,15 @@ public class KeyboardView extends View implements View.OnClickListener { // Switch the character to uppercase if shift is pressed String label = key.label == null? null : adjustCase(key.label).toString(); - + final Rect bounds = keyBackground.getBounds(); - if (key.width != bounds.right || + if (key.width != bounds.right || key.height != bounds.bottom) { keyBackground.setBounds(0, 0, key.width, key.height); } canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop); keyBackground.draw(canvas); - + if (label != null) { // For characters, use large font. For labels like "Done", use small font. if (label.length() > 1 && key.codes.length < 2) { @@ -698,12 +707,12 @@ public class KeyboardView extends View implements View.OnClickListener { // Turn off drop shadow paint.setShadowLayer(0, 0, 0, 0); } else if (key.icon != null) { - final int drawableX = (key.width - padding.left - padding.right + final int drawableX = (key.width - padding.left - padding.right - key.icon.getIntrinsicWidth()) / 2 + padding.left; - final int drawableY = (key.height - padding.top - padding.bottom + final int drawableY = (key.height - padding.top - padding.bottom - key.icon.getIntrinsicHeight()) / 2 + padding.top; canvas.translate(drawableX, drawableY); - key.icon.setBounds(0, 0, + key.icon.setBounds(0, 0, key.icon.getIntrinsicWidth(), key.icon.getIntrinsicHeight()); key.icon.draw(canvas); canvas.translate(-drawableX, -drawableY); @@ -717,17 +726,19 @@ public class KeyboardView extends View implements View.OnClickListener { canvas.drawRect(0, 0, getWidth(), getHeight(), paint); } - if (DEBUG && mShowTouchPoints) { - paint.setAlpha(128); - paint.setColor(0xFFFF0000); - canvas.drawCircle(mStartX, mStartY, 3, paint); - canvas.drawLine(mStartX, mStartY, mLastX, mLastY, paint); - paint.setColor(0xFF0000FF); - canvas.drawCircle(mLastX, mLastY, 3, paint); - paint.setColor(0xFF00FF00); - canvas.drawCircle((mStartX + mLastX) / 2, (mStartY + mLastY) / 2, 2, paint); + if (DEBUG) { + if (mShowTouchPoints) { + paint.setAlpha(128); + paint.setColor(0xFFFF0000); + canvas.drawCircle(mStartX, mStartY, 3, paint); + canvas.drawLine(mStartX, mStartY, mLastX, mLastY, paint); + paint.setColor(0xFF0000FF); + canvas.drawCircle(mLastX, mLastY, 3, paint); + paint.setColor(0xFF00FF00); + canvas.drawCircle((mStartX + mLastX) / 2, (mStartY + mLastY) / 2, 2, paint); + } } - + mDrawPending = false; mDirtyRect.setEmpty(); } @@ -748,8 +759,8 @@ public class KeyboardView extends View implements View.OnClickListener { primaryIndex = nearestKeyIndices[i]; } - if (((mProximityCorrectOn - && (dist = key.squaredDistanceFrom(x, y)) < mProximityThreshold) + if (((mProximityCorrectOn + && (dist = key.squaredDistanceFrom(x, y)) < mProximityThreshold) || isInside) && key.codes[0] > 32) { // Find insertion point @@ -758,9 +769,9 @@ public class KeyboardView extends View implements View.OnClickListener { closestKeyDist = dist; closestKey = nearestKeyIndices[i]; } - + if (allKeys == null) continue; - + for (int j = 0; j < mDistances.length; j++) { if (mDistances[j] > dist) { // Make space for nCodes codes @@ -825,11 +836,11 @@ public class KeyboardView extends View implements View.OnClickListener { return adjustCase(key.label); } } - + private void showPreview(int keyIndex) { int oldKeyIndex = mCurrentKeyIndex; final PopupWindow previewPopup = mPreviewPopup; - + mCurrentKeyIndex = keyIndex; // Release the old key and press the new key final Key[] keys = mKeys; @@ -849,7 +860,7 @@ public class KeyboardView extends View implements View.OnClickListener { if (previewPopup.isShowing()) { if (keyIndex == NOT_A_KEY) { mHandler.sendMessageDelayed(mHandler - .obtainMessage(MSG_REMOVE_PREVIEW), + .obtainMessage(MSG_REMOVE_PREVIEW), DELAY_AFTER_PREVIEW); } } @@ -859,20 +870,20 @@ public class KeyboardView extends View implements View.OnClickListener { showKey(keyIndex); } else { mHandler.sendMessageDelayed( - mHandler.obtainMessage(MSG_SHOW_PREVIEW, keyIndex, 0), + mHandler.obtainMessage(MSG_SHOW_PREVIEW, keyIndex, 0), DELAY_BEFORE_PREVIEW); } } } } - + private void showKey(final int keyIndex) { final PopupWindow previewPopup = mPreviewPopup; final Key[] keys = mKeys; if (keyIndex < 0 || keyIndex >= mKeys.length) return; Key key = keys[keyIndex]; if (key.icon != null) { - mPreviewText.setCompoundDrawables(null, null, null, + mPreviewText.setCompoundDrawables(null, null, null, key.iconPreview != null ? key.iconPreview : key.icon); mPreviewText.setText(null); } else { @@ -886,9 +897,9 @@ public class KeyboardView extends View implements View.OnClickListener { mPreviewText.setTypeface(Typeface.DEFAULT); } } - mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), + mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); - int popupWidth = Math.max(mPreviewText.getMeasuredWidth(), key.width + int popupWidth = Math.max(mPreviewText.getMeasuredWidth(), key.width + mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight()); final int popupHeight = mPreviewHeight; LayoutParams lp = mPreviewText.getLayoutParams(); @@ -897,7 +908,7 @@ public class KeyboardView extends View implements View.OnClickListener { lp.height = popupHeight; } if (!mPreviewCentered) { - mPopupPreviewX = key.x - mPreviewText.getPaddingLeft() + mPaddingLeft; + mPopupPreviewX = key.x - mPreviewText.getPaddingLeft() + getPaddingLeft(); mPopupPreviewY = key.y - popupHeight + mPreviewOffset; } else { // TODO: Fix this if centering is brought back @@ -938,7 +949,7 @@ public class KeyboardView extends View implements View.OnClickListener { } else { previewPopup.setWidth(popupWidth); previewPopup.setHeight(popupHeight); - previewPopup.showAtLocation(mPopupParent, Gravity.NO_GRAVITY, + previewPopup.showAtLocation(mPopupParent, Gravity.NO_GRAVITY, mPopupPreviewX, mPopupPreviewY); } mPreviewText.setVisibility(VISIBLE); @@ -946,7 +957,7 @@ public class KeyboardView extends View implements View.OnClickListener { /** * Requests a redraw of the entire keyboard. Calling {@link #invalidate} is not sufficient - * because the keyboard renders the keys to an off-screen buffer and an invalidate() only + * because the keyboard renders the keys to an off-screen buffer and an invalidate() only * draws the cached buffer. * @see #invalidateKey(int) */ @@ -970,11 +981,11 @@ public class KeyboardView extends View implements View.OnClickListener { } final Key key = mKeys[keyIndex]; mInvalidatedKey = key; - mDirtyRect.union(key.x + mPaddingLeft, key.y + mPaddingTop, - key.x + key.width + mPaddingLeft, key.y + key.height + mPaddingTop); + mDirtyRect.union(key.x + getPaddingLeft(), key.y + getPaddingTop(), + key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop()); onBufferDraw(); - invalidate(key.x + mPaddingLeft, key.y + mPaddingTop, - key.x + key.width + mPaddingLeft, key.y + key.height + mPaddingTop); + invalidate(key.x + getPaddingLeft(), key.y + getPaddingTop(), + key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop()); } private boolean openPopupIfRequired(MotionEvent me) { @@ -986,7 +997,7 @@ public class KeyboardView extends View implements View.OnClickListener { return false; } - Key popupKey = mKeys[mCurrentKey]; + Key popupKey = mKeys[mCurrentKey]; boolean result = onLongPress(popupKey); if (result) { mAbortKey = true; @@ -1011,22 +1022,22 @@ public class KeyboardView extends View implements View.OnClickListener { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); mMiniKeyboardContainer = inflater.inflate(mPopupLayout, null); - mMiniKeyboard = (KeyboardView) mMiniKeyboardContainer.findViewById( - com.android.internal.R.id.keyboardView); + mMiniKeyboard = (LatinKeyboardBaseView) mMiniKeyboardContainer.findViewById( + R.id.LatinKeyboardBaseView); View closeButton = mMiniKeyboardContainer.findViewById( - com.android.internal.R.id.closeButton); + R.id.closeButton); if (closeButton != null) closeButton.setOnClickListener(this); mMiniKeyboard.setOnKeyboardActionListener(new OnKeyboardActionListener() { public void onKey(int primaryCode, int[] keyCodes) { mKeyboardActionListener.onKey(primaryCode, keyCodes); dismissPopupKeyboard(); } - + public void onText(CharSequence text) { mKeyboardActionListener.onText(text); dismissPopupKeyboard(); } - + public void swipeLeft() { } public void swipeRight() { } public void swipeUp() { } @@ -1041,7 +1052,7 @@ public class KeyboardView extends View implements View.OnClickListener { //mInputView.setSuggest(mSuggest); Keyboard keyboard; if (popupKey.popupCharacters != null) { - keyboard = new Keyboard(getContext(), popupKeyboardId, + keyboard = new Keyboard(getContext(), popupKeyboardId, popupKey.popupCharacters, -1, getPaddingLeft() + getPaddingRight()); } else { keyboard = new Keyboard(getContext(), popupKeyboardId); @@ -1049,20 +1060,20 @@ public class KeyboardView extends View implements View.OnClickListener { mMiniKeyboard.setKeyboard(keyboard); mMiniKeyboard.setPopupParent(this); mMiniKeyboardContainer.measure( - MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), + MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); - + mMiniKeyboardCache.put(popupKey, mMiniKeyboardContainer); } else { - mMiniKeyboard = (KeyboardView) mMiniKeyboardContainer.findViewById( - com.android.internal.R.id.keyboardView); + mMiniKeyboard = (LatinKeyboardBaseView) mMiniKeyboardContainer.findViewById( + R.id.LatinKeyboardBaseView); } if (mWindowOffset == null) { mWindowOffset = new int[2]; getLocationInWindow(mWindowOffset); } - mPopupX = popupKey.x + mPaddingLeft; - mPopupY = popupKey.y + mPaddingTop; + mPopupX = popupKey.x + getPaddingLeft(); + mPopupY = popupKey.y + getPaddingTop(); mPopupX = mPopupX + popupKey.width - mMiniKeyboardContainer.getMeasuredWidth(); mPopupY = mPopupY - mMiniKeyboardContainer.getMeasuredHeight(); final int x = mPopupX + mMiniKeyboardContainer.getPaddingRight() + mWindowOffset[0]; @@ -1081,12 +1092,9 @@ public class KeyboardView extends View implements View.OnClickListener { return false; } - private long mOldEventTime; - private boolean mUsedVelocity; - @Override public boolean onTouchEvent(MotionEvent me) { - // Convert multi-pointer up/down events to single up/down events to + // Convert multi-pointer up/down events to single up/down events to // deal with the typical multi-pointer behavior of two-thumb typing final int pointerCount = me.getPointerCount(); final int action = me.getAction(); @@ -1127,11 +1135,10 @@ public class KeyboardView extends View implements View.OnClickListener { } private boolean onModifiedTouchEvent(MotionEvent me, boolean possiblePoly) { - int touchX = (int) me.getX() - mPaddingLeft; - int touchY = (int) me.getY() + mVerticalCorrection - mPaddingTop; + int touchX = (int) me.getX() - getPaddingLeft(); + int touchY = (int) me.getY() + mVerticalCorrection - getPaddingTop(); final int action = me.getAction(); final long eventTime = me.getEventTime(); - mOldEventTime = eventTime; int keyIndex = getKeyIndices(touchX, touchY, null); mPossiblePoly = possiblePoly; @@ -1151,7 +1158,7 @@ public class KeyboardView extends View implements View.OnClickListener { mHandler.removeMessages(MSG_LONGPRESS); return true; } - + // Needs to be called after the gesture detector gets a turn, as it may have // displayed the mini keyboard if (mMiniKeyboardOnScreen && action != MotionEvent.ACTION_CANCEL) { @@ -1173,7 +1180,7 @@ public class KeyboardView extends View implements View.OnClickListener { mDownTime = me.getEventTime(); mLastMoveTime = mDownTime; checkMultiTap(eventTime, keyIndex); - mKeyboardActionListener.onPress(keyIndex != NOT_A_KEY ? + mKeyboardActionListener.onPress(keyIndex != NOT_A_KEY ? mKeys[keyIndex].codes[0] : 0); if (mCurrentKey >= 0 && mKeys[mCurrentKey].repeatable) { mRepeatKeyIndex = mCurrentKey; @@ -1272,11 +1279,11 @@ public class KeyboardView extends View implements View.OnClickListener { detectAndSendKey(mCurrentKey, key.x, key.y, mLastTapTime); return true; } - + protected void swipeRight() { mKeyboardActionListener.swipeRight(); } - + protected void swipeLeft() { mKeyboardActionListener.swipeLeft(); } @@ -1294,7 +1301,7 @@ public class KeyboardView extends View implements View.OnClickListener { mPreviewPopup.dismiss(); } removeMessages(); - + dismissPopupKeyboard(); mBuffer = null; mCanvas = null; @@ -1335,7 +1342,7 @@ public class KeyboardView extends View implements View.OnClickListener { mLastTapTime = -1; mInMultiTap = false; } - + private void checkMultiTap(long eventTime, int keyIndex) { if (keyIndex == NOT_A_KEY) return; Key key = mKeys[keyIndex]; diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index e99977d21..bfa26f668 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -22,7 +22,6 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.inputmethodservice.Keyboard; -import android.inputmethodservice.KeyboardView; import android.inputmethodservice.Keyboard.Key; import android.os.Handler; import android.os.Message; @@ -32,7 +31,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.widget.PopupWindow; -public class LatinKeyboardView extends KeyboardView { +public class LatinKeyboardView extends LatinKeyboardBaseView { static final int KEYCODE_OPTIONS = -100; static final int KEYCODE_SHIFT_LONGPRESS = -101; From 578096b6881270ccb4f28e30277dd148cda5dbef Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Fri, 25 Jun 2010 14:21:02 -0700 Subject: [PATCH 080/159] Quick adjustment to keyboard size on xlarge screens. And adjust the text size of the extension keyboard too. --- java/res/layout-xlarge/input.xml | 31 ++++++++++++++++++++++++++ java/res/layout-xlarge/input_trans.xml | 31 ++++++++++++++++++++++++++ java/res/values-xlarge/dimens.xml | 25 +++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 java/res/layout-xlarge/input.xml create mode 100755 java/res/layout-xlarge/input_trans.xml create mode 100644 java/res/values-xlarge/dimens.xml diff --git a/java/res/layout-xlarge/input.xml b/java/res/layout-xlarge/input.xml new file mode 100644 index 000000000..6b0bb12a6 --- /dev/null +++ b/java/res/layout-xlarge/input.xml @@ -0,0 +1,31 @@ + + + + diff --git a/java/res/layout-xlarge/input_trans.xml b/java/res/layout-xlarge/input_trans.xml new file mode 100755 index 000000000..1dfdc1555 --- /dev/null +++ b/java/res/layout-xlarge/input_trans.xml @@ -0,0 +1,31 @@ + + + + diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml new file mode 100644 index 000000000..433176274 --- /dev/null +++ b/java/res/values-xlarge/dimens.xml @@ -0,0 +1,25 @@ + + + + + 72dip + 46dip + 0dip + From cd61cadb717264953e56db5d292bf81fa88c81b7 Mon Sep 17 00:00:00 2001 From: satok Date: Sat, 26 Jun 2010 09:41:11 +0900 Subject: [PATCH 081/159] Remove additional layouts Change-Id: I65dbf3a4484b02ff1d854f704088ca527e273b85 --- java/res/drawable/keyboard_background_4.png | Bin 11964 -> 0 bytes java/res/drawable/keyboard_background_5.png | Bin 12227 -> 0 bytes java/res/layout/input3.xml | 31 ------------------ java/res/layout/input4.xml | 31 ------------------ java/res/layout/input5.xml | 31 ------------------ java/res/layout/input6.xml | 31 ------------------ java/res/values/strings.xml | 12 ------- .../inputmethod/latin/KeyboardSwitcher.java | 6 ++-- .../inputmethod/latin/LatinImeLogger.java | 4 +++ 9 files changed, 6 insertions(+), 140 deletions(-) delete mode 100644 java/res/drawable/keyboard_background_4.png delete mode 100644 java/res/drawable/keyboard_background_5.png delete mode 100755 java/res/layout/input3.xml delete mode 100755 java/res/layout/input4.xml delete mode 100755 java/res/layout/input5.xml delete mode 100755 java/res/layout/input6.xml diff --git a/java/res/drawable/keyboard_background_4.png b/java/res/drawable/keyboard_background_4.png deleted file mode 100644 index 74fc2e7627753059f4f1143ec60b702b7dabd936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11964 zcmb`N^K%_e7shXH&^V24+txR3jK;XJZL2qG+}O4oJ2$q`*hyoXZ~usQc6QI~PiN=M z?#_OmeSWGa$)F$-AOZjY6xnZ*YX9QZzrF+y{cl_j_>B4&@ZF@e-M%|oxOp18m;=Pj z98Jv0WbKVD&DG3}&AgpQ&4mB}Xn=}>x)iNPiHv7Dl^$3lq5{D19e~crWt$`$*~sTp z!trbH8@L=m$RFOaB;{YEmCz0#myk^zwk{Yk%kEDf`AZwtfu-OIg+P_uGz!3CgJRc( z;x}b5jYd-O1yIRDNw}c%>3olA#8CC4G>#_J34sP80$~Uv>L-D+ZUU}ZKruUf*HS1_ zAvn`ifRJ@k=b}|&6_T7Ag1AlV(y>`|nPvGr5C|mHj|9qj7Y-~z(JK&{BrsVgQL6g@ zaJls}2Z|>S5QI#KjAFpm!x?>R$Q)|ydj1?g8VSGqLc?H$m9zo4jM-gskaVMcelJj( zCFmE;AS!wT;mExTI$eqeY5nUxs^@&GCzy47iEJ`4#mwBZo9(i?2<7atOcLpxb178a z)Urn9e{~};$?}^915jwcXADBCfmM7nfNb9>Z8EU*qdAR!2sot(1Xbbv=rB!ez*G-H zR0~1k*N1_DrLs=Okg`!t?i06-bV;c;&FIF{1oIjD!~3=hhcpO8cN?d)3wvfW8irvB z8+x^F6RCIz*~Y5>$Y-)o2M~)w8zhj*+i--m*+l11X$Jrih#1U&!MRpqYlpCzMX^P7 z!rB#cSjVATXS!5O0hI!gMa}Ug%%L=XV#?a%`_)rA#Y!YeVybih8DW zb4SS(ox~hc*!}CEv}1wNp8jP6bn5O-rDM>vQdEZF@N`l&vwv;UTiFeQI2}`Q9rA(j z*i4pj)T*|jUArV!$@tP%kkwN}RwYdHH0#thu~^8j+Fl?KMkf`*tmg&;gr(E;!cg}7 zDh9HxTd_^4N7VRe+Iv5g6n40 za%WI@)M22YNHhc3J@es+IZ2%I0X!D}{cPb6Z-f3y20!hFH{W(p053N7O#Y#GX` z?j-7zfQpP~7?g;}YozA(69@yOwoFAv!~n(Cq8P@ZX@?6X_Is8M0ay(vq)lK&E#Tnb zkm2DFu$lNQA{wUmY!%%K002fcSxGTnmOk55{=0);f*L%8VEp+SDIAxZ`t zwA3;b<&_czm10)pPX(s?vj57;!o87T9qFik9b8d~?V!!C6e)=+S&I*1jkZY-2WA_J zvO3>6{(b!L6WO}tiGQKD$Uhe*El^v_@$K5WoPNFi&^KEDFkJ~`FA8L8fL;qehj>Iw zp?sGBnN4~~GTxPku!qhn88;;2Rkl@d4rkT{hKTLyM^MKuX@fJK&G6E?azaK&L^Dw( z`X=hnOH=5oeu<06?(MP0W+Rg~2t-B52w&p|@*L40pdJWAO?JXG0 zOGi$AJ_{E{P{?goK0r~Ut$b6WrhhmM4y0N$u>OH@? z;hAtvSGh)#v5;@#;cD*fNeLYO!fOl~ip`8;VjB`ZQ=-t)AGnCYfim4ZqzX^S%RAxb z{Sue;N(U?~7+WXs;meV=^5x@*q6QLiiLup@GMfwI;A7+{aS>?2|SJrM*M8m!Q zb_LiV?EUKR!c4}RkeQ06Z0V?B8iQx^IC?UgeyK$h4)sFo3K;vntqS~bZ0el>N$<>^ zc+fUsV1`?G$R^CCh&G*8_OiwhecsXkZHQY?Ln=dREh{N7N!>Nyum|`l#S#m+t|E1K z2z$DkF2!^+ zZ{K|5yb9odZ#$?ofR>*8OkKSip|dNCLO3?EvA3?iP@rpjGKNaI<(sU1_uij5mMFQ* z_`C0FwD6{AvF*DNqpalE5?*9V|g@uYE% zZJ3*_H_?qZm>rU|VmbX8s(yX22i>kO|DG@HXy;RUFK9J*i2x9;N=T&RrCN>G0o`Vc3aQ$)Os7AE#r5Db@0`?SMxJ+3n4<_@O;Mie)6tGw~ggkr`y_AJ+Z%* z3_8?+Zu?R(X^{yJ6aF5xPpnb-V`1?e>5Wt4c$X8or>^udw2fv>%+8ybmTKhci}>3? z7L2FFSd^@p-NQc6kdu?yD~PBoDKI*5^lRpZ{Ov!&&LZ~*8YeSLHHLHaMeNSXR{FE+ z>v0V4>{>+ZKVf;`W$O!Eu_vRT60gBOns;6KjW6aGPXBOu&erJk?KC<(_h=j;Pw<%%K6*Q?yaoe}oI!NKAEndUDStTWR=#%zcd1^Wt8tkn*l=FD|ZQDq~&qwf6m zZQ};$wS|SQAPF}k%equ8*HrP<+~D5qJ#(JfC~tfJ6@r!pQb`K)^r+M0`P-pfI1??} z)ce@eKOOtr6W2-Ks3s@hE}+(@gHTGMU9d@fybAxo&|qWrc?B;=1t_r0+NLSSLay9B~(%oJH8R$)lu`H zsPUlADiqg;Gla8~$hf$__(kmjNOrBR-D)$!{CZC8)NnKt3q3Afw<&&gCd&)Pd#S9s zo~!(HkgetiN--!!6GcRJ1etbQ~~bq@`%PvCRDiqm^6;aQJQB z9EAJb{J6RKQ4hC73z|k|y%+C5=J#2PEDVGqoWTAIOXTdhsnA%wFbKiAoUNk1RPeSP z`gMI9*3CA}Pfkb2Xlo?ve-|@x)gRsgGrOS4^1QSMbb}E zNdL;_&$msI;p;3RZqK~^vbY|k+h2)q&$)o-_Kvlj=ZK=|Jg~sD#p5OAi7$-WFqgfR z&c?7k(wQ&O$MPKo*Kr>%S#!2iC6TlZVWEjP07={!vLu|N(V`unZ|yX zj>&L_cghtU1%Ook^!N9QcHB8}B17nceE+_`2cv{N-1=ozSIuU=HFT;sIXCXFmj97K z@ijiuQugOQ$4K$)km&~ZSn^$Ya1DbYhaU+4t|g7X=2Utsu~G%OdxP|q=O>JXpxj_5 z(Qba9K=Jdig!8rATjE`z{;r@FXqZF7z_3S8IO*}{>y7lvT>Wq(Rz19!@`47>PWD0W~ySss|r?W8*mh%XeHdyU9LL=i(H1!5AYEenMs%%iuI zH<#qnVgKmbM%Z~{;}i<5`o1!bWTW}NeN@`wAs|R@zU?B(2E(^hMy)K)4#J7Y3|Z~} z=GQG@*z9_~+L@b};N4npb>2&h5e%d?0)Lg=tp=@+!Z(P)!d-tDZdyuIe;igVY~qR$$pX$%eF4M(?X9N&_z zU$+U&6_j|_LG{T}hUA)jIs@`uJ}37G{kgAR1FyBHF$SH>-oK+7#&-w7c+s<$-LDr) zcBup$sT8+&QfOOtTW4oy$scQdIAP3LoDNf2m`DL%jKHHKznm{lbaeKc+MPMHy#Eqq z_M2(8Zr$A6C}_XF%uD3>yAMR5U-oRn9G)SMfLTfmR=rK8vZiq;2vd&;cbAeD7WNSu zyH^;sYVOdGqDaEe=EI!#2rvR~Inm(UiIpel>kSn1z^M;<)XJbD^P3H@V4@snszpG; z&nhlI>pnr{xNLTR_^WOKPi`xulvGdW{vTodu7{H0#{Uv*!PEt1D5?Z=qZ?sjVg@c_ zusdzH^TNF~LrMfFGbc;_G}<>FFx1x3k6o#KW6$}T6darl>P^~62w4#Mbb~}&ZVh+B z;Cf-=F!4dvAfgiDG=DvA#rXa5y(-O39)`w$F9!VO?{x0xhU1qi9^2?vPcTn5-Y8j- zS@1eT2tIrk#0&2$bqm!6#-m<>Udz;$xQED-=2dk`RSPJ$4rx?yS3?We$pS*06whP3 zgy8ho*|k9IKp7Wcgh$O7L?QbHcoYPNKAblE+<2k=CEWWIV|2>(O_iw>4qUI7o_x_8 zytA`IR-{!okljpo7ZE8ys^QVibmwQKL&veziC`L-6}wM-{h@0)A$UY#`dOuudm-e! zJ5Xwb@;V=2wR{B)n~{voWdsR&KK)}lK?|udaP??QTbjB08a(QzUdq$oS}VI0ADrYH zy1@WFH`O1^WkKyNsUhu88hYl3j|VkrPw!}LjbOdf%x5$bH?8D%n2t_KGv(pp7GkI2 z|Essv&04gXt4<7z@dK_62C8)2r|)?Hvlg;9Y8yMnfZ{yf}NZYF(QL~2?ATvfM=^<+j* z5}Z2SY8=FSfqam5X zEMI^?EW6`KJUM3W^C{=_+kGu&sS>e>-`mrCsd7hqjno6w@-3-?_eb*I-j9bC)*#oJ zK@=1uMOLyrl{pQa&q#W-9a%hT(DbZkMy`yX>K;(Zo1_M^qJ`A?UpGt zkVe7l6cP;m9aSNn?l+|5w$-F0Vz_fjf=iD9aR0%+J}&G8aVTM|m|?N0xg~I`WXH5gAxAik7f6pKuT{~lk3#|sBaz?)HgefMrKtA z6Hu-u^m~MuyTFD-8d@QL+Nd4Z*q|qtF&o`ztm!~K1 z@xM9x4Tm=elc}tRLpf16^|jCX9f$DE0q<{6&^0x$*1xv$yh)XFKhBm*a|0{}1|Gu= zzDRp=G1jlI&MYqGClqeX67iSIhDKmw`O~2QC@O}$WRS}^BpGmUe-7?9*7#aQ)CMZP zL#l)Tuyd>_RR-*DcQ zj^p}uU#Emjn2_+lQ~TJnp8PF#T+I?36*-gQ=?S&!Fp_Yq5a#PW?hhQo#l>Gxp}kq< zk5CW#Hv3zHs@&HK30Ms~16B6n>LGoNfX+)-ZM@z$n#&vwY9=3n<*PN&yP=Ao`Z6Kw zs71^=0(H5KHJgZ7m@pn0=y^4n-)|9}!Dlw|Dv`5supas-uNN27hXgk+S;m&!pz!#x z`3gX;+U|kTh?+{tyKMvLdUqEei!1ueYJSz-6JsO=#|NokQB#TEAV2C8q@-={-VN$r z9rrMMySxXvM@^|0?+=W?nDEr_wdu?Ii)ZlX%zISfi&ByqjWj3=3+}H_GCts7ujGsX zO@fPn_iaf+DY`FgL8^5an#|axK$Rr8$##OIWDPw%B#H5`)z!Sb&Z<>r;}zMRot!lc za8{2t`#mJM{E`W3CS8Lb8=p^Iq{m5)NeBqE(A*`5=lXKb`VHzV10o53_OaGSLB z5PP(`)Ps#Je5+3icpLpV=6eZIZ>%5O)udveL2-|&yr#oXbI0cUA}vY9BCl|FdwY9z zwS2L&gWJrpHt(tDRvk5cR?cbB$^E+e=Fa(f;IGMKNuTKZ;7GQZmQVK`NwIHDJn^|% zhYn*Muj}&E7)l~6MxWF1sFPBnJFAN)Rmu_R@6LCkGYTFhf#Ak8G3FoFHW z2sz=;!KbU;=Xg7XjAU*nBY%Gr6RwQd7sLNF&$d;dan7{@7Y|m?NPDuJx54+UpM~3Y z9cqPnKJiHz7B_@y3rs~5Apzi?-)KD#4rfngnEe!n$%{Lto+I8`&&W(TZ{d8tgQ`$8)I}7)6^E| zhY+C!{hv*Kr~MJcVfRb_O$YUDLRvQ;b=7%?DA`Hz8#V;{i6Y$kb>3Lx)+zX9Zm-iJ zh!`)qqdz{|Yn0o#HSrQQvObm5Cn%}PEd3JP!fUk9)rA7K5kzLy<;oCWQNdrF+mGAh zVyrA0=$}Rdzr2KTh5q+WsC5=^2+U$5mEcq!wzXBBc4sLU82^6cl$)fGq2g>`@)Loc zx*Wk@6%*72>SrQ$9ko7*HjpqRz`W?bI^512&n38D!bn9fHos-l#4Bb>jxgtvbw>jr zW5ZP3H^m3$V^u{X+W%mSDVszTFIf8HOE!0AH(eATe-n?>QqsEnmb;YyeE;_R1r22I zIJ78)`*$&FzHdx7M*Pi=#}prsIU&x(6rZU;(-2c{BmR$6oI5wy+q}*fD8oJMCX>`R zBfHx64m(+8gfCkohU%TsdQO%aXbOCXWWKORcSh^CK5}XX{e$N zIDO-n_j|$g>Q2Ao1tI2$R(XLV>ZbFp3Z$G?AF;K$lP?6er7`lASe@R8t63bM{Lm^r znRz9E@GE`7LVs;oN@GK@P$MUnh0`(K{q`HU>`8CmiH1YCi;ZKByyqj_nYZuRE@sB) zs7qTF$(Nh^UcOdqWDo5!{ot(O;qHc5Zz~D1&tS7ZNi3*Df`3mtTv@H3nP~ZRL?^T4 zC*$)8X^ky2y2I@2h?{{nd!ctK;&BQxeE`Jm?sFzulYqCz;75f=NL*r^ELW z)Y6B9YHZA#K*a&d&KanxdGrWcEuhPXG5=L($46OE?RI2|@A6D;%o5 z3qU=!vs1TGs&7kFaB3b?TTqbv6GuAd*$G=5*7tf)YS;p2xb2*o@wFRx_BwW1=n&d> zCQL6`fWe6UlB=x$7)#OjKsJl&o zES&qvL?2QzLFNi>sDXYSOjRwE4l5ZNDjG5}g0*Y1zRNyXLNvM*!qlSl+u$haQ1Rzax*v*t9r7luGf^t48x z0hOcPeV)qy8hTi@05CTx?mDV!(Af3&oOZ!Y#bG%>AD=NC$ z%vIS8$Kyw1)%=mRg-LZmBz~8TJdnnApN77X{&^Cy&iyNtxJpO;NyLhOnUsaPze`Va zi+HgC1Qq%3Q>BiDY9=G74o7CSP-XsnG2(5B|LU~!-$c6=cETMVoMLUos+$n5Hsdox z8e^l&Oj0o5ma%XuoTr1+d3{saaJrys3MQ1F`xO03Fr&Z4KJYolotlv4Vy#_9YJ+v?yJ{xeuk`gl$tLbqjSnDiXs^TejTW#C_xs(~*8Zw@A3x7S-3pT}H zjPfseJ3iptT*w!HGF&F&=f%$^JC}!tW~);YXoe3x#;>A}zt}WTiN6(wXPl25Y<`T* z2N5Ow$)091p}+W(`z`XvP1Ya<5{uOk<({XTSMm$%%R}io$?wyI2J#fx(yfW7||hl}XxVV66*oIB8S4Vz%$g2@dvhB#qW zK;Q1m$bAi?`e=}&QuVL!4coH%_Y0%eSeSgSOW!h_Q>A-SMvE@D=~nq%CN1Fh3dV5* zU&hzU&-F1NHx&FCP?Vv)4JiIla0?soTwnNpH))hTDTt3Zlf!}F4MlQU_v$X@Q+w|O zfR#nDoocs&+sR(uIHdn}|69h9&Lss1hx|~s`C^$pruUoEv&op}C3YQrU1vmS%gr{L z0^}6aNlXd#KZ;i(VH1^b4T!N`%~nAKJIf0WA;#i6Ycc-p3RdTcvXd%&gKDMn?jlTQ z)J=bZ^4U7Vhk~JCAAW=5@PW0pwHS-C(C73X`~Es_=Hy`O6TcUcX>QP(iOH&oNZd1# zPBfz7USxBIwgXY2b1<$5Jij{LW0!+fk>?+0b{2XPy3MH)&P0&@{x({tDLm^epVw(O z_wVR;!XNtGUgjENj5KDqDz8CA>OZ(9%l|DIc_t@@|J8eMWk`C#27B8e$L=QT%EVEc zSSn|zss|0k9WC6-t#pa6(2TFJ0u;kN6mGUs{rzeAXE=I=vJS-5zryEpd$8OXf#S`g z{B}Uf?}F7}N9}BRlD=<}*vJZrvHWRnwjEHJX79U(M_7r}%JDUox;=&skw;9SfP{Etx3e?-lFd*nUS0MYb zCejgLqTu!GehD4t@8s+}%P=UKuDt8yCN=QFfojKg;|p+l$fV%~F3TA!9mi02JY^mX z?3L{;^JHwt0oA8wlZ&`!vXp3F4G zq@aManEV`%;+OH3`exXkDi8JN9tCfwdH2;uRWM7&z?8CO`$ubrFP4@}+wV!iQ#d>P z_{cP?SGjL5MY4%RY?qmS)PHNg>TXt;1c*{7F3P<4eWNgzZIr?{#(YcG>eM)WziFbz*L<-PEfGAdzrs>ClcB8IVf}oyt4_e0HZgdEvGvc z$(+Qy!iOI!Z_!FZBC%UfWrR7M2|(G6j*xw6ljhJ=TH4f1AWM|((&ak!L@{$Q@6uD1R!6OoQ9qec=S^L*xaSi{QzT zY5k}Ry_5#bhHBW1eArEnOG7MpxPzW@u9NZnGc~KSv5f{nm9t@(9d91b8vS|DGV=Bd z5tGXA(8vo$j;kWMhQ>>X)y^D7H-PCcy%Zuw#F5w_d3G3^8tXefriU>MGes1=I1($O z;S&GC>VKO;w`s#TJ;^z;JL$y?)B@9+=O<*|rJq1Ju(P#9$UpDI?m4t3cZIgwmo>?j zW+-hsjYr}%87bDyZ-78d`UL@b+vKX1UEG0_-pYdJq-6Yc;x~hE-s`erGMIy5M0D() zQGF`b@D-@h3NM-)i_fzn2xQKvdGa31tw7UU#t^s(ODGgcNl6?a@Pw9Lh3Xrv`wfKK zRF6#&Q&-CpBTdENvvTxV* zoX$d1s#TnT7EF-ZTgoU6ZBuo|{(Y7G0m!5H*a?~dNl|&xm`R)y*6^G7+CNSah6aNL zH&&Wug4?+2#yHO~_Aub}FRwg&oIffY*BY6Kz5R(d!67*yx&^wTIT1_i3i?Q8GCC;> zC!(YxvQN4rqjNX~^m6x}1*h=qpH>qZH&ef18MtP9;&XfaqjGy3ztvIkX%C&VIC9Vn z?e{VcLtR#xqw7r-mE!ii?}p>=3UnpCSjoyGKqI}PPS7M%jV;Q>^uh4a!Oxbk==IuR zEgI8h*F46iR728mfADtqGa~FP`SLwA!*t01cov%7cpT3=->omH(}|XEz>$<(C<1rA z@A~TIC~Y+0muW4ezaTTE%zJX)YHv^Za7XGT9<$8WEvMM`w&&_;k+<^wiga@P1rFH! zZ%!`U4-FDy+qS5Re>QdO(HnhmNJX7WJ^HW~c&sKNIgqkDQn8mgRmJetw#XBzKfL^u zlWnnGyfOaOCOM(K4z%{{jB6s30^ZS~waNjUh@mf5{ zk-aKe&Ir_}%Ov+m)LioV&w_=;&bfA9OYZ4rzvJR-{Zr$sT+e&7&UnCbf_7q#T3yFU ze~)XlXRa?Ct-2^YThlN23R?XR`Z9l>E(FDRUsu45_4XLR(z3Yo+ft}c-3K@KGYRTo zXnxC+l`nJ0-$^X}OvZx91frDUV2G&QHQlB`9bwSg^5G@{*dGTk$Xi{w3ZUC=#*w%R z6~LLk(8d1PjTISb|0e3hOm97X5`*blGY5K<@TicBL*mRq>OpDc&Xc+J(JbE=VAKUtjA>2j zm9~`Xw(pg`L_BB|;8N!3?@2eh>T9pK4g@P#xxh2;n+JZW<2)WNWS9vvOxN7pn`oKD z*J%eF;0ipQZ*A2X$u~m7pBcp8fHGTKq_f*EQDcJ2ZN@mD>*VZ)=+q_kXqxZL!3#X> zDd+A}Sm$%e06pYJdVU7{aLO4MFVEaK4Yx}hm$s~wk&Li+q?GsVzlK@5S8bkR4DeMc zA14rfmSb&|dxp@cNA>h$1D8XRVXvQbPfqCx3@QKI3F4>e{`q)^{2Jx-n^yMeg$H%X zJbLEk8_9?b1+S%POrp6UB4OK4;C7cvYsdL*Rvgb@#Hr7{)dn=wIE>Vpt5#A`qTRVB zSvdA?IYx}_Ug%x?51&dVUA=E(J2~CX&c7T>|H)=on&x?=+k@!0Tt_-r=rHTmkZgj` zbO%&z5#eOLqW;oXTq^1C!NFpm;l=}^&#-yh%J*Oxxb3X0OGdJv1+i!R>-E1IlS3nO zzBJlj$n_?6yIPU{{%>hTJNst2y^7T53*6onvA6H(Y(tFw<|eD&(12Relk}VsX*=WC4!Clil0B zJ;v+w`t7Nd_>}mre`x;w@d8fsGHs|(_Xav=z^-tp=#O3l6pH*tW=N_+*%TubTzL0a zo*JlY9_$h>o@Q*n!h>`YRJP6VAk;P+HXcnves3``9XUB2D}0dyZ;_+qVu`+X=8?fJci^wQ%)u4m%gpMc=tzE9 z79?o+Du++rRh{rdDwoz`aV-|wVh&4{L4(Zcu65ujxjRSE!Tu|V-rjCfVyCzTO=2Yu z(yQVzM}_IYPYBU#lHueafD$QTE};n1rrcd7|SYo=`WO5E=!h~?hcElMMi6_L=JR)GV0@xRa$Z_!KRkmw%~ z?AFxsV%=Sj4e0JJ2Ei#J{7zEQNmQb$v z0uX8z@>Iw{qM|drqvx5?g)!Kq);ef0k0MGX$Fkrh$wwh%adHL!S~}l#hms>$+;`|z z*xC|-XTAU_{RJCty4Z{Ab`{KX+(V=n5=Ws7)oWEad8?x@kS^~akaoCZ2*zwOolZHM zp0rNAv`M}FZsH2n#Bb*fx`ji{L4E-1&0qZi!sK2K+2VIhJfzwg6->0yc-@|+fx37v z=#Bo8pQ?$hI{DI4zg4o-k}u-C6W1SjY&g~V>%(z-dJx%e?CXCG>XPX((z{PDeT|Wq z#EKkOLwbL&>y~Yc`DZmFI`2R5S24=YaH~&9X7a%#Kr|kUxwa}gML;&?JZSK7mb1x+ z-c>|Ic&35AtDX^Qye>n7*sPWFnvrJ~=8GE>tLcd4R(+rMMha|V>Y~tpk}T^n^+&H| zy*jjLw9&vutKK|9VhiY@S;r>lgsN|}I{u)~o5&m1Y06O2c*=^+0R3Pugp^PQCnjW| zc7Ei@29uLo2Wt)T$iJeq)yOb)q3vvRv@9TYTIHAiIXU)+TG(>do41Scvv;u3j|tzB zQ%*C+X^d>D2+z!U#p<^*Mjt~?3h;gJmJOEFT$>8F8)H=YgMk4T%GAPEKSYUa4{K$O z*y-;SS=ajEOX#0K4Xu?^Z^`Ua~0r~8VX}(@h43ys}3Osds zU6mYW)v%iW<_&!`P}mX1`a7I$QA^M!D1?TZnyhH%~nzg3Fah5aR1se&hJWYlPXvbhz` z)mCRQ{q5~cE&eg3ig=$p1Nj|yxzA41N}I_c``A(jgPfsbrd_?oMc1oz*XyO|4Jl_Q z83sE(HNL+X8N{4$@+aMW(oUPN-*9`&Y{*ZPG8k%h15jxep1yxKM<9L1cl#CExi8 z*}*55U_IS7{fVU`lpf5w7pSx5wu``t7RSdMl()DRN5<`rmdPQ_%Z2peNY#yX{0bY( msI{1u#h%3XKc9$ffc(dK8XPc>$3HtdKvqggvPRtK$NvD`n-!J- diff --git a/java/res/drawable/keyboard_background_5.png b/java/res/drawable/keyboard_background_5.png deleted file mode 100644 index 2e0fb289fc89ec798592502f3ef1974b99960f2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12227 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 - - - diff --git a/java/res/layout/input4.xml b/java/res/layout/input4.xml deleted file mode 100755 index b5da9d48f..000000000 --- a/java/res/layout/input4.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - diff --git a/java/res/layout/input5.xml b/java/res/layout/input5.xml deleted file mode 100755 index 2de11dfff..000000000 --- a/java/res/layout/input5.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - diff --git a/java/res/layout/input6.xml b/java/res/layout/input6.xml deleted file mode 100755 index 54f31044f..000000000 --- a/java/res/layout/input6.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index e310da7f6..64b8dbe59 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -332,19 +332,11 @@ Keyboard Theme Basic Basic (High Contrast) - Blue Ribbon - Dazzle - Blue Ribbon (High Contrast) - Dazzle (High Contrast) Default @string/layout_basic @string/layout_high_contrast - @string/layout_blue_ribbon - @string/layout_blue_ribbon_high - @string/layout_dazzle - @string/layout_dazzle_high @string/layout_stone @@ -352,10 +344,6 @@ 0 1 2 - 3 - 4 - 5 - 6 Debug (Temporary) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 3c0ab5a4e..665e16aec 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -48,12 +48,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public static final int KEYBOARDMODE_IM = R.id.mode_im; public static final int KEYBOARDMODE_WEB = R.id.mode_webentry; - public static final String DEFAULT_LAYOUT_ID = "6"; + public static final String DEFAULT_LAYOUT_ID = "2"; public static final String PREF_KEYBOARD_LAYOUT = "keyboard_layout"; private static final int[] LAYOUTS = new int [] { - R.layout.input, R.layout.input2, R.layout.input3, R.layout.input4, R.layout.input5, - R.layout.input6, R.layout.input7 - }; + R.layout.input, R.layout.input2, R.layout.input7}; private static final int SYMBOLS_MODE_STATE_NONE = 0; private static final int SYMBOLS_MODE_STATE_BEGIN = 1; diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 1e467d9a6..42d5689d2 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -263,6 +263,10 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (sLOGPRINT) { Log.d(TAG, "Log theme Id. (1)"); } + // TODO: Not to convert theme ID here. Currently "2" is treated as "6" in a log server. + if (mThemeId == "2") { + mThemeId = "6"; + } mLogBuffer.add(new LogEntry (time, ID_THEME_ID, new String[] {mThemeId})); } From 6c20ab55b5b33543aedf5a56ffdea0b85f9e9cb6 Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 29 Jun 2010 05:32:48 +0900 Subject: [PATCH 082/159] Add a typeFace element and a symbol's color element - add default bold theme - add Change-Id: Ie3f31a6973c12e7f8b885d0036f50e8647c9fe82 --- .../res/layout/{input.xml => input_basic.xml} | 2 +- ...nput2.xml => input_basic_highcontrast.xml} | 2 +- java/res/layout/input_stone_bold.xml | 38 +++++++++++++++++++ .../{input7.xml => input_stone_normal.xml} | 3 +- ...input7_popup.xml => input_stone_popup.xml} | 9 ++--- java/res/values/attrs.xml | 12 ++++++ java/res/values/strings.xml | 7 +++- java/res/values/styles.xml | 1 + java/res/xml/prefs.xml | 2 +- .../inputmethod/latin/KeyboardSwitcher.java | 11 ++++-- .../inputmethod/latin/LatinImeLogger.java | 4 +- .../latin/LatinKeyboardBaseView.java | 28 +++++++++++++- 12 files changed, 101 insertions(+), 18 deletions(-) rename java/res/layout/{input.xml => input_basic.xml} (95%) rename java/res/layout/{input2.xml => input_basic_highcontrast.xml} (95%) create mode 100755 java/res/layout/input_stone_bold.xml rename java/res/layout/{input7.xml => input_stone_normal.xml} (93%) rename java/res/layout/{input7_popup.xml => input_stone_popup.xml} (86%) diff --git a/java/res/layout/input.xml b/java/res/layout/input_basic.xml similarity index 95% rename from java/res/layout/input.xml rename to java/res/layout/input_basic.xml index 039fdd8df..ffa59543b 100755 --- a/java/res/layout/input.xml +++ b/java/res/layout/input_basic.xml @@ -21,7 +21,7 @@ + + + diff --git a/java/res/layout/input7.xml b/java/res/layout/input_stone_normal.xml similarity index 93% rename from java/res/layout/input7.xml rename to java/res/layout/input_stone_normal.xml index 1290eb8ca..51693502e 100755 --- a/java/res/layout/input7.xml +++ b/java/res/layout/input_stone_normal.xml @@ -31,5 +31,6 @@ latin:keyTextSize="22dip" latin:keyTextColor="@color/latinkeyboard_key_color_black" latin:shadowColor="@color/latinkeyboard_key_color_white" - latin:popupLayout="@layout/input7_popup" + latin:symbolColorScheme="black" + latin:popupLayout="@layout/input_stone_popup" /> diff --git a/java/res/layout/input7_popup.xml b/java/res/layout/input_stone_popup.xml similarity index 86% rename from java/res/layout/input7_popup.xml rename to java/res/layout/input_stone_popup.xml index 2056757fa..e6eae5dad 100755 --- a/java/res/layout/input7_popup.xml +++ b/java/res/layout/input_stone_popup.xml @@ -25,10 +25,9 @@ android:orientation="horizontal" android:background="@drawable/keyboard_popup_panel_background" > - - + + + + + + + + + + + + diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 64b8dbe59..f2d823f0b 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -332,18 +332,21 @@ Keyboard Theme Basic Basic (High Contrast) - Default + Default (bold) + Default (normal) @string/layout_basic @string/layout_high_contrast - @string/layout_stone + @string/layout_stone_normal + @string/layout_stone_bold 0 1 2 + 3 Debug (Temporary) diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index a59a15083..143355033 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -30,5 +30,6 @@ #BB000000 2.75 0.5 + white diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index b50588a9e..10e3998f9 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -60,7 +60,7 @@ android:persistent="true" android:entryValues="@array/keyboard_layout_modes_values" android:entries="@array/keyboard_layout_modes" - android:defaultValue="6" + android:defaultValue="3" /> mMiniKeyboardCache; private int[] mWindowOffset; private Key[] mKeys; + private Typeface mKeyTextStyle = Typeface.DEFAULT; + private int mSymbolColorScheme = 0; /** Listener for {@link OnKeyboardActionListener}. */ private OnKeyboardActionListener mKeyboardActionListener; @@ -334,6 +336,24 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener case R.styleable.LatinKeyboardBaseView_backgroundDimAmount: mBackgroundDimAmount = a.getFloat(attr, 0.5f); break; + //case android.R.styleable. + case R.styleable.LatinKeyboardBaseView_keyTextStyle: + int textStyle = a.getInt(attr, 0); + switch (textStyle) { + case 0: + mKeyTextStyle = Typeface.DEFAULT; + break; + case 1: + mKeyTextStyle = Typeface.DEFAULT_BOLD; + break; + default: + mKeyTextStyle = Typeface.defaultFromStyle(textStyle); + break; + } + break; + case R.styleable.LatinKeyboardBaseView_symbolColorScheme: + mSymbolColorScheme = a.getInt(attr, 0); + break; } } @@ -526,6 +546,10 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener return mShowPreview; } + public int getSymbolColorSheme() { + return mSymbolColorScheme; + } + public void setVerticalCorrection(int verticalOffset) { } @@ -693,7 +717,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener paint.setTypeface(Typeface.DEFAULT_BOLD); } else { paint.setTextSize(mKeyTextSize); - paint.setTypeface(Typeface.DEFAULT); + paint.setTypeface(mKeyTextStyle); } // Draw a drop shadow for the text paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor); @@ -894,7 +918,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mPreviewText.setTypeface(Typeface.DEFAULT_BOLD); } else { mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge); - mPreviewText.setTypeface(Typeface.DEFAULT); + mPreviewText.setTypeface(mKeyTextStyle); } } mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), From 57691a35743e3705abe60db4902f9ad3c0e722d8 Mon Sep 17 00:00:00 2001 From: Maryam Garrett Date: Mon, 28 Jun 2010 16:31:12 -0400 Subject: [PATCH 083/159] Show word alternatives for spoken input With this change, we show alternatives for a word that has been spoken.The user triggers the display of alternatives by tapping on the word. The alternatives are currently generated by a client-side algorithm, but will be improved when we move to a server-side generation of the alternatives Change-Id: I454ee28fef9bf97a1b026ce8c605ca4badb39e79 --- .../android/inputmethod/latin/LatinIME.java | 83 ++++++++++++------- .../android/inputmethod/voice/VoiceInput.java | 4 +- 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index a89265e76..c19428d05 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -508,7 +508,6 @@ public class LatinIME extends InputMethodService mShowingVoiceSuggestions = false; mImmediatelyAfterVoiceSuggestions = false; mVoiceInputHighlighted = false; - mWordToSuggestions.clear(); mInputTypeNoAutoCorrect = false; mPredictionOn = false; mCompletionOn = false; @@ -702,29 +701,6 @@ public class LatinIME extends InputMethodService postUpdateOldSuggestions(); } } - - if (VOICE_INSTALLED) { - if (mShowingVoiceSuggestions) { - if (mImmediatelyAfterVoiceSuggestions) { - mImmediatelyAfterVoiceSuggestions = false; - } else { - updateSuggestions(); - mShowingVoiceSuggestions = false; - } - } - if (VoiceInput.ENABLE_WORD_CORRECTIONS) { - // If we have alternatives for the current word, then show them. - String word = EditingUtil.getWordAtCursor( - getCurrentInputConnection(), getWordSeparators()); - if (word != null && mWordToSuggestions.containsKey(word.trim())) { - mSuggestionShouldReplaceCurrentWord = true; - final List suggestions = mWordToSuggestions.get(word.trim()); - - setSuggestions(suggestions, false, true, true); - setCandidatesViewShown(true); - } - } - } } @Override @@ -745,6 +721,7 @@ public class LatinIME extends InputMethodService mVoiceInput.cancel(); } } + mWordToSuggestions.clear(); mWordHistory.clear(); super.hideWindow(); TextEntryState.endSession(); @@ -1512,9 +1489,6 @@ public class LatinIME extends InputMethodService // Show N-Best alternates, if there is more than one choice. if (nBest.size() > 1) { mImmediatelyAfterVoiceSuggestions = true; - mShowingVoiceSuggestions = true; - setSuggestions(nBest.subList(1, nBest.size()), false, true, true); - setCandidatesViewShown(true); } mVoiceInputHighlighted = true; mWordToSuggestions.putAll(mVoiceResults.alternatives); @@ -1682,6 +1656,29 @@ public class LatinIME extends InputMethodService } } + private void rememberReplacedWord(CharSequence suggestion) { + if (mShowingVoiceSuggestions) { + // Retain the replaced word in the alternatives array. + InputConnection ic = getCurrentInputConnection(); + EditingUtil.Range range = new EditingUtil.Range(); + String wordToBeReplaced = EditingUtil.getWordAtCursor(getCurrentInputConnection(), + mWordSeparators, range).trim(); + if (!mWordToSuggestions.containsKey(wordToBeReplaced)) { + wordToBeReplaced = wordToBeReplaced.toLowerCase(); + } + if (mWordToSuggestions.containsKey(wordToBeReplaced)) { + List suggestions = mWordToSuggestions.get(wordToBeReplaced); + if (suggestions.contains(suggestion)) { + suggestions.remove(suggestion); + } + suggestions.add(wordToBeReplaced); + mWordToSuggestions.remove(wordToBeReplaced); + mWordToSuggestions.put(suggestion.toString(), suggestions); + } + } + // TODO: implement rememberReplacedWord for typed words + } + private void pickSuggestion(CharSequence suggestion) { if (mCapsLock) { suggestion = suggestion.toString().toUpperCase(); @@ -1692,6 +1689,7 @@ public class LatinIME extends InputMethodService } InputConnection ic = getCurrentInputConnection(); if (ic != null) { + rememberReplacedWord(suggestion); if (mSuggestionShouldReplaceCurrentWord) { EditingUtil.deleteWordAtCursor(ic, getWordSeparators()); } @@ -1710,6 +1708,7 @@ public class LatinIME extends InputMethodService private void setOldSuggestions() { // TODO: Inefficient to check if touching word and then get the touching word. Do it // in one go. + mShowingVoiceSuggestions = false; InputConnection ic = getCurrentInputConnection(); if (ic == null) return; ic.beginBatchEdit(); @@ -1727,7 +1726,35 @@ public class LatinIME extends InputMethodService if (mWordSeparators.indexOf(touching.charAt(touching.length() - 1)) > 0) { touching = touching.toString().substring(0, touching.length() - 1); } - // Search for result in word history + + // Search for result in spoken word alternatives + // TODO: possibly combine the spoken suggestions with the typed suggestions. + String selectedWord = touching.toString().trim(); + if (!mWordToSuggestions.containsKey(selectedWord)){ + selectedWord = selectedWord.toLowerCase(); + } + if (mWordToSuggestions.containsKey(selectedWord)){ + mShowingVoiceSuggestions = true; + mSuggestionShouldReplaceCurrentWord = true; + underlineWord(touching, range.charsBefore, range.charsAfter); + List suggestions = mWordToSuggestions.get(selectedWord); + // If the first letter of touching is capitalized, make all the suggestions + // start with a capital letter. + if (Character.isUpperCase((char) touching.charAt(0))) { + for (int i=0; i< suggestions.size(); i++) { + String origSugg = (String) suggestions.get(i); + String capsSugg = origSugg.toUpperCase().charAt(0) + + origSugg.subSequence(1, origSugg.length()).toString(); + suggestions.set(i,capsSugg); + } + } + setSuggestions(suggestions, false, true, true); + setCandidatesViewShown(true); + TextEntryState.selectedForCorrection(); + ic.endBatchEdit(); + return; + } + // If we didn't find a match, search for result in word history WordComposer foundWord = null; WordAlternatives alternatives = null; for (WordAlternatives entry : mWordHistory) { diff --git a/java/src/com/android/inputmethod/voice/VoiceInput.java b/java/src/com/android/inputmethod/voice/VoiceInput.java index ac06ab50d..354670969 100644 --- a/java/src/com/android/inputmethod/voice/VoiceInput.java +++ b/java/src/com/android/inputmethod/voice/VoiceInput.java @@ -63,7 +63,7 @@ public class VoiceInput implements OnClickListener { // WARNING! Before enabling this, fix the problem with calling getExtractedText() in // landscape view. It causes Extracted text updates to be rejected due to a token mismatch - public static boolean ENABLE_WORD_CORRECTIONS = false; + public static boolean ENABLE_WORD_CORRECTIONS = true; // Dummy word suggestion which means "delete current word" public static final String DELETE_SYMBOL = " \u00D7 "; // times symbol @@ -308,7 +308,7 @@ public class VoiceInput implements OnClickListener { SettingsUtil.getSettingsInt( mContext.getContentResolver(), SettingsUtil.LATIN_IME_MAX_VOICE_RESULTS, - 1)); + 10)); // Get endpointer params from Gservices. // TODO: Consider caching these values for improved performance on slower devices. From 0fbdf1035b2ca6a4089bb991fddd5fe5ad973bf9 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 30 Jun 2010 12:32:04 +0900 Subject: [PATCH 084/159] Change color of a shodow behind the current language in Black symbols scheme Change-Id: I8ce049e1d77753a481cd45b53254ba248dca9f15 --- java/res/values/colors.xml | 3 ++- .../android/inputmethod/latin/LatinKeyboard.java | 16 +++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml index 4581cc961..343a9405d 100644 --- a/java/res/values/colors.xml +++ b/java/res/values/colors.xml @@ -22,7 +22,8 @@ #FFE35900 #ff808080 #00000000 - #80000000 + #80000000 + #80FFFFFF #FF808080 #A0000000 #FF000000 diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 2dd03389c..3d1e1d3cf 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -350,7 +350,7 @@ public class LatinKeyboard extends Keyboard { Bitmap buffer = Bitmap.createBitmap(mSpaceKey.width, mSpaceIcon.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(buffer); - drawSpaceBar(canvas, buffer.getWidth(), buffer.getHeight(), 255); + drawSpaceBar(canvas, buffer.getWidth(), buffer.getHeight(), 255, isBlack); mSpaceKey.icon = new BitmapDrawable(mRes, buffer); mSpaceKey.repeatable = mLanguageSwitcher.getLocaleCount() < 2; } else { @@ -360,7 +360,7 @@ public class LatinKeyboard extends Keyboard { } } - private void drawSpaceBar(Canvas canvas, int width, int height, int opacity) { + private void drawSpaceBar(Canvas canvas, int width, int height, int opacity, boolean isBlack) { canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR); Paint paint = new Paint(); paint.setAntiAlias(true); @@ -370,12 +370,14 @@ public class LatinKeyboard extends Keyboard { paint.setTextAlign(Align.CENTER); final String language = getInputLanguage(mSpaceKey.width, paint); final int ascent = (int) -paint.ascent(); - paint.setColor(mRes.getColor(R.color.latinkeyboard_bar_language_shadow)); - canvas.drawText(language, - width / 2, ascent - 1, paint); + + int shadowColor = isBlack ? mRes.getColor(R.color.latinkeyboard_bar_language_shadow_black) + : mRes.getColor(R.color.latinkeyboard_bar_language_shadow_white); + + paint.setColor(shadowColor); + canvas.drawText(language, width / 2, ascent - 1, paint); paint.setColor(mRes.getColor(R.color.latinkeyboard_bar_language_text)); - canvas.drawText(language, - width / 2, ascent, paint); + canvas.drawText(language, width / 2, ascent, paint); // Put arrows on either side of the text if (mLanguageSwitcher.getLocaleCount() > 1) { Rect bounds = new Rect(); From 0208492cae358dc07b50d8996e1e59e4203f97f3 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 30 Jun 2010 13:13:31 +0900 Subject: [PATCH 085/159] change version Change-Id: I94e110b3180dc740a7708984440eda12e32a849f --- java/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 9a41667af..7811c30b1 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionName="0.19"> From f5d9b3d4e4abb0fbe997a0e24f42ff5f273a3a95 Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 30 Jun 2010 13:16:00 +0900 Subject: [PATCH 086/159] change version code Change-Id: I54b45774d12ea6791e567c9908202606475503ff --- java/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 7811c30b1..f1f4368f6 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,6 +1,6 @@ From 40c86618c1dab44ccb4fe1ae3e7eee88f4cfb998 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 30 Jun 2010 12:38:41 +0900 Subject: [PATCH 087/159] No capitalization for inputs from the symbols keyboard. bug: 2220892 Change-Id: I832e855e8882c0ccbc48505acce5b605761cd93a --- .../src/com/android/inputmethod/latin/LatinIME.java | 5 ++++- .../android/inputmethod/latin/LatinKeyboard.java | 4 ++++ .../inputmethod/latin/LatinKeyboardBaseView.java | 2 +- .../inputmethod/latin/LatinKeyboardView.java | 13 +++++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 5b10e2ce7..b863a708c 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1138,7 +1138,10 @@ public class LatinIME extends InputMethodService || keyCodes[0] > Character.MAX_CODE_POINT) { return; } - primaryCode = new String(keyCodes, 0, 1).toUpperCase().charAt(0); + primaryCode = keyCodes[0]; + if (mKeyboardSwitcher.isAlphabetMode()) { + primaryCode = Character.toUpperCase(primaryCode); + } } if (mPredicting) { if (mKeyboardSwitcher.getInputView().isShifted() && mComposing.length() == 0) { diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 3d1e1d3cf..11dd8b7a0 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -274,6 +274,10 @@ public class LatinKeyboard extends Keyboard { } } + /* package */ boolean isAlphaKeyboard() { + return mIsAlphaKeyboard; + } + public void setExtension(int resId) { mExtensionResId = resId; } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 6b8d4f890..7f35ea98e 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -590,7 +590,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener dismissPopupKeyboard(); } - private CharSequence adjustCase(CharSequence label) { + protected CharSequence adjustCase(CharSequence label) { if (mKeyboard.isShifted() && label != null && label.length() < 3 && Character.isLowerCase(label.charAt(0))) { label = label.toString().toUpperCase(); diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index bfa26f668..bce2cde25 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -111,6 +111,19 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { } } + @Override + protected CharSequence adjustCase(CharSequence label) { + Keyboard keyboard = getKeyboard(); + if (keyboard.isShifted() + && keyboard instanceof LatinKeyboard + && ((LatinKeyboard) keyboard).isAlphaKeyboard() + && label != null && label.length() < 3 + && Character.isLowerCase(label.charAt(0))) { + label = label.toString().toUpperCase(); + } + return label; + } + /** * This function checks to see if we need to handle any sudden jumps in the pointer location * that could be due to a multi-touch being treated as a move by the firmware or hardware. From 67607ea8b12a149f95a5d74b94ff550eac4bd0ff Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 30 Jun 2010 19:10:11 +0900 Subject: [PATCH 088/159] Fix "pi" input issues. Added a popup for greek capital pi. Bug: 2220892 Change-Id: Ie465e2ed93c79b0efe9d518cc44df1028f1bb392 --- java/res/xml/kbd_symbols_shift.xml | 5 ++++- java/res/xml/kbd_symbols_shift_black.xml | 5 ++++- java/src/com/android/inputmethod/latin/LatinIME.java | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml index 09b5c3f9d..ca431fc8c 100755 --- a/java/res/xml/kbd_symbols_shift.xml +++ b/java/res/xml/kbd_symbols_shift.xml @@ -34,7 +34,10 @@ android:popupCharacters="♪♥♠♦♣" /> - + diff --git a/java/res/xml/kbd_symbols_shift_black.xml b/java/res/xml/kbd_symbols_shift_black.xml index dc8425125..a8acb9d00 100755 --- a/java/res/xml/kbd_symbols_shift_black.xml +++ b/java/res/xml/kbd_symbols_shift_black.xml @@ -34,7 +34,10 @@ android:popupCharacters="♪♥♠♦♣" /> - + diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index b863a708c..6af8c4f22 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1144,7 +1144,9 @@ public class LatinIME extends InputMethodService } } if (mPredicting) { - if (mKeyboardSwitcher.getInputView().isShifted() && mComposing.length() == 0) { + if (mKeyboardSwitcher.getInputView().isShifted() + && mKeyboardSwitcher.isAlphabetMode() + && mComposing.length() == 0) { mWord.setCapitalized(true); } mComposing.append((char) primaryCode); From daf88d35e72e754a96bf5940d5374038faf87b43 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Wed, 30 Jun 2010 11:13:49 -0700 Subject: [PATCH 089/159] Move the Serbian keyboard and strings to the correct folder. --- {res => java/res}/values-sr/strings.xml | 0 {res => java/res}/xml-sr/kbd_qwerty.xml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {res => java/res}/values-sr/strings.xml (100%) rename {res => java/res}/xml-sr/kbd_qwerty.xml (100%) diff --git a/res/values-sr/strings.xml b/java/res/values-sr/strings.xml similarity index 100% rename from res/values-sr/strings.xml rename to java/res/values-sr/strings.xml diff --git a/res/xml-sr/kbd_qwerty.xml b/java/res/xml-sr/kbd_qwerty.xml similarity index 100% rename from res/xml-sr/kbd_qwerty.xml rename to java/res/xml-sr/kbd_qwerty.xml From 222c9019e75b8cdb08a8c040d9bcdd93031dbe52 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 1 Jul 2010 07:33:06 +0900 Subject: [PATCH 090/159] Add a key to the keyboard layout for Russia bug: 2693836 Change-Id: I88a3664af8074788c6bfc146247ab33ae8a02c08 --- java/res/xml-ru/kbd_qwerty_black.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/java/res/xml-ru/kbd_qwerty_black.xml b/java/res/xml-ru/kbd_qwerty_black.xml index e500b97f2..4923be01a 100755 --- a/java/res/xml-ru/kbd_qwerty_black.xml +++ b/java/res/xml-ru/kbd_qwerty_black.xml @@ -70,7 +70,9 @@ - + ¯ + android:keyWidth="10%p"/> , + android:keyWidth="20%p" android:isRepeatable="true"/> From 9c76844da2c8b8fb7ac2db5279d74f9e4fd5c629 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 1 Jul 2010 08:42:20 +0900 Subject: [PATCH 091/159] Fix NPE on logging words Change-Id: Idb01cc3226a979de656b30e57422bb35b25d13fa --- java/src/com/android/inputmethod/latin/Suggest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 8ef6c07f8..e7b9e5d69 100755 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -197,10 +197,11 @@ public class Suggest implements Dictionary.WordCallback { if (mOriginalWord != null) { mOriginalWord = mOriginalWord.toString(); mLowerOriginalWord = mOriginalWord.toString().toLowerCase(); + LatinImeLogger.onAddSuggestedWord(mOriginalWord.toString(), Suggest.DIC_USER_TYPED); } else { mLowerOriginalWord = ""; } - LatinImeLogger.onAddSuggestedWord(mOriginalWord.toString(), Suggest.DIC_USER_TYPED); + // Search the dictionary only if there are at least 2 characters if (wordComposer.size() > 1) { if (mUserDictionary != null || mContactsDictionary != null) { From 59d271ee763efac79c07e8224490e3755284e603 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Thu, 1 Jul 2010 09:14:24 +0900 Subject: [PATCH 092/159] Add key debounce. bug: 2517112 Change-Id: I461e481226395ce8964003c2ad1f4af888c6f7f9 --- .../inputmethod/latin/LatinKeyboardBaseView.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 7f35ea98e..4205aadcf 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -182,6 +182,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener private int mVerticalCorrection; private int mProximityThreshold; + private int mKeyDebounceThreshold; + private static final int KEY_DEBOUNCE_FACTOR = 6; private boolean mPreviewCentered = false; private boolean mShowPreview = true; @@ -633,6 +635,9 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener if (dimensionSum < 0 || length == 0) return; mProximityThreshold = (int) (dimensionSum * 1.4f / length); mProximityThreshold *= mProximityThreshold; // Square it + + // 1/KEY_DEBOUNCE_FACTOR of distance between adjacent keys + mKeyDebounceThreshold = mProximityThreshold / KEY_DEBOUNCE_FACTOR; } @Override @@ -1158,6 +1163,13 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener return result; } + private boolean isMinorMoveForKeyDebounce(int x, int y) { + // TODO: Check the coordinate against each key border. The current + // logic is pretty simple. + return ((x - mLastCodeX) * (x - mLastCodeX) + + (y - mLastCodeY) * (y - mLastCodeY)) < mKeyDebounceThreshold; + } + private boolean onModifiedTouchEvent(MotionEvent me, boolean possiblePoly) { int touchX = (int) me.getX() - getPaddingLeft(); int touchY = (int) me.getY() + mVerticalCorrection - getPaddingTop(); @@ -1231,7 +1243,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mCurrentKey = keyIndex; mCurrentKeyTime = eventTime - mDownTime; } else { - if (keyIndex == mCurrentKey) { + if (keyIndex == mCurrentKey + || isMinorMoveForKeyDebounce(touchX, touchY)) { mCurrentKeyTime += eventTime - mLastMoveTime; continueLongPress = true; } else if (mRepeatKeyIndex == NOT_A_KEY) { From a86a942d7c95c1ab1225f705f712383258b4d614 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 2 Jul 2010 05:35:27 +0900 Subject: [PATCH 093/159] Fix the mic icon key is not black in the black scheme. Change-Id: I2be3507019601bc93a3e49cc60777e1515f53dc4 --- .../com/android/inputmethod/latin/LatinKeyboard.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 11dd8b7a0..2ce91ce78 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -293,17 +293,17 @@ public class LatinKeyboard extends Keyboard { mSpaceIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_space); mMicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic); m123MicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_123_mic); - if (mF1Key != null) { - mF1Key.icon = mMicIcon; - } } else { mShiftLockIcon = mRes.getDrawable(R.drawable.sym_keyboard_shift_locked); mSpaceIcon = mRes.getDrawable(R.drawable.sym_keyboard_space); mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic); m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic); - if (mF1Key != null) { - mF1Key.icon = mMicIcon; - } + } + if (m123Key != null) { + m123Key.icon = m123MicIcon; + } + if (mF1Key != null) { + mF1Key.icon = mMicIcon; } if (mSpaceKey != null) { mSpaceKey.icon = mSpaceIcon; From ac108d5b341f484d48009ba0e90524569bab84f2 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 2 Jul 2010 06:36:02 +0900 Subject: [PATCH 094/159] Null check at BackToAcceptedDefault Change-Id: Ib232475520f822bf8613258afb9638e1be50d7f7 --- java/src/com/android/inputmethod/latin/LatinIME.java | 2 +- java/src/com/android/inputmethod/latin/TextEntryState.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 756cd2327..7612426eb 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1288,7 +1288,7 @@ public class LatinIME extends InputMethodService doubleSpace(); } if (pickedDefault) { - TextEntryState.backToAcceptedDefault(); + TextEntryState.backToAcceptedDefault(mWord.getTypedWord()); } updateShiftKeyState(getCurrentInputEditorInfo()); if (ic != null) { diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java index 1a3bb877a..224423c23 100644 --- a/java/src/com/android/inputmethod/latin/TextEntryState.java +++ b/java/src/com/android/inputmethod/latin/TextEntryState.java @@ -138,7 +138,8 @@ public class TextEntryState { // STATE_ACCEPTED_DEFAULT will be changed to other sub-states // (see "case STATE_ACCEPTED_DEFAULT" in typedCharacter() below), // and should be restored back to STATE_ACCEPTED_DEFAULT after processing for each sub-state. - public static void backToAcceptedDefault() { + public static void backToAcceptedDefault(CharSequence typedWord) { + if (typedWord == null) return; switch (sState) { case STATE_SPACE_AFTER_ACCEPTED: case STATE_PUNCTUATION_AFTER_ACCEPTED: From bc0b0a6478d97874e305be60bfa16798268edc2a Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 2 Jul 2010 08:02:55 +0900 Subject: [PATCH 095/159] Show preview of F1 keys properly Change-Id: Ie1c6a13efcada09d29c1006224dcf54000c14283 --- java/src/com/android/inputmethod/latin/LatinKeyboard.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 2ce91ce78..db4d167d4 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -299,12 +299,7 @@ public class LatinKeyboard extends Keyboard { mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic); m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic); } - if (m123Key != null) { - m123Key.icon = m123MicIcon; - } - if (mF1Key != null) { - mF1Key.icon = mMicIcon; - } + updateF1Key(); if (mSpaceKey != null) { mSpaceKey.icon = mSpaceIcon; updateSpaceBarForLocale(f); From 09ecdc8bd653ed47a00fb1de7f3375cb73353f83 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 2 Jul 2010 17:29:44 +0900 Subject: [PATCH 096/159] Disable re-editting feature. Change-Id: I1fd8d7b3037ec8ee2eb468ed7770b10c09c5e73c --- java/src/com/android/inputmethod/latin/LatinIME.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 7612426eb..2cc92e133 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -711,15 +711,16 @@ public class LatinIME extends InputMethodService mLastSelectionEnd = newSelEnd; + // TODO: Uncomment this block when we enable re-editing feature // If a word is selected - if ((candidatesStart == candidatesEnd || newSelStart != oldSelStart) + /*if ((candidatesStart == candidatesEnd || newSelStart != oldSelStart) && (newSelStart < newSelEnd - 1 || (!mPredicting)) && !mVoiceInputHighlighted) { abortCorrection(false); if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) { postUpdateOldSuggestions(); } - } + }*/ } @Override From 2941dc28d7ba203d9b5009b9bcb0d3b38a83bd93 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 2 Jul 2010 17:37:41 +0900 Subject: [PATCH 097/159] Change version Change-Id: I1e4042eef1a6b19e1e75cc62f24e8b229970b608 --- java/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index f1f4368f6..57708bff4 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionCode="20" + android:versionName="0.20"> From b71547f2d065a17b268d1dbc896daab1820141a6 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Thu, 8 Jul 2010 15:41:17 -0700 Subject: [PATCH 098/159] Fix some bugs in editing feature - Fixed caching of words - some StringBuilders were being recycled while also being cached. Making copies now. - Fixed regression in revert - don't reset the word composer after saving the accepted word. - Removed flicker when cursoring through a word - delay the abortCorrection() until we need to and do the correction as an atomic operation. - Fixed replacing of "selected" words (double-tap to select a word) Still to do: - Remove flicker on highlighting a word - may need a framework change - Don't remove spans on text that's already in the text field - may require a framework change. - Figure out what to do about the punctuations that share the suggestion strip when in correction mode. --- .../android/inputmethod/latin/LatinIME.java | 39 ++++++++++--------- .../inputmethod/latin/WordComposer.java | 2 + 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index c19428d05..b1b6d9228 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -49,8 +49,8 @@ import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewParent; import android.view.ViewGroup; +import android.view.ViewParent; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.CompletionInfo; @@ -693,12 +693,14 @@ public class LatinIME extends InputMethodService // If a word is selected - if ((candidatesStart == candidatesEnd || newSelStart != oldSelStart) + if (isPredictionOn() && mJustRevertedSeparator == null + && (candidatesStart == candidatesEnd || newSelStart != oldSelStart) && (newSelStart < newSelEnd - 1 || (!mPredicting)) && !mVoiceInputHighlighted) { - abortCorrection(false); if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) { postUpdateOldSuggestions(); + } else { + abortCorrection(false); } } } @@ -1083,6 +1085,8 @@ public class LatinIME extends InputMethodService InputConnection ic = getCurrentInputConnection(); if (ic == null) return; + ic.beginBatchEdit(); + if (mAfterVoiceInput) { // Don't log delete if the user is pressing delete at // the beginning of the text box (hence not deleting anything) @@ -1115,6 +1119,7 @@ public class LatinIME extends InputMethodService TextEntryState.backspace(); if (TextEntryState.getState() == TextEntryState.STATE_UNDO_COMMIT) { revertLastWord(deleteChar); + ic.endBatchEdit(); return; } else if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) { ic.deleteSurroundingText(mEnteredText.length(), 0); @@ -1125,6 +1130,7 @@ public class LatinIME extends InputMethodService } } mJustRevertedSeparator = null; + ic.endBatchEdit(); } private void handleShift() { @@ -1277,9 +1283,10 @@ public class LatinIME extends InputMethodService mWord.reset(); return; } - TypedWordAlternatives entry = new TypedWordAlternatives(result, mWord); - // Create a new WordComposer as the old one is being saved for later use - mWord = new WordComposer(mWord); + // Make a copy of the CharSequence, since it is/could be a mutable CharSequence + final String resultCopy = result.toString(); + TypedWordAlternatives entry = new TypedWordAlternatives(resultCopy, + new WordComposer(mWord)); mWordHistory.add(entry); } @@ -1648,7 +1655,8 @@ public class LatinIME extends InputMethodService // Fool the state watcher so that a subsequent backspace will not do a revert TextEntryState.typedCharacter((char) KEYCODE_SPACE, true); - if (index == 0 && mCorrectionMode > 0 && !mSuggest.isValidWord(suggestion)) { + if (index == 0 && mCorrectionMode > 0 && !mSuggest.isValidWord(suggestion) + && !mSuggest.isValidWord(suggestion.toString().toLowerCase())) { mCandidateView.showAddToDictionaryHint(suggestion); } if (ic != null) { @@ -1662,9 +1670,9 @@ public class LatinIME extends InputMethodService InputConnection ic = getCurrentInputConnection(); EditingUtil.Range range = new EditingUtil.Range(); String wordToBeReplaced = EditingUtil.getWordAtCursor(getCurrentInputConnection(), - mWordSeparators, range).trim(); + mWordSeparators, range); if (!mWordToSuggestions.containsKey(wordToBeReplaced)) { - wordToBeReplaced = wordToBeReplaced.toLowerCase(); + wordToBeReplaced = wordToBeReplaced.toLowerCase(); } if (mWordToSuggestions.containsKey(wordToBeReplaced)) { List suggestions = mWordToSuggestions.get(wordToBeReplaced); @@ -1690,9 +1698,6 @@ public class LatinIME extends InputMethodService InputConnection ic = getCurrentInputConnection(); if (ic != null) { rememberReplacedWord(suggestion); - if (mSuggestionShouldReplaceCurrentWord) { - EditingUtil.deleteWordAtCursor(ic, getWordSeparators()); - } if (!VoiceInput.DELETE_SYMBOL.equals(suggestion)) { ic.commitText(suggestion, 1); } @@ -1719,9 +1724,8 @@ public class LatinIME extends InputMethodService } if (!mPredicting && isCursorTouchingWord()) { EditingUtil.Range range = new EditingUtil.Range(); - CharSequence touching = - EditingUtil.getWordAtCursor(getCurrentInputConnection(), mWordSeparators, - range); + CharSequence touching = EditingUtil.getWordAtCursor(getCurrentInputConnection(), + mWordSeparators, range); if (touching != null && touching.length() > 1) { if (mWordSeparators.indexOf(touching.charAt(touching.length() - 1)) > 0) { touching = touching.toString().substring(0, touching.length() - 1); @@ -1782,7 +1786,7 @@ public class LatinIME extends InputMethodService foundWord); showCorrections(alternatives); if (foundWord != null) { - mWord = foundWord; + mWord = new WordComposer(foundWord); } else { mWord.reset(); } @@ -1815,6 +1819,7 @@ public class LatinIME extends InputMethodService private void underlineWord(CharSequence word, int left, int right) { InputConnection ic = getCurrentInputConnection(); if (ic == null) return; + ic.finishComposingText(); ic.deleteSurroundingText(left, right); ic.setComposingText(word, 1); ic.setSelection(mLastSelectionStart, mLastSelectionStart); @@ -1859,7 +1864,6 @@ public class LatinIME extends InputMethodService if (!mPredicting && length > 0) { final InputConnection ic = getCurrentInputConnection(); mPredicting = true; - ic.beginBatchEdit(); mJustRevertedSeparator = ic.getTextBeforeCursor(1, 0); if (deleteChar) ic.deleteSurroundingText(1, 0); int toDelete = mCommittedLength; @@ -1871,7 +1875,6 @@ public class LatinIME extends InputMethodService ic.deleteSurroundingText(toDelete, 0); ic.setComposingText(mComposing, 1); TextEntryState.backspace(); - ic.endBatchEdit(); postUpdateSuggestions(); } else { sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL); diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index e2573a0a9..1ea74847a 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -55,7 +55,9 @@ public class WordComposer { mTypedWord = new StringBuilder(copy.mTypedWord); mCapsCount = copy.mCapsCount; mAutoCapitalized = copy.mAutoCapitalized; + mIsCapitalized = copy.mIsCapitalized; } + /** * Clear out the keys registered so far. */ From 937d5ad0131267aa4273f3e5d75b203a1f263c18 Mon Sep 17 00:00:00 2001 From: Jae Yong Sung Date: Wed, 30 Jun 2010 20:28:04 -0700 Subject: [PATCH 099/159] added bigram prediction - after first character, only suggests bigram data (but doesn't autocomplete) - after second character, words from dictionary gets rearranged by using bigram - compatible with old dictionary - added preference option to disable bigram Change-Id: Ia8f4e8fa55e797e86d858fd499887cd396388411 --- java/res/values/strings.xml | 5 + java/res/xml/prefs.xml | 10 +- .../inputmethod/latin/BinaryDictionary.java | 34 ++- .../android/inputmethod/latin/Dictionary.java | 29 +- .../inputmethod/latin/EditingUtil.java | 16 + .../latin/ExpandableDictionary.java | 5 +- .../android/inputmethod/latin/LatinIME.java | 16 +- .../android/inputmethod/latin/Suggest.java | 167 +++++++++-- ...oid_inputmethod_latin_BinaryDictionary.cpp | 28 +- native/src/dictionary.cpp | 281 +++++++++++++++++- native/src/dictionary.h | 25 +- tests/data/bigramlist.xml | 36 +++ tests/data/wordlist.xml | 1 + tests/res/raw/test.dict | Bin 2562 -> 2829 bytes .../inputmethod/latin/tests/SuggestTests.java | 73 ++++- 15 files changed, 663 insertions(+), 63 deletions(-) create mode 100644 tests/data/bigramlist.xml diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 35dd3e089..70a5b7e2e 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -85,6 +85,11 @@ Spacebar and punctuation automatically insert highlighted word + + Bigram Suggestions + + Use previous word to improve suggestion + None diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 535b63f3b..c93fe0ac3 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -81,6 +81,14 @@ android:defaultValue="@bool/enable_autocorrect" android:dependency="show_suggestions" /> - + + diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 6473f4558..8d2363012 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -33,9 +33,9 @@ import android.util.Log; public class BinaryDictionary extends Dictionary { private static final String TAG = "BinaryDictionary"; - public static final int MAX_WORD_LENGTH = 48; private static final int MAX_ALTERNATIVES = 16; private static final int MAX_WORDS = 16; + private static final int MAX_BIGRAMS = 255; // TODO Probably don't need all 255 private static final int TYPED_LETTER_MULTIPLIER = 2; private static final boolean ENABLE_MISSED_CHARACTERS = true; @@ -44,7 +44,9 @@ public class BinaryDictionary extends Dictionary { private int mDictLength; private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES]; private char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS]; + private char[] mOutputChars_bigrams = new char[MAX_WORD_LENGTH * MAX_BIGRAMS]; private int[] mFrequencies = new int[MAX_WORDS]; + private int[] mFrequencies_bigrams = new int[MAX_BIGRAMS]; // Keep a reference to the native dict direct buffer in Java to avoid // unexpected deallocation of the direct buffer. private ByteBuffer mNativeDictDirectBuffer; @@ -71,7 +73,7 @@ public class BinaryDictionary extends Dictionary { /** * Create a dictionary from a byte buffer. This is used for testing. * @param context application context for reading resources - * @param resId the resource containing the raw binary dictionary + * @param byteBuffer a ByteBuffer containing the binary dictionary */ public BinaryDictionary(Context context, ByteBuffer byteBuffer) { if (byteBuffer != null) { @@ -95,6 +97,8 @@ public class BinaryDictionary extends Dictionary { char[] outputChars, int[] frequencies, int maxWordLength, int maxWords, int maxAlternatives, int skipPos, int[] nextLettersFrequencies, int nextLettersSize); + private native int getBigramsNative(int nativeData, char[] prevWord, int prevWordLength, + char[] outputChars, int[] frequencies, int maxWordLength, int maxBigrams); private final void loadDictionary(Context context, int resId) { InputStream is = context.getResources().openRawResource(resId); @@ -121,6 +125,30 @@ public class BinaryDictionary extends Dictionary { } } + @Override + public void getBigrams(final WordComposer composer, final CharSequence previousWord, + final WordCallback callback, int[] nextLettersFrequencies) { + + char[] chars = previousWord.toString().toCharArray(); + Arrays.fill(mOutputChars_bigrams, (char) 0); + Arrays.fill(mFrequencies_bigrams, 0); + + int count = getBigramsNative(mNativeDict, chars, chars.length, mOutputChars_bigrams, + mFrequencies_bigrams, MAX_WORD_LENGTH, MAX_BIGRAMS); + for (int j = 0; j < count; j++) { + if (mFrequencies_bigrams[j] < 1) break; + int start = j * MAX_WORD_LENGTH; + int len = 0; + while (mOutputChars_bigrams[start + len] != 0) { + len++; + } + if (len > 0) { + callback.addWord(mOutputChars_bigrams, start, len, mFrequencies_bigrams[j], + DataType.BIGRAM); + } + } + } + @Override public void getWords(final WordComposer codes, final WordCallback callback, int[] nextLettersFrequencies) { @@ -166,7 +194,7 @@ public class BinaryDictionary extends Dictionary { len++; } if (len > 0) { - callback.addWord(mOutputChars, start, len, mFrequencies[j]); + callback.addWord(mOutputChars, start, len, mFrequencies[j], DataType.UNIGRAM); } } } diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java index e7b526663..54317c861 100644 --- a/java/src/com/android/inputmethod/latin/Dictionary.java +++ b/java/src/com/android/inputmethod/latin/Dictionary.java @@ -21,7 +21,9 @@ package com.android.inputmethod.latin; * strokes. */ abstract public class Dictionary { - + + protected static final int MAX_WORD_LENGTH = 48; + /** * Whether or not to replicate the typed word in the suggested list, even if it's valid. */ @@ -31,7 +33,11 @@ abstract public class Dictionary { * The weight to give to a word if it's length is the same as the number of typed characters. */ protected static final int FULL_WORD_FREQ_MULTIPLIER = 2; - + + public static enum DataType { + UNIGRAM, BIGRAM + } + /** * Interface to be implemented by classes requesting words to be fetched from the dictionary. * @see #getWords(WordComposer, WordCallback) @@ -45,9 +51,11 @@ abstract public class Dictionary { * @param wordLength length of valid characters in the character array * @param frequency the frequency of occurence. This is normalized between 1 and 255, but * can exceed those limits + * @param dataType tells type of this data * @return true if the word was added, false if no more words are required */ - boolean addWord(char[] word, int wordOffset, int wordLength, int frequency); + boolean addWord(char[] word, int wordOffset, int wordLength, int frequency, + DataType dataType); } /** @@ -64,6 +72,21 @@ abstract public class Dictionary { abstract public void getWords(final WordComposer composer, final WordCallback callback, int[] nextLettersFrequencies); + /** + * Searches for pairs in the bigram dictionary that matches the previous word and all the + * possible words following are added through the callback object. + * @param composer the key sequence to match + * @param callback the callback object to send possible word following previous word + * @param nextLettersFrequencies array of frequencies of next letters that could follow the + * word so far. For instance, "bracke" can be followed by "t", so array['t'] will have + * a non-zero value on returning from this method. + * Pass in null if you don't want the dictionary to look up next letters. + */ + public void getBigrams(final WordComposer composer, final CharSequence previousWord, + final WordCallback callback, int[] nextLettersFrequencies) { + // empty base implementation + } + /** * Checks if the given word occurs in the dictionary * @param word the word to search for. The search should be case-insensitive. diff --git a/java/src/com/android/inputmethod/latin/EditingUtil.java b/java/src/com/android/inputmethod/latin/EditingUtil.java index 7571f1daf..5133c60ca 100644 --- a/java/src/com/android/inputmethod/latin/EditingUtil.java +++ b/java/src/com/android/inputmethod/latin/EditingUtil.java @@ -16,6 +16,8 @@ package com.android.inputmethod.latin; +import java.util.regex.Pattern; + import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; @@ -24,6 +26,11 @@ import android.view.inputmethod.InputConnection; * Utility methods to deal with editing text through an InputConnection. */ public class EditingUtil { + /** + * Number of characters we want to look back in order to identify the previous word + */ + public static final int LOOKBACK_CHARACTER_NUM = 15; + private EditingUtil() {}; /** @@ -175,4 +182,13 @@ public class EditingUtil { private static boolean isWhitespace(int code, String whitespace) { return whitespace.contains(String.valueOf((char) code)); } + + private static final Pattern spaceRegex = Pattern.compile("\\s+"); + + public static CharSequence getPreviousWord(InputConnection connection) { + //TODO: Should fix this. This could be slow! + CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0); + String[] w = spaceRegex.split(prev); + return (w.length >= 2) ? w[w.length-2] : null; + } } diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java index 46bc41c42..6f4d925ee 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java @@ -267,7 +267,7 @@ public class ExpandableDictionary extends Dictionary { if (completion) { word[depth] = c; if (terminal) { - if (!callback.addWord(word, 0, depth + 1, freq * snr)) { + if (!callback.addWord(word, 0, depth + 1, freq * snr, DataType.UNIGRAM)) { return; } // Add to frequency of next letters for predictive correction @@ -305,7 +305,8 @@ public class ExpandableDictionary extends Dictionary { || !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); + callback.addWord(word, 0, depth + 1, finalFreq, + DataType.UNIGRAM); } } if (children != null) { diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index b1b6d9228..51fb9d876 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -89,6 +89,7 @@ public class LatinIME extends InputMethodService private static final String PREF_QUICK_FIXES = "quick_fixes"; private static final String PREF_SHOW_SUGGESTIONS = "show_suggestions"; private static final String PREF_AUTO_COMPLETE = "auto_complete"; + private static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion"; private static final String PREF_VOICE_MODE = "voice_mode"; // Whether or not the user has used voice input before (and thus, whether to show the @@ -187,6 +188,7 @@ public class LatinIME extends InputMethodService private boolean mAutoSpace; private boolean mJustAddedAutoSpace; private boolean mAutoCorrectEnabled; + private boolean mBigramSuggestionEnabled; private boolean mAutoCorrectOn; private boolean mCapsLock; private boolean mPasswordText; @@ -1538,7 +1540,7 @@ public class LatinIME extends InputMethodService } private List getTypedSuggestions(WordComposer word) { - List stringList = mSuggest.getSuggestions(mInputView, word, false); + List stringList = mSuggest.getSuggestions(mInputView, word, false, null); return stringList; } @@ -1549,7 +1551,14 @@ public class LatinIME extends InputMethodService } private void showSuggestions(WordComposer word) { - List stringList = mSuggest.getSuggestions(mInputView, word, false); + //long startTime = System.currentTimeMillis(); // TIME MEASUREMENT! + // TODO Maybe need better way of retrieving previous word + CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection()); + List stringList = mSuggest.getSuggestions(mInputView, word, false, + prevWord); + //long stopTime = System.currentTimeMillis(); // TIME MEASUREMENT! + //Log.d("LatinIME","Suggest Total Time - " + (stopTime - startTime)); + int[] nextLettersFrequencies = mSuggest.getNextLettersFrequencies(); ((LatinKeyboard) mInputView.getKeyboard()).setPreferredLetters(nextLettersFrequencies); @@ -2088,6 +2097,8 @@ public class LatinIME extends InputMethodService mCorrectionMode = (mAutoCorrectOn && mAutoCorrectEnabled) ? Suggest.CORRECTION_FULL : (mAutoCorrectOn ? Suggest.CORRECTION_BASIC : Suggest.CORRECTION_NONE); + mCorrectionMode = (mBigramSuggestionEnabled && mAutoCorrectOn && mAutoCorrectEnabled) + ? Suggest.CORRECTION_FULL_BIGRAM : mCorrectionMode; if (mSuggest != null) { mSuggest.setCorrectionMode(mCorrectionMode); } @@ -2154,6 +2165,7 @@ public class LatinIME extends InputMethodService } mAutoCorrectEnabled = sp.getBoolean(PREF_AUTO_COMPLETE, mResources.getBoolean(R.bool.enable_autocorrect)) & mShowSuggestions; + mBigramSuggestionEnabled = sp.getBoolean(PREF_BIGRAM_SUGGESTIONS, true) & mShowSuggestions; updateCorrectionMode(); updateAutoTextEnabled(mResources.getConfiguration().locale); mLanguageSwitcher.loadLocales(sp); diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 010913d6d..3e6090c72 100755 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -37,6 +37,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; + public static final int CORRECTION_FULL_BIGRAM = 3; + + /** + * Words that appear in both bigram and unigram data gets multiplier ranging from + * BIGRAM_MULTIPLIER_MIN to BIGRAM_MULTIPLIER_MAX depending on the frequency score from + * bigram data. + */ + public static final double BIGRAM_MULTIPLIER_MIN = 1.2; + public static final double BIGRAM_MULTIPLIER_MAX = 1.5; + + /** + * Maximum possible bigram frequency. Will depend on how many bits are being used in data + * structure. Maximum bigram freqeuncy will get the BIGRAM_MULTIPLIER_MAX as the multiplier. + */ + public static final int MAXIMUM_BIGRAM_FREQUENCY = 127; static final int LARGE_DICTIONARY_THRESHOLD = 200 * 1000; @@ -49,10 +64,13 @@ public class Suggest implements Dictionary.WordCallback { private Dictionary mContactsDictionary; private int mPrefMaxSuggestions = 12; + private int mPrefMaxBigrams = 255; private boolean mAutoTextEnabled; private int[] mPriorities = new int[mPrefMaxSuggestions]; + private int[] mBigramPriorities = new int[mPrefMaxBigrams]; + // Handle predictive correction for only the first 1280 characters for performance reasons // If we support scripts that need latin characters beyond that, we should probably use some // kind of a sparse array or language specific list with a mapping lookup table. @@ -60,6 +78,7 @@ public class Suggest implements Dictionary.WordCallback { // latin characters. private int[] mNextLettersFrequencies = new int[1280]; private ArrayList mSuggestions = new ArrayList(); + private ArrayList mBigramSuggestions = new ArrayList(); private ArrayList mStringPool = new ArrayList(); private boolean mHaveCorrection; private CharSequence mOriginalWord; @@ -80,7 +99,7 @@ public class Suggest implements Dictionary.WordCallback { private void initPool() { for (int i = 0; i < mPrefMaxSuggestions; i++) { - StringBuilder sb = new StringBuilder(32); + StringBuilder sb = new StringBuilder(Dictionary.MAX_WORD_LENGTH); mStringPool.add(sb); } } @@ -132,9 +151,10 @@ public class Suggest implements Dictionary.WordCallback { } mPrefMaxSuggestions = maxSuggestions; mPriorities = new int[mPrefMaxSuggestions]; - collectGarbage(); + mBigramPriorities = new int[mPrefMaxBigrams]; + collectGarbage(mSuggestions, mPrefMaxSuggestions); while (mStringPool.size() < mPrefMaxSuggestions) { - StringBuilder sb = new StringBuilder(32); + StringBuilder sb = new StringBuilder(Dictionary.MAX_WORD_LENGTH); mStringPool.add(sb); } } @@ -169,17 +189,16 @@ public class Suggest implements Dictionary.WordCallback { /** * 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. - * @param a view for retrieving the context for AutoText - * @param codes the list of codes. Each list item contains an array of character codes - * in order of probability where the character at index 0 in the array has the highest - * probability. + * @param view a view for retrieving the context for AutoText + * @param wordComposer contains what is currently being typed + * @param prevWordForBigram previous word (used only for bigram) * @return list of suggestions. */ public List getSuggestions(View view, WordComposer wordComposer, - boolean includeTypedWordIfValid) { + boolean includeTypedWordIfValid, CharSequence prevWordForBigram) { mHaveCorrection = false; mCapitalize = wordComposer.isCapitalized(); - collectGarbage(); + collectGarbage(mSuggestions, mPrefMaxSuggestions); Arrays.fill(mPriorities, 0); Arrays.fill(mNextLettersFrequencies, 0); @@ -191,8 +210,39 @@ public class Suggest implements Dictionary.WordCallback { } else { mLowerOriginalWord = ""; } - // Search the dictionary only if there are at least 2 characters - if (wordComposer.size() > 1) { + + if (wordComposer.size() == 1 && (mCorrectionMode == CORRECTION_FULL_BIGRAM + || mCorrectionMode == CORRECTION_BASIC)) { + // At first character, just get the bigrams + Arrays.fill(mBigramPriorities, 0); + collectGarbage(mBigramSuggestions, mPrefMaxBigrams); + + if (!TextUtils.isEmpty(prevWordForBigram)) { + CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase(); + if (mMainDict.isValidWord(lowerPrevWord)) { + prevWordForBigram = lowerPrevWord; + } + mMainDict.getBigrams(wordComposer, prevWordForBigram, this, + mNextLettersFrequencies); + char currentChar = wordComposer.getTypedWord().charAt(0); + int count = 0; + int bigramSuggestionSize = mBigramSuggestions.size(); + for (int i = 0; i < bigramSuggestionSize; i++) { + if (mBigramSuggestions.get(i).charAt(0) == currentChar) { + int poolSize = mStringPool.size(); + StringBuilder sb = poolSize > 0 ? + (StringBuilder) mStringPool.remove(poolSize - 1) + : new StringBuilder(Dictionary.MAX_WORD_LENGTH); + sb.setLength(0); + sb.append(mBigramSuggestions.get(i)); + mSuggestions.add(count++, sb); + if (count > mPrefMaxSuggestions) break; + } + } + } + + } else if (wordComposer.size() > 1) { + // Search the dictionary only if there are at least 2 characters if (mUserDictionary != null || mContactsDictionary != null) { if (mUserDictionary != null) { mUserDictionary.getWords(wordComposer, this, mNextLettersFrequencies); @@ -202,21 +252,26 @@ public class Suggest implements Dictionary.WordCallback { } if (mSuggestions.size() > 0 && isValidWord(mOriginalWord) - && mCorrectionMode == CORRECTION_FULL) { + && (mCorrectionMode == CORRECTION_FULL + || mCorrectionMode == CORRECTION_FULL_BIGRAM)) { mHaveCorrection = true; } } mMainDict.getWords(wordComposer, this, mNextLettersFrequencies); - if (mCorrectionMode == CORRECTION_FULL && mSuggestions.size() > 0) { + if ((mCorrectionMode == CORRECTION_FULL || mCorrectionMode == CORRECTION_FULL_BIGRAM) + && mSuggestions.size() > 0) { mHaveCorrection = true; } } + if (mOriginalWord != null) { mSuggestions.add(0, mOriginalWord.toString()); } - + // Check if the first suggestion has a minimum number of characters in common - if (mCorrectionMode == CORRECTION_FULL && mSuggestions.size() > 1) { + if (wordComposer.size() > 1 && mSuggestions.size() > 1 + && (mCorrectionMode == CORRECTION_FULL + || mCorrectionMode == CORRECTION_FULL_BIGRAM)) { if (!haveSufficientCommonality(mLowerOriginalWord, mSuggestions.get(1))) { mHaveCorrection = false; } @@ -247,7 +302,6 @@ public class Suggest implements Dictionary.WordCallback { i++; } } - removeDupes(); return mSuggestions; } @@ -301,20 +355,50 @@ public class Suggest implements Dictionary.WordCallback { return false; } - public boolean addWord(final char[] word, final int offset, final int length, final int freq) { + public boolean addWord(final char[] word, final int offset, final int length, int freq, + final Dictionary.DataType dataType) { + ArrayList suggestions; + int[] priorities; + int prefMaxSuggestions; + if(dataType == Dictionary.DataType.BIGRAM) { + suggestions = mBigramSuggestions; + priorities = mBigramPriorities; + prefMaxSuggestions = mPrefMaxBigrams; + } else { + suggestions = mSuggestions; + priorities = mPriorities; + prefMaxSuggestions = mPrefMaxSuggestions; + } + int pos = 0; - final int[] priorities = mPriorities; - final int prefMaxSuggestions = mPrefMaxSuggestions; + // Check if it's the same word, only caps are different if (compareCaseInsensitive(mLowerOriginalWord, word, offset, length)) { pos = 0; } else { + if (dataType == Dictionary.DataType.UNIGRAM) { + // Check if the word was already added before (by bigram data) + int bigramSuggestion = searchBigramSuggestion(word,offset,length); + if(bigramSuggestion >= 0) { + // turn freq from bigram into multiplier specified above + double multiplier = (((double) mBigramPriorities[bigramSuggestion]) + / MAXIMUM_BIGRAM_FREQUENCY) + * (BIGRAM_MULTIPLIER_MAX - BIGRAM_MULTIPLIER_MIN) + + BIGRAM_MULTIPLIER_MIN; + /* Log.d("Suggest","bigram num: " + bigramSuggestion + + " wordB: " + mBigramSuggestions.get(bigramSuggestion).toString() + + " currentPriority: " + freq + " bigramPriority: " + + mBigramPriorities[bigramSuggestion] + + " multiplier: " + multiplier); */ + freq = (int)Math.round((freq * multiplier)); + } + } + // Check the last one's priority and bail if (priorities[prefMaxSuggestions - 1] >= freq) return true; while (pos < prefMaxSuggestions) { if (priorities[pos] < freq - || (priorities[pos] == freq && length < mSuggestions - .get(pos).length())) { + || (priorities[pos] == freq && length < suggestions.get(pos).length())) { break; } pos++; @@ -324,12 +408,13 @@ public class Suggest implements Dictionary.WordCallback { if (pos >= prefMaxSuggestions) { return true; } + System.arraycopy(priorities, pos, priorities, pos + 1, prefMaxSuggestions - pos - 1); priorities[pos] = freq; int poolSize = mStringPool.size(); StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) - : new StringBuilder(32); + : new StringBuilder(Dictionary.MAX_WORD_LENGTH); sb.setLength(0); if (mCapitalize) { sb.append(Character.toUpperCase(word[offset])); @@ -339,9 +424,9 @@ public class Suggest implements Dictionary.WordCallback { } else { sb.append(word, offset, length); } - mSuggestions.add(pos, sb); - if (mSuggestions.size() > prefMaxSuggestions) { - CharSequence garbage = mSuggestions.remove(prefMaxSuggestions); + suggestions.add(pos, sb); + if (suggestions.size() > prefMaxSuggestions) { + CharSequence garbage = suggestions.remove(prefMaxSuggestions); if (garbage instanceof StringBuilder) { mStringPool.add(garbage); } @@ -349,6 +434,26 @@ public class Suggest implements Dictionary.WordCallback { return true; } + private int searchBigramSuggestion(final char[] word, final int offset, final int length) { + // TODO This is almost O(n^2). Might need fix. + // search whether the word appeared in bigram data + int bigramSuggestSize = mBigramSuggestions.size(); + for(int i = 0; i < bigramSuggestSize; i++) { + if(mBigramSuggestions.get(i).length() == length) { + boolean chk = true; + for(int j = 0; j < length; j++) { + if(mBigramSuggestions.get(i).charAt(j) != word[offset+j]) { + chk = false; + break; + } + } + if(chk) return i; + } + } + + return -1; + } + public boolean isValidWord(final CharSequence word) { if (word == null || word.length() == 0) { return false; @@ -359,21 +464,21 @@ public class Suggest implements Dictionary.WordCallback { || (mContactsDictionary != null && mContactsDictionary.isValidWord(word)); } - private void collectGarbage() { + private void collectGarbage(ArrayList suggestions, int prefMaxSuggestions) { int poolSize = mStringPool.size(); - int garbageSize = mSuggestions.size(); - while (poolSize < mPrefMaxSuggestions && garbageSize > 0) { - CharSequence garbage = mSuggestions.get(garbageSize - 1); + int garbageSize = suggestions.size(); + while (poolSize < prefMaxSuggestions && garbageSize > 0) { + CharSequence garbage = suggestions.get(garbageSize - 1); if (garbage != null && garbage instanceof StringBuilder) { mStringPool.add(garbage); poolSize++; } garbageSize--; } - if (poolSize == mPrefMaxSuggestions + 1) { + if (poolSize == prefMaxSuggestions + 1) { Log.w("Suggest", "String pool got too big: " + poolSize); } - mSuggestions.clear(); + suggestions.clear(); } public void close() { diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp index bb45cb538..4fe80da69 100644 --- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp +++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp @@ -59,8 +59,7 @@ static int latinime_BinaryDictionary_getSuggestions( jint maxAlternatives, jint skipPos, jintArray nextLettersArray, jint nextLettersSize) { Dictionary *dictionary = (Dictionary*) dict; - if (dictionary == NULL) - return 0; + if (dictionary == NULL) return 0; int *frequencies = env->GetIntArrayElements(frequencyArray, NULL); int *inputCodes = env->GetIntArrayElements(inputArray, NULL); @@ -81,6 +80,28 @@ static int latinime_BinaryDictionary_getSuggestions( return count; } +static int latinime_BinaryDictionary_getBigrams + (JNIEnv *env, jobject object, jint dict, jcharArray wordArray, jint wordLength, + jcharArray outputArray, jintArray frequencyArray, jint maxWordLength, jint maxBigrams) +{ + Dictionary *dictionary = (Dictionary*) dict; + if (dictionary == NULL) return 0; + + jchar *word = env->GetCharArrayElements(wordArray, NULL); + jchar *outputChars = env->GetCharArrayElements(outputArray, NULL); + int *frequencies = env->GetIntArrayElements(frequencyArray, NULL); + + int count = dictionary->getBigrams((unsigned short*) word, wordLength, + (unsigned short*) outputChars, frequencies, maxWordLength, maxBigrams); + + env->ReleaseCharArrayElements(wordArray, word, JNI_ABORT); + env->ReleaseCharArrayElements(outputArray, outputChars, 0); + env->ReleaseIntArrayElements(frequencyArray, frequencies, 0); + + return count; +} + + static jboolean latinime_BinaryDictionary_isValidWord (JNIEnv *env, jobject object, jint dict, jcharArray wordArray, jint wordLength) { @@ -108,7 +129,8 @@ static JNINativeMethod gMethods[] = { (void*)latinime_BinaryDictionary_open}, {"closeNative", "(I)V", (void*)latinime_BinaryDictionary_close}, {"getSuggestionsNative", "(I[II[C[IIIII[II)I", (void*)latinime_BinaryDictionary_getSuggestions}, - {"isValidWordNative", "(I[CI)Z", (void*)latinime_BinaryDictionary_isValidWord} + {"isValidWordNative", "(I[CI)Z", (void*)latinime_BinaryDictionary_isValidWord}, + {"getBigramsNative", "(I[CI[C[III)I", (void*)latinime_BinaryDictionary_getBigrams} }; static int registerNativeMethods(JNIEnv* env, const char* className, diff --git a/native/src/dictionary.cpp b/native/src/dictionary.cpp index e75beb5b7..a1a632faa 100644 --- a/native/src/dictionary.cpp +++ b/native/src/dictionary.cpp @@ -19,6 +19,7 @@ #include #include #include +//#define LOG_TAG "dictionary.cpp" //#include #define LOGI @@ -27,6 +28,9 @@ #include "char_utils.h" #define DEBUG_DICT 0 +#define DICTIONARY_VERSION_MIN 200 +#define DICTIONARY_HEADER_SIZE 2 +#define NOT_VALID_WORD -99 namespace latinime { @@ -35,6 +39,7 @@ Dictionary::Dictionary(void *dict, int typedLetterMultiplier, int fullWordMultip mDict = (unsigned char*) dict; mTypedLetterMultiplier = typedLetterMultiplier; mFullWordMultiplier = fullWordMultiplier; + getVersionNumber(); } Dictionary::~Dictionary() @@ -58,7 +63,11 @@ int Dictionary::getSuggestions(int *codes, int codesSize, unsigned short *outWor mNextLettersFrequencies = nextLetters; mNextLettersSize = nextLettersSize; - getWordsRec(0, 0, mInputLength * 3, false, 1, 0, 0); + if (checkIfDictVersionIsLatest()) { + getWordsRec(DICTIONARY_HEADER_SIZE, 0, mInputLength * 3, false, 1, 0, 0); + } else { + getWordsRec(0, 0, mInputLength * 3, false, 1, 0, 0); + } // Get the word count suggWords = 0; @@ -85,6 +94,21 @@ Dictionary::registerNextLetter(unsigned short c) } } +void +Dictionary::getVersionNumber() +{ + mVersion = (mDict[0] & 0xFF); + mBigram = (mDict[1] & 0xFF); + LOGI("IN NATIVE SUGGEST Version: %d Bigram : %d \n", mVersion, mBigram); +} + +// Checks whether it has the latest dictionary or the old dictionary +bool +Dictionary::checkIfDictVersionIsLatest() +{ + return (mVersion >= DICTIONARY_VERSION_MIN) && (mBigram == 1 || mBigram == 0); +} + unsigned short Dictionary::getChar(int *pos) { @@ -112,6 +136,28 @@ Dictionary::getAddress(int *pos) return address; } +int +Dictionary::getFreq(int *pos) +{ + int freq = mDict[(*pos)++] & 0xFF; + + if (checkIfDictVersionIsLatest()) { + // skipping bigram + int bigramExist = (mDict[*pos] & FLAG_BIGRAM_READ); + if (bigramExist > 0) { + int nextBigramExist = 1; + while (nextBigramExist > 0) { + (*pos) += 3; + nextBigramExist = (mDict[(*pos)++] & FLAG_BIGRAM_CONTINUED); + } + } else { + (*pos)++; + } + } + + return freq; +} + int Dictionary::wideStrLen(unsigned short *str) { @@ -161,6 +207,46 @@ Dictionary::addWord(unsigned short *word, int length, int frequency) return false; } +bool +Dictionary::addWordBigram(unsigned short *word, int length, int frequency) +{ + word[length] = 0; + if (DEBUG_DICT) { + char s[length + 1]; + for (int i = 0; i <= length; i++) s[i] = word[i]; + LOGI("Bigram: Found word = %s, freq = %d : \n", s, frequency); + } + + // Find the right insertion point + int insertAt = 0; + while (insertAt < mMaxBigrams) { + if (frequency > mBigramFreq[insertAt] + || (mBigramFreq[insertAt] == frequency + && length < wideStrLen(mBigramChars + insertAt * mMaxWordLength))) { + break; + } + insertAt++; + } + LOGI("Bigram: InsertAt -> %d maxBigrams: %d\n", insertAt, mMaxBigrams); + if (insertAt < mMaxBigrams) { + memmove((char*) mBigramFreq + (insertAt + 1) * sizeof(mBigramFreq[0]), + (char*) mBigramFreq + insertAt * sizeof(mBigramFreq[0]), + (mMaxBigrams - insertAt - 1) * sizeof(mBigramFreq[0])); + mBigramFreq[insertAt] = frequency; + memmove((char*) mBigramChars + (insertAt + 1) * mMaxWordLength * sizeof(short), + (char*) mBigramChars + (insertAt ) * mMaxWordLength * sizeof(short), + (mMaxBigrams - insertAt - 1) * sizeof(short) * mMaxWordLength); + unsigned short *dest = mBigramChars + (insertAt ) * mMaxWordLength; + while (length--) { + *dest++ = *word++; + } + *dest = 0; // NULL terminate + if (DEBUG_DICT) LOGI("Bigram: Added word at %d\n", insertAt); + return true; + } + return false; +} + unsigned short Dictionary::toLowerCase(unsigned short c) { if (c < sizeof(BASE_CHARS) / sizeof(BASE_CHARS[0])) { @@ -213,12 +299,17 @@ Dictionary::getWordsRec(int pos, int depth, int maxDepth, bool completion, int s } for (int i = 0; i < count; i++) { + // -- at char unsigned short c = getChar(&pos); + // -- at flag/add unsigned short lowerC = toLowerCase(c); bool terminal = getTerminal(&pos); int childrenAddress = getAddress(&pos); + // -- after address or flag int freq = 1; if (terminal) freq = getFreq(&pos); + // -- after add or freq + // If we are only doing completions, no need to look at the typed characters. if (completion) { mWord[depth] = c; @@ -232,7 +323,7 @@ Dictionary::getWordsRec(int pos, int depth, int maxDepth, bool completion, int s getWordsRec(childrenAddress, depth + 1, maxDepth, completion, snr, inputIndex, diffs); } - } else if (c == QUOTE && currentChars[0] != QUOTE || mSkipPos == depth) { + } else if ((c == QUOTE && currentChars[0] != QUOTE) || mSkipPos == depth) { // Skip the ' or other letter and continue deeper mWord[depth] = c; if (childrenAddress != 0) { @@ -270,14 +361,185 @@ Dictionary::getWordsRec(int pos, int depth, int maxDepth, bool completion, int s } } -bool -Dictionary::isValidWord(unsigned short *word, int length) +int +Dictionary::getBigramAddress(int *pos, bool advance) { - return isValidWordRec(0, word, 0, length); + int address = 0; + + address += (mDict[*pos] & 0x3F) << 16; + address += (mDict[*pos + 1] & 0xFF) << 8; + address += (mDict[*pos + 2] & 0xFF); + + if (advance) { + *pos += 3; + } + + return address; +} + +int +Dictionary::getBigramFreq(int *pos) +{ + int freq = mDict[(*pos)++] & FLAG_BIGRAM_FREQ; + + return freq; +} + + +int +Dictionary::getBigrams(unsigned short *prevWord, int prevWordLength, unsigned short *bigramChars, + int *bigramFreq, int maxWordLength, int maxBigrams) +{ + mBigramFreq = bigramFreq; + mBigramChars = bigramChars; + mMaxWordLength = maxWordLength; + mMaxBigrams = maxBigrams; + + if (mBigram == 1 && checkIfDictVersionIsLatest()) { + int pos = isValidWordRec(DICTIONARY_HEADER_SIZE, prevWord, 0, prevWordLength); + LOGI("Pos -> %d\n", pos); + if (pos < 0) { + return 0; + } + + int bigramCount = 0; + int bigramExist = (mDict[pos] & FLAG_BIGRAM_READ); + if (bigramExist > 0) { + int nextBigramExist = 1; + while (nextBigramExist > 0) { + int bigramAddress = getBigramAddress(&pos, true); + int frequency = (FLAG_BIGRAM_FREQ & mDict[pos]); + // search for all bigrams and store them + searchForTerminalNode(bigramAddress, frequency); + nextBigramExist = (mDict[pos++] & FLAG_BIGRAM_CONTINUED); + bigramCount++; + } + } + + return bigramCount; + } + return 0; +} + +void +Dictionary::searchForTerminalNode(int addressLookingFor, int frequency) +{ + // track word with such address and store it in an array + unsigned short word[mMaxWordLength]; + + int pos; + int followDownBranchAddress = DICTIONARY_HEADER_SIZE; + bool found = false; + char followingChar = ' '; + int depth = -1; + + while(!found) { + bool followDownAddressSearchStop = false; + bool firstAddress = true; + bool haveToSearchAll = true; + + if (depth >= 0) { + word[depth] = (unsigned short) followingChar; + } + pos = followDownBranchAddress; // pos start at count + int count = mDict[pos] & 0xFF; + LOGI("count - %d\n",count); + pos++; + for (int i = 0; i < count; i++) { + // pos at data + pos++; + // pos now at flag + if (!getFirstBitOfByte(&pos)) { // non-terminal + if (!followDownAddressSearchStop) { + int addr = getBigramAddress(&pos, false); + if (addr > addressLookingFor) { + followDownAddressSearchStop = true; + if (firstAddress) { + firstAddress = false; + haveToSearchAll = true; + } else if (!haveToSearchAll) { + break; + } + } else { + followDownBranchAddress = addr; + followingChar = (char)(0xFF & mDict[pos-1]); + if (firstAddress) { + firstAddress = false; + haveToSearchAll = false; + } + } + } + pos += 3; + } else if (getFirstBitOfByte(&pos)) { // terminal + if (addressLookingFor == (pos-1)) { // found !! + depth++; + word[depth] = (0xFF & mDict[pos-1]); + found = true; + break; + } + if (getSecondBitOfByte(&pos)) { // address + freq (4 byte) + if (!followDownAddressSearchStop) { + int addr = getBigramAddress(&pos, false); + if (addr > addressLookingFor) { + followDownAddressSearchStop = true; + if (firstAddress) { + firstAddress = false; + haveToSearchAll = true; + } else if (!haveToSearchAll) { + break; + } + } else { + followDownBranchAddress = addr; + followingChar = (char)(0xFF & mDict[pos-1]); + if (firstAddress) { + firstAddress = false; + haveToSearchAll = true; + } + } + } + pos += 4; + } else { // freq only (2 byte) + pos += 2; + } + + // skipping bigram + int bigramExist = (mDict[pos] & FLAG_BIGRAM_READ); + if (bigramExist > 0) { + int nextBigramExist = 1; + while (nextBigramExist > 0) { + pos += 3; + nextBigramExist = (mDict[pos++] & FLAG_BIGRAM_CONTINUED); + } + } else { + pos++; + } + } + } + depth++; + if (followDownBranchAddress == 0) { + LOGI("ERROR!!! Cannot find bigram!!"); + break; + } + } + + addWordBigram(word, depth, frequency); } bool +Dictionary::isValidWord(unsigned short *word, int length) +{ + if (checkIfDictVersionIsLatest()) { + return (isValidWordRec(DICTIONARY_HEADER_SIZE, word, 0, length) != NOT_VALID_WORD); + } else { + return (isValidWordRec(0, word, 0, length) != NOT_VALID_WORD); + } +} + +int Dictionary::isValidWordRec(int pos, unsigned short *word, int offset, int length) { + // returns address of bigram data of that word + // return -99 if not found + int count = getCount(&pos); unsigned short currentChar = (unsigned short) word[offset]; for (int j = 0; j < count; j++) { @@ -287,12 +549,13 @@ Dictionary::isValidWordRec(int pos, unsigned short *word, int offset, int length if (c == currentChar) { if (offset == length - 1) { if (terminal) { - return true; + return (pos+1); } } else { if (childPos != 0) { - if (isValidWordRec(childPos, word, offset + 1, length)) { - return true; + int t = isValidWordRec(childPos, word, offset + 1, length); + if (t > 0) { + return t; } } } @@ -303,7 +566,7 @@ Dictionary::isValidWordRec(int pos, unsigned short *word, int offset, int length // There could be two instances of each alphabet - upper and lower case. So continue // looking ... } - return false; + return NOT_VALID_WORD; } diff --git a/native/src/dictionary.h b/native/src/dictionary.h index 3749f3d88..2c574290f 100644 --- a/native/src/dictionary.h +++ b/native/src/dictionary.h @@ -28,12 +28,19 @@ namespace latinime { // if the word has other endings. #define FLAG_TERMINAL_MASK 0x80 +#define FLAG_BIGRAM_READ 0x80 +#define FLAG_BIGRAM_CHILDEXIST 0x40 +#define FLAG_BIGRAM_CONTINUED 0x80 +#define FLAG_BIGRAM_FREQ 0x7F + 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 skipPos, int *nextLetters, int nextLettersSize); + int getBigrams(unsigned short *word, int length, unsigned short *outWords, int *frequencies, + int maxWordLength, int maxBigrams); bool isValidWord(unsigned short *word, int length); void setAsset(void *asset) { mAsset = asset; } void *getAsset() { return mAsset; } @@ -41,28 +48,40 @@ public: private: + void getVersionNumber(); + bool checkIfDictVersionIsLatest(); int getAddress(int *pos); + int getBigramAddress(int *pos, bool advance); + int getFreq(int *pos); + int getBigramFreq(int *pos); + void searchForTerminalNode(int address, int frequency); + + bool getFirstBitOfByte(int *pos) { return (mDict[*pos] & 0x80) > 0; } + bool getSecondBitOfByte(int *pos) { return (mDict[*pos] & 0x40) > 0; } bool getTerminal(int *pos) { return (mDict[*pos] & FLAG_TERMINAL_MASK) > 0; } - int getFreq(int *pos) { return mDict[(*pos)++] & 0xFF; } int getCount(int *pos) { return mDict[(*pos)++] & 0xFF; } unsigned short getChar(int *pos); int wideStrLen(unsigned short *str); bool sameAsTyped(unsigned short *word, int length); bool addWord(unsigned short *word, int length, int frequency); + bool addWordBigram(unsigned short *word, int length, int frequency); unsigned short toLowerCase(unsigned short c); void getWordsRec(int pos, int depth, int maxDepth, bool completion, int frequency, int inputIndex, int diffs); - bool isValidWordRec(int pos, unsigned short *word, int offset, int length); + int isValidWordRec(int pos, unsigned short *word, int offset, int length); void registerNextLetter(unsigned short c); unsigned char *mDict; void *mAsset; int *mFrequencies; + int *mBigramFreq; int mMaxWords; + int mMaxBigrams; int mMaxWordLength; unsigned short *mOutputChars; + unsigned short *mBigramChars; int *mInputCodes; int mInputLength; int mMaxAlternatives; @@ -74,6 +93,8 @@ private: int mTypedLetterMultiplier; int *mNextLettersFrequencies; int mNextLettersSize; + int mVersion; + int mBigram; }; // ---------------------------------------------------------------------------- diff --git a/tests/data/bigramlist.xml b/tests/data/bigramlist.xml new file mode 100644 index 000000000..dd3f2916e --- /dev/null +++ b/tests/data/bigramlist.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/wordlist.xml b/tests/data/wordlist.xml index 22d0caa38..b870eb2a3 100644 --- a/tests/data/wordlist.xml +++ b/tests/data/wordlist.xml @@ -225,6 +225,7 @@ services niño María + car hmmm hon tty diff --git a/tests/res/raw/test.dict b/tests/res/raw/test.dict index e789aaa9a66cd003e1282870a79fc12a8d731fdd..6a5d6d794f4a1f5c21f25ff97bfd89fe5a0f80f5 100644 GIT binary patch literal 2829 zcmXYzdyG}p6~^~I?{iR^*d}UQYeO|tt3_<9Z7rk=+hQvv(o{*51R3U@nYr9M_mcaV zVVcmM65CWv)%b{kno?5Q6q;Jw;W@+O$U_DY5D1Tok5NI?f(nX_)IfjhPX9SMd+)Wr zwZ65!z0Mi7pKXXKwTpeMD$ciy;tX_(dr6JW0lONzzx6WLql9!D*6w9CnLYRL$+J zXHB2jX+^OqVXF#?4oHGv$H7XR86d36+15I&kmTHm_ar-_hdUvCEIH1 zVz${d+hc4k+hus$Vw^^94!>zCxf$7FY@3*4ww`S^wv?Nbn+)&kjZ@EFH5D=EoDwHp zxixF_V2yE7v11ALX^?PfioL>iiM`5pXB+Vndp%ndINWG-|7P}A8>b-ld(~{nSXlhf z_N!@?{J@%FD`IC_n9XK?z}OzKb8&ypI3=<3%VHO>8YDSzY=3SaFvgZM9t|FGCAWk7 z;B1f8vqJ{!4;tBiGe;cTDbDA*#Q91Oer_TA$n=Q8huBJ*zaG z8!ZC)hOK0|i8^y<);a3!G)7D z9a_!;it{Xu%XR}WOdG{{gizZJM4TnMT*`7=EAk3#*BkO*WjtaIpEQl!xiDhtMD9c( z4q^9Gp2LvZ+9Gw#*2Ed1^v(%Q{T-$Ao@Vl)QvMhcD56c=unrq!u+O+vaj&e2+g22J zl2gl0z{wp)3WIc3+zF|;-?BZ~i&?Ot*&^a%d`GXicU8o_$JWKYlNwT~bTrk~#s{g{ zF7D!PasQs??th=7A>QXn*8O=|+{bNq?*3{-({&fo1NUM4*Qylu8c&(^6B_K5-J{wV z1>{1xM*uxh&30ljV4Mzd_W*YQT^`WrYm8ILo<~9M2rCk5igz8WueXag*A|8n8t8Zy_u=M_UC_ZdQz6nGxMYmL{Qd%rQJfk@T6F5cs|mU|CFy^cPpq_>z( zdB3OjT#Ax-e?bl2-#BHd55GV6UQo?>htk|Tf0VJ|-(3~|z7{@``j?`H~&i86#ol2_+J9Dr6~WaFz~;| z61`N!pJ==E_V zCGa#^6!8+a*}hlpt?Nu&XG+$$kmW zV;o##(>%DI`^musAw9fzsbS|5yn@CBR>Q3~d5Lql~*_$uuRkF%suZ4$og_Aug|O9~`^p)8S$Z)@CO z&6oUAN)la$^={+M%cC21nR*`Gk~4v#+gcZ~D$z|eL+R$xBpO$MFyFywYD1#C;Tuhd zFJrnW(Y0Kf{&7-{Slvl8PQhQhWh)(39ON z9YWDFJ$W>!lQ23!bEDOq=Bm1NW}ZY_Eis1Gbq_^>D7hTby_YP1Ca*zFM0=llY2?#8jD)Dl#bGIb%FG2Wqr^HV{l8M9WK}C6l zCG~5yr7rQ(R&W=nf8e}^KdT`i$)q$|9%Tk)3K;JN`DJ<@AEf8;QTDkZM15UhPwL|o zsq1Bx_o$B+NgZi5-$m=Z$>$^_x|bq=OY~S{Hc50@3A+gCg*uBKzdusL?U&0~2 fgvmQlMY!bnp>54$EH2oZjB)L0858kETxtFXLKju= literal 2562 zcmX9=eT-aH6@Ta6`@WK5QWI*@CRRl)h$v`5lp0Slp;|-`geW37otfR4&dhtwo7tUR z4dxmRNR1G+Adr-r7O6BMmD!ou+0WZ#{X)^4*~x@g<5DNB$FZD>P5sK2}ZF}wGk zd(Q9t&c{9XEw8YXPcbDi)5ScCVh4-iDoeMQO9kWc)g>-l<8rL+^li7UQDqwnrG)<2|H)O=Mt}1Ph(w!tXa|%ksd3vGe}we5+!;P z|M!ZDaVB4jjB{i!tzzd8mGvkUjB{)RtClG16A?S7L_v>s8s|R^2pb~H&igSt7hyk2 zT}+BPnL^6xVNqsU2FY?94O{6-Nb4fQbY-ju352hvUZ}--BFnUfBBr&35N?9BMkS_O zVYpuunC>Yu{REoygdMmI%K9|8Tt6eB7e&)MS>aCp!{ zyl$;e!+MX6;yfY$?^C2r&|$dIL^L~u=j|Ho=S8Z_~I7ekAthY%kF-J-9C5|8K|{Du}{Iz{R^H{%# zwh(ES8-Ws`m8RjaAtHSsVfj<6_fW;iUriBI9zx#a!<5nvsLE|H*s+S`PAE;m)fn<3 z|B6jZg1|5~`{7}lptctQOrpVuus&$B3_p$wu5V;nS-d=}D-u>;p)MoeK8`FM0`R*Q z@B;ugRm!NPPDR&YR%W$=5~DuWM0Wd;CiMvY6R5h{ zLcn~&>OKW5+ZSpl=qek(?RQnDPTa;Ss}YMjX8*KpYY-3*JPKdP3J!Rqun{&0Xx?8X+f^9>(PNvFJw+yFW(vIYDgPU(V*(eJ0E9Xo@}2 z#on?Cdn@zoeXWE{RHVL3-*Q;y=C2;vtzJ^thpZ|Yc&ZTA3+;q zuzwVgNGI}^W^V<|hXoEV2kC3z(Yp$r*aSuII_NY7UV|HZ{;#_Z0-&;Yn?1f0*xua; zzR!(~SDC`@X9)U9;5-Ms2D)Rms@t+^yoV-w*!yiad%pvxKC%}J+K*API8VK8w1K^+ zt>{^ZhL9=mg+*6q*c+r+@3JpM%-(EPw}HNZ2TA4Gzf>gbodBJAC{F=(NMW2t#(Q@t z!`^=j>^qAyDT_?vhb!t|Qf7ZCA|8Nt1Eb$xjxzWwv8&@@@h_JpeXyJT)kXHNhmF1e z4Rn{k7E${*L2XKHGX6c2W#eZ}#C~kAOw4`?DMn1jFZ3h1HM}K$Plf$oASVBQ#MDA< z{0D$mlPUK92#c{i2U13Q60UXte3XjDe|7+s@Lzz@AezE&qABdu?*o-Sj0FF1$@p`a zME=_-ls}6jgP!T%#Qv)U+y!g&CStCmKK?l?dXEtGMG&t+6a+Y{p<2PG+Hn8P6bI|F z9H6sT63GQ30Dn1Kx zR#XCuAOZCniWEEu&0R4EHGm$F1rD~r{_zeDo4n!QkLl9q}(;R+? I_hHxn0FARwX8-^I diff --git a/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java b/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java index 9401d926a..59720640a 100644 --- a/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java +++ b/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java @@ -71,7 +71,7 @@ public class SuggestTests extends AndroidTestCase { Log.w(TAG, "No available size for binary dictionary"); } mSuggest.setAutoTextEnabled(false); - mSuggest.setCorrectionMode(Suggest.CORRECTION_FULL); + mSuggest.setCorrectionMode(Suggest.CORRECTION_FULL_BIGRAM); } /************************** Helper functions ************************/ @@ -108,19 +108,56 @@ public class SuggestTests extends AndroidTestCase { private boolean isDefaultSuggestion(CharSequence typed, CharSequence expected) { WordComposer word = createWordComposer(typed); - List suggestions = mSuggest.getSuggestions(null, word, false); + List suggestions = mSuggest.getSuggestions(null, word, false, null); + return isDefaultSuggestion(suggestions, expected); + } + + private void getBigramSuggestions(CharSequence previous, CharSequence typed) { + if(!TextUtils.isEmpty(previous) && (typed.length() > 1)) { + WordComposer firstChar = createWordComposer(typed.charAt(0) + ""); + mSuggest.getSuggestions(null, firstChar, false, previous); + } + } + + private boolean isDefaultNextSuggestion(CharSequence previous, CharSequence typed, + CharSequence expected) { + WordComposer word = createWordComposer(typed); + getBigramSuggestions(previous, typed); + List suggestions = mSuggest.getSuggestions(null, word, false, previous); return isDefaultSuggestion(suggestions, expected); } private boolean isDefaultCorrection(CharSequence typed, CharSequence expected) { WordComposer word = createWordComposer(typed); - List suggestions = mSuggest.getSuggestions(null, word, false); + List suggestions = mSuggest.getSuggestions(null, word, false, null); + return isDefaultSuggestion(suggestions, expected) && mSuggest.hasMinimalCorrection(); + } + + private boolean isDefaultNextCorrection(CharSequence previous, CharSequence typed, + CharSequence expected) { + WordComposer word = createWordComposer(typed); + getBigramSuggestions(previous, typed); + List suggestions = mSuggest.getSuggestions(null, word, false, previous); + for(int i=0;i suggestions = mSuggest.getSuggestions(null, word, false); + List suggestions = mSuggest.getSuggestions(null, word, false, null); + for (int i = 1; i < suggestions.size(); i++) { + if (TextUtils.equals(suggestions.get(i), expected)) return true; + } + return false; + } + + private boolean isASuggestion(CharSequence previous, CharSequence typed, + CharSequence expected) { + WordComposer word = createWordComposer(typed); + getBigramSuggestions(previous, typed); + List suggestions = mSuggest.getSuggestions(null, word, false, previous); for (int i = 1; i < suggestions.size(); i++) { if (TextUtils.equals(suggestions.get(i), expected)) return true; } @@ -241,8 +278,30 @@ public class SuggestTests extends AndroidTestCase { * Are accented forms of words suggested as corrections? */ public void testAccents() { - assertTrue(isDefaultCorrection("nino", "ni\u00F1o")); // nio - assertTrue(isDefaultCorrection("nimo", "ni\u00F1o")); // nio - assertTrue(isDefaultCorrection("maria", "Mar\u00EDa")); // Mara + assertTrue(isDefaultCorrection("nino", "ni\u00F1o")); // niño + assertTrue(isDefaultCorrection("nimo", "ni\u00F1o")); // niño + assertTrue(isDefaultCorrection("maria", "Mar\u00EDa")); // María + } + + /** + * Make sure bigrams are showing when first character is typed + * and don't show any when there aren't any + */ + public void testBigramsAtFirstChar() { + assertTrue(isDefaultNextCorrection("about", "p", "part")); + assertTrue(isDefaultNextCorrection("I'm", "a", "about")); + assertTrue(isDefaultNextCorrection("about", "b", "business")); + assertTrue(isASuggestion("about", "b", "being")); + assertFalse(isDefaultNextSuggestion("about", "p", "business")); + } + + /** + * Make sure bigrams score affects the original score + */ + public void testBigramsScoreEffect() { + assertTrue(isDefaultCorrection("pa", "page")); + assertTrue(isDefaultNextCorrection("about", "pa", "part")); + assertTrue(isDefaultCorrection("sa", "said")); + assertTrue(isDefaultNextCorrection("from", "sa", "same")); } } From 2a118d844e0b7dd3e01f25e937b02b05711768a6 Mon Sep 17 00:00:00 2001 From: Ying Wang Date: Wed, 14 Jul 2010 17:32:12 -0700 Subject: [PATCH 100/159] Unbundle LatinIME Change-Id: I9f55377d5de050d18ee4a3b29bc43b19b0fababd --- java/Android.mk | 2 +- native/Android.mk | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/java/Android.mk b/java/Android.mk index 4bb8986ee..b6bbbf8e7 100755 --- a/java/Android.mk +++ b/java/Android.mk @@ -15,7 +15,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := android-common #LOCAL_AAPT_FLAGS := -0 .dict -LOCAL_SDK_VERSION := current +LOCAL_SDK_VERSION := 8 LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags diff --git a/native/Android.mk b/native/Android.mk index 0df74c702..b2944699c 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -8,8 +8,8 @@ LOCAL_SRC_FILES := \ src/dictionary.cpp \ src/char_utils.cpp -LOCAL_C_INCLUDES += \ - $(JNI_H_INCLUDE) +LOCAL_NDK_VERSION := 4 +LOCAL_SDK_VERSION := 8 LOCAL_MODULE := libjni_latinime From 7ff4da9489df0cc8fffce390a42510b4cfb86549 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 16 Jul 2010 17:38:25 +0900 Subject: [PATCH 101/159] Fix build failure by adding an input Change-Id: I0f8f7549423deb6d18df4cca949b210c9ec494a5 --- .../com/android/inputmethod/latin/BinaryDictionary.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index fad56c5d9..a1e9adf2e 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -92,7 +92,8 @@ public class BinaryDictionary extends Dictionary { mDicTypeId = dicTypeId; } - private native int openNative(ByteBuffer bb, int typedLetterMultiplier, int fullWordMultiplier); + private native int openNative(ByteBuffer bb, int typedLetterMultiplier, + int fullWordMultiplier); private native void closeNative(int dict); private native boolean isValidWordNative(int nativeData, char[] word, int wordLength); private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize, @@ -146,7 +147,7 @@ public class BinaryDictionary extends Dictionary { } if (len > 0) { callback.addWord(mOutputChars_bigrams, start, len, mFrequencies_bigrams[j], - DataType.BIGRAM); + mDicTypeId, DataType.BIGRAM); } } } @@ -196,7 +197,8 @@ public class BinaryDictionary extends Dictionary { len++; } if (len > 0) { - callback.addWord(mOutputChars, start, len, mFrequencies[j], mDicTypeId, DataType.UNIGRAM); + callback.addWord(mOutputChars, start, len, mFrequencies[j], mDicTypeId, + DataType.UNIGRAM); } } } From f73907ab5aeba9e45100282b4b3c40c5853c6e01 Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 16 Jul 2010 17:42:33 +0900 Subject: [PATCH 102/159] Change version to 0.21 Change-Id: I8e3792ba43293313baab0bb0d6bebba8c65df4b9 --- java/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 57708bff4..d14ca32e5 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionCode="21" + android:versionName="0.21"> From f336adc4bffa9c522a4d66077e1f4e71bda48b3b Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 16 Jul 2010 17:59:24 +0900 Subject: [PATCH 103/159] Comment out re-editing feature Change-Id: Ib4ffee3a00b8dae75e3472ccdfcb3765625ed4ed --- java/src/com/android/inputmethod/latin/LatinIME.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 2527c81fa..da5b38833 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -715,7 +715,8 @@ public class LatinIME extends InputMethodService // TODO: Uncomment this block when we enable re-editing feature // If a word is selected - /*if (isPredictionOn() && mJustRevertedSeparator == null + /* + if (isPredictionOn() && mJustRevertedSeparator == null && (candidatesStart == candidatesEnd || newSelStart != oldSelStart) && (newSelStart < newSelEnd - 1 || (!mPredicting)) && !mVoiceInputHighlighted) { @@ -724,7 +725,8 @@ public class LatinIME extends InputMethodService } else { abortCorrection(false); } - }*/ + } + */ } @Override From 30ce6f0530d125309da3fd28d24cc1f74419f74e Mon Sep 17 00:00:00 2001 From: Ying Wang Date: Fri, 16 Jul 2010 11:36:20 -0700 Subject: [PATCH 105/159] Fix sim build NDK does not support sim build. Change-Id: If3164399d72786c9445cd308376497b8ba76011c --- native/Android.mk | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/native/Android.mk b/native/Android.mk index b2944699c..6bad9d638 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -8,8 +8,13 @@ LOCAL_SRC_FILES := \ src/dictionary.cpp \ src/char_utils.cpp -LOCAL_NDK_VERSION := 4 -LOCAL_SDK_VERSION := 8 +# NDK does not support sim build. +ifneq ($(TARGET_SIMULATOR),true) + LOCAL_NDK_VERSION := 4 + LOCAL_SDK_VERSION := 8 +else + LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) +endif LOCAL_MODULE := libjni_latinime From 8b96a9a238875767a46400902006540cb54f8d9b Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Thu, 15 Jul 2010 16:02:31 -0700 Subject: [PATCH 106/159] Underlining for correction is causing problems with styled text. Disable for now. Disable until we find a cleaner solution to highlighting for correction (may need a framework change). Removed a check for VoiceInput.DELETE_SYMBOL, which is not in use any more. --- .../android/inputmethod/latin/LatinIME.java | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 51fb9d876..783805e2b 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -82,6 +82,7 @@ public class LatinIME extends InputMethodService static final boolean TRACE = false; static final boolean VOICE_INSTALLED = true; static final boolean ENABLE_VOICE_BUTTON = true; + private static final boolean MODIFY_TEXT_FOR_CORRECTION = false; private static final String PREF_VIBRATE_ON = "vibrate_on"; private static final String PREF_SOUND_ON = "sound_on"; @@ -1604,7 +1605,7 @@ public class LatinIME extends InputMethodService if (mBestWord != null && mBestWord.length() > 0) { TextEntryState.acceptedDefault(mWord.getTypedWord(), mBestWord); mJustAccepted = true; - pickSuggestion(mBestWord); + pickSuggestion(mBestWord, false); // Add the word to the auto dictionary if it's not a known word checkAddToDictionary(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED); } @@ -1650,7 +1651,7 @@ public class LatinIME extends InputMethodService return; } mJustAccepted = true; - pickSuggestion(suggestion); + pickSuggestion(suggestion, correcting); // Add the word to the auto dictionary if it's not a known word if (index == 0) { checkAddToDictionary(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED); @@ -1696,7 +1697,15 @@ public class LatinIME extends InputMethodService // TODO: implement rememberReplacedWord for typed words } - private void pickSuggestion(CharSequence suggestion) { + /** + * Commits the chosen word to the text field and saves it for later + * retrieval. + * @param suggestion the suggestion picked by the user to be committed to + * the text field + * @param correcting whether this is due to a correction of an existing + * word. + */ + private void pickSuggestion(CharSequence suggestion, boolean correcting) { if (mCapsLock) { suggestion = suggestion.toString().toUpperCase(); } else if (preferCapitalization() @@ -1707,9 +1716,17 @@ public class LatinIME extends InputMethodService InputConnection ic = getCurrentInputConnection(); if (ic != null) { rememberReplacedWord(suggestion); - if (!VoiceInput.DELETE_SYMBOL.equals(suggestion)) { - ic.commitText(suggestion, 1); + // If text is in correction mode and we're not using composing + // text to underline, then the word at the cursor position needs + // to be removed before committing the correction + if (correcting && !MODIFY_TEXT_FOR_CORRECTION) { + if (mLastSelectionStart < mLastSelectionEnd) { + ic.setSelection(mLastSelectionStart, mLastSelectionStart); + } + EditingUtil.deleteWordAtCursor(ic, getWordSeparators()); } + + ic.commitText(suggestion, 1); } saveWordInHistory(suggestion); mPredicting = false; @@ -1828,9 +1845,11 @@ public class LatinIME extends InputMethodService private void underlineWord(CharSequence word, int left, int right) { InputConnection ic = getCurrentInputConnection(); if (ic == null) return; - ic.finishComposingText(); - ic.deleteSurroundingText(left, right); - ic.setComposingText(word, 1); + if (MODIFY_TEXT_FOR_CORRECTION) { + ic.finishComposingText(); + ic.deleteSurroundingText(left, right); + ic.setComposingText(word, 1); + } ic.setSelection(mLastSelectionStart, mLastSelectionStart); } From cbd4592fe1f2bce822044099246709f7802d5aa8 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 16 Jul 2010 16:45:12 -0700 Subject: [PATCH 107/159] Add JNI_H_INCLUDE directory to LOCAL_C_INCLUDES to be able to build under source tree Change-Id: I06d1687fbd7f9d02c069d84a50c2b53950372733 --- native/Android.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/Android.mk b/native/Android.mk index 6492de6bb..10ffdbf2a 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -1,7 +1,7 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) -LOCAL_C_INCLUDES += $(LOCAL_PATH)/src +LOCAL_C_INCLUDES += $(LOCAL_PATH)/src $(JNI_H_INCLUDE) LOCAL_SRC_FILES := \ jni/com_android_inputmethod_latin_BinaryDictionary.cpp \ From 353c20a62ffe9b21b4efa9a6d3be2c1492e6ab83 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 16 Jul 2010 17:45:39 -0700 Subject: [PATCH 108/159] Slightly reluctant to scroll candidate strip to be able to easily choose the suggestion Also fixed the comment of mMinTouchableWidth Bug: 2581826 Change-Id: Idc79186b0647b0e7e7ec889488b019b7db5241ad --- .../android/inputmethod/latin/CandidateView.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java index ae45001b8..93966a86c 100755 --- a/java/src/com/android/inputmethod/latin/CandidateView.java +++ b/java/src/com/android/inputmethod/latin/CandidateView.java @@ -144,9 +144,13 @@ public class CandidateView extends View { mPaint.setStrokeWidth(0); mPaint.setTextAlign(Align.CENTER); mDescent = (int) mPaint.descent(); - // 80 pixels for a 160dpi device would mean half an inch + // 50 pixels for a 160dpi device would mean about 0.3 inch mMinTouchableWidth = (int) (getResources().getDisplayMetrics().density * 50); + // Slightly reluctant to scroll to be able to easily choose the suggestion + // 50 pixels for a 160dpi device would mean about 0.3 inch + final int touchSlop = (int) (getResources().getDisplayMetrics().density * 50); + final int touchSlopSquare = touchSlop * touchSlop; mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { @Override public void onLongPress(MotionEvent me) { @@ -160,6 +164,13 @@ public class CandidateView extends View { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + final int deltaX = (int) (e2.getX() - e1.getX()); + final int deltaY = (int) (e2.getY() - e1.getY()); + final int distance = (deltaX * deltaX) + (deltaY * deltaY); + if (distance < touchSlopSquare) { + return false; + } + final int width = getWidth(); mScrolled = true; int scrollX = getScrollX(); From e04cc8b826a8d77c62b4377beaa7ba8879f9551e Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 20 Jul 2010 14:17:34 +0900 Subject: [PATCH 109/159] Change the name of the application to Latin Keyboard Change-Id: I0ae02c61fae200672004028196d3e8d990b4c32c --- java/res/values-cs/strings.xml | 4 ++-- java/res/values-da/strings.xml | 4 ++-- java/res/values-de/strings.xml | 4 ++-- java/res/values-el/strings.xml | 4 ++-- java/res/values-es-rUS/strings.xml | 4 ++-- java/res/values-es/strings.xml | 4 ++-- java/res/values-fr-rCA/strings.xml | 2 +- java/res/values-fr/strings.xml | 4 ++-- java/res/values-it/strings.xml | 4 ++-- java/res/values-ja/strings.xml | 4 ++-- java/res/values-ko/strings.xml | 4 ++-- java/res/values-nb/strings.xml | 4 ++-- java/res/values-nl/strings.xml | 4 ++-- java/res/values-pl/strings.xml | 4 ++-- java/res/values-pt-rPT/strings.xml | 4 ++-- java/res/values-pt/strings.xml | 4 ++-- java/res/values-ru/strings.xml | 4 ++-- java/res/values-sv/strings.xml | 4 ++-- java/res/values-tr/strings.xml | 4 ++-- java/res/values-zh-rCN/strings.xml | 4 ++-- java/res/values-zh-rTW/strings.xml | 4 ++-- java/res/values/strings.xml | 4 ++-- 22 files changed, 43 insertions(+), 43 deletions(-) diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index e063c8a28..4bc1f5543 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -20,8 +20,8 @@ - "Klávesnice Android 2" - "Nastavení klávesnice Android 2" + "Klávesnice Android" + "Nastavení klávesnice Android" "Při stisku klávesy vibrovat" "Zvuk při stisku klávesy" "Opravovat překlepy" diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 09cb8c90c..750d67b20 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -20,8 +20,8 @@ - "Android-tastatur 2" - "Indstillinger for Android-tastatur 2" + "Android-tastatur" + "Indstillinger for Android-tastatur" "Vibration ved tastetryk" "Lyd ved tastetryk" "Ret stavefejl" diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index 02ed5a662..ed6408dde 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -20,8 +20,8 @@ - "Android-Tastatur 2" - "Android-Tastatur2einstellungen" + "Android-Tastatur" + "Android-Tastatureinstellungen" "Vibrieren b. Tastendruck" "Ton bei Tastendruck" "Eingabefehler korrigieren" diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index fbe705fd2..c4a50771a 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -20,8 +20,8 @@ - "Πληκτρολόγιο Android 2" - "Ρυθμίσεις πληκτρολογίου Android 2" + "Πληκτρολόγιο Android" + "Ρυθμίσεις πληκτρολογίου Android" "Δόνηση κατά το πάτημα πλήκτρων" "Ήχος κατά το πάτημα πλήκτρων" "Διόρθωση σφαλμάτων πληκτρολόγησης" diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 150ff7574..cd17dba31 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -20,8 +20,8 @@ - "Teclado de Android 2" - "Configuración de teclado de Android 2" + "Teclado de Android" + "Configuración de teclado de Android" "Vibrar al pulsar teclas" "Sonar al pulsar las teclas" "Corregir errores de escritura" diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 4ef3eac31..fbe3ad347 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -20,8 +20,8 @@ - "Teclado de Android 2" - "Ajustes del teclado de Android 2" + "Teclado de Android" + "Ajustes del teclado de Android" "Vibrar al pulsar tecla" "Sonido al pulsar tecla" "Corregir errores de escritura" diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml index e0d456d00..b56463ed9 100644 --- a/java/res/values-fr-rCA/strings.xml +++ b/java/res/values-fr-rCA/strings.xml @@ -15,5 +15,5 @@ --> - "Clavier Android 2" + "Clavier Android" diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index d4ec8789e..2cabe40d9 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -20,8 +20,8 @@ - "Clavier Android 2" - "Paramètres du clavier Android 2" + "Clavier Android" + "Paramètres du clavier Android" "Vibrer à chaque touche" "Son à chaque touche" "Corriger les fautes de frappe" diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 297ea5c03..8100175b3 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -20,8 +20,8 @@ - "Tastiera Android 2" - "Impostazioni tastiera Android 2" + "Tastiera Android" + "Impostazioni tastiera Android" "Vibrazione tasti" "Suono tasti" "Correggi errori di digitazione" diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index f77cb210c..7867684cb 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -20,8 +20,8 @@ - "Androidキーボード 2" - "Androidキーボード 2 の設定" + "Androidキーボード" + "Androidキーボードの設定" "キー操作バイブ" "キー操作音" "入力ミス補正" diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index 414a149bb..94d1ff4ef 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -20,8 +20,8 @@ - "Android 키보드 2" - "Android 키보드 2 설정" + "Android 키보드" + "Android 키보드 설정" "키를 누를 때 진동 발생" "키를 누를 때 소리 발생" "입력 오류 수정" diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 5c1bbf1c4..041d07eb3 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -20,8 +20,8 @@ - "Skjermtastatur 2" - "Innstillinger for skjermtastatur 2" + "Skjermtastatur" + "Innstillinger for skjermtastatur" "Vibrer ved tastetrykk" "Lyd ved tastetrykk" "Rett opp skrivefeil" diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index c5771c8b7..00b197bf1 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -20,8 +20,8 @@ - "Android-toetsenbord 2" - "Instellingen voor Android-toetsenbord 2" + "Android-toetsenbord" + "Instellingen voor Android-toetsenbord" "Trillen bij druk op toets" "Geluid bij druk op een toets" "Typefouten corrigeren" diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 561191d98..0c72727ce 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -20,8 +20,8 @@ - "Klawiatura Android 2" - "Ustawienia klawiatury Android 2" + "Klawiatura Android" + "Ustawienia klawiatury Android" "Wibracja przy naciśnięciu" "Dźwięk przy naciśnięciu" "Popraw błędy pisowni" diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 39007c130..35a9cb715 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -20,8 +20,8 @@ - "Teclado do Android 2" - "Definições de teclado do Android 2" + "Teclado do Android" + "Definições de teclado do Android" "Vibrar ao primir as teclas" "Som ao premir as teclas" "Corrigir erros de escrita" diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 38890d8ff..235fd65ac 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -20,8 +20,8 @@ - "Teclado Android 2" - "Configurações de teclado Android 2" + "Teclado Android" + "Configurações de teclado Android" "Vibrar ao tocar a tecla" "Som ao tocar a tecla" "Corrigir erros de digitação" diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index f1a8a1c0b..e27402c7f 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -20,8 +20,8 @@ - "Клавиатура Android 2" - "Настройки клавиатуры Android 2" + "Клавиатура Android" + "Настройки клавиатуры Android" "Виброотклик клавиш" "Звук клавиш" "Исправлять опечатки" diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 8970a05f7..9c6c22159 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -20,8 +20,8 @@ - "Androids tangentbord 2" - "Inställningar för Androids tangentbord 2" + "Androids tangentbord" + "Inställningar för Androids tangentbord" "Vibrera vid tangenttryck" "Knappljud" "Rätta skrivfel" diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 86d956971..0fbdc7da3 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -20,8 +20,8 @@ - "Android klavyesi 2" - "Android klavye 2 ayarları" + "Android klavyesi" + "Android klavye ayarları" "Tuşa basıldığında titret" "Tuşa basıldığında ses çıkar" "Yazım hatalarını düzelt" diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index b0a07817f..175ed6094 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -20,8 +20,8 @@ - "Android 键盘 2" - "Android 键盘 2 设置" + "Android 键盘" + "Android 键盘 设置" "按键时振动" "按键时播放音效" "纠正输入错误" diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 89b2eac9f..4f83be405 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -20,8 +20,8 @@ - "Android 鍵盤 2" - "Android 鍵盤 2 設定" + "Android 鍵盤" + "Android 鍵盤設定" "按鍵時震動" "按鍵時播放音效" "修正輸入錯誤" diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 6c7aa8324..e77155d50 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -19,9 +19,9 @@ --> - Android keyboard 2 + Android keyboard - Android keyboard 2 settings + Android keyboard settings Vibrate on keypress From 91d96f2a64ddb2853122746cb9ce3f6fa14eaf8b Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 20 Jul 2010 14:21:54 +0900 Subject: [PATCH 110/159] Add xlarge resources Change-Id: I8879322ed8573d57257faf15b66b8ae04101971f --- java/res/layout-xlarge/input.xml | 31 ++++++++++++++++++++++++++ java/res/layout-xlarge/input_trans.xml | 31 ++++++++++++++++++++++++++ java/res/values-xlarge/dimens.xml | 25 +++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 java/res/layout-xlarge/input.xml create mode 100755 java/res/layout-xlarge/input_trans.xml create mode 100644 java/res/values-xlarge/dimens.xml diff --git a/java/res/layout-xlarge/input.xml b/java/res/layout-xlarge/input.xml new file mode 100644 index 000000000..6b0bb12a6 --- /dev/null +++ b/java/res/layout-xlarge/input.xml @@ -0,0 +1,31 @@ + + + + diff --git a/java/res/layout-xlarge/input_trans.xml b/java/res/layout-xlarge/input_trans.xml new file mode 100755 index 000000000..1dfdc1555 --- /dev/null +++ b/java/res/layout-xlarge/input_trans.xml @@ -0,0 +1,31 @@ + + + + diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml new file mode 100644 index 000000000..433176274 --- /dev/null +++ b/java/res/values-xlarge/dimens.xml @@ -0,0 +1,25 @@ + + + + + 72dip + 46dip + 0dip + From debd74c67871e8ede5a1338a053da352e41243c8 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Tue, 20 Jul 2010 16:20:15 +0900 Subject: [PATCH 111/159] Prepare for master merge - Rename the jni library name - Revert the local cert - LatinIme2Google -> LatinIME Please note that we'll use the new package name: com.google.android.inputmethod.latin Change-Id: Ibbab07e8102ade5a93660c0723cd86f600c14a7d --- java/Android.mk | 9 +++++---- java/AndroidManifest.xml | 6 +----- .../com/android/inputmethod/latin/BinaryDictionary.java | 4 ++-- native/Android.mk | 8 +++----- tests/Android.mk | 4 ++-- 5 files changed, 13 insertions(+), 18 deletions(-) diff --git a/java/Android.mk b/java/Android.mk index 172f35a89..c89e1c6bb 100755 --- a/java/Android.mk +++ b/java/Android.mk @@ -5,17 +5,18 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) -LOCAL_PACKAGE_NAME := LatinIme2Google +LOCAL_PACKAGE_NAME := LatinIME -LOCAL_CERTIFICATE := vendor/google/certs/app +LOCAL_CERTIFICATE := shared -LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime2 +LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime LOCAL_STATIC_JAVA_LIBRARIES := android-common #LOCAL_AAPT_FLAGS := -0 .dict # The following flag is required because we use a different package name -# com.google.android.inputmethod.latin in the LatinIME sandbox. +# com.google.android.inputmethod.latin than Java package name +# com.android.inputmethod.latin LOCAL_AAPT_FLAGS := --custom-package com.android.inputmethod.latin LOCAL_SDK_VERSION := 8 diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index d14ca32e5..f87ce013b 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,9 +1,5 @@ - - + package="com.google.android.inputmethod.latin"> diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index a1e9adf2e..0a2af0662 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -53,9 +53,9 @@ public class BinaryDictionary extends Dictionary { static { try { - System.loadLibrary("jni_latinime2"); + System.loadLibrary("jni_latinime"); } catch (UnsatisfiedLinkError ule) { - Log.e("BinaryDictionary", "Could not load native library jni_latinime2"); + Log.e("BinaryDictionary", "Could not load native library jni_latinime"); } } diff --git a/native/Android.mk b/native/Android.mk index de4f7eb01..6bad9d638 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -1,7 +1,7 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) -LOCAL_C_INCLUDES += $(LOCAL_PATH)/src $(JNI_H_INCLUDE) +LOCAL_C_INCLUDES += $(LOCAL_PATH)/src LOCAL_SRC_FILES := \ jni/com_android_inputmethod_latin_BinaryDictionary.cpp \ @@ -16,10 +16,8 @@ else LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) endif -LOCAL_PRELINK_MODULE := false +LOCAL_MODULE := libjni_latinime -LOCAL_MODULE := libjni_latinime2 - -LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_TAGS := user include $(BUILD_SHARED_LIBRARY) diff --git a/tests/Android.mk b/tests/Android.mk index 60e82d5c2..fba7a8d74 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -10,8 +10,8 @@ LOCAL_JAVA_LIBRARIES := android.test.runner # Include all test java files. LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_PACKAGE_NAME := LatinIME2Tests +LOCAL_PACKAGE_NAME := LatinIMETests -LOCAL_INSTRUMENTATION_FOR := LatinIme2Google +LOCAL_INSTRUMENTATION_FOR := LatinIME include $(BUILD_PACKAGE) From 7df1c4e6c99c2b3d87e8f860978141948980bbc2 Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 20 Jul 2010 17:46:09 +0900 Subject: [PATCH 112/159] Change the default vaule of Log to be false Change-Id: I8a3c0ce81b67e27b7559b534b4ccde2ad0783dbc --- java/res/xml/prefs.xml | 2 +- java/src/com/android/inputmethod/latin/LatinImeLogger.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 12a1ed305..e4c689aa8 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -42,7 +42,7 @@ android:title="@string/prefs_enable_log" android:summary="@string/prefs_description_log" android:persistent="true" - android:defaultValue="true" + android:defaultValue="false" /> Date: Tue, 20 Jul 2010 20:19:21 +0900 Subject: [PATCH 113/159] Enable re-edit feature Change-Id: I4c6a9ddf3f3c4eb35076f4ed27e009462cfc2e9e --- java/src/com/android/inputmethod/latin/LatinIME.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 8d54572e2..f845577d7 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -716,7 +716,6 @@ public class LatinIME extends InputMethodService // TODO: Uncomment this block when we enable re-editing feature // If a word is selected - /* if (isPredictionOn() && mJustRevertedSeparator == null && (candidatesStart == candidatesEnd || newSelStart != oldSelStart) && (newSelStart < newSelEnd - 1 || (!mPredicting)) @@ -727,7 +726,6 @@ public class LatinIME extends InputMethodService abortCorrection(false); } } - */ } @Override From 096b87a4b4747bf9d6fd1e91bddea2723b24401d Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 20 Jul 2010 22:24:00 +0900 Subject: [PATCH 114/159] Fix a string for zh-rCN Change-Id: I63d9c5254188a84c92cb4ff34988ebb5a2a034ae --- java/res/values-zh-rCN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 175ed6094..9c9b25708 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -21,7 +21,7 @@ "Android 键盘" - "Android 键盘 设置" + "Android 键盘设置" "按键时振动" "按键时播放音效" "纠正输入错误" From 7c76990c0367ed8365a287f8ede7088edd4de18b Mon Sep 17 00:00:00 2001 From: Fredrik Roubert Date: Tue, 20 Jul 2010 17:26:22 +0200 Subject: [PATCH 115/159] Add Norwegian and Danish keyboard layouts. Change-Id: I77e4f6105b1f5d4569ad59e3d536941310cc6c0d --- java/res/xml-da/kbd_qwerty.xml | 213 +++++++++++++++++++++++++++++++++ java/res/xml-nb/kbd_qwerty.xml | 213 +++++++++++++++++++++++++++++++++ 2 files changed, 426 insertions(+) create mode 100644 java/res/xml-da/kbd_qwerty.xml create mode 100644 java/res/xml-nb/kbd_qwerty.xml diff --git a/java/res/xml-da/kbd_qwerty.xml b/java/res/xml-da/kbd_qwerty.xml new file mode 100644 index 000000000..472f8be55 --- /dev/null +++ b/java/res/xml-da/kbd_qwerty.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml new file mode 100644 index 000000000..554bb00eb --- /dev/null +++ b/java/res/xml-nb/kbd_qwerty.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 68df22eebc3274cd3615a1cf3545cecb3386cb8d Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 23 Jul 2010 01:01:53 +0900 Subject: [PATCH 116/159] Get rid of wrongly added "Don't translate" entries in values-sr/strings.xml Change-Id: I10437a119fac68ae3231ad923b2ce090f56847e6 --- java/res/values-sr/strings.xml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml index 64f5af1f1..f706ebc3d 100644 --- a/java/res/values-sr/strings.xml +++ b/java/res/values-sr/strings.xml @@ -93,13 +93,6 @@ Напредно - - 0 - - 1 - - 2 - @string/prediction_none @string/prediction_basic @@ -249,13 +242,6 @@ Искључен - - 0 - - 1 - - 2 - @string/voice_mode_main @string/voice_mode_symbols From 4bbb39d52c0ab105b803df7b13bc241757c2345b Mon Sep 17 00:00:00 2001 From: Ying Wang Date: Thu, 22 Jul 2010 17:27:14 -0700 Subject: [PATCH 117/159] Remove unncessary special handling for sim build Now JNI_H_INCLUDE is added to header search path by default for non-NDK build. Change-Id: If1a9a1fae3cea51de6f776edbf7a2982f3d92b65 --- native/Android.mk | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/native/Android.mk b/native/Android.mk index 6bad9d638..b2944699c 100644 --- a/native/Android.mk +++ b/native/Android.mk @@ -8,13 +8,8 @@ LOCAL_SRC_FILES := \ src/dictionary.cpp \ src/char_utils.cpp -# NDK does not support sim build. -ifneq ($(TARGET_SIMULATOR),true) - LOCAL_NDK_VERSION := 4 - LOCAL_SDK_VERSION := 8 -else - LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) -endif +LOCAL_NDK_VERSION := 4 +LOCAL_SDK_VERSION := 8 LOCAL_MODULE := libjni_latinime From ae1b71c6a8e0669dcdfef439a80ab72148a0cbb9 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Sat, 24 Jul 2010 10:15:57 +0900 Subject: [PATCH 118/159] Move Google's proprietary dictionaries for LatinIME to vendor/google/apps/LatinImeGoogle. bug: 2811749 Refer to https://android-git.corp.google.com/g/58621 Change-Id: I3721ad3b3a29673f1ddd32871b1575a45c7365ee --- java/Android.mk | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/java/Android.mk b/java/Android.mk index c89e1c6bb..0d5a93db0 100755 --- a/java/Android.mk +++ b/java/Android.mk @@ -23,4 +23,11 @@ LOCAL_SDK_VERSION := 8 LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags +# Define LOCAL_DICTIONARY_RESOURCE_DIR in order to overlay dictionaries. +# The overlay dictionary resource directory should have dictionary files such +# as raw-en/main.dict, raw-es/main.dict per locale. +ifneq ($(strip $(LOCAL_DICTIONARY_RESOURCE_DIR)),) +LOCAL_RESOURCE_DIR := $(LOCAL_DICTIONARY_RESOURCE_DIR) $(LOCAL_PATH)/res +endif + include $(BUILD_PACKAGE) From c97c326cb82edef3ec19c8b13709fd932fa08dac Mon Sep 17 00:00:00 2001 From: satok Date: Mon, 26 Jul 2010 14:10:06 +0900 Subject: [PATCH 119/159] Change the default value of keyTextSize for xlarge - rename ginger to stone Change-Id: I6968ed1b388e1f55ecb27a449ca49be77790f9cc --- ...> btn_keyboard_key_normal_off_stone.9.png} | Bin ...=> btn_keyboard_key_normal_on_stone.9.png} | Bin ...ng => btn_keyboard_key_normal_stone.9.png} | Bin ..._ginger.xml => btn_keyboard_key_stone.xml} | 10 ++--- java/res/layout-xlarge/input.xml | 31 ---------------- java/res/layout-xlarge/input_trans.xml | 31 ---------------- java/res/layout/input_stone_bold.xml | 3 +- java/res/layout/input_stone_normal.xml | 3 +- java/res/layout/input_stone_popup.xml | 5 +-- java/res/layout/keyboard_popup_keyboard.xml | 3 +- java/res/values-xlarge/styles.xml | 35 ++++++++++++++++++ 11 files changed, 45 insertions(+), 76 deletions(-) rename java/res/drawable/{btn_keyboard_key_normal_off_ginger.9.png => btn_keyboard_key_normal_off_stone.9.png} (100%) rename java/res/drawable/{btn_keyboard_key_normal_on_ginger.9.png => btn_keyboard_key_normal_on_stone.9.png} (100%) rename java/res/drawable/{btn_keyboard_key_normal_ginger.9.png => btn_keyboard_key_normal_stone.9.png} (100%) rename java/res/drawable/{btn_keyboard_key_ginger.xml => btn_keyboard_key_stone.xml} (92%) delete mode 100644 java/res/layout-xlarge/input.xml delete mode 100755 java/res/layout-xlarge/input_trans.xml create mode 100644 java/res/values-xlarge/styles.xml diff --git a/java/res/drawable/btn_keyboard_key_normal_off_ginger.9.png b/java/res/drawable/btn_keyboard_key_normal_off_stone.9.png similarity index 100% rename from java/res/drawable/btn_keyboard_key_normal_off_ginger.9.png rename to java/res/drawable/btn_keyboard_key_normal_off_stone.9.png diff --git a/java/res/drawable/btn_keyboard_key_normal_on_ginger.9.png b/java/res/drawable/btn_keyboard_key_normal_on_stone.9.png similarity index 100% rename from java/res/drawable/btn_keyboard_key_normal_on_ginger.9.png rename to java/res/drawable/btn_keyboard_key_normal_on_stone.9.png diff --git a/java/res/drawable/btn_keyboard_key_normal_ginger.9.png b/java/res/drawable/btn_keyboard_key_normal_stone.9.png similarity index 100% rename from java/res/drawable/btn_keyboard_key_normal_ginger.9.png rename to java/res/drawable/btn_keyboard_key_normal_stone.9.png diff --git a/java/res/drawable/btn_keyboard_key_ginger.xml b/java/res/drawable/btn_keyboard_key_stone.xml similarity index 92% rename from java/res/drawable/btn_keyboard_key_ginger.xml rename to java/res/drawable/btn_keyboard_key_stone.xml index 7477037b8..a6040a04e 100644 --- a/java/res/drawable/btn_keyboard_key_ginger.xml +++ b/java/res/drawable/btn_keyboard_key_stone.xml @@ -20,17 +20,17 @@ + android:drawable="@drawable/btn_keyboard_key_normal_on_stone" /> + android:drawable="@drawable/btn_keyboard_key_normal_off_stone" /> + android:drawable="@drawable/btn_keyboard_key_normal_on_stone" /> + android:drawable="@drawable/btn_keyboard_key_normal_off_stone" /> - + diff --git a/java/res/layout-xlarge/input.xml b/java/res/layout-xlarge/input.xml deleted file mode 100644 index 6b0bb12a6..000000000 --- a/java/res/layout-xlarge/input.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - diff --git a/java/res/layout-xlarge/input_trans.xml b/java/res/layout-xlarge/input_trans.xml deleted file mode 100755 index 1dfdc1555..000000000 --- a/java/res/layout-xlarge/input_trans.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - diff --git a/java/res/layout/input_stone_bold.xml b/java/res/layout/input_stone_bold.xml index 8cc082b5d..d6c03cc20 100755 --- a/java/res/layout/input_stone_bold.xml +++ b/java/res/layout/input_stone_bold.xml @@ -28,8 +28,7 @@ android:background="@drawable/keyboard_background" android:textStyle="bold" - latin:keyBackground="@drawable/btn_keyboard_key_ginger" - latin:keyTextSize="22dip" + latin:keyBackground="@drawable/btn_keyboard_key_stone" latin:keyTextColor="@color/latinkeyboard_key_color_black" latin:shadowColor="@color/latinkeyboard_key_color_white" latin:keyTextStyle="bold" diff --git a/java/res/layout/input_stone_normal.xml b/java/res/layout/input_stone_normal.xml index 51693502e..2c39bb137 100755 --- a/java/res/layout/input_stone_normal.xml +++ b/java/res/layout/input_stone_normal.xml @@ -27,8 +27,7 @@ android:layout_height="wrap_content" android:background="@drawable/keyboard_background" - latin:keyBackground="@drawable/btn_keyboard_key_ginger" - latin:keyTextSize="22dip" + latin:keyBackground="@drawable/btn_keyboard_key_stone" latin:keyTextColor="@color/latinkeyboard_key_color_black" latin:shadowColor="@color/latinkeyboard_key_color_white" latin:symbolColorScheme="black" diff --git a/java/res/layout/input_stone_popup.xml b/java/res/layout/input_stone_popup.xml index e6eae5dad..b6894b6e0 100755 --- a/java/res/layout/input_stone_popup.xml +++ b/java/res/layout/input_stone_popup.xml @@ -33,10 +33,9 @@ android:layout_height="wrap_content" android:background="@drawable/keyboard_background" - latin:keyBackground="@drawable/btn_keyboard_key_ginger" + latin:keyBackground="@drawable/btn_keyboard_key_stone" latin:keyTextColor="@color/latinkeyboard_key_color_black" latin:shadowColor="@color/latinkeyboard_key_color_white" - latin:keyTextSize="22dip" latin:popupLayout="@layout/input_stone_popup" /> - \ No newline at end of file + diff --git a/java/res/layout/keyboard_popup_keyboard.xml b/java/res/layout/keyboard_popup_keyboard.xml index e6b3a411f..5f8a03d46 100644 --- a/java/res/layout/keyboard_popup_keyboard.xml +++ b/java/res/layout/keyboard_popup_keyboard.xml @@ -33,7 +33,6 @@ android:background="@android:color/transparent" latin:keyPreviewLayout="@layout/keyboard_key_preview" - latin:keyTextSize="22sp" latin:popupLayout="@layout/keyboard_popup_keyboard" /> - \ No newline at end of file + diff --git a/java/res/values-xlarge/styles.xml b/java/res/values-xlarge/styles.xml new file mode 100644 index 000000000..1772da3b7 --- /dev/null +++ b/java/res/values-xlarge/styles.xml @@ -0,0 +1,35 @@ + + + + + + From 262748c8dae5aa258f9a5c0c2594c9eb0cf4c277 Mon Sep 17 00:00:00 2001 From: Maryam Garrett Date: Wed, 21 Jul 2010 11:19:05 -0400 Subject: [PATCH 120/159] Read the alternatives from the server-side This change will parse the voice-search word-based alternatives from the bundle returned by the server, rather than generating them on the client. Change-Id: I7d7abc224de3ab8f37eca18632a427d39fd61a78 --- .../android/inputmethod/voice/VoiceInput.java | 74 ++++++++++++++----- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/java/src/com/android/inputmethod/voice/VoiceInput.java b/java/src/com/android/inputmethod/voice/VoiceInput.java index 354670969..f24c180d0 100644 --- a/java/src/com/android/inputmethod/voice/VoiceInput.java +++ b/java/src/com/android/inputmethod/voice/VoiceInput.java @@ -25,6 +25,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.os.Parcelable; import android.speech.RecognitionListener; import android.speech.SpeechRecognizer; import android.speech.RecognizerIntent; @@ -52,6 +53,8 @@ public class VoiceInput implements OnClickListener { private static final String EXTRA_RECOGNITION_CONTEXT = "android.speech.extras.RECOGNITION_CONTEXT"; private static final String EXTRA_CALLING_PACKAGE = "calling_package"; + private static final String EXTRA_ALTERNATES = "android.speech.extra.ALTERNATES"; + private static final int MAX_ALT_LIST_LENGTH = 6; private static final String DEFAULT_RECOMMENDED_PACKAGES = "com.android.mms " + @@ -73,6 +76,25 @@ public class VoiceInput implements OnClickListener { private VoiceInputLogger mLogger; + // Names of a few extras defined in VoiceSearch's RecognitionController + // Note, the version of voicesearch that shipped in Froyo returns the raw + // RecognitionClientAlternates protocol buffer under the key "alternates", + // so a VS market update must be installed on Froyo devices in order to see + // alternatives. + private static final String ALTERNATES_BUNDLE = "alternates_bundle"; + + // This is copied from the VoiceSearch app. + private static final class AlternatesBundleKeys { + public static final String ALTERNATES = "alternates"; + public static final String CONFIDENCE = "confidence"; + public static final String LENGTH = "length"; + public static final String MAX_SPAN_LENGTH = "max_span_length"; + public static final String SPANS = "spans"; + public static final String SPAN_KEY_DELIMITER = ":"; + public static final String START = "start"; + public static final String TEXT = "text"; + } + // Names of a few intent extras defined in VoiceSearch's RecognitionService. // These let us tweak the endpointer parameters. private static final String EXTRA_SPEECH_MINIMUM_LENGTH_MILLIS = @@ -304,12 +326,12 @@ public class VoiceInput implements OnClickListener { intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, ""); intent.putExtra(EXTRA_RECOGNITION_CONTEXT, context.getBundle()); intent.putExtra(EXTRA_CALLING_PACKAGE, "VoiceIME"); + intent.putExtra(EXTRA_ALTERNATES, true); intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, SettingsUtil.getSettingsInt( mContext.getContentResolver(), SettingsUtil.LATIN_IME_MAX_VOICE_RESULTS, - 10)); - + 1)); // Get endpointer params from Gservices. // TODO: Consider caching these values for improved performance on slower devices. final ContentResolver cr = mContext.getContentResolver(); @@ -563,26 +585,42 @@ public class VoiceInput implements OnClickListener { public void onResults(Bundle resultsBundle) { List results = resultsBundle .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); + // VS Market update is needed for IME froyo clients to access the alternatesBundle + // TODO: verify this. + Bundle alternatesBundle = resultsBundle.getBundle(ALTERNATES_BUNDLE); mState = DEFAULT; final Map> alternatives = - new HashMap>(); - if (results.size() >= 2 && ENABLE_WORD_CORRECTIONS) { - final String[][] words = new String[results.size()][]; - for (int i = 0; i < words.length; i++) { - words[i] = results.get(i).split(" "); - } + new HashMap>(); - for (int key = 0; key < words[0].length; key++) { - alternatives.put(words[0][key], new ArrayList()); - for (int alt = 1; alt < words.length; alt++) { - int keyBegin = key * words[alt].length / words[0].length; - int keyEnd = (key + 1) * words[alt].length / words[0].length; - - for (int i = keyBegin; i < Math.min(words[alt].length, keyEnd); i++) { - List altList = alternatives.get(words[0][key]); - if (!altList.contains(words[alt][i]) && altList.size() < 6) { - altList.add(words[alt][i]); + if (ENABLE_WORD_CORRECTIONS && alternatesBundle != null && results.size() > 0) { + // Use the top recognition result to map each alternative's start:length to a word. + String[] words = results.get(0).split(" "); + Bundle spansBundle = alternatesBundle.getBundle(AlternatesBundleKeys.SPANS); + for (String key : spansBundle.keySet()) { + // Get the word for which these alternates correspond to. + Bundle spanBundle = spansBundle.getBundle(key); + int start = spanBundle.getInt(AlternatesBundleKeys.START); + int length = spanBundle.getInt(AlternatesBundleKeys.LENGTH); + // Only keep single-word based alternatives. + if (length == 1 && start < words.length) { + // Get the alternatives associated with the span. + // If a word appears twice in a recognition result, + // concatenate the alternatives for the word. + List altList = alternatives.get(words[start]); + if (altList == null) { + altList = new ArrayList(); + alternatives.put(words[start], altList); + } + Parcelable[] alternatesArr = spanBundle + .getParcelableArray(AlternatesBundleKeys.ALTERNATES); + for (int j = 0; j < alternatesArr.length && + altList.size() < MAX_ALT_LIST_LENGTH; j++) { + Bundle alternateBundle = (Bundle) alternatesArr[j]; + String alternate = alternateBundle.getString(AlternatesBundleKeys.TEXT); + // Don't allow duplicates in the alternates list. + if (!altList.contains(alternate)) { + altList.add(alternate); } } } From 999368ef0c6eb55ab65f288401a35011b73126f3 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Mon, 26 Jul 2010 16:31:38 -0700 Subject: [PATCH 121/159] Updating keyboard ids must happen everytime makeKeyboards() is called In makeKeyboards(), there is a fall through pass in which the keyboards' id (mSymbolsId and mSymbolsShiftedId) will not be updated. Then in toggleShift(), current keyboard id (mCurrentId) will not match any of two and nothing happens. Bug: 2825858 Change-Id: Iaf8a7368f513b35cf77a67794ecd3e21aa08484b --- .../com/android/inputmethod/latin/KeyboardSwitcher.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index bbde23221..95068e6cb 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -129,6 +129,9 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } void makeKeyboards(boolean forceCreate) { + mSymbolsId = makeSymbolsId(mHasVoice && !mVoiceOnPrimary); + mSymbolsShiftedId = makeSymbolsShiftedId(mHasVoice && !mVoiceOnPrimary); + 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 @@ -137,8 +140,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha if (displayWidth == mLastDisplayWidth) return; mLastDisplayWidth = displayWidth; if (!forceCreate) mKeyboards.clear(); - mSymbolsId = makeSymbolsId(mHasVoice && !mVoiceOnPrimary); - mSymbolsShiftedId = makeSymbolsShiftedId(mHasVoice && !mVoiceOnPrimary); } /** @@ -338,7 +339,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha LatinKeyboard symbolsShiftedKeyboard = getKeyboard(mSymbolsShiftedId); symbolsShiftedKeyboard.setShifted(false); mCurrentId = mSymbolsId; - mInputView.setKeyboard(getKeyboard(mSymbolsId)); + mInputView.setKeyboard(symbolsKeyboard); symbolsKeyboard.setShifted(false); symbolsKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions); } From bd0f31f49262855b26bad7b9358cb13cfc3c7957 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Sun, 25 Jul 2010 22:44:24 -0700 Subject: [PATCH 122/159] Refactor UI message handling class to be more readable This is the first one of three changes to fix the bug#2868304. Bug: 2868304 Change-Id: I2eb31c0966b2a7695e19aed7fceb13dad0c5bf0d --- .../latin/LatinKeyboardBaseView.java | 113 +++++++++++------- 1 file changed, 73 insertions(+), 40 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 4205aadcf..0a3e4a7c7 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -171,11 +171,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener /** Listener for {@link OnKeyboardActionListener}. */ private OnKeyboardActionListener mKeyboardActionListener; - private static final int MSG_SHOW_PREVIEW = 1; - private static final int MSG_REMOVE_PREVIEW = 2; - private static final int MSG_REPEAT = 3; - private static final int MSG_LONGPRESS = 4; - private static final int DELAY_BEFORE_PREVIEW = 0; private static final int DELAY_AFTER_PREVIEW = 70; private static final int DEBOUNCE_TIME = 70; @@ -258,27 +253,79 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener /** The canvas for the above mutable keyboard bitmap */ private Canvas mCanvas; - Handler mHandler = new Handler() { + UIHandler mHandler = new UIHandler(); + + class UIHandler extends Handler { + private static final int MSG_POPUP_PREVIEW = 1; + private static final int MSG_DISMISS_PREVIEW = 2; + private static final int MSG_REPEAT_KEY = 3; + private static final int MSG_LOGPRESS_KEY = 4; + @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_SHOW_PREVIEW: + case MSG_POPUP_PREVIEW: showKey(msg.arg1); break; - case MSG_REMOVE_PREVIEW: + case MSG_DISMISS_PREVIEW: mPreviewText.setVisibility(INVISIBLE); break; - case MSG_REPEAT: + case MSG_REPEAT_KEY: if (repeatKey()) { - Message repeat = Message.obtain(this, MSG_REPEAT); - sendMessageDelayed(repeat, REPEAT_INTERVAL); + startKeyRepeatTimer(REPEAT_INTERVAL); } break; - case MSG_LONGPRESS: + case MSG_LOGPRESS_KEY: openPopupIfRequired((MotionEvent) msg.obj); break; } } + + public void popupPreview(int keyIndex, long delay) { + sendMessageDelayed(obtainMessage(MSG_POPUP_PREVIEW, keyIndex, 0), delay); + } + + public void cancelPopupPreview() { + removeMessages(MSG_POPUP_PREVIEW); + } + + public void dismissPreview(long delay) { + sendMessageDelayed(obtainMessage(MSG_DISMISS_PREVIEW), delay); + } + + public void cancelDismissPreview() { + removeMessages(MSG_DISMISS_PREVIEW); + } + + public void startKeyRepeatTimer(long delay) { + sendMessageDelayed(obtainMessage(MSG_REPEAT_KEY), delay); + } + + public void startLongPressTimer(MotionEvent me, long delay) { + sendMessageDelayed(obtainMessage(MSG_LOGPRESS_KEY, me), delay); + } + + public void cancelLongPressTimer() { + removeMessages(MSG_LOGPRESS_KEY); + } + + public void cancelKeyTimers() { + removeMessages(MSG_REPEAT_KEY); + removeMessages(MSG_LOGPRESS_KEY); + } + + public void cancelKeyTimersAndPopupPreview() { + removeMessages(MSG_REPEAT_KEY); + removeMessages(MSG_LOGPRESS_KEY); + removeMessages(MSG_POPUP_PREVIEW); + } + + public void cancelAllMessages() { + removeMessages(MSG_REPEAT_KEY); + removeMessages(MSG_LOGPRESS_KEY); + removeMessages(MSG_POPUP_PREVIEW); + removeMessages(MSG_DISMISS_PREVIEW); + } }; public LatinKeyboardBaseView(Context context, AttributeSet attrs) { @@ -475,8 +522,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener if (mKeyboard != null) { showPreview(NOT_A_KEY); } - // Remove any pending messages - removeMessages(); + // Remove any pending messages, except dismissing preview + mHandler.cancelKeyTimersAndPopupPreview(); mKeyboard = keyboard; List keys = mKeyboard.getKeys(); mKeys = keys.toArray(new Key[keys.size()]); @@ -885,12 +932,10 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener } // If key changed and preview is on ... if (oldKeyIndex != mCurrentKeyIndex && mShowPreview) { - mHandler.removeMessages(MSG_SHOW_PREVIEW); + mHandler.cancelPopupPreview(); if (previewPopup.isShowing()) { if (keyIndex == NOT_A_KEY) { - mHandler.sendMessageDelayed(mHandler - .obtainMessage(MSG_REMOVE_PREVIEW), - DELAY_AFTER_PREVIEW); + mHandler.dismissPreview(DELAY_AFTER_PREVIEW); } } if (keyIndex != NOT_A_KEY) { @@ -898,9 +943,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener // Show right away, if it's already visible and finger is moving around showKey(keyIndex); } else { - mHandler.sendMessageDelayed( - mHandler.obtainMessage(MSG_SHOW_PREVIEW, keyIndex, 0), - DELAY_BEFORE_PREVIEW); + mHandler.popupPreview(keyIndex, DELAY_BEFORE_PREVIEW); } } } @@ -944,7 +987,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mPopupPreviewX = 160 - mPreviewText.getMeasuredWidth() / 2; mPopupPreviewY = - mPreviewText.getMeasuredHeight(); } - mHandler.removeMessages(MSG_REMOVE_PREVIEW); + mHandler.cancelDismissPreview(); if (mOffsetInWindow == null) { mOffsetInWindow = new int[2]; getLocationInWindow(mOffsetInWindow); @@ -1190,8 +1233,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener if (mGestureDetector.onTouchEvent(me)) { showPreview(NOT_A_KEY); - mHandler.removeMessages(MSG_REPEAT); - mHandler.removeMessages(MSG_LONGPRESS); + mHandler.cancelKeyTimers(); return true; } @@ -1220,8 +1262,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mKeys[keyIndex].codes[0] : 0); if (mCurrentKey >= 0 && mKeys[mCurrentKey].repeatable) { mRepeatKeyIndex = mCurrentKey; - Message msg = mHandler.obtainMessage(MSG_REPEAT); - mHandler.sendMessageDelayed(msg, REPEAT_START_DELAY); + mHandler.startKeyRepeatTimer(REPEAT_START_DELAY); repeatKey(); // Delivering the key could have caused an abort if (mAbortKey) { @@ -1230,8 +1271,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener } } if (mCurrentKey != NOT_A_KEY) { - Message msg = mHandler.obtainMessage(MSG_LONGPRESS, me); - mHandler.sendMessageDelayed(msg, LONGPRESS_TIMEOUT); + mHandler.startLongPressTimer(me, LONGPRESS_TIMEOUT); } showPreview(keyIndex); break; @@ -1261,11 +1301,10 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener } if (!continueLongPress) { // Cancel old longpress - mHandler.removeMessages(MSG_LONGPRESS); + mHandler.cancelLongPressTimer(); // Start new longpress if key has changed if (keyIndex != NOT_A_KEY) { - Message msg = mHandler.obtainMessage(MSG_LONGPRESS, me); - mHandler.sendMessageDelayed(msg, LONGPRESS_TIMEOUT); + mHandler.startLongPressTimer(me, LONGPRESS_TIMEOUT); } } showPreview(mCurrentKey); @@ -1273,7 +1312,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener break; case MotionEvent.ACTION_UP: - removeMessages(); + mHandler.cancelKeyTimersAndPopupPreview(); if (keyIndex == mCurrentKey) { mCurrentKeyTime += eventTime - mLastMoveTime; } else { @@ -1299,7 +1338,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mRepeatKeyIndex = NOT_A_KEY; break; case MotionEvent.ACTION_CANCEL: - removeMessages(); + mHandler.cancelKeyTimersAndPopupPreview(); dismissPopupKeyboard(); mAbortKey = true; showPreview(NOT_A_KEY); @@ -1337,7 +1376,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener if (mPreviewPopup.isShowing()) { mPreviewPopup.dismiss(); } - removeMessages(); + mHandler.cancelAllMessages(); dismissPopupKeyboard(); mBuffer = null; @@ -1345,12 +1384,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mMiniKeyboardCache.clear(); } - private void removeMessages() { - mHandler.removeMessages(MSG_REPEAT); - mHandler.removeMessages(MSG_LONGPRESS); - mHandler.removeMessages(MSG_SHOW_PREVIEW); - } - @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); From 6591321cc1ac448ee6fe98456945c10d8cf3e641 Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 27 Jul 2010 16:04:54 +0900 Subject: [PATCH 123/159] Remove values-xlarge/styles.xml and added key_text_size to dimens.xml Change-Id: I5b23950447742f70e7ca6dca21e8afaed28d30ec --- java/res/values-xlarge/dimens.xml | 1 + java/res/values-xlarge/styles.xml | 35 ------------------------------- java/res/values/dimens.xml | 3 ++- java/res/values/styles.xml | 2 +- 4 files changed, 4 insertions(+), 37 deletions(-) delete mode 100644 java/res/values-xlarge/styles.xml diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml index 433176274..c8234881b 100644 --- a/java/res/values-xlarge/dimens.xml +++ b/java/res/values-xlarge/dimens.xml @@ -22,4 +22,5 @@ 72dip 46dip 0dip + 32sp diff --git a/java/res/values-xlarge/styles.xml b/java/res/values-xlarge/styles.xml deleted file mode 100644 index 1772da3b7..000000000 --- a/java/res/values-xlarge/styles.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index f057c16a7..81ae64e5f 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -26,4 +26,5 @@ 2.5in - \ No newline at end of file + 22sp + diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index 143355033..24fee02d8 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -19,7 +19,7 @@ @drawable/keyboard_background @drawable/btn_keyboard_key - 22sp + @dimen/key_text_size #FFFFFFFF @layout/keyboard_key_preview -12dip From d5276e4a726240d72cf860f2567543db0f4931fb Mon Sep 17 00:00:00 2001 From: satok Date: Fri, 23 Jul 2010 18:56:42 +0900 Subject: [PATCH 124/159] Add a logging code to send Bigram data - with some cleanups Change-Id: I737c9ee7f148f94e6299d6e962dda82701454759 --- .../android/inputmethod/latin/LatinIME.java | 20 +-- .../inputmethod/latin/LatinImeLogger.java | 141 ++++++++++++++---- .../android/inputmethod/latin/Suggest.java | 15 +- .../inputmethod/latin/TextEntryState.java | 17 +-- 4 files changed, 125 insertions(+), 68 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index f845577d7..f5d13ac05 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -178,7 +178,6 @@ public class LatinIME extends InputMethodService private boolean mAfterVoiceInput; private boolean mImmediatelyAfterVoiceInput; private boolean mShowingVoiceSuggestions; - private boolean mImmediatelyAfterVoiceSuggestions; private boolean mVoiceInputHighlighted; private boolean mEnableVoiceButton; private CharSequence mBestWord; @@ -200,7 +199,6 @@ public class LatinIME extends InputMethodService private boolean mHasUsedVoiceInputUnsupportedLocale; private boolean mLocaleSupportedForVoiceInput; private boolean mShowSuggestions; - private boolean mSuggestionShouldReplaceCurrentWord; private boolean mIsShowingHint; private int mCorrectionMode; private boolean mEnableVoice = true; @@ -526,7 +524,6 @@ public class LatinIME extends InputMethodService mAfterVoiceInput = false; mImmediatelyAfterVoiceInput = false; mShowingVoiceSuggestions = false; - mImmediatelyAfterVoiceSuggestions = false; mVoiceInputHighlighted = false; mInputTypeNoAutoCorrect = false; mPredictionOn = false; @@ -680,7 +677,6 @@ public class LatinIME extends InputMethodService mVoiceInput.setSelectionSpan(newSelEnd - newSelStart); } - mSuggestionShouldReplaceCurrentWord = false; // If the current selection in the text view changes, we should // clear whatever candidate text we have. if ((((mComposing.length() > 0 && mPredicting) || mVoiceInputHighlighted) @@ -1533,10 +1529,6 @@ public class LatinIME extends InputMethodService if (ic != null) ic.endBatchEdit(); - // Show N-Best alternates, if there is more than one choice. - if (nBest.size() > 1) { - mImmediatelyAfterVoiceSuggestions = true; - } mVoiceInputHighlighted = true; mWordToSuggestions.putAll(mVoiceResults.alternatives); @@ -1561,8 +1553,6 @@ public class LatinIME extends InputMethodService } private void updateSuggestions() { - mSuggestionShouldReplaceCurrentWord = false; - LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null); @@ -1579,7 +1569,8 @@ public class LatinIME extends InputMethodService } private List getTypedSuggestions(WordComposer word) { - List stringList = mSuggest.getSuggestions(mKeyboardSwitcher.getInputView(), word, false, null); + List stringList = mSuggest.getSuggestions( + mKeyboardSwitcher.getInputView(), word, false, null); return stringList; } @@ -1593,8 +1584,8 @@ public class LatinIME extends InputMethodService //long startTime = System.currentTimeMillis(); // TIME MEASUREMENT! // TODO Maybe need better way of retrieving previous word CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection()); - List stringList = mSuggest.getSuggestions(mKeyboardSwitcher.getInputView(), word, false, - prevWord); + List stringList = mSuggest.getSuggestions( + mKeyboardSwitcher.getInputView(), word, false, prevWord); //long stopTime = System.currentTimeMillis(); // TIME MEASUREMENT! //Log.d("LatinIME","Suggest Total Time - " + (stopTime - startTime)); @@ -1726,7 +1717,6 @@ public class LatinIME extends InputMethodService private void rememberReplacedWord(CharSequence suggestion) { if (mShowingVoiceSuggestions) { // Retain the replaced word in the alternatives array. - InputConnection ic = getCurrentInputConnection(); EditingUtil.Range range = new EditingUtil.Range(); String wordToBeReplaced = EditingUtil.getWordAtCursor(getCurrentInputConnection(), mWordSeparators, range); @@ -1816,7 +1806,6 @@ public class LatinIME extends InputMethodService } if (mWordToSuggestions.containsKey(selectedWord)){ mShowingVoiceSuggestions = true; - mSuggestionShouldReplaceCurrentWord = true; underlineWord(touching, range.charsBefore, range.charsAfter); List suggestions = mWordToSuggestions.get(selectedWord); // If the first letter of touching is capitalized, make all the suggestions @@ -1856,7 +1845,6 @@ public class LatinIME extends InputMethodService } // Found a match, show suggestions if (foundWord != null || alternatives != null) { - mSuggestionShouldReplaceCurrentWord = true; underlineWord(touching, range.charsBefore, range.charsAfter); TextEntryState.selectedForCorrection(); if (alternatives == null) alternatives = new TypedWordAlternatives(touching, diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 967fbbb9f..19eead0a0 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -16,6 +16,8 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.latin.Dictionary.DataType; + import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageInfo; @@ -26,6 +28,7 @@ import android.preference.PreferenceManager; import android.text.TextUtils; import android.text.format.DateUtils; import android.util.Log; +import android.util.Pair; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -39,7 +42,7 @@ import java.util.List; public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "LatinIMELogs"; public static boolean sDBG = false; - private static boolean sLOGPRINT = false; + private static boolean sPRINTLOGGING = false; // SUPPRESS_EXCEPTION should be true when released to public. private static final boolean SUPPRESS_EXCEPTION = true; // DEFAULT_LOG_ENABLED should be false when released to public. @@ -52,7 +55,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final char NULL_CHAR = '\uFFFC'; private static final int EXCEPTION_MAX_LENGTH = 400; - private static final int ID_MANUALSUGGESTION = 0; + // ID_MANUALSUGGESTION has been replaced by ID_MANUALSUGGESTION_WITH_DATATYPE + // private static final int ID_MANUALSUGGESTION = 0; private static final int ID_AUTOSUGGESTIONCANCELLED = 1; private static final int ID_AUTOSUGGESTION = 2; private static final int ID_INPUT_COUNT = 3; @@ -67,6 +71,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang private static final int ID_AUTOSUGGESTIONCANCELLEDCOUNT = 12; private static final int ID_AUTOSUGGESTIONCOUNT = 13; private static final int ID_LANGUAGES = 14; + private static final int ID_MANUALSUGGESTION_WITH_DATATYPE = 15; private static final String PREF_ENABLE_LOG = "enable_logging"; private static final String PREF_DEBUG_MODE = "debug_mode"; @@ -79,8 +84,13 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang /* package */ static String sLastAutoSuggestBefore; /* package */ static String sLastAutoSuggestAfter; /* package */ static String sLastAutoSuggestSeparator; + // This value holds MAIN, USER, AUTO, etc... private static int sLastAutoSuggestDicTypeId; - private static HashMap sSuggestDicMap = new HashMap(); + // This value holds 0 (= unigram), 1 (= bigram) etc... + private static int sLastAutoSuggestDataType; + private static HashMap> sSuggestDicMap + = new HashMap>(); + private static String[] sPreviousWords; private static DebugKeyEnabler sDebugKeyEnabler = new DebugKeyEnabler(); private ArrayList mLogBuffer = null; @@ -139,7 +149,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } @Override protected Void doInBackground(Void... params) { - if (sLOGPRINT) { + if (sPRINTLOGGING) { Log.d(TAG, "Commit log: " + mData); } mDropBox.addText(TAG, mData); @@ -173,8 +183,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang KeyboardSwitcher.DEFAULT_LAYOUT_ID); mSelectedLanguages = prefs.getString(LatinIME.PREF_SELECTED_LANGUAGES, ""); mCurrentLanguage = prefs.getString(LatinIME.PREF_INPUT_LANGUAGE, ""); - sLOGPRINT = prefs.getBoolean(PREF_DEBUG_MODE, sLOGPRINT); - sDBG = sLOGPRINT; + sPRINTLOGGING = prefs.getBoolean(PREF_DEBUG_MODE, sPRINTLOGGING); + sDBG = sPRINTLOGGING; prefs.registerOnSharedPreferenceChangeListener(this); } @@ -214,7 +224,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addCountEntry(long time) { - if (sLOGPRINT) { + if (sPRINTLOGGING) { Log.d(TAG, "Log counts. (4)"); } mLogBuffer.add(new LogEntry (time, ID_DELETE_COUNT, @@ -233,7 +243,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addSuggestionCountEntry(long time) { - if (sLOGPRINT) { + if (sPRINTLOGGING) { Log.d(TAG, "log suggest counts. (1)"); } String[] s = new String[mAutoSuggestCountPerDic.length]; @@ -260,7 +270,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addThemeIdEntry(long time) { - if (sLOGPRINT) { + if (sPRINTLOGGING) { Log.d(TAG, "Log theme Id. (1)"); } // TODO: Not to convert theme ID here. Currently "2" is treated as "6" in a log server. @@ -274,7 +284,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addLanguagesEntry(long time) { - if (sLOGPRINT) { + if (sPRINTLOGGING) { Log.d(TAG, "Log language settings. (1)"); } // CurrentLanguage and SelectedLanguages will be blank if user doesn't use multi-language @@ -287,7 +297,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addSettingsEntry(long time) { - if (sLOGPRINT) { + if (sPRINTLOGGING) { Log.d(TAG, "Log settings. (1)"); } final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); @@ -297,7 +307,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addVersionNameEntry(long time) { - if (sLOGPRINT) { + if (sPRINTLOGGING) { Log.d(TAG, "Log Version. (1)"); } try { @@ -311,14 +321,14 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } private void addExceptionEntry(long time, String[] data) { - if (sLOGPRINT) { + if (sPRINTLOGGING) { Log.d(TAG, "Log Exception. (1)"); } mLogBuffer.add(new LogEntry(time, ID_EXCEPTION, data)); } private void flushPrivacyLogSafely() { - if (sLOGPRINT) { + if (sPRINTLOGGING) { Log.d(TAG, "Log obfuscated data. (" + mPrivacyLogBuffer.size() + ")"); } long now = System.currentTimeMillis(); @@ -351,7 +361,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } mInputCount += (Integer)data; break; - case ID_MANUALSUGGESTION: + case ID_MANUALSUGGESTION_WITH_DATATYPE: case ID_AUTOSUGGESTION: ++mWordCount; String[] dataStrings = (String[]) data; @@ -412,7 +422,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang // if there is no log entry in mLogBuffer, will not send logs to DropBox. if (!mLogBuffer.isEmpty() && (mAddTextToDropBoxTask == null || mAddTextToDropBoxTask.getStatus() == AsyncTask.Status.FINISHED)) { - if (sLOGPRINT) { + if (sPRINTLOGGING) { Log.d(TAG, "Commit (" + mLogBuffer.size() + ")"); } flushPrivacyLogSafely(); @@ -483,8 +493,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang KeyboardSwitcher.DEFAULT_LAYOUT_ID); addThemeIdEntry(mLastTimeActive); } else if (PREF_DEBUG_MODE.equals(key)) { - sLOGPRINT = sharedPreferences.getBoolean(PREF_DEBUG_MODE, sLOGPRINT); - sDBG = sLOGPRINT; + sPRINTLOGGING = sharedPreferences.getBoolean(PREF_DEBUG_MODE, sPRINTLOGGING); + sDBG = sPRINTLOGGING; } else if (LatinIME.PREF_INPUT_LANGUAGE.equals(key)) { mCurrentLanguage = sharedPreferences.getString(LatinIME.PREF_INPUT_LANGUAGE, ""); addLanguagesEntry(mLastTimeActive); @@ -518,14 +528,14 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang if (sLogEnabled) { // log punctuation if (before.length() == 0 && after.length() == 1) { - sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION, new String[] { + sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION_WITH_DATATYPE, new String[] { before, after, String.valueOf(position), ""}); } else if (!sSuggestDicMap.containsKey(after)) { if (sDBG) { Log.e(TAG, "logOnManualSuggestion was cancelled: from unknown dic."); } } else { - int dicTypeId = sSuggestDicMap.get(after); + int dicTypeId = sSuggestDicMap.get(after).first; sLatinImeLogger.mManualSuggestCountPerDic[dicTypeId]++; if (dicTypeId != Suggest.DIC_MAIN) { if (sDBG) { @@ -533,6 +543,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } before = ""; after = ""; + sPreviousWords = null; } // TODO: Don't send a log if this doesn't come from Main Dictionary. { @@ -540,15 +551,61 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang before = ""; after = ""; } - String[] strings = new String[3 + suggestions.size()]; - strings[0] = before; - strings[1] = after; - strings[2] = String.valueOf(position); - for (int i = 0; i < suggestions.size(); ++i) { + + /* Example: + * When user typed "Illegal imm" and picked "immigrants", + * the suggestion list has "immigrants, immediate, immigrant". + * At this time, the log strings will be something like below: + * strings[0 = COLUMN_BEFORE_ID] = imm + * strings[1 = COLUMN_AFTER_ID] = immigrants + * strings[2 = COLUMN_PICKED_POSITION_ID] = 0 + * strings[3 = COLUMN_SUGGESTION_LENGTH_ID] = 3 + * strings[4 = COLUMN_PREVIOUS_WORDS_COUNT_ID] = 1 + * strings[5] = immigrants + * strings[6] = immediate + * strings[7] = immigrant + * strings[8] = 1 (= bigram) + * strings[9] = 0 (= unigram) + * strings[10] = 1 (= bigram) + * strings[11] = Illegal + */ + + // 0 for unigram, 1 for bigram, 2 for trigram... + int previousWordsLength = (sPreviousWords == null) ? 0 : sPreviousWords.length; + int suggestionLength = suggestions.size(); + + final int COLUMN_BEFORE_ID = 0; + final int COLUMN_AFTER_ID = 1; + final int COLUMN_PICKED_POSITION_ID = 2; + final int COLUMN_SUGGESTION_LENGTH_ID = 3; + final int COLUMN_PREVIOUS_WORDS_COUNT_ID = 4; + final int BASE_COLUMN_SIZE = 5; + + String[] strings = + new String[BASE_COLUMN_SIZE + suggestionLength * 2 + previousWordsLength]; + strings[COLUMN_BEFORE_ID] = before; + strings[COLUMN_AFTER_ID] = after; + strings[COLUMN_PICKED_POSITION_ID] = String.valueOf(position); + strings[COLUMN_SUGGESTION_LENGTH_ID] = String.valueOf(suggestionLength); + strings[COLUMN_PREVIOUS_WORDS_COUNT_ID] = String.valueOf(previousWordsLength); + + for (int i = 0; i < suggestionLength; ++i) { String s = suggestions.get(i).toString(); - strings[i + 3] = sSuggestDicMap.containsKey(s) ? s : ""; + if (sSuggestDicMap.containsKey(s)) { + strings[BASE_COLUMN_SIZE + i] = s; + strings[BASE_COLUMN_SIZE + suggestionLength + i] + = sSuggestDicMap.get(s).second.toString(); + } else { + strings[BASE_COLUMN_SIZE + i] = ""; + strings[BASE_COLUMN_SIZE + suggestionLength + i] = ""; + } } - sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION, strings); + + for (int i = 0; i < previousWordsLength; ++i) { + strings[BASE_COLUMN_SIZE + suggestionLength * 2 + i] = sPreviousWords[i]; + } + + sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION_WITH_DATATYPE, strings); } } sSuggestDicMap.clear(); @@ -563,7 +620,8 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } else { String separator = String.valueOf(sLatinImeLogger.mRingCharBuffer.getLastChar()); - sLastAutoSuggestDicTypeId = sSuggestDicMap.get(after); + sLastAutoSuggestDicTypeId = sSuggestDicMap.get(after).first; + sLastAutoSuggestDataType = sSuggestDicMap.get(after).second; sLatinImeLogger.mAutoSuggestCountPerDic[sLastAutoSuggestDicTypeId]++; if (sLastAutoSuggestDicTypeId != Suggest.DIC_MAIN) { if (sDBG) { @@ -571,6 +629,7 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } before = ""; after = ""; + sPreviousWords = null; } // TODO: Not to send a log if this doesn't come from Main Dictionary. { @@ -578,7 +637,22 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang before = ""; after = ""; } - String[] strings = new String[] {before, after, separator}; + int previousWordsLength = (sPreviousWords == null) ? 0 : sPreviousWords.length; + + final int COLUMN_BEFORE_ID = 0; + final int COLUMN_AFTER_ID = 1; + final int COLUMN_SEPARATOR_ID = 2; + final int COLUMN_DATA_TYPE_ID = 3; + final int BASE_COLUMN_SIZE = 4; + + String[] strings = new String[4 + previousWordsLength]; + strings[COLUMN_BEFORE_ID] = before; + strings[COLUMN_AFTER_ID] = after; + strings[COLUMN_SEPARATOR_ID] = separator; + strings[COLUMN_DATA_TYPE_ID] = String.valueOf(sLastAutoSuggestDataType); + for (int i = 0; i < previousWordsLength; ++i) { + strings[BASE_COLUMN_SIZE + i] = sPreviousWords[i]; + } sLatinImeLogger.sendLogToDropBox(ID_AUTOSUGGESTION, strings); } synchronized (LatinImeLogger.class) { @@ -658,15 +732,18 @@ public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChang } } - public static void onStartSuggestion() { + // TODO: This code supports only Bigram. + public static void onStartSuggestion(CharSequence previousWords) { if (sLogEnabled) { sSuggestDicMap.clear(); + sPreviousWords = new String[] { + (previousWords == null) ? "" : previousWords.toString()}; } } - public static void onAddSuggestedWord(String word, int typeId) { + public static void onAddSuggestedWord(String word, int typeId, DataType dataType) { if (sLogEnabled) { - sSuggestDicMap.put(word, typeId); + sSuggestDicMap.put(word, new Pair(typeId, dataType.ordinal())); } } diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 6705e9a36..b90547483 100755 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -204,7 +204,7 @@ public class Suggest implements Dictionary.WordCallback { */ public List getSuggestions(View view, WordComposer wordComposer, boolean includeTypedWordIfValid, CharSequence prevWordForBigram) { - LatinImeLogger.onStartSuggestion(); + LatinImeLogger.onStartSuggestion(prevWordForBigram); mHaveCorrection = false; mCapitalize = wordComposer.isCapitalized(); collectGarbage(mSuggestions, mPrefMaxSuggestions); @@ -214,9 +214,12 @@ public class Suggest implements Dictionary.WordCallback { // Save a lowercase version of the original word mOriginalWord = wordComposer.getTypedWord(); if (mOriginalWord != null) { - mOriginalWord = mOriginalWord.toString(); - mLowerOriginalWord = mOriginalWord.toString().toLowerCase(); - LatinImeLogger.onAddSuggestedWord(mOriginalWord.toString(), Suggest.DIC_USER_TYPED); + final String mOriginalWordString = mOriginalWord.toString(); + mOriginalWord = mOriginalWordString; + mLowerOriginalWord = mOriginalWordString.toLowerCase(); + // Treating USER_TYPED as UNIGRAM suggestion for logging now. + LatinImeLogger.onAddSuggestedWord(mOriginalWordString, Suggest.DIC_USER_TYPED, + Dictionary.DataType.UNIGRAM); } else { mLowerOriginalWord = ""; } @@ -368,6 +371,7 @@ public class Suggest implements Dictionary.WordCallback { public boolean addWord(final char[] word, final int offset, final int length, int freq, final int dicTypeId, final Dictionary.DataType dataType) { + Dictionary.DataType dataTypeForLog = dataType; ArrayList suggestions; int[] priorities; int prefMaxSuggestions; @@ -391,6 +395,7 @@ public class Suggest implements Dictionary.WordCallback { // Check if the word was already added before (by bigram data) int bigramSuggestion = searchBigramSuggestion(word,offset,length); if(bigramSuggestion >= 0) { + dataTypeForLog = Dictionary.DataType.BIGRAM; // turn freq from bigram into multiplier specified above double multiplier = (((double) mBigramPriorities[bigramSuggestion]) / MAXIMUM_BIGRAM_FREQUENCY) @@ -442,7 +447,7 @@ public class Suggest implements Dictionary.WordCallback { mStringPool.add(garbage); } } else { - LatinImeLogger.onAddSuggestedWord(sb.toString(), dicTypeId); + LatinImeLogger.onAddSuggestedWord(sb.toString(), dicTypeId, dataTypeForLog); } return true; } diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java index 224423c23..bc7bf3f71 100644 --- a/java/src/com/android/inputmethod/latin/TextEntryState.java +++ b/java/src/com/android/inputmethod/latin/TextEntryState.java @@ -43,22 +43,9 @@ public class TextEntryState { private static int sSessionCount = 0; private static int sTypedChars; - + private static int sActualChars; - - private static final String[] STATES = { - "Unknown", - "Start", - "In word", - "Accepted default", - "Picked suggestion", - "Punc. after word", - "Punc. after accepted", - "Space after accepted", - "Space after picked", - "Undo commit" - }; - + public static final int STATE_UNKNOWN = 0; public static final int STATE_START = 1; public static final int STATE_IN_WORD = 2; From e55a9a170ec6b3e3b57dbdebb16b3606997af19b Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Mon, 26 Jul 2010 21:35:21 -0700 Subject: [PATCH 125/159] Refactor move and time de-bouncing codes into separate static class This is the second one of three changes to fix the bug#2868304. Bug: 2868304 Change-Id: I11a6d2e501888da98faf0c88c8d861c508d500fc --- .../latin/LatinKeyboardBaseView.java | 187 ++++++++++++------ 1 file changed, 124 insertions(+), 63 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 0a3e4a7c7..ba7aa5d1c 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -177,8 +177,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener private int mVerticalCorrection; private int mProximityThreshold; - private int mKeyDebounceThreshold; - private static final int KEY_DEBOUNCE_FACTOR = 6; private boolean mPreviewCentered = false; private boolean mShowPreview = true; @@ -187,25 +185,18 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener private int mPopupPreviewY; private int mWindowY; - private int mLastX; - private int mLastY; - private int mStartX; - private int mStartY; - private boolean mProximityCorrectOn; private Paint mPaint; private Rect mPadding; - private long mDownTime; - private long mLastMoveTime; - private int mLastKey; - private int mLastCodeX; - private int mLastCodeY; private int mCurrentKey = NOT_A_KEY; private int mDownKey = NOT_A_KEY; - private long mLastKeyTime; - private long mCurrentKeyTime; + private int mStartX; + private int mStartY; + + private KeyDebouncer mDebouncer; + private int[] mKeyIndices = new int[12]; private GestureDetector mGestureDetector; private int mPopupX; @@ -328,6 +319,98 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener } }; + static class KeyDebouncer { + // for move de-bouncing + private int mLastCodeX; + private int mLastCodeY; + private int mLastX; + private int mLastY; + + // for time de-bouncing + private int mLastKey; + private long mLastKeyTime; + private long mLastMoveTime; + private long mCurrentKeyTime; + + private int mKeyDebounceThreshold; + private static final int KEY_DEBOUNCE_FACTOR = 6; + + KeyDebouncer(int proximityThreshold) { + // 1/KEY_DEBOUNCE_FACTOR of distance between adjacent keys + mKeyDebounceThreshold = proximityThreshold / KEY_DEBOUNCE_FACTOR; + } + + public int getLastCodeX() { + return mLastCodeX; + } + + public int getLastCodeY() { + return mLastCodeY; + } + + public int getLastX() { + return mLastX; + } + + public int getLastY() { + return mLastY; + } + + public int getLastKey() { + return mLastKey; + } + + public void startMoveDebouncing(int x, int y) { + mLastCodeX = x; + mLastCodeY = y; + } + + public void updateMoveDebouncing(int x, int y) { + mLastX = x; + mLastY = y; + } + + public void resetMoveDebouncing() { + mLastCodeX = mLastX; + mLastCodeY = mLastY; + } + + public boolean isMinorMoveBounce(int x, int y, int keyIndex, int currentKey) { + // TODO: Check the coordinate against each key border. The current + // logic is pretty simple. + if (keyIndex == currentKey) + return true; + int dx = x - mLastCodeX; + int dy = y - mLastCodeY; + int delta = dx * dx + dy * dy; + return delta < mKeyDebounceThreshold; + } + + public void startTimeDebouncing(long eventTime) { + mLastKey = NOT_A_KEY; + mLastKeyTime = 0; + mCurrentKeyTime = 0; + mLastMoveTime = eventTime; + } + + public void updateTimeDebouncing(long eventTime) { + mCurrentKeyTime += eventTime - mLastMoveTime; + mLastMoveTime = eventTime; + } + + public void resetTimeDebouncing(long eventTime, int currentKey) { + mLastKey = currentKey; + mLastKeyTime = mCurrentKeyTime + eventTime - mLastMoveTime; + mCurrentKeyTime = 0; + mLastMoveTime = eventTime; + } + + public boolean isMinorTimeBounce() { + return mCurrentKeyTime < mLastKeyTime && mCurrentKeyTime < DEBOUNCE_TIME + && mLastKey != NOT_A_KEY; + } + } + public LatinKeyboardBaseView(Context context, AttributeSet attrs) { this(context, attrs, R.attr.keyboardViewStyle); } @@ -683,8 +766,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mProximityThreshold = (int) (dimensionSum * 1.4f / length); mProximityThreshold *= mProximityThreshold; // Square it - // 1/KEY_DEBOUNCE_FACTOR of distance between adjacent keys - mKeyDebounceThreshold = mProximityThreshold / KEY_DEBOUNCE_FACTOR; + mDebouncer = new KeyDebouncer(mProximityThreshold); } @Override @@ -804,14 +886,16 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener if (DEBUG) { if (mShowTouchPoints) { + int lastX = mDebouncer.getLastX(); + int lastY = mDebouncer.getLastY(); paint.setAlpha(128); paint.setColor(0xFFFF0000); canvas.drawCircle(mStartX, mStartY, 3, paint); - canvas.drawLine(mStartX, mStartY, mLastX, mLastY, paint); + canvas.drawLine(mStartX, mStartY, lastX, lastY, paint); paint.setColor(0xFF0000FF); - canvas.drawCircle(mLastX, mLastY, 3, paint); + canvas.drawCircle(lastX, lastY, 3, paint); paint.setColor(0xFF00FF00); - canvas.drawCircle((mStartX + mLastX) / 2, (mStartY + mLastY) / 2, 2, paint); + canvas.drawCircle((mStartX + lastX) / 2, (mStartY + lastY) / 2, 2, paint); } } @@ -1206,13 +1290,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener return result; } - private boolean isMinorMoveForKeyDebounce(int x, int y) { - // TODO: Check the coordinate against each key border. The current - // logic is pretty simple. - return ((x - mLastCodeX) * (x - mLastCodeX) + - (y - mLastCodeY) * (y - mLastCodeY)) < mKeyDebounceThreshold; - } - private boolean onModifiedTouchEvent(MotionEvent me, boolean possiblePoly) { int touchX = (int) me.getX() - getPaddingLeft(); int touchY = (int) me.getY() + mVerticalCorrection - getPaddingTop(); @@ -1246,17 +1323,12 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener switch (action) { case MotionEvent.ACTION_DOWN: mAbortKey = false; - mStartX = touchX; - mStartY = touchY; - mLastCodeX = touchX; - mLastCodeY = touchY; - mLastKeyTime = 0; - mCurrentKeyTime = 0; - mLastKey = NOT_A_KEY; mCurrentKey = keyIndex; mDownKey = keyIndex; - mDownTime = me.getEventTime(); - mLastMoveTime = mDownTime; + mStartX = touchX; + mStartY = touchY; + mDebouncer.startMoveDebouncing(touchX, touchY); + mDebouncer.startTimeDebouncing(eventTime); checkMultiTap(eventTime, keyIndex); mKeyboardActionListener.onPress(keyIndex != NOT_A_KEY ? mKeys[keyIndex].codes[0] : 0); @@ -1281,22 +1353,16 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener if (keyIndex != NOT_A_KEY) { if (mCurrentKey == NOT_A_KEY) { mCurrentKey = keyIndex; - mCurrentKeyTime = eventTime - mDownTime; - } else { - if (keyIndex == mCurrentKey - || isMinorMoveForKeyDebounce(touchX, touchY)) { - mCurrentKeyTime += eventTime - mLastMoveTime; - continueLongPress = true; - } else if (mRepeatKeyIndex == NOT_A_KEY) { - resetMultiTap(); - mLastKey = mCurrentKey; - mLastCodeX = mLastX; - mLastCodeY = mLastY; - mLastKeyTime = - mCurrentKeyTime + eventTime - mLastMoveTime; - mCurrentKey = keyIndex; - mCurrentKeyTime = 0; - } + mDebouncer.updateTimeDebouncing(eventTime); + } else if (mDebouncer.isMinorMoveBounce(touchX, touchY, + keyIndex, mCurrentKey)) { + mDebouncer.updateTimeDebouncing(eventTime); + continueLongPress = true; + } else if (mRepeatKeyIndex == NOT_A_KEY) { + resetMultiTap(); + mDebouncer.resetTimeDebouncing(eventTime, mCurrentKey); + mDebouncer.resetMoveDebouncing(); + mCurrentKey = keyIndex; } } if (!continueLongPress) { @@ -1308,25 +1374,21 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener } } showPreview(mCurrentKey); - mLastMoveTime = eventTime; break; case MotionEvent.ACTION_UP: mHandler.cancelKeyTimersAndPopupPreview(); if (keyIndex == mCurrentKey) { - mCurrentKeyTime += eventTime - mLastMoveTime; + mDebouncer.updateTimeDebouncing(eventTime); } else { resetMultiTap(); - mLastKey = mCurrentKey; - mLastKeyTime = mCurrentKeyTime + eventTime - mLastMoveTime; + mDebouncer.resetTimeDebouncing(eventTime, mCurrentKey); mCurrentKey = keyIndex; - mCurrentKeyTime = 0; } - if (mCurrentKeyTime < mLastKeyTime && mCurrentKeyTime < DEBOUNCE_TIME - && mLastKey != NOT_A_KEY) { - mCurrentKey = mLastKey; - touchX = mLastCodeX; - touchY = mLastCodeY; + if (mDebouncer.isMinorTimeBounce()) { + mCurrentKey = mDebouncer.getLastKey(); + touchX = mDebouncer.getLastCodeX(); + touchY = mDebouncer.getLastCodeY(); } showPreview(NOT_A_KEY); Arrays.fill(mKeyIndices, NOT_A_KEY); @@ -1345,8 +1407,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener invalidateKey(mCurrentKey); break; } - mLastX = touchX; - mLastY = touchY; + mDebouncer.updateMoveDebouncing(touchX, touchY); return true; } From 679b838b05a70ed965017635efdf536449aa230f Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 28 Jul 2010 22:32:20 +0900 Subject: [PATCH 126/159] Update resources of the tentertive UI for tablet friendly UI Change-Id: I59acd50b3531cf02d71c124d7ce8211d0c3dcd7e --- .../btn_keyboard_key_normal_off_stone.9.png | Bin 0 -> 2348 bytes .../btn_keyboard_key_normal_on_stone.9.png | Bin 0 -> 2379 bytes .../btn_keyboard_key_normal_stone.9.png | Bin 0 -> 2211 bytes .../btn_keyboard_key_normal_off_stone.9.png | Bin 0 -> 2691 bytes .../btn_keyboard_key_normal_on_stone.9.png | Bin 0 -> 2720 bytes .../btn_keyboard_key_normal_stone.9.png | Bin 0 -> 2517 bytes .../btn_keyboard_key_normal_off_stone.9.png | Bin 0 -> 2691 bytes .../btn_keyboard_key_normal_on_stone.9.png | Bin 0 -> 2720 bytes .../btn_keyboard_key_normal_stone.9.png | Bin 0 -> 2517 bytes .../btn_keyboard_key_normal_off_stone.9.png | Bin 0 -> 2348 bytes .../btn_keyboard_key_normal_on_stone.9.png | Bin 0 -> 2379 bytes .../btn_keyboard_key_normal_stone.9.png | Bin 0 -> 2211 bytes .../btn_keyboard_key_normal_off_stone.9.png | Bin 2198 -> 0 bytes .../btn_keyboard_key_normal_on_stone.9.png | Bin 2242 -> 0 bytes .../drawable/btn_keyboard_key_normal_stone.9.png | Bin 2116 -> 0 bytes java/res/values-xlarge/dimens.xml | 2 +- 16 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png create mode 100644 java/res/drawable-hdpi/btn_keyboard_key_normal_on_stone.9.png create mode 100644 java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png create mode 100644 java/res/drawable-land-hdpi/btn_keyboard_key_normal_off_stone.9.png create mode 100644 java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png create mode 100644 java/res/drawable-land-hdpi/btn_keyboard_key_normal_stone.9.png create mode 100644 java/res/drawable-land-mdpi/btn_keyboard_key_normal_off_stone.9.png create mode 100644 java/res/drawable-land-mdpi/btn_keyboard_key_normal_on_stone.9.png create mode 100644 java/res/drawable-land-mdpi/btn_keyboard_key_normal_stone.9.png create mode 100644 java/res/drawable-mdpi/btn_keyboard_key_normal_off_stone.9.png create mode 100644 java/res/drawable-mdpi/btn_keyboard_key_normal_on_stone.9.png create mode 100644 java/res/drawable-mdpi/btn_keyboard_key_normal_stone.9.png delete mode 100644 java/res/drawable/btn_keyboard_key_normal_off_stone.9.png delete mode 100644 java/res/drawable/btn_keyboard_key_normal_on_stone.9.png delete mode 100644 java/res/drawable/btn_keyboard_key_normal_stone.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_stone.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b67732cd42da45d3f9b407efc2fb841b814357b9 GIT binary patch literal 2348 zcmV+{3Dfq8P)U2)uzuw=~tpW@F&<(OYd^7RDb~J9+YCckI|Pcl`MAI-NLiBIxAFlR@|n z#~eL+H0a2YBlUFn@Zl02I&`Q+2M->srvnELl-0zE69H4}t+t42o=hW9pE`BQojrTD zp3a>+7j)sm1$Xh{#qjg|`SamB9&_f*nG&5oeY!+wpQ@>;3E}{$ICv@y9z1%l?|Z!$ zVbUNlc+Z&l8{y}*YuCbe5dJ?Uo=>q|314D7( ztS}G}q_tP82$Ke(SsI3J-n{8<-MZy&-@fhc-o5MY-Md#O{0`l@b0;aBqe43n+GP72 z6djn<0AT*Gd);QQ&*r@Nj#d%E7ed%Iq}dbt4u2865D%a)^0tv{sUY%o#H4H)+G|;bKKR0O5AUAjJT(@-TQnzHu5;t|~RM)3ZAGdz} z`g$-8L0OpG$Oy;}USD~&D+Iy8Jdusz-ZEmuh+ux*x^-^j#*IO1*RFN*=g)To2M!Dq zvs^UFMMXi1AWUji#q?@l2!aX6D-s&O@BRDtce7{Dc5BwGaT_*laGN%5s?(}ftK6hX zlib3E3!5}&6hxz;02I7Lke|J}dUYrS;U$(=E8Ogc4jmds9?<{@qCpVA&6qJGq*?A{ zw-9!YC;+`c@Rki?FTc2c4<0-?%ng{vd>{;jhyY^Vym?8psjHPv@>E*cOELv-*&w)4 z@jA{1#*7&g=E<^U%fh?>41|9#TC~WG8a2x8-@m`aXv(xo??H%0L-!SU%Lc(sM{h!C z0BavaW!ki9!T9p!%LCMc1qiH>6Dyle3ZZK;2;Pc7oCU!O6(?{J$3_?(d&9K%oLt$+LJ4MTPz5X|}%-2+63fX5Fc!IZV z5PcGa_#i}>)WyJF<;uw(ZznS$QV(G8mJNbORGh%4H9|2;=tSoZC#1qPBt1vx0;50x zeR6~+c*_Q{&+LR!AUl8Tg`pwoIXVw4fYt;cc*_RC%}3JgDp(Pyns8K=76gf+s#L!C(|D5UU!DP?2n< zBqgnySO8lVg12lC6wYu0YDg^96#?10S7W6$u@nFcfh-2XTQ&$PdZ-MtYRGCL8cPA` zTxyJL(M|zURZMt-w``Do`}T$MrIt1chK4mlgtBw0ob2&hSw!13Z_BLk1aH|OyLayn z&lXy9B^ZHh+Wi}8`Y3>{1;Z0o;MpKMckXn1_wEhC2tWk0Kn%amsa)x~DFF1z{^BA5lz&}$l&Q|cTGK;!BGp5QGTWW|aVfgDvuN{ey|r0LgGu^kJ5 zKGg#}tz5Y>9|ZL(R1ZOq$|8hD2&Yv>tpPI?a;4|8J+w{J5c`K0c!IYgkdkr`D(;91 z=pi(qU<6{dQNwT3QB`yt+aZ7&hv);I;4QnZg{nHpQB9->W`S%9Hbpx61fX$<9^eU8 z&TJ4A-$0I+ITXPZh)@*MpfTdPI{Gw^KGg#}!CN*6s_r0Pym)b)&HPRw)4Vr~ShdUSVW|;Ke4=3t?2DAp%;cR4O(`JYNCWANz+Vyfw=P z!Al&Z7s9AQLj=@_p<|Uz$sF-q0?;^x{^2QZbIJo5KYn~jFNBdoBb0^GXr)rJNNPR> zK=TxQ;4N7;$k?%CLkIz5Wx;H;QYl#^h1c{UfDR-CPvgdo%Lm~*Ld+E_G^UWLh^5jp zC50z|Lg)aZPxOyL&IZA&W`qzhMY3S22-*>~vfvs8ny1hg`o(MVY!K`@K?pHdtN^G= z!KETtq!hG5Xj|w5*^&){SI!7wIRVrv2fSz?6kLt-H8>?8RS~3cQ_U0X#j38ZE)+nE zglLx2$dMyUgj9xL5~)MscNLE5+qbXl)~(xL-s?|ZT?#=eDk^^QFn_+O`+mK@zdLp6 zG}U|U;q_(Q4p<7}^{!XTxbg9`Nd2AHuU-SZ{_q;+Rs9MzEb4c!-@LGa`J1?}@slEu z7I9B)>$uIXW8C0X8F#H!#fkQ+RTa~zM}+7c)2dC;9{3hZKjj841QK!?|$_EBwPI<<)qE&s2-Zg?$!n)DCaQbdOn SOLA@i0000) z&lwIQM*QzT63LU#lh2dSWA^#cV@~)pdGh3UCrz4EmmrTRbwx!*?UvXlQ7V#>PhX=anm0-0yhI#fum7sIRZj1MQQ# zx;h63NW;O?VDOMJ$@)~nPrOW61Oc0xnsPKZH#=HdTIA~0t8(qyHMxHMy8E-WwblI& z;O|55e8P4yARH794B^08Fc4m3biy-UCM?3R3=G=Z+T_NK8*=mJO=)j$myV8(9QYaB zx^*iE&e5P9fHv7a2SpD|Xn-&PUgYNqW4uh>)oCOSLMIHtkOtT?3!q`kPs?1r>z++qGv-35M=Wr zzfYKu@N%jMFR{E@UBB5NN51%ANRGEnk6!Fn!mbf5z$^gSqDAs9znwRv?*3Fc{pBAs zY3SY%3>&&y=|vtYD|<;M$QCVv?+0GT*+APrYoz|0V!80mUxGA#`^XV6C)2sFKbH%cbYv)iUty8R_ZkO#Nmb>Kk8w(`yNa zC&+|s(IQ#*TJ0Te(tWQ{`tR3E-;?w1MT=mohr1g9qhN(XYbdl~ zk+$)mv1>pJ=$#gTY|$dvr_x(67zHcDT@B7q8g{27gx)o=0(M&n*`h_TafTDHhs2G# zG$Fh1RVaE-EF{2?9yui^u>Oe1DTL5T4eX`-LilGerFHR0L9QSXGoWy{pW#LblGqQ7@qwy z2Quy1vnO6;=gyt7ckf-U`*t@g03!e>W`%U= zg{rdG%U0v<$H*enTKqHi+kS;%6g0bjx*&feZ{`MOLg>;mp^qTbF}kT8L7FWl#t_SC2l!qfeaynUF17WZAN1&V0?9H961- z<*by2p|Y^&=+UPD`qLSZ3E84WmMmE!D_5>`B}UK)<+PA3K??(FLdWURrvUoX8ITFt zqD2-hS|rPtFLz)n3FY)`>6scXY{P~}f4YCy?V(36i>Dd|% zJl}>#f4YBUs;sPx7g?}if&2G!Oru82St(nJg%T1#f4YBUs;H=l7nwJ2o+~d*qXrF8 z&`O0$u@HE^7GQtuADQsxQnUzOB|>>&8Z~H$f_lc#vBs8U3_O;zY{J z%UyY48VMR9R!YxSs3g#kX@sP;gl-Fcpjx6urcImXrZ5YLT4Kc0 z211ML;6NX*M5cI=)R$^{i;Ih;q@*Mjh^B$r%wooj8F`?T0Yaj52!7V!n5k2z%EXBi z?Cgkk@=Ujq?(CG4rQsFZAnKdDg#<`n;c= x7kvXSKLTFzjP>O-#!Ec?|N7qzkL155{Rf;PP9H9-2x0&L002ovPDHLkV1nE#j2{31 literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_stone.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fba10b8882d6ecb43458ed5535e20d77f65197c5 GIT binary patch literal 2211 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on_stone.9.png new file mode 100644 index 0000000000000000000000000000000000000000..63cbe60a3ab527002739db25418087ec7a1b674a GIT binary patch literal 2720 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-land-mdpi/btn_keyboard_key_normal_on_stone.9.png b/java/res/drawable-land-mdpi/btn_keyboard_key_normal_on_stone.9.png new file mode 100644 index 0000000000000000000000000000000000000000..63cbe60a3ab527002739db25418087ec7a1b674a GIT binary patch literal 2720 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 SOLA@i0000) z&lwIQM*QzT63LU#lh2dSWA^#cV@~)pdGh3UCrz4EmmrTRbwx!*?UvXlQ7V#>PhX=anm0-0yhI#fum7sIRZj1MQQ# zx;h63NW;O?VDOMJ$@)~nPrOW61Oc0xnsPKZH#=HdTIA~0t8(qyHMxHMy8E-WwblI& z;O|55e8P4yARH794B^08Fc4m3biy-UCM?3R3=G=Z+T_NK8*=mJO=)j$myV8(9QYaB zx^*iE&e5P9fHv7a2SpD|Xn-&PUgYNqW4uh>)oCOSLMIHtkOtT?3!q`kPs?1r>z++qGv-35M=Wr zzfYKu@N%jMFR{E@UBB5NN51%ANRGEnk6!Fn!mbf5z$^gSqDAs9znwRv?*3Fc{pBAs zY3SY%3>&&y=|vtYD|<;M$QCVv?+0GT*+APrYoz|0V!80mUxGA#`^XV6C)2sFKbH%cbYv)iUty8R_ZkO#Nmb>Kk8w(`yNa zC&+|s(IQ#*TJ0Te(tWQ{`tR3E-;?w1MT=mohr1g9qhN(XYbdl~ zk+$)mv1>pJ=$#gTY|$dvr_x(67zHcDT@B7q8g{27gx)o=0(M&n*`h_TafTDHhs2G# zG$Fh1RVaE-EF{2?9yui^u>Oe1DTL5T4eX`-LilGerFHR0L9QSXGoWy{pW#LblGqQ7@qwy z2Quy1vnO6;=gyt7ckf-U`*t@g03!e>W`%U= zg{rdG%U0v<$H*enTKqHi+kS;%6g0bjx*&feZ{`MOLg>;mp^qTbF}kT8L7FWl#t_SC2l!qfeaynUF17WZAN1&V0?9H961- z<*by2p|Y^&=+UPD`qLSZ3E84WmMmE!D_5>`B}UK)<+PA3K??(FLdWURrvUoX8ITFt zqD2-hS|rPtFLz)n3FY)`>6scXY{P~}f4YCy?V(36i>Dd|% zJl}>#f4YBUs;sPx7g?}if&2G!Oru82St(nJg%T1#f4YBUs;H=l7nwJ2o+~d*qXrF8 z&`O0$u@HE^7GQtuADQsxQnUzOB|>>&8Z~H$f_lc#vBs8U3_O;zY{J z%UyY48VMR9R!YxSs3g#kX@sP;gl-Fcpjx6urcImXrZ5YLT4Kc0 z211ML;6NX*M5cI=)R$^{i;Ih;q@*Mjh^B$r%wooj8F`?T0Yaj52!7V!n5k2z%EXBi z?Cgkk@=Ujq?(CG4rQsFZAnKdDg#<`n;c= x7kvXSKLTFzjP>O-#!Ec?|N7qzkL155{Rf;PP9H9-2x0&L002ovPDHLkV1nE#j2{31 literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_stone.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_stone.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fba10b8882d6ecb43458ed5535e20d77f65197c5 GIT binary patch literal 2211 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 QxBvhE07*qoM6N<$f{>$7RsaA1 diff --git a/java/res/drawable/btn_keyboard_key_normal_stone.9.png b/java/res/drawable/btn_keyboard_key_normal_stone.9.png deleted file mode 100644 index 46747bde613896d0eca646c780a4876aad065759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2116 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 46dip 0dip - 32sp + 35sp From e36bce042b01402fa8aa26d8081b8c85e17dc49d Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 27 Jul 2010 22:59:50 -0700 Subject: [PATCH 127/159] Add hysteresis movement key debouncing When key is pressed, each key will have a halo which is 0.05 inch wider than the key. Bug: bug2517112 Change-Id: I1368ff4af5f5d230b8c2f0c05c3c27bdb89027ae --- java/res/values/dimens.xml | 1 + .../latin/LatinKeyboardBaseView.java | 40 +++++++++++-------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index 81ae64e5f..39dce9db0 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -27,4 +27,5 @@ will not go into extract (fullscreen) mode. --> 2.5in 22sp + 0.05in diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index ba7aa5d1c..e25ef495e 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -332,12 +332,10 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener private long mLastMoveTime; private long mCurrentKeyTime; - private int mKeyDebounceThreshold; - private static final int KEY_DEBOUNCE_FACTOR = 6; + private final int mKeyDebounceThresholdSquared; - KeyDebouncer(int proximityThreshold) { - // 1/KEY_DEBOUNCE_FACTOR of distance between adjacent keys - mKeyDebounceThreshold = proximityThreshold / KEY_DEBOUNCE_FACTOR; + KeyDebouncer(float hysteresisPixel) { + mKeyDebounceThresholdSquared = (int)(hysteresisPixel * hysteresisPixel); } public int getLastCodeX() { @@ -375,15 +373,23 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mLastCodeY = mLastY; } - public boolean isMinorMoveBounce(int x, int y, int keyIndex, int currentKey) { - // TODO: Check the coordinate against each key border. The current - // logic is pretty simple. - if (keyIndex == currentKey) + public boolean isMinorMoveBounce(int x, int y, Key newKey, Key curKey) { + if (newKey == curKey) return true; - int dx = x - mLastCodeX; - int dy = y - mLastCodeY; - int delta = dx * dx + dy * dy; - return delta < mKeyDebounceThreshold; + + return getSquareDistanceToKeyEdge(x, y, curKey) < mKeyDebounceThresholdSquared; + } + + private static int getSquareDistanceToKeyEdge(int x, int y, Key key) { + final int left = key.x; + final int right = key.x + key.width; + final int top = key.y; + final int bottom = key.y + key.height; + final int edgeX = x < left ? left : (x > right ? right : x); + final int edgeY = y < top ? top : (y > bottom ? bottom : y); + final int dx = x - edgeX; + final int dy = y - edgeY; + return dx * dx + dy * dy; } public void startTimeDebouncing(long eventTime) { @@ -766,7 +772,9 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mProximityThreshold = (int) (dimensionSum * 1.4f / length); mProximityThreshold *= mProximityThreshold; // Square it - mDebouncer = new KeyDebouncer(mProximityThreshold); + final float hysteresisPixel = getContext().getResources() + .getDimension(R.dimen.key_debounce_hysteresis_distance); + mDebouncer = new KeyDebouncer(hysteresisPixel); } @Override @@ -1354,8 +1362,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener if (mCurrentKey == NOT_A_KEY) { mCurrentKey = keyIndex; mDebouncer.updateTimeDebouncing(eventTime); - } else if (mDebouncer.isMinorMoveBounce(touchX, touchY, - keyIndex, mCurrentKey)) { + } else if (mDebouncer.isMinorMoveBounce(touchX, touchY, mKeys[keyIndex], + mKeys[mCurrentKey])) { mDebouncer.updateTimeDebouncing(eventTime); continueLongPress = true; } else if (mRepeatKeyIndex == NOT_A_KEY) { From 80aa14fd432cf7d2c67f2fcfcc57c80f29f8eb64 Mon Sep 17 00:00:00 2001 From: Jae Yong Sung Date: Mon, 26 Jul 2010 11:43:29 -0700 Subject: [PATCH 128/159] - separate dict (uses xml) - retrieve bigrams that only starts with character typed and neighbor keys - contacts bigram - performance measure bug: 2873133 Change-Id: If97c005b18c82f3fafef50009dd2dfd972b0ab8f --- java/res/xml-en/dictionary.xml | 25 ++ java/res/xml/dictionary.xml | 23 ++ .../inputmethod/latin/BinaryDictionary.java | 72 +++-- .../inputmethod/latin/ContactsDictionary.java | 17 +- .../android/inputmethod/latin/Dictionary.java | 3 - .../inputmethod/latin/EditingUtil.java | 18 +- .../latin/ExpandableDictionary.java | 193 ++++++++++--- .../latin/InputLanguageSelection.java | 5 +- .../android/inputmethod/latin/LatinIME.java | 114 +++++++- .../android/inputmethod/latin/Suggest.java | 51 +++- ...oid_inputmethod_latin_BinaryDictionary.cpp | 23 +- native/src/dictionary.cpp | 31 +- native/src/dictionary.h | 6 +- tests/res/raw/testtext.txt | 24 ++ .../latin/tests/SuggestHelper.java | 192 +++++++++++++ .../latin/tests/SuggestPerformanceTests.java | 127 +++++++++ .../inputmethod/latin/tests/SuggestTests.java | 264 +++++------------- 17 files changed, 884 insertions(+), 304 deletions(-) create mode 100644 java/res/xml-en/dictionary.xml create mode 100644 java/res/xml/dictionary.xml create mode 100644 tests/res/raw/testtext.txt create mode 100644 tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java create mode 100644 tests/src/com/android/inputmethod/latin/tests/SuggestPerformanceTests.java diff --git a/java/res/xml-en/dictionary.xml b/java/res/xml-en/dictionary.xml new file mode 100644 index 000000000..74af75a0f --- /dev/null +++ b/java/res/xml-en/dictionary.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/java/res/xml/dictionary.xml b/java/res/xml/dictionary.xml new file mode 100644 index 000000000..7b770a8b4 --- /dev/null +++ b/java/res/xml/dictionary.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index 0a2af0662..e2c0c4ccc 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -16,6 +16,7 @@ package com.android.inputmethod.latin; +import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.IOException; import java.nio.ByteBuffer; @@ -31,6 +32,14 @@ import android.util.Log; */ public class BinaryDictionary extends Dictionary { + /** + * There is difference between what java and native code can handle. + * This value should only be used in BinaryDictionary.java + * It is necessary to keep it at this value because some languages e.g. German have + * really long words. + */ + protected static final int MAX_WORD_LENGTH = 48; + private static final String TAG = "BinaryDictionary"; private static final int MAX_ALTERNATIVES = 16; private static final int MAX_WORDS = 16; @@ -64,8 +73,8 @@ public class BinaryDictionary extends Dictionary { * @param context application context for reading resources * @param resId the resource containing the raw binary dictionary */ - public BinaryDictionary(Context context, int resId, int dicTypeId) { - if (resId != 0) { + public BinaryDictionary(Context context, int[] resId, int dicTypeId) { + if (resId != null && resId.length > 0 && resId[0] != 0) { loadDictionary(context, resId); } mDicTypeId = dicTypeId; @@ -97,47 +106,68 @@ public class BinaryDictionary extends Dictionary { private native void closeNative(int dict); 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, int skipPos, - int[] nextLettersFrequencies, int nextLettersSize); - private native int getBigramsNative(int nativeData, char[] prevWord, int prevWordLength, - char[] outputChars, int[] frequencies, int maxWordLength, int maxBigrams); + char[] outputChars, int[] frequencies, int maxWordLength, int maxWords, + int maxAlternatives, int skipPos, int[] nextLettersFrequencies, int nextLettersSize); + private native int getBigramsNative(int dict, char[] prevWord, int prevWordLength, + int[] inputCodes, int inputCodesLength, char[] outputChars, int[] frequencies, + int maxWordLength, int maxBigrams, int maxAlternatives); - private final void loadDictionary(Context context, int resId) { - InputStream is = context.getResources().openRawResource(resId); + private final void loadDictionary(Context context, int[] resId) { + InputStream[] is = null; try { - int avail = is.available(); + // merging separated dictionary into one if dictionary is separated + int total = 0; + is = new InputStream[resId.length]; + for (int i = 0; i < resId.length; i++) { + is[i] = context.getResources().openRawResource(resId[i]); + total += is[i].available(); + } + mNativeDictDirectBuffer = - ByteBuffer.allocateDirect(avail).order(ByteOrder.nativeOrder()); - int got = Channels.newChannel(is).read(mNativeDictDirectBuffer); - if (got != avail) { - Log.e(TAG, "Read " + got + " bytes, expected " + avail); + ByteBuffer.allocateDirect(total).order(ByteOrder.nativeOrder()); + int got = 0; + for (int i = 0; i < resId.length; i++) { + got += Channels.newChannel(is[i]).read(mNativeDictDirectBuffer); + } + if (got != total) { + Log.e(TAG, "Read " + got + " bytes, expected " + total); } else { mNativeDict = openNative(mNativeDictDirectBuffer, TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER); - mDictLength = avail; + mDictLength = total; } } catch (IOException e) { - Log.w(TAG, "No available size for binary dictionary"); + Log.w(TAG, "No available memory for binary dictionary"); } finally { try { - is.close(); + for (int i = 0;i < is.length; i++) { + is[i].close(); + } } catch (IOException e) { Log.w(TAG, "Failed to close input stream"); } } } + @Override - public void getBigrams(final WordComposer composer, final CharSequence previousWord, + public void getBigrams(final WordComposer codes, final CharSequence previousWord, final WordCallback callback, int[] nextLettersFrequencies) { char[] chars = previousWord.toString().toCharArray(); Arrays.fill(mOutputChars_bigrams, (char) 0); Arrays.fill(mFrequencies_bigrams, 0); - int count = getBigramsNative(mNativeDict, chars, chars.length, mOutputChars_bigrams, - mFrequencies_bigrams, MAX_WORD_LENGTH, MAX_BIGRAMS); + int codesSize = codes.size(); + Arrays.fill(mInputCodes, -1); + int[] alternatives = codes.getCodesAt(0); + System.arraycopy(alternatives, 0, mInputCodes, 0, + Math.min(alternatives.length, MAX_ALTERNATIVES)); + + int count = getBigramsNative(mNativeDict, chars, chars.length, mInputCodes, codesSize, + mOutputChars_bigrams, mFrequencies_bigrams, MAX_WORD_LENGTH, MAX_BIGRAMS, + MAX_ALTERNATIVES); + for (int j = 0; j < count; j++) { if (mFrequencies_bigrams[j] < 1) break; int start = j * MAX_WORD_LENGTH; @@ -156,7 +186,7 @@ public class BinaryDictionary extends Dictionary { public void getWords(final WordComposer codes, final WordCallback callback, int[] nextLettersFrequencies) { final int codesSize = codes.size(); - // Wont deal with really long words. + // Won't deal with really long words. if (codesSize > MAX_WORD_LENGTH - 1) return; Arrays.fill(mInputCodes, -1); diff --git a/java/src/com/android/inputmethod/latin/ContactsDictionary.java b/java/src/com/android/inputmethod/latin/ContactsDictionary.java index f5ff865c4..756782887 100644 --- a/java/src/com/android/inputmethod/latin/ContactsDictionary.java +++ b/java/src/com/android/inputmethod/latin/ContactsDictionary.java @@ -22,6 +22,8 @@ import android.database.ContentObserver; import android.database.Cursor; import android.os.SystemClock; import android.provider.ContactsContract.Contacts; +import android.text.TextUtils; +import android.util.Log; public class ContactsDictionary extends ExpandableDictionary { @@ -30,6 +32,12 @@ public class ContactsDictionary extends ExpandableDictionary { Contacts.DISPLAY_NAME, }; + /** + * Frequency for contacts information into the dictionary + */ + private static final int FREQUENCY_FOR_CONTACTS = 128; + private static final int FREQUENCY_FOR_CONTACTS_BIGRAM = 90; + private static final int INDEX_NAME = 1; private ContentObserver mObserver; @@ -90,6 +98,7 @@ public class ContactsDictionary extends ExpandableDictionary { if (name != null) { int len = name.length(); + String prevWord = null; // TODO: Better tokenization for non-Latin writing systems for (int i = 0; i < len; i++) { @@ -113,7 +122,13 @@ public class ContactsDictionary extends ExpandableDictionary { // capitalization of i. final int wordLen = word.length(); if (wordLen < maxWordLength && wordLen > 1) { - super.addWord(word, 128); + super.addWord(word, FREQUENCY_FOR_CONTACTS); + if (!TextUtils.isEmpty(prevWord)) { + // TODO Do not add email address + super.addBigrams(prevWord, word, + FREQUENCY_FOR_CONTACTS_BIGRAM); + } + prevWord = word; } } } diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java index a02edeee5..d04bf57a7 100644 --- a/java/src/com/android/inputmethod/latin/Dictionary.java +++ b/java/src/com/android/inputmethod/latin/Dictionary.java @@ -21,9 +21,6 @@ package com.android.inputmethod.latin; * strokes. */ abstract public class Dictionary { - - protected static final int MAX_WORD_LENGTH = 48; - /** * Whether or not to replicate the typed word in the suggested list, even if it's valid. */ diff --git a/java/src/com/android/inputmethod/latin/EditingUtil.java b/java/src/com/android/inputmethod/latin/EditingUtil.java index 5133c60ca..0c87f8d58 100644 --- a/java/src/com/android/inputmethod/latin/EditingUtil.java +++ b/java/src/com/android/inputmethod/latin/EditingUtil.java @@ -29,7 +29,7 @@ public class EditingUtil { /** * Number of characters we want to look back in order to identify the previous word */ - public static final int LOOKBACK_CHARACTER_NUM = 15; + private static final int LOOKBACK_CHARACTER_NUM = 15; private EditingUtil() {}; @@ -185,10 +185,22 @@ public class EditingUtil { private static final Pattern spaceRegex = Pattern.compile("\\s+"); - public static CharSequence getPreviousWord(InputConnection connection) { + public static CharSequence getPreviousWord(InputConnection connection, + String sentenceSeperators) { //TODO: Should fix this. This could be slow! CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0); + if (prev == null) { + return null; + } String[] w = spaceRegex.split(prev); - return (w.length >= 2) ? w[w.length-2] : null; + if (w.length >= 2 && w[w.length-2].length() > 0) { + char lastChar = w[w.length-2].charAt(w[w.length-2].length() -1); + if (sentenceSeperators.contains(String.valueOf(lastChar))) { + return null; + } + return w[w.length-2]; + } else { + return null; + } } } diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java index d8a9547c1..53f9ed8c8 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java @@ -16,22 +16,32 @@ package com.android.inputmethod.latin; +import java.util.LinkedList; + import android.content.Context; import android.os.AsyncTask; +import android.os.SystemClock; +import android.util.Log; /** * 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 { + /** + * There is difference between what java and native code can handle. + * It uses 32 because Java stack overflows when greater value is used. + */ + protected static final int MAX_WORD_LENGTH = 32; + private Context mContext; private char[] mWordBuilder = new char[MAX_WORD_LENGTH]; private int mDicTypeId; private int mMaxDepth; private int mInputLength; private int[] mNextLettersFrequencies; + private StringBuilder sb = new StringBuilder(MAX_WORD_LENGTH); - public static final int MAX_WORD_LENGTH = 32; private static final char QUOTE = '\''; private boolean mRequiresReload; @@ -45,7 +55,9 @@ public class ExpandableDictionary extends Dictionary { char code; int frequency; boolean terminal; + Node parent; NodeArray children; + LinkedList ngrams; // Supports ngram } static class NodeArray { @@ -69,6 +81,18 @@ public class ExpandableDictionary extends Dictionary { } } + static class NextWord { + Node word; + NextWord nextWord; + int frequency; + + NextWord(Node word, int frequency) { + this.word = word; + this.frequency = frequency; + } + } + + private NodeArray mRoots; private int[][] mCodes; @@ -117,12 +141,11 @@ public class ExpandableDictionary extends Dictionary { } public void addWord(String word, int frequency) { - addWordRec(mRoots, word, 0, frequency); + addWordRec(mRoots, word, 0, frequency, null); } - private void addWordRec(NodeArray children, final String word, - final int depth, final int frequency) { - + private void addWordRec(NodeArray children, final String word, final int depth, + final int frequency, Node parentNode) { final int wordLength = word.length(); final char c = word.charAt(depth); // Does children have the current character? @@ -139,6 +162,7 @@ public class ExpandableDictionary extends Dictionary { if (!found) { childNode = new Node(); childNode.code = c; + childNode.parent = parentNode; children.add(childNode); } if (wordLength == depth + 1) { @@ -151,7 +175,7 @@ public class ExpandableDictionary extends Dictionary { if (childNode.children == null) { childNode.children = new NodeArray(); } - addWordRec(childNode.children, word, depth + 1, frequency); + addWordRec(childNode.children, word, depth + 1, frequency, childNode); } @Override @@ -185,7 +209,7 @@ public class ExpandableDictionary extends Dictionary { if (mRequiresReload) startDictionaryLoadingTaskLocked(); if (mUpdatingDictionary) return false; } - final int freq = getWordFrequencyRec(mRoots, word, 0, word.length()); + final int freq = getWordFrequency(word); return freq > -1; } @@ -193,32 +217,8 @@ public class ExpandableDictionary extends Dictionary { * 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; + Node node = searchNode(mRoots, word, 0, word.length()); + return (node == null) ? -1 : node.frequency; } /** @@ -325,6 +325,133 @@ public class ExpandableDictionary extends Dictionary { } } + /** + * Adds bigrams to the in-memory trie structure that is being used to retrieve any word + * @param addFrequency adding frequency of the pair + * @return returns the final frequency + */ + protected int addBigrams(String word1, String word2, int addFrequency) { + Node firstWord = searchWord(mRoots, word1, 0, null); + Node secondWord = searchWord(mRoots, word2, 0, null); + LinkedList bigram = firstWord.ngrams; + if (bigram == null || bigram.size() == 0) { + firstWord.ngrams = new LinkedList(); + bigram = firstWord.ngrams; + } else { + for (NextWord nw : bigram) { + if (nw.word == secondWord) { + nw.frequency += addFrequency; + return nw.frequency; + } + } + } + NextWord nw = new NextWord(secondWord, addFrequency); + firstWord.ngrams.add(nw); + return addFrequency; + } + + /** + * Searches for the word and add the word if it does not exist. + * @return Returns the terminal node of the word we are searching for. + */ + private Node searchWord(NodeArray children, String word, int depth, Node parentNode) { + 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; + childNode.parent = parentNode; + children.add(childNode); + } + if (wordLength == depth + 1) { + // Terminate this word + childNode.terminal = true; + return childNode; + } + if (childNode.children == null) { + childNode.children = new NodeArray(); + } + return searchWord(childNode.children, word, depth + 1, childNode); + } + + @Override + public void getBigrams(final WordComposer codes, final CharSequence previousWord, + final WordCallback callback, int[] nextLettersFrequencies) { + synchronized (mUpdatingLock) { + // If we need to update, start off a background task + if (mRequiresReload) startDictionaryLoadingTaskLocked(); + // Currently updating contacts, don't return any results. + if (mUpdatingDictionary) return; + } + + Node prevWord = searchNode(mRoots, previousWord, 0, previousWord.length()); + if (prevWord != null && prevWord.ngrams != null) { + reverseLookUp(prevWord.ngrams, callback); + } + } + + /** + * reverseLookUp retrieves the full word given a list of terminal nodes and adds those words + * through callback. + * @param terminalNodes list of terminal nodes we want to add + */ + private void reverseLookUp(LinkedList terminalNodes, + final WordCallback callback) { + Node node; + int freq; + for (NextWord nextWord : terminalNodes) { + node = nextWord.word; + freq = nextWord.frequency; + sb.setLength(0); + do { + sb.insert(0, node.code); + node = node.parent; + } while(node != null); + + // TODO better way to feed char array? + callback.addWord(sb.toString().toCharArray(), 0, sb.length(), freq, mDicTypeId, + DataType.BIGRAM); + } + } + + /** + * Search for the terminal node of the word + * @return Returns the terminal node of the word if the word exists + */ + private Node searchNode(final NodeArray children, final CharSequence word, final int offset, + final int length) { + // TODO Consider combining with addWordRec + 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; + } + } else { + if (node.children != null) { + Node returnNode = searchNode(node.children, word, offset + 1, length); + if (returnNode != null) return returnNode; + } + } + } + } + return null; + } + protected void clearDictionary() { mRoots = new NodeArray(); } diff --git a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java index 718fda18d..923dce359 100644 --- a/java/src/com/android/inputmethod/latin/InputLanguageSelection.java +++ b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java @@ -99,7 +99,10 @@ public class InputLanguageSelection extends PreferenceActivity { boolean haveDictionary = false; conf.locale = locale; res.updateConfiguration(conf, res.getDisplayMetrics()); - BinaryDictionary bd = new BinaryDictionary(this, R.raw.main, Suggest.DIC_MAIN); + + int[] dictionaries = LatinIME.getDictionary(res, this.getPackageName()); + BinaryDictionary bd = new BinaryDictionary(this, dictionaries, Suggest.DIC_MAIN); + // Is the dictionary larger than a placeholder? Arbitrarily chose a lower limit of // 4000-5000 words, whereas the LARGE_DICTIONARY is about 20000+ words. if (bd.getSize() > Suggest.LARGE_DICTIONARY_THRESHOLD / 4) { diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index f5d13ac05..bbca316a4 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -20,6 +20,8 @@ import com.android.inputmethod.voice.FieldContext; import com.android.inputmethod.voice.SettingsUtil; import com.android.inputmethod.voice.VoiceInput; +import org.xmlpull.v1.XmlPullParserException; + import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; @@ -29,6 +31,7 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; +import android.content.res.XmlResourceParser; import android.inputmethodservice.InputMethodService; import android.inputmethodservice.Keyboard; import android.media.AudioManager; @@ -60,6 +63,7 @@ import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputMethodManager; import java.io.FileDescriptor; +import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; @@ -159,6 +163,8 @@ public class LatinIME extends InputMethodService KeyboardSwitcher mKeyboardSwitcher; private UserDictionary mUserDictionary; + // User Bigram is disabled for now + //private UserBigramDictionary mUserBigramDictionary; private ContactsDictionary mContactsDictionary; private AutoDictionary mAutoDictionary; @@ -383,6 +389,45 @@ public class LatinIME extends InputMethodService prefs.registerOnSharedPreferenceChangeListener(this); } + /** + * Loads a dictionary or multiple separated dictionary + * @return returns array of dictionary resource ids + */ + static int[] getDictionary(Resources res, String packageName) { + XmlResourceParser xrp = res.getXml(R.xml.dictionary); + int dictionaryCount = 0; + ArrayList dictionaries = new ArrayList(); + + try { + int current = xrp.getEventType(); + while (current != XmlResourceParser.END_DOCUMENT) { + if (current == XmlResourceParser.START_TAG) { + String tag = xrp.getName(); + if (tag != null) { + if (tag.equals("part")) { + String dictFileName = xrp.getAttributeValue(null, "name"); + dictionaries.add(res.getIdentifier(dictFileName, "raw", packageName)); + } + } + } + xrp.next(); + current = xrp.getEventType(); + } + } catch (XmlPullParserException e) { + Log.e(TAG, "Dictionary XML parsing failure"); + } catch (IOException e) { + Log.e(TAG, "Dictionary XML IOException"); + } + + int count = dictionaries.size(); + int[] dict = new int[count]; + for (int i = 0; i < count; i++) { + dict[i] = dictionaries.get(i); + } + + return dict; + } + private void initSuggest(String locale) { mInputLocale = locale; @@ -396,7 +441,9 @@ public class LatinIME extends InputMethodService } SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true); - mSuggest = new Suggest(this, R.raw.main); + + int[] dictionaries = getDictionary(orig, this.getPackageName()); + mSuggest = new Suggest(this, dictionaries); updateAutoTextEnabled(saveLocale); if (mUserDictionary != null) mUserDictionary.close(); mUserDictionary = new UserDictionary(this, mInputLocale); @@ -407,6 +454,15 @@ public class LatinIME extends InputMethodService mAutoDictionary.close(); } mAutoDictionary = new AutoDictionary(this, this, mInputLocale, Suggest.DIC_AUTO); + // User Bigram is disabled for now + /* + if (mUserBigramDictionary != null) { + mUserBigramDictionary.close(); + } + mUserBigramDictionary = new UserBigramDictionary(this, this, mInputLocale, + Suggest.DIC_USERBIGRAM); + mSuggest.setUserBigramDictionary(mUserBigramDictionary); + */ mSuggest.setUserDictionary(mUserDictionary); mSuggest.setContactsDictionary(mContactsDictionary); mSuggest.setAutoDictionary(mAutoDictionary); @@ -642,6 +698,8 @@ public class LatinIME extends InputMethodService mKeyboardSwitcher.getInputView().closing(); } if (mAutoDictionary != null) mAutoDictionary.flushPendingWrites(); + // User Bigram is disabled for now + //if (mUserBigramDictionary != null) mUserBigramDictionary.flushPendingWrites(); } @Override @@ -897,7 +955,7 @@ public class LatinIME extends InputMethodService } mCommittedLength = mComposing.length(); TextEntryState.acceptedTyped(mComposing); - checkAddToDictionary(mComposing, AutoDictionary.FREQUENCY_FOR_TYPED); + addToDictionaries(mComposing, AutoDictionary.FREQUENCY_FOR_TYPED); } updateSuggestions(); } @@ -1583,9 +1641,10 @@ public class LatinIME extends InputMethodService private void showSuggestions(WordComposer word) { //long startTime = System.currentTimeMillis(); // TIME MEASUREMENT! // TODO Maybe need better way of retrieving previous word - CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection()); + CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection(), + mWordSeparators); List stringList = mSuggest.getSuggestions( - mKeyboardSwitcher.getInputView(), word, false, prevWord); + mKeyboardSwitcher.getInputView(), word, false, prevWord); //long stopTime = System.currentTimeMillis(); // TIME MEASUREMENT! //Log.d("LatinIME","Suggest Total Time - " + (stopTime - startTime)); @@ -1601,7 +1660,8 @@ public class LatinIME extends InputMethodService boolean typedWordValid = mSuggest.isValidWord(typedWord) || (preferCapitalization() && mSuggest.isValidWord(typedWord.toString().toLowerCase())); - if (mCorrectionMode == Suggest.CORRECTION_FULL) { + if (mCorrectionMode == Suggest.CORRECTION_FULL + || mCorrectionMode == Suggest.CORRECTION_FULL_BIGRAM) { correctionAvailable |= typedWordValid; } // Don't auto-correct words with multiple capital letter @@ -1637,8 +1697,9 @@ public class LatinIME extends InputMethodService mJustAccepted = true; pickSuggestion(mBestWord, false); // Add the word to the auto dictionary if it's not a known word - checkAddToDictionary(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED); + addToDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED); return true; + } return false; } @@ -1692,7 +1753,9 @@ public class LatinIME extends InputMethodService pickSuggestion(suggestion, correcting); // Add the word to the auto dictionary if it's not a known word if (index == 0) { - checkAddToDictionary(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED); + addToDictionaries(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED); + } else { + addToBigramDictionary(suggestion, 1); } LatinImeLogger.logOnManualSuggestion(mComposing.toString(), suggestion.toString(), index, suggestions); @@ -1892,16 +1955,43 @@ public class LatinIME extends InputMethodService ic.setSelection(mLastSelectionStart, mLastSelectionStart); } - private void checkAddToDictionary(CharSequence suggestion, int frequencyDelta) { + private void addToDictionaries(CharSequence suggestion, int frequencyDelta) { + checkAddToDictionary(suggestion, frequencyDelta, false); + } + + private void addToBigramDictionary(CharSequence suggestion, int frequencyDelta) { + checkAddToDictionary(suggestion, frequencyDelta, true); + } + + /** + * Adds to the UserBigramDictionary and/or AutoDictionary + * @param addToBigramDictionary true if it should be added to bigram dictionary if possible + */ + private void checkAddToDictionary(CharSequence suggestion, int frequencyDelta, + boolean addToBigramDictionary) { if (suggestion == null || suggestion.length() < 1) return; // Only auto-add to dictionary if auto-correct is ON. Otherwise we'll be // adding words in situations where the user or application really didn't // want corrections enabled or learned. - if (!(mCorrectionMode == Suggest.CORRECTION_FULL)) return; - if (suggestion != null && mAutoDictionary.isValidWord(suggestion) - || (!mSuggest.isValidWord(suggestion.toString()) + if (!(mCorrectionMode == Suggest.CORRECTION_FULL + || mCorrectionMode == Suggest.CORRECTION_FULL_BIGRAM)) { + return; + } + if (suggestion != null) { + if (!addToBigramDictionary && mAutoDictionary.isValidWord(suggestion) + || (!mSuggest.isValidWord(suggestion.toString()) && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) { - mAutoDictionary.addWord(suggestion.toString(), frequencyDelta); + mAutoDictionary.addWord(suggestion.toString(), frequencyDelta); + } + // User Bigram is disabled for now + /* + if (mUserBigramDictionary != null) { + CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection()); + if (!TextUtils.isEmpty(prevWord)) { + mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString(), 1); + } + } + */ } } diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index b90547483..cfb691021 100755 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -34,6 +34,10 @@ import android.view.View; */ public class Suggest implements Dictionary.WordCallback { + private static final String TAG = "Suggest"; + + public static final int APPROX_MAX_WORD_LENGTH = 32; + public static final int CORRECTION_NONE = 0; public static final int CORRECTION_BASIC = 1; public static final int CORRECTION_FULL = 2; @@ -71,6 +75,8 @@ public class Suggest implements Dictionary.WordCallback { private Dictionary mContactsDictionary; + private Dictionary mUserBigramDictionary; + private int mPrefMaxSuggestions = 12; private int mPrefMaxBigrams = 255; @@ -95,7 +101,7 @@ public class Suggest implements Dictionary.WordCallback { private int mCorrectionMode = CORRECTION_BASIC; - public Suggest(Context context, int dictionaryResId) { + public Suggest(Context context, int[] dictionaryResId) { mMainDict = new BinaryDictionary(context, dictionaryResId, DIC_MAIN); initPool(); } @@ -107,7 +113,7 @@ public class Suggest implements Dictionary.WordCallback { private void initPool() { for (int i = 0; i < mPrefMaxSuggestions; i++) { - StringBuilder sb = new StringBuilder(Dictionary.MAX_WORD_LENGTH); + StringBuilder sb = new StringBuilder(getApproxMaxWordLength()); mStringPool.add(sb); } } @@ -128,6 +134,10 @@ public class Suggest implements Dictionary.WordCallback { return mMainDict.getSize() > LARGE_DICTIONARY_THRESHOLD; } + public int getApproxMaxWordLength() { + return APPROX_MAX_WORD_LENGTH; + } + /** * Sets an optional user dictionary resource to be loaded. The user dictionary is consulted * before the main dictionary, if set. @@ -147,6 +157,10 @@ public class Suggest implements Dictionary.WordCallback { mAutoDictionary = autoDictionary; } + public void setUserBigramDictionary(Dictionary userBigramDictionary) { + mUserBigramDictionary = userBigramDictionary; + } + /** * Number of suggestions to generate from the input key sequence. This has * to be a number between 1 and 100 (inclusive). @@ -162,7 +176,7 @@ public class Suggest implements Dictionary.WordCallback { mBigramPriorities = new int[mPrefMaxBigrams]; collectGarbage(mSuggestions, mPrefMaxSuggestions); while (mStringPool.size() < mPrefMaxSuggestions) { - StringBuilder sb = new StringBuilder(Dictionary.MAX_WORD_LENGTH); + StringBuilder sb = new StringBuilder(getApproxMaxWordLength()); mStringPool.add(sb); } } @@ -224,10 +238,9 @@ public class Suggest implements Dictionary.WordCallback { mLowerOriginalWord = ""; } - // Search the dictionary only if there are at least 2 characters if (wordComposer.size() == 1 && (mCorrectionMode == CORRECTION_FULL_BIGRAM || mCorrectionMode == CORRECTION_BASIC)) { - // At first character, just get the bigrams + // At first character typed, search only the bigrams Arrays.fill(mBigramPriorities, 0); collectGarbage(mBigramSuggestions, mPrefMaxBigrams); @@ -236,17 +249,29 @@ public class Suggest implements Dictionary.WordCallback { if (mMainDict.isValidWord(lowerPrevWord)) { prevWordForBigram = lowerPrevWord; } - mMainDict.getBigrams(wordComposer, prevWordForBigram, this, - mNextLettersFrequencies); + if (mUserBigramDictionary != null) { + mUserBigramDictionary.getBigrams(wordComposer, prevWordForBigram, this, + mNextLettersFrequencies); + } + if (mContactsDictionary != null) { + mContactsDictionary.getBigrams(wordComposer, prevWordForBigram, this, + mNextLettersFrequencies); + } + if (mMainDict != null) { + mMainDict.getBigrams(wordComposer, prevWordForBigram, this, + mNextLettersFrequencies); + } char currentChar = wordComposer.getTypedWord().charAt(0); + char currentCharUpper = Character.toUpperCase(currentChar); int count = 0; int bigramSuggestionSize = mBigramSuggestions.size(); for (int i = 0; i < bigramSuggestionSize; i++) { - if (mBigramSuggestions.get(i).charAt(0) == currentChar) { + if (mBigramSuggestions.get(i).charAt(0) == currentChar + || mBigramSuggestions.get(i).charAt(0) == currentCharUpper) { int poolSize = mStringPool.size(); StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) - : new StringBuilder(Dictionary.MAX_WORD_LENGTH); + : new StringBuilder(getApproxMaxWordLength()); sb.setLength(0); sb.append(mBigramSuggestions.get(i)); mSuggestions.add(count++, sb); @@ -256,7 +281,7 @@ public class Suggest implements Dictionary.WordCallback { } } else if (wordComposer.size() > 1) { - // Search the dictionary only if there are at least 2 characters + // At second character typed, search the unigrams (scores being affected by bigrams) if (mUserDictionary != null || mContactsDictionary != null) { if (mUserDictionary != null) { mUserDictionary.getWords(wordComposer, this, mNextLettersFrequencies); @@ -277,7 +302,6 @@ public class Suggest implements Dictionary.WordCallback { mHaveCorrection = true; } } - if (mOriginalWord != null) { mSuggestions.add(0, mOriginalWord.toString()); } @@ -290,7 +314,6 @@ public class Suggest implements Dictionary.WordCallback { mHaveCorrection = false; } } - if (mAutoTextEnabled) { int i = 0; int max = 6; @@ -401,7 +424,7 @@ public class Suggest implements Dictionary.WordCallback { / MAXIMUM_BIGRAM_FREQUENCY) * (BIGRAM_MULTIPLIER_MAX - BIGRAM_MULTIPLIER_MIN) + BIGRAM_MULTIPLIER_MIN; - /* Log.d("Suggest","bigram num: " + bigramSuggestion + /* Log.d(TAG,"bigram num: " + bigramSuggestion + " wordB: " + mBigramSuggestions.get(bigramSuggestion).toString() + " currentPriority: " + freq + " bigramPriority: " + mBigramPriorities[bigramSuggestion] @@ -430,7 +453,7 @@ public class Suggest implements Dictionary.WordCallback { priorities[pos] = freq; int poolSize = mStringPool.size(); StringBuilder sb = poolSize > 0 ? (StringBuilder) mStringPool.remove(poolSize - 1) - : new StringBuilder(Dictionary.MAX_WORD_LENGTH); + : new StringBuilder(getApproxMaxWordLength()); sb.setLength(0); if (mCapitalize) { sb.append(Character.toUpperCase(word[offset])); diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp index 4fe80da69..bf7ec0d1a 100644 --- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp +++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp @@ -67,8 +67,9 @@ static int latinime_BinaryDictionary_getSuggestions( int *nextLetters = nextLettersArray != NULL ? env->GetIntArrayElements(nextLettersArray, NULL) : NULL; - int count = dictionary->getSuggestions(inputCodes, arraySize, (unsigned short*) outputChars, frequencies, - maxWordLength, maxWords, maxAlternatives, skipPos, nextLetters, nextLettersSize); + int count = dictionary->getSuggestions(inputCodes, arraySize, (unsigned short*) outputChars, + frequencies, maxWordLength, maxWords, maxAlternatives, skipPos, nextLetters, + nextLettersSize); env->ReleaseIntArrayElements(frequencyArray, frequencies, 0); env->ReleaseIntArrayElements(inputArray, inputCodes, JNI_ABORT); @@ -81,20 +82,24 @@ static int latinime_BinaryDictionary_getSuggestions( } static int latinime_BinaryDictionary_getBigrams - (JNIEnv *env, jobject object, jint dict, jcharArray wordArray, jint wordLength, - jcharArray outputArray, jintArray frequencyArray, jint maxWordLength, jint maxBigrams) + (JNIEnv *env, jobject object, jint dict, jcharArray prevWordArray, jint prevWordLength, + jintArray inputArray, jint inputArraySize, jcharArray outputArray, + jintArray frequencyArray, jint maxWordLength, jint maxBigrams, jint maxAlternatives) { Dictionary *dictionary = (Dictionary*) dict; if (dictionary == NULL) return 0; - jchar *word = env->GetCharArrayElements(wordArray, NULL); + jchar *prevWord = env->GetCharArrayElements(prevWordArray, NULL); + int *inputCodes = env->GetIntArrayElements(inputArray, NULL); jchar *outputChars = env->GetCharArrayElements(outputArray, NULL); int *frequencies = env->GetIntArrayElements(frequencyArray, NULL); - int count = dictionary->getBigrams((unsigned short*) word, wordLength, - (unsigned short*) outputChars, frequencies, maxWordLength, maxBigrams); + int count = dictionary->getBigrams((unsigned short*) prevWord, prevWordLength, inputCodes, + inputArraySize, (unsigned short*) outputChars, frequencies, maxWordLength, maxBigrams, + maxAlternatives); - env->ReleaseCharArrayElements(wordArray, word, JNI_ABORT); + env->ReleaseCharArrayElements(prevWordArray, prevWord, JNI_ABORT); + env->ReleaseIntArrayElements(inputArray, inputCodes, JNI_ABORT); env->ReleaseCharArrayElements(outputArray, outputChars, 0); env->ReleaseIntArrayElements(frequencyArray, frequencies, 0); @@ -130,7 +135,7 @@ static JNINativeMethod gMethods[] = { {"closeNative", "(I)V", (void*)latinime_BinaryDictionary_close}, {"getSuggestionsNative", "(I[II[C[IIIII[II)I", (void*)latinime_BinaryDictionary_getSuggestions}, {"isValidWordNative", "(I[CI)Z", (void*)latinime_BinaryDictionary_isValidWord}, - {"getBigramsNative", "(I[CI[C[III)I", (void*)latinime_BinaryDictionary_getBigrams} + {"getBigramsNative", "(I[CI[II[C[IIII)I", (void*)latinime_BinaryDictionary_getBigrams} }; static int registerNativeMethods(JNIEnv* env, const char* className, diff --git a/native/src/dictionary.cpp b/native/src/dictionary.cpp index a1a632faa..1a39f585b4 100644 --- a/native/src/dictionary.cpp +++ b/native/src/dictionary.cpp @@ -387,13 +387,17 @@ Dictionary::getBigramFreq(int *pos) int -Dictionary::getBigrams(unsigned short *prevWord, int prevWordLength, unsigned short *bigramChars, - int *bigramFreq, int maxWordLength, int maxBigrams) +Dictionary::getBigrams(unsigned short *prevWord, int prevWordLength, int *codes, int codesSize, + unsigned short *bigramChars, int *bigramFreq, int maxWordLength, int maxBigrams, + int maxAlternatives) { mBigramFreq = bigramFreq; mBigramChars = bigramChars; + mInputCodes = codes; + mInputLength = codesSize; mMaxWordLength = maxWordLength; mMaxBigrams = maxBigrams; + mMaxAlternatives = maxAlternatives; if (mBigram == 1 && checkIfDictVersionIsLatest()) { int pos = isValidWordRec(DICTIONARY_HEADER_SIZE, prevWord, 0, prevWordLength); @@ -406,7 +410,7 @@ Dictionary::getBigrams(unsigned short *prevWord, int prevWordLength, unsigned sh int bigramExist = (mDict[pos] & FLAG_BIGRAM_READ); if (bigramExist > 0) { int nextBigramExist = 1; - while (nextBigramExist > 0) { + while (nextBigramExist > 0 && bigramCount < maxBigrams) { int bigramAddress = getBigramAddress(&pos, true); int frequency = (FLAG_BIGRAM_FREQ & mDict[pos]); // search for all bigrams and store them @@ -521,8 +525,27 @@ Dictionary::searchForTerminalNode(int addressLookingFor, int frequency) break; } } + if (checkFirstCharacter(word)) { + addWordBigram(word, depth, frequency); + } +} - addWordBigram(word, depth, frequency); +bool +Dictionary::checkFirstCharacter(unsigned short *word) +{ + // Checks whether this word starts with same character or neighboring characters of + // what user typed. + + int *inputCodes = mInputCodes; + int maxAlt = mMaxAlternatives; + while (maxAlt > 0) { + if ((unsigned int) *inputCodes == (unsigned int) *word) { + return true; + } + inputCodes++; + maxAlt--; + } + return false; } bool diff --git a/native/src/dictionary.h b/native/src/dictionary.h index 2c574290f..d13496e01 100644 --- a/native/src/dictionary.h +++ b/native/src/dictionary.h @@ -39,8 +39,9 @@ public: int getSuggestions(int *codes, int codesSize, unsigned short *outWords, int *frequencies, int maxWordLength, int maxWords, int maxAlternatives, int skipPos, int *nextLetters, int nextLettersSize); - int getBigrams(unsigned short *word, int length, unsigned short *outWords, int *frequencies, - int maxWordLength, int maxBigrams); + int getBigrams(unsigned short *word, int length, int *codes, int codesSize, + unsigned short *outWords, int *frequencies, int maxWordLength, int maxBigrams, + int maxAlternatives); bool isValidWord(unsigned short *word, int length); void setAsset(void *asset) { mAsset = asset; } void *getAsset() { return mAsset; } @@ -64,6 +65,7 @@ private: int wideStrLen(unsigned short *str); bool sameAsTyped(unsigned short *word, int length); + bool checkFirstCharacter(unsigned short *word); bool addWord(unsigned short *word, int length, int frequency); bool addWordBigram(unsigned short *word, int length, int frequency); unsigned short toLowerCase(unsigned short c); diff --git a/tests/res/raw/testtext.txt b/tests/res/raw/testtext.txt new file mode 100644 index 000000000..eca20c05f --- /dev/null +++ b/tests/res/raw/testtext.txt @@ -0,0 +1,24 @@ +This text is used as test text for measuring performance of dictionary prediction. Any text can be put into this file to test the performance (total keystroke savings). +When you think about “information,” what probably comes to mind are streams of words and numbers. Google’s pretty good at organizing these types of information, but consider all the things you can’t express with words: what does it look like in the middle of a sandstorm? What are some great examples of Art Nouveau architecture? Should I consider wedding cupcakes instead of a traditional cake? +This is why we built Google Images in 2001. We realized that for many searches, the best answer wasn’t text—it was an image or a set of images. The service has grown quite a bit since then. In 2001, we indexed around 250 million images. By 2005, we had indexed over 1 billion. And today, we have an index of over 10 billion images. +It’s not just about quantity, though. Over the past decade we’ve been baking deep computer science into Google Images to make it even faster and easier for you to find precisely the right images. We not only find images for pretty much anything you type in; we can also instantly pull out images of clip art, line drawings, faces and even colors. +There’s even more sophisticated computer vision technology powering our “Similar images” tool. For example, did you know there are nine subspecies of leopards, each with a distinct pattern of spots? Google Images can recognize the difference, returning just leopards of a particular subspecies. It can tell you the name of the subspecies in a particular image—even if that image isn’t labeled—because other similar leopard images on the web are labeled with that subspecies’s name. +And our “Similar colors” refinement doesn’t just return images based on the overall color of an image. If it did, lots of images would simply be classified as “white.” If you’re looking for [tulips] and you refine results to “white,” you really want images in which the tulips themselves are white—not the surrounding image. It takes some heavy-duty algorithmic wizardry and processing power for a search engine to understand what the items of interest are in all the images out there. +Those are just a few of the technologies we’ve built to make Google Images more useful. Meanwhile, the quantity and variety of images on the web has ballooned since 2001, and images have become one of the most popular types of content people search for. So over the next few days we’re rolling out an update to Google Images to match the scope and beauty of this fast-growing visual web, and to bring to the surface some of the powerful technology behind Images. +Here’s what’s new in this refreshed design of Google Images: +Dense tiled layout designed to make it easy to look at lots of images at once. We want to get the app out of the way so you can find what you’re really looking for. +Instant scrolling between pages, without letting you get lost in the images. You can now get up to 1,000 images, all in one scrolling page. And we’ll show small, unobtrusive page numbers so you don’t lose track of where you are. +Larger thumbnail previews on the results page, designed for modern browsers and high-res screens. +A hover pane that appears when you mouse over a given thumbnail image, giving you a larger preview, more info about the image and other image-specific features such as “Similar images.” +Once you click on an image, you’re taken to a new landing page that displays a large image in context, with the website it’s hosted on visible right behind it. Click anywhere outside the image, and you’re right in the original page where you can learn more about the source and context. +Optimized keyboard navigation for faster scrolling through many pages, taking advantage of standard web keyboard shortcuts such as Page Up / Page Down. It’s all about getting you to the info you need quickly, so you can get on with actually building that treehouse or buying those flowers. +Apple's not really ready to say it's sorry about the iPhone 4 antenna design, but it is willing to give all you darn squeaky wheels free cases for your trouble. Since Apple can't build its own Bumpers fast enough, it will give you a few options and let you decide, then send it your way for free as long as you purchased the phone before September 30th. Not good enough for you? Well, if you already bought a bumper from Apple you'll get a refund, and you can also return your phone for a full refund within 30 days as long as it's unharmed. +This solution comes at the end of 22 days of Apple engineers "working their butts off," according to Steve, with "physics" ultimately being pinned as the main culprit. Apple claims you can replicate the left-handed "death grip" bar-dropping problem on the BlackBerry Bold 9700, HTC Droid Eris, and Samsung Omnia II, and that "phones aren't perfect." Steve also claims that only 0.55% of people who bought the iPhone 4 have called into AppleCare to complain about the antenna, and the phone has a 1.7% return rate at AT&T, compared to 6% with the 3GS, though he would cop to a slight increase in dropped calls over the iPhone 3GS. For this Steve has what he confesses to be a pet theory: that 3GS users were using the case they had from the 3G, and therefore weren't met with the horrible reality of a naked, call dropping handset. Hence the free case solution, which will probably satisfy some, infuriate others, and never even blip onto the radar of many of the massive horde of consumers that's devoured this product in unprecedented numbers. +Update: Our own Richard Lai just waltzed down to the Regent Street Apple Store in London with his iPhone Bumper receipt in hand. A few minutes later he left with cold, hard cash, and kept the Bumper to boot. Seems as if the refund effort is a go, at least over in the UK. +Update 2: We've heard from several tipsters saying Apple no longer does Bumper refunds at its stores; customers will now have to make an online claim instead. Looks like we got super lucky. +If you have ever received an instant message, text message, or any text-based chat message that seemed to be written in a foreign language, this Webopedia Quick Reference will help you decipher the text chat lingo by providing the definitions to more than 1,300 chat, text message, and Twitter abbreviations. +With the popularity and rise in real-time text-based communications, such as Facebook, Twitter, instant messaging, e-mail, Internet and online gaming services, chat rooms, discussion boards and mobile phone text messaging (SMS), came the emergence of a new language tailored to the immediacy and compactness of these new communication media. +While it does seem incredible that there are so many chat abbreviations, remember that different chat abbreviations are used by different groups of people when communicating online. Some of the following chat abbreviations may be familiar to you, while others may be foreign because they are used by a group of people with different online interests and hobbies than your own. For example, people playing online games are likely to use chat abbreviations that are different than those used by someone running a financial blog updating their Twitter status. +Twitter is a free microblog, or social messaging tool that lets people stay connected through brief text message updates up to 140 characters in length. Twitter is based on you answering the question "What are you doing?" You then post thoughts, observations and goings-on during the day in answer to that question. Your update is posted on your Twitter profile page through SMS text messaging, the Twitter Web site, instant messaging, RSS, e-mail or through other social applications and sites, such as Facebook. +As with any new social medium, there is an entire vocabulary that users of the Twitter service adopt. Many of the new lingo Twitter-based terms and phrases are used to describe the collection of people who use the service, while other terms are used in reference to describe specific functions and features of the service itself. Also, there are a number of "chat terms," which are basically shorthand abbreviations that users often include in their tweets. Lastly, our guide also provides descriptions to a number of Twitter tools and applications that you can use to enhance your Twitter experience. +Here are definitions to more than 100 Twitter-related abbreviations, words, phrases, and tools that are associated with the Twitter microblogging service. If you know of a Twitter slang term or application name that is not included in our Twitter Dictionary, please let us know. diff --git a/tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java b/tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java new file mode 100644 index 000000000..e3e995a23 --- /dev/null +++ b/tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2010 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.tests; + +import android.content.Context; +import android.test.AndroidTestCase; +import android.text.TextUtils; +import android.util.Log; +import com.android.inputmethod.latin.Suggest; +import com.android.inputmethod.latin.WordComposer; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.Channels; +import java.util.List; + +public class SuggestHelper { + private Suggest mSuggest; + private final String TAG; + + public SuggestHelper(String tag, Context context, int[] resId) { + TAG = tag; + try { + // merging separated dictionary into one if dictionary is separated + int total = 0; + InputStream[] res = new InputStream[resId.length]; + for (int i = 0; i < resId.length; i++) { + res[i] = context.getResources().openRawResource(resId[i]); + total += res[i].available(); + } + + ByteBuffer byteBuffer = + ByteBuffer.allocateDirect(total).order(ByteOrder.nativeOrder()); + int got = 0; + for (int i = 0; i < resId.length; i++) { + got += Channels.newChannel(res[i]).read(byteBuffer); + } + if (got != total) { + Log.w(TAG, "Read " + got + " bytes, expected " + total); + } else { + mSuggest = new Suggest(context, byteBuffer); + Log.i(TAG, "Created mSuggest " + total + " bytes"); + } + } catch (IOException e) { + Log.w(TAG, "No available memory for binary dictionary"); + } finally { + try { + for (int i = 0;i < is.length; i++) { + res[i].close(); + } + } catch (IOException e) { + Log.w(TAG, "Failed to close input stream"); + } + } + mSuggest.setAutoTextEnabled(false); + mSuggest.setCorrectionMode(Suggest.CORRECTION_FULL_BIGRAM); + } + + private WordComposer createWordComposer(CharSequence s) { + WordComposer word = new WordComposer(); + for (int i = 0; i < s.length(); i++) { + final char c = s.charAt(i); + int[] codes; + // If it's not a lowercase letter, don't find adjacent letters + if (c < 'a' || c > 'z') { + codes = new int[] { c }; + } else { + codes = adjacents[c - 'a']; + } + word.add(c, codes); + } + return word; + } + + private void showList(String title, List suggestions) { + Log.i(TAG, title); + for (int i = 0; i < suggestions.size(); i++) { + Log.i(title, suggestions.get(i) + ", "); + } + } + + private boolean isDefaultSuggestion(List suggestions, CharSequence word) { + // Check if either the word is what you typed or the first alternative + return suggestions.size() > 0 && + (/*TextUtils.equals(suggestions.get(0), word) || */ + (suggestions.size() > 1 && TextUtils.equals(suggestions.get(1), word))); + } + + boolean isDefaultSuggestion(CharSequence typed, CharSequence expected) { + WordComposer word = createWordComposer(typed); + List suggestions = mSuggest.getSuggestions(null, word, false, null); + return isDefaultSuggestion(suggestions, expected); + } + + boolean isDefaultCorrection(CharSequence typed, CharSequence expected) { + WordComposer word = createWordComposer(typed); + List suggestions = mSuggest.getSuggestions(null, word, false, null); + return isDefaultSuggestion(suggestions, expected) && mSuggest.hasMinimalCorrection(); + } + + boolean isASuggestion(CharSequence typed, CharSequence expected) { + WordComposer word = createWordComposer(typed); + List suggestions = mSuggest.getSuggestions(null, word, false, null); + for (int i = 1; i < suggestions.size(); i++) { + if (TextUtils.equals(suggestions.get(i), expected)) return true; + } + return false; + } + + private void getBigramSuggestions(CharSequence previous, CharSequence typed) { + if(!TextUtils.isEmpty(previous) && (typed.length() > 1)) { + WordComposer firstChar = createWordComposer(typed.charAt(0) + ""); + mSuggest.getSuggestions(null, firstChar, false, previous); + } + } + + boolean isDefaultNextSuggestion(CharSequence previous, CharSequence typed, + CharSequence expected) { + WordComposer word = createWordComposer(typed); + getBigramSuggestions(previous, typed); + List suggestions = mSuggest.getSuggestions(null, word, false, previous); + return isDefaultSuggestion(suggestions, expected); + } + + boolean isDefaultNextCorrection(CharSequence previous, CharSequence typed, + CharSequence expected) { + WordComposer word = createWordComposer(typed); + getBigramSuggestions(previous, typed); + List suggestions = mSuggest.getSuggestions(null, word, false, previous); + return isDefaultSuggestion(suggestions, expected) && mSuggest.hasMinimalCorrection(); + } + + boolean isASuggestion(CharSequence previous, CharSequence typed, + CharSequence expected) { + WordComposer word = createWordComposer(typed); + getBigramSuggestions(previous, typed); + List suggestions = mSuggest.getSuggestions(null, word, false, previous); + for (int i = 1; i < suggestions.size(); i++) { + if (TextUtils.equals(suggestions.get(i), expected)) return true; + } + return false; + } + + boolean isValid(CharSequence typed) { + return mSuggest.isValidWord(typed); + } + + final int[][] adjacents = { + {'a','s','w','q',-1}, + {'b','h','v','n','g','j',-1}, + {'c','v','f','x','g',}, + {'d','f','r','e','s','x',-1}, + {'e','w','r','s','d',-1}, + {'f','g','d','c','t','r',-1}, + {'g','h','f','y','t','v',-1}, + {'h','j','u','g','b','y',-1}, + {'i','o','u','k',-1}, + {'j','k','i','h','u','n',-1}, + {'k','l','o','j','i','m',-1}, + {'l','k','o','p',-1}, + {'m','k','n','l',-1}, + {'n','m','j','k','b',-1}, + {'o','p','i','l',-1}, + {'p','o',-1}, + {'q','w',-1}, + {'r','t','e','f',-1}, + {'s','d','e','w','a','z',-1}, + {'t','y','r',-1}, + {'u','y','i','h','j',-1}, + {'v','b','g','c','h',-1}, + {'w','e','q',-1}, + {'x','c','d','z','f',-1}, + {'y','u','t','h','g',-1}, + {'z','s','x','a','d',-1}, + }; +} diff --git a/tests/src/com/android/inputmethod/latin/tests/SuggestPerformanceTests.java b/tests/src/com/android/inputmethod/latin/tests/SuggestPerformanceTests.java new file mode 100644 index 000000000..473c440f9 --- /dev/null +++ b/tests/src/com/android/inputmethod/latin/tests/SuggestPerformanceTests.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2010 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.tests; + +import android.test.AndroidTestCase; +import android.util.Log; + +import java.io.InputStreamReader; +import java.io.InputStream; +import java.io.BufferedReader; +import java.util.StringTokenizer; +import java.util.regex.Pattern; + +public class SuggestPerformanceTests extends AndroidTestCase { + private static final String TAG = "SuggestPerformanceTests"; + + private String mTestText; + private SuggestHelper sh; + + @Override + protected void setUp() { + // TODO Figure out a way to directly using the dictionary rather than copying it over + + // For testing with real dictionary, TEMPORARILY COPY main dictionary into test directory. + // DO NOT SUBMIT real dictionary under test directory. + //int[] resId = new int[] { R.raw.main0, R.raw.main1, R.raw.main2 }; + + int[] resId = new int[] { R.raw.test }; + + sh = new SuggestHelper(TAG, getTestContext(), resId); + loadString(); + } + + private void loadString() { + try { + InputStream is = getTestContext().getResources().openRawResource(R.raw.testtext); + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + StringBuilder sb = new StringBuilder(); + String line = reader.readLine(); + while (line != null) { + sb.append(line + " "); + line = reader.readLine(); + } + mTestText = sb.toString(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /************************** Helper functions ************************/ + private int lookForSuggestion(String prevWord, String currentWord) { + for (int i = 1; i < currentWord.length(); i++) { + if (i == 1) { + if (sh.isDefaultNextSuggestion(prevWord, currentWord.substring(0, i), + currentWord)) { + return i; + } + } else { + if (sh.isDefaultNextCorrection(prevWord, currentWord.substring(0, i), + currentWord)) { + return i; + } + } + } + return currentWord.length(); + } + + private double runText(boolean withBigrams) { + StringTokenizer st = new StringTokenizer(mTestText); + String prevWord = null; + int typeCount = 0; + int characterCount = 0; // without space + int wordCount = 0; + while (st.hasMoreTokens()) { + String currentWord = st.nextToken(); + boolean endCheck = false; + if (currentWord.matches("[\\w]*[\\.|?|!|*|@|&|/|:|;]")) { + currentWord = currentWord.substring(0, currentWord.length() - 1); + endCheck = true; + } + if (withBigrams && prevWord != null) { + typeCount += lookForSuggestion(prevWord, currentWord); + } else { + typeCount += lookForSuggestion(null, currentWord); + } + characterCount += currentWord.length(); + if (!endCheck) prevWord = currentWord; + wordCount++; + } + + double result = (double) (characterCount - typeCount) / characterCount * 100; + if (withBigrams) { + Log.i(TAG, "with bigrams -> " + result + " % saved!"); + } else { + Log.i(TAG, "without bigrams -> " + result + " % saved!"); + } + Log.i(TAG, "\ttotal number of words: " + wordCount); + Log.i(TAG, "\ttotal number of characters: " + mTestText.length()); + Log.i(TAG, "\ttotal number of characters without space: " + characterCount); + Log.i(TAG, "\ttotal number of characters typed: " + typeCount); + return result; + } + + + /************************** Performance Tests ************************/ + /** + * Compare the Suggest with and without bigram + * Check the log for detail + */ + public void testSuggestPerformance() { + assertTrue(runText(false) < runText(true)); + } +} diff --git a/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java b/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java index 318cc7ccd..a42422b91 100644 --- a/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java +++ b/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java @@ -1,171 +1,33 @@ +/* + * Copyright (C) 2010 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.tests; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.channels.Channels; -import java.util.List; - -import android.content.Context; import android.test.AndroidTestCase; -import android.text.TextUtils; import android.util.Log; -import com.android.inputmethod.latin.Suggest; -import com.android.inputmethod.latin.WordComposer; - public class SuggestTests extends AndroidTestCase { private static final String TAG = "SuggestTests"; - private Suggest mSuggest; - - int[][] adjacents = { - {'a','s','w','q',-1}, - {'b','h','v','n','g','j',-1}, - {'c','v','f','x','g',}, - {'d','f','r','e','s','x',-1}, - {'e','w','r','s','d',-1}, - {'f','g','d','c','t','r',-1}, - {'g','h','f','y','t','v',-1}, - {'h','j','u','g','b','y',-1}, - {'i','o','u','k',-1}, - {'j','k','i','h','u','n',-1}, - {'k','l','o','j','i','m',-1}, - {'l','k','o','p',-1}, - {'m','k','n','l',-1}, - {'n','m','j','k','b',-1}, - {'o','p','i','l',-1}, - {'p','o',-1}, - {'q','w',-1}, - {'r','t','e','f',-1}, - {'s','d','e','w','a','z',-1}, - {'t','y','r',-1}, - {'u','y','i','h','j',-1}, - {'v','b','g','c','h',-1}, - {'w','e','q',-1}, - {'x','c','d','z','f',-1}, - {'y','u','t','h','g',-1}, - {'z','s','x','a','d',-1}, - }; + private SuggestHelper sh; @Override protected void setUp() { - final Context context = getTestContext(); - InputStream is = context.getResources().openRawResource(R.raw.test); - Log.i(TAG, "Stream type is " + is); - try { - int avail = is.available(); - if (avail > 0) { - ByteBuffer byteBuffer = - ByteBuffer.allocateDirect(avail).order(ByteOrder.nativeOrder()); - int got = Channels.newChannel(is).read(byteBuffer); - if (got != avail) { - Log.e(TAG, "Read " + got + " bytes, expected " + avail); - } else { - mSuggest = new Suggest(context, byteBuffer); - Log.i(TAG, "Created mSuggest " + avail + " bytes"); - } - } - } catch (IOException ioe) { - Log.w(TAG, "No available size for binary dictionary"); - } - mSuggest.setAutoTextEnabled(false); - mSuggest.setCorrectionMode(Suggest.CORRECTION_FULL_BIGRAM); - } - - /************************** Helper functions ************************/ - - private WordComposer createWordComposer(CharSequence s) { - WordComposer word = new WordComposer(); - for (int i = 0; i < s.length(); i++) { - final char c = s.charAt(i); - int[] codes; - // If it's not a lowercase letter, don't find adjacent letters - if (c < 'a' || c > 'z') { - codes = new int[] { c }; - } else { - codes = adjacents[c - 'a']; - } - word.add(c, codes); - } - return word; - } - - private void showList(String title, List suggestions) { - Log.i(TAG, title); - for (int i = 0; i < suggestions.size(); i++) { - Log.i(title, suggestions.get(i) + ", "); - } - } - - private boolean isDefaultSuggestion(List suggestions, CharSequence word) { - // Check if either the word is what you typed or the first alternative - return suggestions.size() > 0 && - (/*TextUtils.equals(suggestions.get(0), word) || */ - (suggestions.size() > 1 && TextUtils.equals(suggestions.get(1), word))); - } - - private boolean isDefaultSuggestion(CharSequence typed, CharSequence expected) { - WordComposer word = createWordComposer(typed); - List suggestions = mSuggest.getSuggestions(null, word, false, null); - return isDefaultSuggestion(suggestions, expected); - } - - private void getBigramSuggestions(CharSequence previous, CharSequence typed) { - if(!TextUtils.isEmpty(previous) && (typed.length() > 1)) { - WordComposer firstChar = createWordComposer(typed.charAt(0) + ""); - mSuggest.getSuggestions(null, firstChar, false, previous); - } - } - - private boolean isDefaultNextSuggestion(CharSequence previous, CharSequence typed, - CharSequence expected) { - WordComposer word = createWordComposer(typed); - getBigramSuggestions(previous, typed); - List suggestions = mSuggest.getSuggestions(null, word, false, previous); - return isDefaultSuggestion(suggestions, expected); - } - - private boolean isDefaultCorrection(CharSequence typed, CharSequence expected) { - WordComposer word = createWordComposer(typed); - List suggestions = mSuggest.getSuggestions(null, word, false, null); - return isDefaultSuggestion(suggestions, expected) && mSuggest.hasMinimalCorrection(); - } - - private boolean isDefaultNextCorrection(CharSequence previous, CharSequence typed, - CharSequence expected) { - WordComposer word = createWordComposer(typed); - getBigramSuggestions(previous, typed); - List suggestions = mSuggest.getSuggestions(null, word, false, previous); - for(int i=0;i suggestions = mSuggest.getSuggestions(null, word, false, null); - for (int i = 1; i < suggestions.size(); i++) { - if (TextUtils.equals(suggestions.get(i), expected)) return true; - } - return false; - } - - private boolean isASuggestion(CharSequence previous, CharSequence typed, - CharSequence expected) { - WordComposer word = createWordComposer(typed); - getBigramSuggestions(previous, typed); - List suggestions = mSuggest.getSuggestions(null, word, false, previous); - for (int i = 1; i < suggestions.size(); i++) { - if (TextUtils.equals(suggestions.get(i), expected)) return true; - } - return false; - } - - private boolean isValid(CharSequence typed) { - return mSuggest.isValidWord(typed); + int[] resId = new int[] { R.raw.test }; + sh = new SuggestHelper(TAG, getTestContext(), resId); } /************************** Tests ************************/ @@ -174,87 +36,87 @@ public class SuggestTests extends AndroidTestCase { * Tests for simple completions of one character. */ public void testCompletion1char() { - assertTrue(isDefaultSuggestion("peopl", "people")); - assertTrue(isDefaultSuggestion("abou", "about")); - assertTrue(isDefaultSuggestion("thei", "their")); + assertTrue(sh.isDefaultSuggestion("peopl", "people")); + assertTrue(sh.isDefaultSuggestion("abou", "about")); + assertTrue(sh.isDefaultSuggestion("thei", "their")); } /** * Tests for simple completions of two characters. */ public void testCompletion2char() { - assertTrue(isDefaultSuggestion("peop", "people")); - assertTrue(isDefaultSuggestion("calli", "calling")); - assertTrue(isDefaultSuggestion("busine", "business")); + assertTrue(sh.isDefaultSuggestion("peop", "people")); + assertTrue(sh.isDefaultSuggestion("calli", "calling")); + assertTrue(sh.isDefaultSuggestion("busine", "business")); } /** * Tests for proximity errors. */ public void testProximityPositive() { - assertTrue(isDefaultSuggestion("peiple", "people")); - assertTrue(isDefaultSuggestion("peoole", "people")); - assertTrue(isDefaultSuggestion("pwpple", "people")); + assertTrue(sh.isDefaultSuggestion("peiple", "people")); + assertTrue(sh.isDefaultSuggestion("peoole", "people")); + assertTrue(sh.isDefaultSuggestion("pwpple", "people")); } /** * Tests for proximity errors - negative, when the error key is not near. */ public void testProximityNegative() { - assertFalse(isDefaultSuggestion("arout", "about")); - assertFalse(isDefaultSuggestion("ire", "are")); + assertFalse(sh.isDefaultSuggestion("arout", "about")); + assertFalse(sh.isDefaultSuggestion("ire", "are")); } /** * Tests for checking if apostrophes are added automatically. */ public void testApostropheInsertion() { - assertTrue(isDefaultSuggestion("im", "I'm")); - assertTrue(isDefaultSuggestion("dont", "don't")); + assertTrue(sh.isDefaultSuggestion("im", "I'm")); + assertTrue(sh.isDefaultSuggestion("dont", "don't")); } /** * Test to make sure apostrophed word is not suggested for an apostrophed word. */ public void testApostrophe() { - assertFalse(isDefaultSuggestion("don't", "don't")); + assertFalse(sh.isDefaultSuggestion("don't", "don't")); } /** * Tests for suggestion of capitalized version of a word. */ public void testCapitalization() { - assertTrue(isDefaultSuggestion("i'm", "I'm")); - assertTrue(isDefaultSuggestion("sunday", "Sunday")); - assertTrue(isDefaultSuggestion("sundat", "Sunday")); + assertTrue(sh.isDefaultSuggestion("i'm", "I'm")); + assertTrue(sh.isDefaultSuggestion("sunday", "Sunday")); + assertTrue(sh.isDefaultSuggestion("sundat", "Sunday")); } /** * Tests to see if more than one completion is provided for certain prefixes. */ public void testMultipleCompletions() { - assertTrue(isASuggestion("com", "come")); - assertTrue(isASuggestion("com", "company")); - assertTrue(isASuggestion("th", "the")); - assertTrue(isASuggestion("th", "that")); - assertTrue(isASuggestion("th", "this")); - assertTrue(isASuggestion("th", "they")); + assertTrue(sh.isASuggestion("com", "come")); + assertTrue(sh.isASuggestion("com", "company")); + assertTrue(sh.isASuggestion("th", "the")); + assertTrue(sh.isASuggestion("th", "that")); + assertTrue(sh.isASuggestion("th", "this")); + assertTrue(sh.isASuggestion("th", "they")); } /** * Does the suggestion engine recognize zero frequency words as valid words. */ public void testZeroFrequencyAccepted() { - assertTrue(isValid("yikes")); - assertFalse(isValid("yike")); + assertTrue(sh.isValid("yikes")); + assertFalse(sh.isValid("yike")); } /** * Tests to make sure that zero frequency words are not suggested as completions. */ public void testZeroFrequencySuggestionsNegative() { - assertFalse(isASuggestion("yike", "yikes")); - assertFalse(isASuggestion("what", "whatcha")); + assertFalse(sh.isASuggestion("yike", "yikes")); + assertFalse(sh.isASuggestion("what", "whatcha")); } /** @@ -262,16 +124,16 @@ public class SuggestTests extends AndroidTestCase { * and not considered corrections, in some cases. */ public void testTooLargeEditDistance() { - assertFalse(isASuggestion("sniyr", "about")); - assertFalse(isDefaultCorrection("rjw", "the")); + assertFalse(sh.isASuggestion("sniyr", "about")); + assertFalse(sh.isDefaultCorrection("rjw", "the")); } /** - * Make sure isValid is case-sensitive. + * Make sure sh.isValid is case-sensitive. */ public void testValidityCaseSensitivity() { - assertTrue(isValid("Sunday")); - assertFalse(isValid("sunday")); + assertTrue(sh.isValid("Sunday")); + assertFalse(sh.isValid("sunday")); } /** @@ -279,11 +141,11 @@ public class SuggestTests extends AndroidTestCase { */ public void testAccents() { // nio - assertTrue(isDefaultCorrection("nino", "ni\u00F1o")); + assertTrue(sh.isDefaultCorrection("nino", "ni\u00F1o")); // nio - assertTrue(isDefaultCorrection("nimo", "ni\u00F1o")); + assertTrue(sh.isDefaultCorrection("nimo", "ni\u00F1o")); // Mara - assertTrue(isDefaultCorrection("maria", "Mar\u00EDa")); + assertTrue(sh.isDefaultCorrection("maria", "Mar\u00EDa")); } /** @@ -291,20 +153,20 @@ public class SuggestTests extends AndroidTestCase { * and don't show any when there aren't any */ public void testBigramsAtFirstChar() { - assertTrue(isDefaultNextCorrection("about", "p", "part")); - assertTrue(isDefaultNextCorrection("I'm", "a", "about")); - assertTrue(isDefaultNextCorrection("about", "b", "business")); - assertTrue(isASuggestion("about", "b", "being")); - assertFalse(isDefaultNextSuggestion("about", "p", "business")); + assertTrue(sh.isDefaultNextSuggestion("about", "p", "part")); + assertTrue(sh.isDefaultNextSuggestion("I'm", "a", "about")); + assertTrue(sh.isDefaultNextSuggestion("about", "b", "business")); + assertTrue(sh.isASuggestion("about", "b", "being")); + assertFalse(sh.isDefaultNextSuggestion("about", "p", "business")); } /** * Make sure bigrams score affects the original score */ public void testBigramsScoreEffect() { - assertTrue(isDefaultCorrection("pa", "page")); - assertTrue(isDefaultNextCorrection("about", "pa", "part")); - assertTrue(isDefaultCorrection("sa", "said")); - assertTrue(isDefaultNextCorrection("from", "sa", "same")); + assertTrue(sh.isDefaultCorrection("pa", "page")); + assertTrue(sh.isDefaultNextCorrection("about", "pa", "part")); + assertTrue(sh.isDefaultCorrection("sa", "said")); + assertTrue(sh.isDefaultNextCorrection("from", "sa", "same")); } } From 4d2d459cd0137c352c4e3c9ce313dc4a8b63f7d7 Mon Sep 17 00:00:00 2001 From: Jae Yong Sung Date: Wed, 28 Jul 2010 12:01:07 -0700 Subject: [PATCH 129/159] Fix for build breakage Change-Id: Ie7ec03bf10ec9c9ce1290942a47cb538eeef6169 --- .../com/android/inputmethod/latin/tests/SuggestHelper.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java b/tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java index e3e995a23..107f04c7c 100644 --- a/tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java +++ b/tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java @@ -36,10 +36,11 @@ public class SuggestHelper { public SuggestHelper(String tag, Context context, int[] resId) { TAG = tag; + InputStream[] res = null; try { // merging separated dictionary into one if dictionary is separated int total = 0; - InputStream[] res = new InputStream[resId.length]; + res = new InputStream[resId.length]; for (int i = 0; i < resId.length; i++) { res[i] = context.getResources().openRawResource(resId[i]); total += res[i].available(); @@ -61,7 +62,7 @@ public class SuggestHelper { Log.w(TAG, "No available memory for binary dictionary"); } finally { try { - for (int i = 0;i < is.length; i++) { + for (int i = 0;i < res.length; i++) { res[i].close(); } } catch (IOException e) { From 820e4260cd12d947c095f60a8452832b39748e2b Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 27 Jul 2010 11:23:41 -0700 Subject: [PATCH 130/159] Fix inconsistency between pop-up preview key and input key This issue is caused by three reasons. - In touch move event and while time debouncing is going on, wrong key is shown as pop-up preview. - There is no pop-up preview key shown when touch up event occurs and also showing pop-up preview message is unintentionally canceled. - In detectAndSendKey() method, nearby keys' primary codes are mistakenly sent as Key codes. This is the last of three changes to fix bug #2868304 Bug: 2868304 Change-Id: Ie482167b2ae2804fa1aa43ffb5067af47b7553f1 --- .../latin/LatinKeyboardBaseView.java | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index e25ef495e..02683dba2 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -197,7 +197,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener private KeyDebouncer mDebouncer; - private int[] mKeyIndices = new int[12]; private GestureDetector mGestureDetector; private int mPopupX; private int mPopupY; @@ -273,6 +272,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener } public void popupPreview(int keyIndex, long delay) { + removeMessages(MSG_POPUP_PREVIEW); sendMessageDelayed(obtainMessage(MSG_POPUP_PREVIEW, keyIndex, 0), delay); } @@ -911,12 +911,12 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mDirtyRect.setEmpty(); } - private int getKeyIndices(int x, int y, int[] allKeys) { + private int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) { final Key[] keys = mKeys; int primaryIndex = NOT_A_KEY; int closestKey = NOT_A_KEY; int closestKeyDist = mProximityThreshold + 1; - java.util.Arrays.fill(mDistances, Integer.MAX_VALUE); + Arrays.fill(mDistances, Integer.MAX_VALUE); int [] nearestKeyIndices = mKeyboard.getNearestKeys(x, y); final int keyCount = nearestKeyIndices.length; for (int i = 0; i < keyCount; i++) { @@ -947,10 +947,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mDistances.length - j - nCodes); System.arraycopy(allKeys, j, allKeys, j + nCodes, allKeys.length - j - nCodes); - for (int c = 0; c < nCodes; c++) { - allKeys[j + c] = key.codes[c]; - mDistances[j + c] = dist; - } + System.arraycopy(key.codes, 0, allKeys, j, nCodes); + Arrays.fill(mDistances, j, j + nCodes, dist); break; } } @@ -973,7 +971,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener //TextEntryState.keyPressedAt(key, x, y); int[] codes = new int[MAX_NEARBY_KEYS]; Arrays.fill(codes, NOT_A_KEY); - getKeyIndices(x, y, codes); + getKeyIndexAndNearbyCodes(x, y, codes); // Multi-tap if (mInMultiTap) { if (mTapCount != -1) { @@ -983,6 +981,15 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener } code = key.codes[mTapCount]; } + /* + * Swap the first and second values in the codes array if the primary code is not + * the first value but the second value in the array. This happens when key + * debouncing is in effect. + */ + if (codes.length >= 2 && codes[0] != code && codes[1] == code) { + codes[1] = codes[0]; + codes[0] = code; + } mKeyboardActionListener.onKey(code, codes); mKeyboardActionListener.onRelease(code); } @@ -1024,13 +1031,12 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener } // If key changed and preview is on ... if (oldKeyIndex != mCurrentKeyIndex && mShowPreview) { - mHandler.cancelPopupPreview(); - if (previewPopup.isShowing()) { - if (keyIndex == NOT_A_KEY) { + if (keyIndex == NOT_A_KEY) { + mHandler.cancelPopupPreview(); + if (previewPopup.isShowing()) { mHandler.dismissPreview(DELAY_AFTER_PREVIEW); } - } - if (keyIndex != NOT_A_KEY) { + } else { if (previewPopup.isShowing() && mPreviewText.getVisibility() == VISIBLE) { // Show right away, if it's already visible and finger is moving around showKey(keyIndex); @@ -1303,7 +1309,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener int touchY = (int) me.getY() + mVerticalCorrection - getPaddingTop(); final int action = me.getAction(); final long eventTime = me.getEventTime(); - int keyIndex = getKeyIndices(touchX, touchY, null); + int keyIndex = getKeyIndexAndNearbyCodes(touchX, touchY, null); mPossiblePoly = possiblePoly; // Track the last few movements to look for spurious swipes. @@ -1381,12 +1387,19 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mHandler.startLongPressTimer(me, LONGPRESS_TIMEOUT); } } - showPreview(mCurrentKey); + /* + * While time debouncing is in effect, mCurrentKey holds the new key and mDebouncer + * holds the last key. At ACTION_UP event if time debouncing will be in effect + * eventually, the last key should be send as the result. For that situation + * mCurrentKey should not be showed as popup preview. + */ + showPreview(mDebouncer.isMinorTimeBounce() ? mDebouncer.getLastKey() : mCurrentKey); break; case MotionEvent.ACTION_UP: mHandler.cancelKeyTimersAndPopupPreview(); - if (keyIndex == mCurrentKey) { + if (mDebouncer.isMinorMoveBounce(touchX, touchY, mKeys[keyIndex], + mKeys[mCurrentKey])) { mDebouncer.updateTimeDebouncing(eventTime); } else { resetMultiTap(); @@ -1399,7 +1412,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener touchY = mDebouncer.getLastCodeY(); } showPreview(NOT_A_KEY); - Arrays.fill(mKeyIndices, NOT_A_KEY); // If we're not on a repeating key (which sends on a DOWN event) if (mRepeatKeyIndex == NOT_A_KEY && !mMiniKeyboardOnScreen && !mAbortKey) { detectAndSendKey(mCurrentKey, touchX, touchY, eventTime); @@ -1407,6 +1419,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener invalidateKey(keyIndex); mRepeatKeyIndex = NOT_A_KEY; break; + case MotionEvent.ACTION_CANCEL: mHandler.cancelKeyTimersAndPopupPreview(); dismissPopupKeyboard(); From f00341fdc5170b4ad9e4027b6a51b9f87649f5fa Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Wed, 28 Jul 2010 20:43:48 -0700 Subject: [PATCH 131/159] Fix grammar error in comment Change-Id: I728c2fefcf3c22d30d192a9f4b3aedad4eddc2ed --- .../com/android/inputmethod/latin/LatinKeyboardBaseView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 02683dba2..9570da7ba 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -1390,8 +1390,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener /* * While time debouncing is in effect, mCurrentKey holds the new key and mDebouncer * holds the last key. At ACTION_UP event if time debouncing will be in effect - * eventually, the last key should be send as the result. For that situation - * mCurrentKey should not be showed as popup preview. + * eventually, the last key should be sent as the result. In such case mCurrentKey + * should not be showed as popup preview. */ showPreview(mDebouncer.isMinorTimeBounce() ? mDebouncer.getLastKey() : mCurrentKey); break; From db60e6f3696ba1616a38f4486c8ceac5f2b6ff25 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 29 Jul 2010 03:04:12 +0900 Subject: [PATCH 132/159] Add a layout for a black-characters based theme bug: 2838151 Change-Id: Ia7136ac7432258386a53ebec2b26251c8caae0ea --- java/res/xml/kbd_alpha_black.xml | 106 ++++++++++++++++++ java/res/xml/kbd_phone_black.xml | 67 +++++++++++ java/res/xml/kbd_phone_symbols_black.xml | 70 ++++++++++++ .../inputmethod/latin/KeyboardSwitcher.java | 55 ++++++--- 4 files changed, 284 insertions(+), 14 deletions(-) create mode 100644 java/res/xml/kbd_alpha_black.xml create mode 100755 java/res/xml/kbd_phone_black.xml create mode 100755 java/res/xml/kbd_phone_symbols_black.xml diff --git a/java/res/xml/kbd_alpha_black.xml b/java/res/xml/kbd_alpha_black.xml new file mode 100644 index 000000000..108e466b8 --- /dev/null +++ b/java/res/xml/kbd_alpha_black.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_phone_black.xml b/java/res/xml/kbd_phone_black.xml new file mode 100755 index 000000000..b7f9096bd --- /dev/null +++ b/java/res/xml/kbd_phone_black.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_phone_symbols_black.xml b/java/res/xml/kbd_phone_symbols_black.xml new file mode 100755 index 000000000..c73e5faa4 --- /dev/null +++ b/java/res/xml/kbd_phone_symbols_black.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 95068e6cb..bcf4902f2 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -50,10 +50,25 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public static final String DEFAULT_LAYOUT_ID = "3"; public static final String PREF_KEYBOARD_LAYOUT = "keyboard_layout"; - private static final int[] LAYOUTS = new int [] { + private static final int[] THEMES = new int [] { R.layout.input_basic, R.layout.input_basic_highcontrast, R.layout.input_stone_normal, R.layout.input_stone_bold}; + // Ids for each characters' color in the keyboard + private static final int CHAR_THEME_COLOR_WHITE = 0; + private static final int CHAR_THEME_COLOR_BLACK = 1; + + // Tables which contains resource ids for each character theme color + private static final int[] KBD_ALPHA = new int[] {R.xml.kbd_alpha, R.xml.kbd_alpha_black}; + private static final int[] KBD_PHONE = new int[] {R.xml.kbd_phone, R.xml.kbd_phone_black}; + private static final int[] KBD_PHONE_SYMBOLS = new int[] { + R.xml.kbd_phone_symbols, R.xml.kbd_phone_symbols_black}; + private static final int[] KBD_SYMBOLS = new int[] { + R.xml.kbd_symbols, R.xml.kbd_symbols_black}; + private static final int[] KBD_SYMBOLS_SHIFT = new int[] { + R.xml.kbd_symbols_shift, R.xml.kbd_symbols_shift_black}; + private static final int[] KBD_QWERTY = new int[] {R.xml.kbd_qwerty, R.xml.kbd_qwerty_black}; + 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; @@ -119,13 +134,11 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } private KeyboardId makeSymbolsId(boolean hasVoice) { - return new KeyboardId( - isBlackSym() ? R.xml.kbd_symbols_black : R.xml.kbd_symbols, hasVoice); + return new KeyboardId(KBD_SYMBOLS[getCharColorId()], hasVoice); } private KeyboardId makeSymbolsShiftedId(boolean hasVoice) { - return new KeyboardId( - isBlackSym() ? R.xml.kbd_symbols_shift_black : R.xml.kbd_symbols_shift, hasVoice); + return new KeyboardId(KBD_SYMBOLS_SHIFT[getCharColorId()], hasVoice); } void makeKeyboards(boolean forceCreate) { @@ -270,11 +283,15 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) { boolean hasVoice = hasVoiceButton(isSymbols); + int charColorId = getCharColorId(); // TODO: generalize for any KeyboardId - int keyboardRowsResId = isBlackSym() ? R.xml.kbd_qwerty_black : R.xml.kbd_qwerty; + int keyboardRowsResId = KBD_QWERTY[charColorId]; if (isSymbols) { - return (mode == MODE_PHONE) - ? new KeyboardId(R.xml.kbd_phone_symbols, hasVoice) : makeSymbolsId(hasVoice); + if (mode == MODE_PHONE) { + return new KeyboardId(KBD_PHONE_SYMBOLS[charColorId], hasVoice); + } else { + return new KeyboardId(KBD_SYMBOLS[charColorId], hasVoice); + } } switch (mode) { case MODE_NONE: @@ -283,14 +300,15 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha /* fall through */ case MODE_TEXT: if (mTextMode == MODE_TEXT_ALPHA) { - return new KeyboardId(R.xml.kbd_alpha, KEYBOARDMODE_NORMAL, true, hasVoice); + return new KeyboardId( + KBD_ALPHA[charColorId], KEYBOARDMODE_NORMAL, true, hasVoice); } // Normally mTextMode should be MODE_TEXT_QWERTY. return new KeyboardId(keyboardRowsResId, KEYBOARDMODE_NORMAL, true, hasVoice); case MODE_SYMBOLS: - return makeSymbolsId(hasVoice); + return new KeyboardId(KBD_SYMBOLS[charColorId], hasVoice); case MODE_PHONE: - return new KeyboardId(R.xml.kbd_phone, hasVoice); + return new KeyboardId(KBD_PHONE[charColorId], hasVoice); case MODE_URL: return new KeyboardId(keyboardRowsResId, KEYBOARDMODE_URL, true, hasVoice); case MODE_EMAIL: @@ -387,7 +405,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha if (mInputView != null) { mInputView.closing(); } - if (LAYOUTS.length <= newLayout) { + if (THEMES.length <= newLayout) { newLayout = Integer.valueOf(DEFAULT_LAYOUT_ID); } @@ -396,7 +414,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha for (int i = 0; i < LatinIMEUtil.GCUtils.GC_TRY_LOOP_MAX && tryGC; ++i) { try { mInputView = (LatinKeyboardView) mInputMethodService.getLayoutInflater( - ).inflate(LAYOUTS[newLayout], null); + ).inflate(THEMES[newLayout], null); tryGC = false; } catch (OutOfMemoryError e) { tryGC = LatinIMEUtil.GCUtils.getInstance().tryGCOrWait( @@ -406,7 +424,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mLayoutId + "," + newLayout, e); } } - mInputView.setExtentionLayoutResId(LAYOUTS[newLayout]); + mInputView.setExtentionLayoutResId(THEMES[newLayout]); mInputView.setOnKeyboardActionListener(mInputMethodService); mLayoutId = newLayout; } @@ -432,4 +450,13 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } return false; } + + private int getCharColorId () { + if (isBlackSym()) { + return CHAR_THEME_COLOR_BLACK; + } else { + return CHAR_THEME_COLOR_WHITE; + } + } + } From 408165374491553ca821b7a61d4083389715954d Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Fri, 30 Jul 2010 01:41:17 +0900 Subject: [PATCH 133/159] Move dictionary.xml which refers to the vendor-specific dictionaries to the vendor-specific directory. Change-Id: I0eff59ca186002fdafe3940720606cc4a39077a6 --- java/res/xml-en/dictionary.xml | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 java/res/xml-en/dictionary.xml diff --git a/java/res/xml-en/dictionary.xml b/java/res/xml-en/dictionary.xml deleted file mode 100644 index 74af75a0f..000000000 --- a/java/res/xml-en/dictionary.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - \ No newline at end of file From 87fe3b8556e3cf91b3273caeddc6e2872e8ab991 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 29 Jul 2010 11:32:27 -0700 Subject: [PATCH 134/159] Fix NPE introduced by Change-Id: Ie482167b2ae2804fa1aa43ffb5067af47b7553f1 Bug: 2868304 Change-Id: I60895e76c4288d4e0e960e5ba22cb47c4b989bf3 --- .../latin/LatinKeyboardBaseView.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 9570da7ba..e7fbd22dd 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -320,6 +320,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener }; static class KeyDebouncer { + private Key[] mKeys; + // for move de-bouncing private int mLastCodeX; private int mLastCodeY; @@ -334,7 +336,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener private final int mKeyDebounceThresholdSquared; - KeyDebouncer(float hysteresisPixel) { + KeyDebouncer(Key[] keys, float hysteresisPixel) { + mKeys = keys; mKeyDebounceThresholdSquared = (int)(hysteresisPixel * hysteresisPixel); } @@ -373,11 +376,15 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener mLastCodeY = mLastY; } - public boolean isMinorMoveBounce(int x, int y, Key newKey, Key curKey) { - if (newKey == curKey) + public boolean isMinorMoveBounce(int x, int y, int newKey, int curKey) { + if (newKey == curKey) { return true; - - return getSquareDistanceToKeyEdge(x, y, curKey) < mKeyDebounceThresholdSquared; + } else if (curKey == NOT_A_KEY) { + return false; + } else { + return getSquareDistanceToKeyEdge(x, y, mKeys[curKey]) + < mKeyDebounceThresholdSquared; + } } private static int getSquareDistanceToKeyEdge(int x, int y, Key key) { @@ -774,7 +781,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener final float hysteresisPixel = getContext().getResources() .getDimension(R.dimen.key_debounce_hysteresis_distance); - mDebouncer = new KeyDebouncer(hysteresisPixel); + mDebouncer = new KeyDebouncer(keys, hysteresisPixel); } @Override @@ -1368,8 +1375,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener if (mCurrentKey == NOT_A_KEY) { mCurrentKey = keyIndex; mDebouncer.updateTimeDebouncing(eventTime); - } else if (mDebouncer.isMinorMoveBounce(touchX, touchY, mKeys[keyIndex], - mKeys[mCurrentKey])) { + } else if (mDebouncer.isMinorMoveBounce(touchX, touchY, keyIndex, + mCurrentKey)) { mDebouncer.updateTimeDebouncing(eventTime); continueLongPress = true; } else if (mRepeatKeyIndex == NOT_A_KEY) { @@ -1398,8 +1405,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener case MotionEvent.ACTION_UP: mHandler.cancelKeyTimersAndPopupPreview(); - if (mDebouncer.isMinorMoveBounce(touchX, touchY, mKeys[keyIndex], - mKeys[mCurrentKey])) { + if (mDebouncer.isMinorMoveBounce(touchX, touchY, keyIndex, mCurrentKey)) { mDebouncer.updateTimeDebouncing(eventTime); } else { resetMultiTap(); From 35f6cd905d94a5dea3eb8b341663e84f801c66f1 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 29 Jul 2010 13:58:52 -0700 Subject: [PATCH 135/159] Fix possible NPE and IndexOutOfBoundsException. Bug: 2868304 Change-Id: I2c474736fb9bb95da9e04bdeb9b9b641e7c3adda --- .../inputmethod/latin/LatinKeyboardBaseView.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index e7fbd22dd..665c641c2 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -320,7 +320,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener }; static class KeyDebouncer { - private Key[] mKeys; + private final Key[] mKeys; + private final int mKeyDebounceThresholdSquared; // for move de-bouncing private int mLastCodeX; @@ -334,9 +335,9 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener private long mLastMoveTime; private long mCurrentKeyTime; - private final int mKeyDebounceThresholdSquared; - KeyDebouncer(Key[] keys, float hysteresisPixel) { + if (keys == null || hysteresisPixel < 1.0f) + throw new IllegalArgumentException(); mKeys = keys; mKeyDebounceThresholdSquared = (int)(hysteresisPixel * hysteresisPixel); } @@ -379,11 +380,11 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener public boolean isMinorMoveBounce(int x, int y, int newKey, int curKey) { if (newKey == curKey) { return true; - } else if (curKey == NOT_A_KEY) { - return false; - } else { + } else if (curKey >= 0 && curKey < mKeys.length) { return getSquareDistanceToKeyEdge(x, y, mKeys[curKey]) - < mKeyDebounceThresholdSquared; + < mKeyDebounceThresholdSquared; + } else { + return false; } } From 11fa0a220b16e3cfb5053ce116e673dd01fa72d0 Mon Sep 17 00:00:00 2001 From: Gilles Debunne Date: Mon, 2 Aug 2010 15:12:15 -0700 Subject: [PATCH 136/159] Move pngs from drawable to drawable-mdpi in project packages/inputmethods/LatinIME/ Change-Id: I7df8040996aab9c90547a472a7627f1f1afe4eb9 --- .../sym_keyboard_feedback_delete.png | Bin 1278 -> 0 bytes .../btn_keyboard_key_normal_off.9.png | Bin 860 -> 0 bytes .../btn_keyboard_key_normal_on.9.png | Bin 926 -> 0 bytes .../btn_keyboard_key_pressed_off.9.png | Bin 836 -> 0 bytes .../btn_keyboard_key_pressed_on.9.png | Bin 886 -> 0 bytes .../btn_keyboard_normal_metal.9.png | Bin .../btn_keyboard_toggle_off.png | Bin .../btn_keyboard_toggle_on.png | Bin .../btn_led_off.9.png | Bin .../{drawable => drawable-mdpi}/btn_led_on.9.png | Bin java/res/{drawable => drawable-mdpi}/cancel.png | Bin java/res/{drawable => drawable-mdpi}/caution.png | Bin .../dialog_top_dark_bottom_medium.9.png | Bin .../ic_dialog_alert_large.png | Bin .../ic_dialog_voice_input.png | Bin .../ic_dialog_wave_0_0.png | Bin .../ic_dialog_wave_1_3.png | Bin .../ic_dialog_wave_2_3.png | Bin .../ic_dialog_wave_3_3.png | Bin .../ic_dialog_wave_4_3.png | Bin .../{drawable => drawable-mdpi}/mic_slash.png | Bin .../{drawable => drawable-mdpi}/ok_cancel.png | Bin .../speak_now_level0.png | Bin .../speak_now_level1.png | Bin .../speak_now_level2.png | Bin .../speak_now_level3.png | Bin .../speak_now_level4.png | Bin .../speak_now_level5.png | Bin .../speak_now_level6.png | Bin .../voice_ime_background.9.png | Bin .../voice_swipe_hint.png | Bin java/res/{drawable => drawable-mdpi}/working.png | Bin 32 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 java/res/drawable-en-hdpi/sym_keyboard_feedback_delete.png delete mode 100644 java/res/drawable-land-mdpi/btn_keyboard_key_normal_off.9.png delete mode 100644 java/res/drawable-land-mdpi/btn_keyboard_key_normal_on.9.png delete mode 100644 java/res/drawable-land-mdpi/btn_keyboard_key_pressed_off.9.png delete mode 100644 java/res/drawable-land-mdpi/btn_keyboard_key_pressed_on.9.png rename java/res/{drawable => drawable-mdpi}/btn_keyboard_normal_metal.9.png (100%) rename java/res/{drawable => drawable-mdpi}/btn_keyboard_toggle_off.png (100%) rename java/res/{drawable => drawable-mdpi}/btn_keyboard_toggle_on.png (100%) rename java/res/{drawable => drawable-mdpi}/btn_led_off.9.png (100%) rename java/res/{drawable => drawable-mdpi}/btn_led_on.9.png (100%) rename java/res/{drawable => drawable-mdpi}/cancel.png (100%) rename java/res/{drawable => drawable-mdpi}/caution.png (100%) rename java/res/{drawable => drawable-mdpi}/dialog_top_dark_bottom_medium.9.png (100%) rename java/res/{drawable => drawable-mdpi}/ic_dialog_alert_large.png (100%) rename java/res/{drawable => drawable-mdpi}/ic_dialog_voice_input.png (100%) rename java/res/{drawable => drawable-mdpi}/ic_dialog_wave_0_0.png (100%) rename java/res/{drawable => drawable-mdpi}/ic_dialog_wave_1_3.png (100%) rename java/res/{drawable => drawable-mdpi}/ic_dialog_wave_2_3.png (100%) rename java/res/{drawable => drawable-mdpi}/ic_dialog_wave_3_3.png (100%) rename java/res/{drawable => drawable-mdpi}/ic_dialog_wave_4_3.png (100%) rename java/res/{drawable => drawable-mdpi}/mic_slash.png (100%) rename java/res/{drawable => drawable-mdpi}/ok_cancel.png (100%) rename java/res/{drawable => drawable-mdpi}/speak_now_level0.png (100%) rename java/res/{drawable => drawable-mdpi}/speak_now_level1.png (100%) rename java/res/{drawable => drawable-mdpi}/speak_now_level2.png (100%) rename java/res/{drawable => drawable-mdpi}/speak_now_level3.png (100%) rename java/res/{drawable => drawable-mdpi}/speak_now_level4.png (100%) rename java/res/{drawable => drawable-mdpi}/speak_now_level5.png (100%) rename java/res/{drawable => drawable-mdpi}/speak_now_level6.png (100%) rename java/res/{drawable => drawable-mdpi}/voice_ime_background.9.png (100%) rename java/res/{drawable => drawable-mdpi}/voice_swipe_hint.png (100%) rename java/res/{drawable => drawable-mdpi}/working.png (100%) diff --git a/java/res/drawable-en-hdpi/sym_keyboard_feedback_delete.png b/java/res/drawable-en-hdpi/sym_keyboard_feedback_delete.png deleted file mode 100755 index ca7637552b5e256f445fc8dd497811ab7518f489..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1278 zcmVjt4JzrO-h`rupqGM#pvQWv=%L$V4;A%L5kVIUx*$nNWmZT;U=UaYNjJKp4;4j4 zsafi7-)H}UVVZOH%-OSfvNP~!*|Rfe<~Q@r_sx82C6mdl;aIY>hG_}GLa-1l1Pj6b z3$PrM%9dsE$4Jry(g-|Gkorlzq;I5dd{>LwPA=T$BRfCMxX*N_&`rzv(^I(eAl9_xb%_WV+=Y8onHp|gc zS8BUThhdr2_01I3(ntD2dPO=aJzuGS1=lO4C_J-ma0C&>iKuSNf`bqf+XGYV4kB0r zd#4Xz>^w%<)XgJZQ=XOk36_Zf9f+H&pDUJ)l@Rajbyxvj*;S+t#S{YxmXG)q#rF>E zyQIykz9Bsg@``0+FO?#uiPA*+`mdTId$;MN<)k{&B0PUhI_Y4FCSK8-2Te0T>-2(D zi-W9P(ABBTV_of7y{wq-l--FSeT8%u`>V%AJCi=lOvxm#=x}Z6gBR@bcx_S5%cQRM z+TsN)a7D)u-k@!7ssSz5a9b%c`8ggYB9|0LP>uz_oD*;;pW#pvURIaA)lyPD;#D#r zdP`cz6RyNuBdCr50mVVL5KorisFVz_s@$GDEbJpb;+$5FGJMEwB;B(K$bZA5 zFC*=foS(3niCcnYN4Bk>YYk;GO8hR~ZirY1Cmq@pjX9;+?$$pw5Lro(!E1flZgp!@d zMA8looDQnc@R;Wa#+?^o7Uj;a0ydgvyb*A_;6!v#`#nIV1ml6PRXY2GyhYr{)Laee zu?DOizvX*)Z^{)bM6N>a@D3bFUYbzC%x^fD;ss48@MVuh@!|%h!<%p@xoJW*Ys{}- z<1J0$TzN%)VL8r#a)(WLZaSOdeLAQkS-<~&)}LlraUI9(%;us8?>L5ZMgw&KfxZad zvR`u!jr$EI;AUvz*?Gg+x&I>8md0gbn5!*Jtp%qqx)^RPSR&m%ps*(WiVcPPun z@4nv0Qq4MFC7zSkV~G`(6#BtSw0mkBs~jw&ZE*xmWmTPi%Bm7 z3dJe75>qfa1y_SW+8H3I_oOv)UePqgEoXw`u&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 diff --git a/java/res/drawable-land-mdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-land-mdpi/btn_keyboard_key_normal_on.9.png deleted file mode 100644 index 0c16ed5093dfcac53807d9d9663c516e52bb07ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/java/res/drawable-land-mdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-land-mdpi/btn_keyboard_key_pressed_off.9.png deleted file mode 100644 index bdcf06e1b8986fd3d5fc87d41037c7c037c6584b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 836 zcmV-K1H1f*P)X@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# Date: Tue, 3 Aug 2010 18:20:49 +0200 Subject: [PATCH 137/159] Fix the bug that black symbols are shown when only one lanugage is selected. (Update with the files left out from Change-Id: I15f83fc43d91c2c9d74b40fdcecdfe239242d565.) --- java/res/xml-da/kbd_qwerty_black.xml | 213 +++++++++++++++++++++++++++ java/res/xml-nb/kbd_qwerty_black.xml | 213 +++++++++++++++++++++++++++ java/res/xml-sr/kbd_qwerty_black.xml | 171 +++++++++++++++++++++ 3 files changed, 597 insertions(+) create mode 100644 java/res/xml-da/kbd_qwerty_black.xml create mode 100644 java/res/xml-nb/kbd_qwerty_black.xml create mode 100644 java/res/xml-sr/kbd_qwerty_black.xml diff --git a/java/res/xml-da/kbd_qwerty_black.xml b/java/res/xml-da/kbd_qwerty_black.xml new file mode 100644 index 000000000..2b41cf1fb --- /dev/null +++ b/java/res/xml-da/kbd_qwerty_black.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-nb/kbd_qwerty_black.xml b/java/res/xml-nb/kbd_qwerty_black.xml new file mode 100644 index 000000000..9d4c52d38 --- /dev/null +++ b/java/res/xml-nb/kbd_qwerty_black.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml-sr/kbd_qwerty_black.xml b/java/res/xml-sr/kbd_qwerty_black.xml new file mode 100644 index 000000000..30d094a88 --- /dev/null +++ b/java/res/xml-sr/kbd_qwerty_black.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From d5b1296738fdcf1324eb3fa6afa5596dd68bfd29 Mon Sep 17 00:00:00 2001 From: Gilles Debunne Date: Tue, 3 Aug 2010 10:47:36 -0700 Subject: [PATCH 138/159] packages/inputmethods/LatinIME/ : added scaled hdpi version of assets that were moved to drawable-mdpi Change-Id: I3e0281e20362f051495b2750cd0b06ab77ed090f --- .../btn_keyboard_normal_metal.9.png | Bin 0 -> 33007 bytes .../drawable-hdpi/btn_keyboard_toggle_off.png | Bin 0 -> 3032 bytes .../drawable-hdpi/btn_keyboard_toggle_on.png | Bin 0 -> 3032 bytes java/res/drawable-hdpi/btn_led_off.9.png | Bin 0 -> 30827 bytes java/res/drawable-hdpi/btn_led_on.9.png | Bin 0 -> 30827 bytes .../dialog_top_dark_bottom_medium.9.png | Bin 0 -> 49933 bytes java/res/drawable-hdpi/voice_swipe_hint.png | Bin 0 -> 22366 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 java/res/drawable-hdpi/btn_keyboard_normal_metal.9.png create mode 100644 java/res/drawable-hdpi/btn_keyboard_toggle_off.png create mode 100644 java/res/drawable-hdpi/btn_keyboard_toggle_on.png create mode 100644 java/res/drawable-hdpi/btn_led_off.9.png create mode 100644 java/res/drawable-hdpi/btn_led_on.9.png create mode 100644 java/res/drawable-hdpi/dialog_top_dark_bottom_medium.9.png create mode 100644 java/res/drawable-hdpi/voice_swipe_hint.png diff --git a/java/res/drawable-hdpi/btn_keyboard_normal_metal.9.png b/java/res/drawable-hdpi/btn_keyboard_normal_metal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0a6010a72116ba619378ae4432bab09aaf7043 GIT binary patch literal 33007 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 Ux4+5YrCYK1xPxal>h($ literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/btn_keyboard_toggle_off.png b/java/res/drawable-hdpi/btn_keyboard_toggle_off.png new file mode 100644 index 0000000000000000000000000000000000000000..2911b9cd3c90c409b8e8002bd62a461d9322f893 GIT binary patch literal 3032 zcmchZ&reiW6vyuyW(H;k1_nk30R=RGjETVt3lr1QYExZkX=4}Nb<3_vlZG9&Nf&L> zMHdab_CGN64Dv~qn#!OK|wMo3_oTVaQHF(d~dw3qtx!&o1D4ty?f62p6~ab zcjtXSeC?yUXlv9MQ+MU^rB9jLWHn)ae|%8*j4ATv<-`IDXb+J3?@UNP$P34F+psPkv}*%$h~~|a%F#iKZ`Ao zkB_gtE$1Pyv9Ynh{QP|Q=+UFGa=F~+d0syNeE^*R^tixDCiO~64&VYdi)HY?x4XOh z=j!Tep|i8IbmPX2gGyjk_}W-lScpZV(RP9_G&D54$Ms-sZEbxd5~-=Kt_}kn3IqZk zj3W3%Vb!+1z1_dHwY5?^OebcW@03uWHNc0l z>KHK6<`@{5ot+&+QXd3KO-)UWfw4zDVN~ekzKOzO6y*`KLEbs;cf`;K>+S80k?aD@ zE;cqc4lqk1lgs4{l36y$X9VDen5h6{G+LuJ!(K<(-*bQ#DJ&0x7x-H+8#y{Unt(yN zsj2BYjNZW^1)D&zSTv0Cew$Ky)uqsi5K{d3$@iT-xZ&L0I3R$W`vwEEr5$ zkf0A{_2FhR7L1rYiI%Y_4naU|paW6T%C>(K%&}1i3sCW-QOqu( z&&j)~92N}Z9MvpvuXij$_n2%p>sKfi4opC9=($)3Oh9UTJ>&E-?3LC8_LTLUVk{U= zE6|F(|}#7oX+%7@!M%!2tFFf%igq_R%{ z{g`*|U7VwtOs4Ao{rmPMl|)J^MsBzUQbQyX33KMm8PnI-x6kt;irnHK`#03O$wB7xboT7oMJl{afc^}NNSdaz+K?znhk8n=y>YU!ZaBon zs?7Qxe$QC{0~IFegWDWii+AtdE%{2g3pYGR^iN-Z_sg&8qA;#}c6kA&N<)x&Q$k{*-P(v z&WJ-q-o*>&Kfpf9Vj1}T>({NnV6#8D@ZqOK{ydBL+c6&+?w1$OzkT_FC$71lwV?C+ zE%E=Lu3Wj2S5>tN8PYVZr0aSCy9XN$5@R*fG~Mj=dbK1;)*#Pr+_vY8S`!l!;q~j+ z)BV7F!e6bGl@-@h<~@?B?O;DI7QVJKtl*j2Ng?DjkFK)4uPYgB*1{YgBgmNF-f^Ux0NTet!VF zfEn(A9X@>64T9hdn4K#W@-wAM-f5T*X;u3-McO8j9+FTc2}SNjCQJo&k`GwC3|uUpnu2RUtmzsYLZk`I0l%) zHN^rjgfx`^L(#-w+>0CN2cmVcOoQ$*t(X>lROu14#Mdx*kb$ADObvLc53aT}HW3RkD3sR-K6Uns zuou`U0|SVM0;w8?p+`}d>hU_MT8!e}ah7la0w^Q34-BNxZvcTXAdib!#+iMD7GZzz zT|v%#yxIXnfoMD(P_l>cZ#u z?4QB1Frv%XFhL&RMZIK?<%M?2_)qON1>FV(oppo;OrVJYLP{13HvOe|m~{`JMw+LR zb(jw2Pf}4Ei=!ZF@OKU~ca8NkFnkuCmCNPDFbo$=(=&?J=)~!v%VgCY`fmH5)JwK7 zMPelUMKA_RaS{ePlzWSgm;VI7F;ZfEwH^?$LLf|Dyla7pW2An2$ka0qizDqIZzDy<62D*xcM)I6Xc6G@sAk#c2e3q+^@@ z(UAdrR2QaJbtlAR=}ihSY ze;@U{v-S_4?8&WLx4de#ItDp|A$k@~d180m*kH`#lBGXGBAlGdyNggaaM@Wvgyy!k zw(js9WOjD;S9g#-W*HKGaFRA+`~yz6j?-}^-9x1w0U%HB1K2B2%WhWyc#f8N0^RQ+ z+3kvV$NOJ0E@iGje=|n*aa+ literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/btn_led_off.9.png b/java/res/drawable-hdpi/btn_led_off.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d29c48a033f9372dcfbca0b3b2af828a8f7f5a2e GIT binary patch literal 30827 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 literal 0 HcmV?d00001 diff --git a/java/res/drawable-hdpi/voice_swipe_hint.png b/java/res/drawable-hdpi/voice_swipe_hint.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbe960646719701e689475309e554894933e84d GIT binary patch literal 22366 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 Date: Tue, 3 Aug 2010 12:19:32 -0700 Subject: [PATCH 139/159] Removed conflicting .9 png Change-Id: Ifafdf81efa05445e143f4e2a44385f540540ecff --- .../dialog_top_dark_bottom_medium.png | Bin 1976 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 java/res/drawable-hdpi/dialog_top_dark_bottom_medium.png diff --git a/java/res/drawable-hdpi/dialog_top_dark_bottom_medium.png b/java/res/drawable-hdpi/dialog_top_dark_bottom_medium.png deleted file mode 100755 index 7c79a4f9083f0ce4496ab2ec0ed99b8965df50aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1976 zcma)-X;>2I7RSM*$V8o%aYM~49rp+^9=CGMB{6Wfa4AKUa2rF@QB%t$!%0U)NpnF^ zatSpT47ajOGi_Ad5Vfq(+%uukmP>Q*{cz{gJn2SPw_5IQIz@LFVl zkQo55*T=!e(k*s+rNjky$P>~RGdr}ViLZb_o zORP4~Tw&vAvVWFyz3Nzslr2vC#(7KB0Y_#=t_{!nT&*TvFg(cqrkQXsv2#rmc9-|^ zSYpyf5K&WnYnGpo)Fqs~aYb4?Na80m2{{0y8wlxE2guBeG)p`2brz?P_JC{LhIM23 zH9qHW*MI#^ze;q+Dk?Ejp_A|)3uX5dt^E)cfp>ve!^}KF8a4mRBnu@Oixz*|j|GVC z@3%Y;O&P@;);}t9q5@befsjpk5-5MCCoxRoYAI_UuD#|Qt&sQ@pu1$kBR~pid7dBZ zBd<4(WG^5ON+a1BW@Y)r65mm?2-VtRw1-NEvDaXECnmT6NMQgtht5}A-_n7i77vQK zILLb0^%I6~8Ao~#GCD)=vHFd+i#?nibyh2?m6eru1R z>RHhy9TA&vo?3=pR$Fo!2^ayQVGQ5x{cDB40vUu^s%F4`HKA!s`Cnu*Vuf1!e&$IG)ey8sJ zpM5N_-in7Vx{(~MIPg;#;dy5~l7>D#F)`7#K3muyxU#ggG)8kGs~Q*>BzDs7Mymh3 zySp2lt#&%`_B6l6Jom-Bg7~<&J(^ltd@6@2-m!VIVJ^NZ}H_*nG zO?=N;FboDWOixeuJJ6jF5O)`9VexIMBVMQ)$H!nWXWifTPDMF;_A#D7 zFkj(CzZ=Lu9TIpN^!jeuXHJc0F#E98<;x4nbUHmSM>5WKwr`(Iwp6%^cb5n4W-)~l zx_{Z!h*CSf^%uLc>CN`G`-9 zjG!N^QguBRq%naBJyH!SALUz7gg0`_>~ALrO74eqOk~0yNj7)9C4*^1is{fKa9&JY z5AGi0BawI^buKEuT?3f%VH|;w0sR{uIl$hCA4&%xu8aSW#1FE75V0R*i6p0-^2C$Z z9Vzmd!e@85w3l`#i)IpbJ}pTiWPpEf*Tw9ZPx4XVOYoSFSp?-r)G?%+#Tk4<97FB4*agMAkWnm(jR(bzPxA*U==02LSA@G#65K1{+KI`fD zju{jRT^IDgEbqi=Ii4GZM^r*cGjp@fBoZl;X@$q(GUB}(+S(AUOy-8&cF(1>YJ1YJ zlZ&-h8bN)1eM!PF93IcL4M+p~oGdcpa=FXwtzF^z_tz~Lky(3L7n53+K#jfUvzy^>Ki^WuYX2ILECOG}D{#l^+cQO{$o z;~l6YTY7{nte?>lgf%Nqmom&}urpbmot=q}l9pGIMsWD?E8GIN?^pV!D4AqUF)EA2 zqEo5VdO983`~dA392ofa%i`kVp%S_x6XG;Qf(WgT9YM&u4XW6*2Hx?pFR3&bX%NMh zgs!2rlF@ZRGkzkCQI}9@XrFFhSJ`pj1R<7z_oxTabSErQgPRfGeP%U4e1E9Le zp=Sa3hY-9cQk?$a^>3??!2`-(Aj;Ty%spl5Vd4e#iGDHskeTVU Date: Tue, 3 Aug 2010 18:37:36 -0700 Subject: [PATCH 140/159] Generated hdpi drawable size reduced Change-Id: I653e483f85d04026654a5cd74b48a97b28bd7e45 --- .../btn_keyboard_normal_metal.9.png | Bin 33007 -> 7614 bytes .../drawable-hdpi/btn_keyboard_toggle_off.png | Bin 3032 -> 1425 bytes .../drawable-hdpi/btn_keyboard_toggle_on.png | Bin 3032 -> 1733 bytes java/res/drawable-hdpi/btn_led_off.9.png | Bin 30827 -> 1279 bytes java/res/drawable-hdpi/btn_led_on.9.png | Bin 30827 -> 1607 bytes java/res/drawable-hdpi/voice_swipe_hint.png | Bin 22366 -> 5965 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/java/res/drawable-hdpi/btn_keyboard_normal_metal.9.png b/java/res/drawable-hdpi/btn_keyboard_normal_metal.9.png index 8f0a6010a72116ba619378ae4432bab09aaf7043..b29d6d1742085f6fad8a881576f576febc78b0fa 100644 GIT binary patch literal 7614 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 literal 33007 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 Ux4+5YrCYK1xPxal>h($ diff --git a/java/res/drawable-hdpi/btn_keyboard_toggle_off.png b/java/res/drawable-hdpi/btn_keyboard_toggle_off.png index 2911b9cd3c90c409b8e8002bd62a461d9322f893..bfe78402f4b99c6f1f39e702341f2204b765893d 100644 GIT binary patch delta 1386 zcmV-w1(o{P7m*8)IDZ90Nklp;`HcBJLmd(T?y zU;jUAkGC=Zz_CJp@lRH#dLJ^<;g0eN#9buB)xB4FMeV`~5x` zh4G2Ns{88dYJcqV^76b`EN+~ipRW+NMxG-Q7pjwc%*04Q@p$|jlD}$fY904{UAp3CLl_V)H(I))xINk>IJO-)U&qS5FN?d|Oo z4Gb7*a|{g3_4TzOsRx3jrmn8ez}QDUAygRPzLmnF6o2I-=A68H++T~K2R1S?5+&Ib z%wD&&v`jEdB9qVO4U$o*ub$)0va7enXKb+@D%7 zm~^emPQ~NrBX5{)evV>s#eY~ZKw6Nlk1h;JhO@IXuPJP1egq=f z9?yDKJ#?>lBsAmA1fmuYViaT2IVXnxVDL1ayjezF-y0uSte!z(zWuDyPd6Q z^uTD4fKCT=w(TW$+9L(Z)C3B4aw$;50jNOd>%g=Qm`{0$vt94H@eZIe7FJ>x>_7#g z=YKK{-3v%VzB2jB1g3lWz^DRX8DINeSTJG=B+6nD90GvaKnJ3v)ouS6%&}1i3sCW- zQOqr&AIW>692N}ZJk=a>uXij=_n1s3<5egY4opC9=($)3Oh9UTJ>&E-?3LC8_MY{; zVk{U=Iq2^4aE#7uOe7M%Y&Po!E1@ctjDP*kec_j-3KE1SD3Pway`IhK7a=@sjg{^5M3HSuk${Hh(rY z;#Bq%pg;1?eTQ=-ole(mZ*SX|R1ztv7`fpZNDUE-#mwmFs7WT1_dGA5$SVKXzoOPJ z9K?Uis9@L?aau!$dS?AwzZ@POZeah+-rk-$I5;rJ$H$f>2`m#y*45Qz`uqFM;NYO) z5SNsk$EDwpaG7IkmEwx7IM@1SWq)O*JU%{tM1|`F=+Cf(q$xV98;JsRs80#CH%>Oz z4Trc`Ran2n?*r?9pu#eJu+Fh{w7I!ic3_^2?!nU1lGyZMQ*81y-8BiYj+-!ygUm9; zNzYp> zsl1Q59Y_0h1;9sGzQ^|+X1}g9UtC-is~LSxZ7X!wPiC4UhEyHwpG*y;??$oIS$8is s>|dTe%3&EK%+MrX{cd~$@LxXo3oDU!g_@aJz5oCK07*qoM6N<$f(+Z2Z~y=R literal 3032 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 diff --git a/java/res/drawable-hdpi/btn_led_off.9.png b/java/res/drawable-hdpi/btn_led_off.9.png index d29c48a033f9372dcfbca0b3b2af828a8f7f5a2e..a60f96539e5b98dc417f8f70cfd77ff3b8b69c00 100644 GIT binary patch literal 1279 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 literal 22366 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 Date: Thu, 5 Aug 2010 16:10:04 -0700 Subject: [PATCH 141/159] Import revised translations. Change-Id: I5671feaa4760b2583052527f3026de9c4411c3a4 --- java/res/values-cs/strings.xml | 16 ++++++++++++---- java/res/values-da/strings.xml | 16 ++++++++++++---- java/res/values-de/strings.xml | 16 ++++++++++++---- java/res/values-el/strings.xml | 16 ++++++++++++---- java/res/values-es-rUS/strings.xml | 16 ++++++++++++---- java/res/values-es/strings.xml | 16 ++++++++++++---- java/res/values-fr/strings.xml | 16 ++++++++++++---- java/res/values-it/strings.xml | 16 ++++++++++++---- java/res/values-ja/strings.xml | 16 ++++++++++++---- java/res/values-ko/strings.xml | 16 ++++++++++++---- java/res/values-nb/strings.xml | 16 ++++++++++++---- java/res/values-nl/strings.xml | 16 ++++++++++++---- java/res/values-pl/strings.xml | 16 ++++++++++++---- java/res/values-pt-rPT/strings.xml | 16 ++++++++++++---- java/res/values-pt/strings.xml | 16 ++++++++++++---- java/res/values-ru/strings.xml | 16 ++++++++++++---- java/res/values-sv/strings.xml | 16 ++++++++++++---- java/res/values-tr/strings.xml | 16 ++++++++++++---- java/res/values-zh-rCN/strings.xml | 16 ++++++++++++---- java/res/values-zh-rTW/strings.xml | 16 ++++++++++++---- 20 files changed, 240 insertions(+), 80 deletions(-) diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 4bc1f5543..5abbab0d5 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -39,14 +39,15 @@ "Velká písmena automaticky" "Zahájit větu velkým písmenem" "Automatická interpunkce" - - + "Rychlé opravy" "Opravuje nejčastější chyby při psaní" "Zobrazit návrhy" "Zobrazovat navržená slova během psaní" "Automatické dokončování" "Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo." + "Návrh Bigram" + "Použít předchozí slovo ke zlepšení návrhu" "Žádný" "Základní" @@ -89,8 +90,7 @@ "Chcete-li použít hlasový vstup, stiskněte tlačítko mikrofonu nebo přejeďte prstem přes klávesnici na obrazovce." "Mluvte" "Probíhá zpracování" - - + "Chyba. Zkuste to prosím znovu." "Připojení se nezdařilo." "Chyba, řeč je příliš dlouhá." @@ -130,4 +130,12 @@ "Jazyk můžete změnit posunutím prstu po mezerníku." "← Uložte slovo opětovným klepnutím" "K dispozici je slovník" + + + + + + + + diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 750d67b20..03a3aaa3c 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -39,14 +39,15 @@ "Skriv aut. med stort" "Første bogstav i en sætning skrives med stort" "Foretag automatisk tegnsætning" - - + "Hurtige løsninger" "Retter almindelige stavefejl" "Vis forslag" "Vis ordforslag under indtastning" "Udfyld automatisk" "Mellemrumstast og tegnsætning indsætter automatisk fremhævet ord" + "Bigram-forslag" + "Brug forrige ord for at forbedre forslag" "Ingen" "Grundlæggende" @@ -89,8 +90,7 @@ "For at bruge stemme-input skal du trykke på knappen mikrofon eller lade glide fingeren hen over skærmtastaturet." "Tal nu" "Arbejder" - - + "Fejl. Prøv igen." "Kunne ikke oprette forbindelse" "Fejl. For meget tale." @@ -130,4 +130,12 @@ "Træk fingeren på mellemrumstasten for at skifte sprog" "← Tast igen for at gemme" "Ordbog er tilgængelig" + + + + + + + + diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index ed6408dde..9e11d5453 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -39,14 +39,15 @@ "Autom. Groß-/Kleinschr." "Sätze mit Großbuchstaben beginnen" "Autom. Zeichensetzung" - - + "Quick Fixes" "Korrigiert gängige Tippfehler" "Vorschläge anzeigen" "Vorgeschlagene Wörter während des Tippens anzeigen" "Autom. vervollständigen" "Leertaste und Interpunktion fügen autom. ein markiertes Wort ein" + "Bigramm-Vorschläge" + "Zur Verbesserung des Vorschlags vorheriges Wort verwenden" "Kein" "Standard" @@ -89,8 +90,7 @@ "Um die Spracheingabe zu verwenden, drücken Sie die Mikrofontaste oder ziehen Sie Ihren Finger über die Bildschirmtastatur." "Jetzt sprechen" "Vorgang läuft" - - + "Fehler. Versuchen Sie es erneut.." "Keine Verbindung" "Fehler – Text zu lang" @@ -130,4 +130,12 @@ "Finger über die Leertaste bewegen, um die Eingabesprache zu wechseln" "← Zum Speichern erneut tippen" "Wörterbuch verfügbar" + + + + + + + + diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index c4a50771a..5dea3806a 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -39,14 +39,15 @@ "Αυτόματη χρήση κεφαλαίων" "Κεφαλαίο το πρώτο γράμμα της πρότασης" "Αυτόματος τονισμός" - - + "Γρήγορες διορθώσεις" "Διορθώνει συνηθισμένα λάθη πληκτρολόγησης" "Εμφάνιση υποδείξεων" "Προβολή προτεινόμενων λέξεων κατά την πληκτρολόγηση" "Αυτόματη συμπλήρωση" "Τα πλήκ.διαστήμ.και τονισμού εισάγ.αυτόμ.την επιλ.λέξη" + "Προτάσεις bigram" + "Χρήση προηγούμενης λέξης για τη βελτίωση πρότασης" "Καμία" "Βασική" @@ -89,8 +90,7 @@ "Για να χρησιμοποιήσετε τις φωνητικές εντολές, πιέστε το κουμπί μικροφώνου ή σύρετε το δάχτυλό σας κατά μήκος του πληκτρολογίου της οθόνης." "Μιλήστε τώρα" "Σε λειτουργία" - - + "Σφάλμα. Δοκιμάστε ξανά." "Δεν ήταν δυνατή η σύνδεση" "Σφάλμα, πολλές λέξεις." @@ -130,4 +130,12 @@ "Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα" "← Πατήστε ξανά για αποθήκευση" "Λεξικό διαθέσιμο" + + + + + + + + diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index cd17dba31..f94f7f78b 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -39,14 +39,15 @@ "Mayúsculas automáticas" "Poner en mayúscula el inicio de una oración" "Puntuación automática" - - + "Arreglos rápidos" "Corrige errores de escritura comunes" "Mostrar sugerencias" "Mostrar palabras sugeridas mientras escribe" "Completar automát." "La barra espaciadora o la puntuación insertan automáticamente la palabra resaltada." + "Sugerencias de Vigoran" + "Utiliza la palabra anterior para mejorar la sugerencia" "Ninguno" "Básico" @@ -89,8 +90,7 @@ "Para realizar entrada por voz, presiona el botón del micrófono o desliza tus dedos por el teclado en pantalla." "Habla ahora" "Procesando" - - + "Error. Vuelve a intentarlo." "No se pudo establecer la conexión." "Error, demasiado discurso." @@ -130,4 +130,12 @@ "Deslizarse manualmente por la barra espaciadora para cambiar el idioma" "← Presionar nuevamente para guardar" "Diccionario disponible" + + + + + + + + diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index fbe3ad347..1c8f02bba 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -39,14 +39,15 @@ "Uso de mayúsculas auto." "Escribir en mayúscula el principio de la frase" "Puntuación automática" - - + "Correcciones rápidas" "Corrige los errores tipográficos que se cometen con más frecuencia." "Mostrar sugerencias" "Muestra las palabras sugeridas mientras se escribe." "Autocompletar" "La barra espaciadora y los signos de puntuación insertan automáticamente la palabra resaltada." + "Sugerencias de bigramas" + "Usar palabra anterior para mejorar sugerencias" "Ninguno" "Básico" @@ -89,8 +90,7 @@ "Para utilizar la función de introducción de voz, pulsa el botón de micrófono o desliza el dedo por el teclado en pantalla." "Hablar ahora" "En curso" - - + "Se ha producido un error. Inténtalo de nuevo." "No se ha podido establecer conexión." "Se ha producido un error debido a un exceso de introducción de datos de voz." @@ -130,4 +130,12 @@ "Deslizar el dedo por la barra espaciadora para cambiar el idioma" "← Volver a tocar para guardar" "Hay un diccionario disponible." + + + + + + + + diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index 2cabe40d9..74a0a4edf 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -39,14 +39,15 @@ "Majuscules auto" "Mettre en majuscule la première lettre de chaque phrase" "Ponctuation automatique" - - + "Corrections rapides" "Corrige les fautes de frappe courantes" "Afficher les suggestions" "Afficher les suggestions de terme lors de la saisie" "Saisie semi-automatique" "Insérer auto. le terme surligné avec barre espace/ponctuation" + "Suggestions de type bigramme" + "Améliorer la suggestion en fonction du mot précédent" "Aucun" "Simple" @@ -89,8 +90,7 @@ "Pour utiliser la saisie vocale, appuyez sur la touche du microphone ou faites glisser votre doigt sur le clavier à l\'écran." "Parlez maintenant" "Traitement en cours" - - + "Erreur. Veuillez réessayer." "Connexion impossible" "Erreur, discours trop long." @@ -130,4 +130,12 @@ "Faites glisser votre doigt sur la barre d\'espacement pour changer la langue." "← Appuyer de nouveau pour enregistrer" "Dictionnaire disponible" + + + + + + + + diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 8100175b3..52c0b741e 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -39,14 +39,15 @@ "Maiuscole automatiche" "Rendi maiuscole le iniziali delle frasi" "Punteggiatura automat." - - + "Correzioni veloci" "Corregge gli errori di digitazione più comuni" "Mostra suggerimenti" "Visualizza le parole suggerite durante la digitazione" "Completamento autom." "Barra spaziatrice e punteggiatura inseriscono la parola evidenziata" + "Suggerimenti sui bigrammi" + "Utilizza parola precedente per migliorare il suggerimento" "Nessuna" "Base" @@ -89,8 +90,7 @@ "Per utilizzare i comandi vocali, premi il pulsante del microfono o fai scorrere il dito sulla tastiera sullo schermo." "Parla ora" "Elaborazione in corso" - - + "Errore. Riprova più tardi." "Impossibile connettersi." "Errore: conversazione troppo lunga." @@ -130,4 +130,12 @@ "Scorri il dito sulla barra spaziatrice per cambiare la lingua" "← Tocca di nuovo per salvare" "Dizionario disponibile" + + + + + + + + diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 7867684cb..58a49a238 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -39,14 +39,15 @@ "自動大文字変換" "英字入力で文頭文字を大文字にする" "句読点を自動入力" - - + "クイックフィックス" "よくある誤字・脱字を修正します" "入力候補を表示" "入力時に入力候補を表示する" "オートコンプリート" "反転表示されている変換候補をスペースまたは句読点キーで挿入する" + "バイグラム入力候補表示" + "直前の単語から入力候補を予測します" "なし" "基本" @@ -89,8 +90,7 @@ "音声入力するには、マイクボタンを押すか画面キーボードをスワイプしてください。" "お話しください" "処理中" - - + "エラーです。もう一度お試しください。" "接続できませんでした" "音声が長すぎてエラーになりました。" @@ -130,4 +130,12 @@ "スペースバーで指をスライドさせて言語を変更する" "←保存するにはもう一度タップ" "辞書を利用できます" + + + + + + + + diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index 94d1ff4ef..804526d39 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -39,14 +39,15 @@ "자동 대문자화" "문장의 첫 글자를 대문자로 표시" "자동 구두점 입력" - - + "빠른 수정" "자주 발생하는 오타를 수정합니다." "추천 단어 표시" "글자를 입력하는 동안 추천 단어를 표시" "자동 완성" "스페이스바와 문장부호 키로 강조 표시된 단어를 자동 삽입" + "Bigram 추천" + "이전 단어를 사용하여 추천 기능 개선" "없음" "기본" @@ -89,8 +90,7 @@ "음성 입력을 사용하려면 마이크 버튼을 누르거나 터치 키보드 위로 손가락을 미끄러지듯 움직이세요." "지금 말하세요." "인식 중" - - + "오류가 발생했습니다. 다시 시도해 보세요." "연결할 수 없습니다." "음성을 너무 많이 입력했습니다." @@ -130,4 +130,12 @@ "손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경" "← 저장하려면 다시 누르세요." "사전 사용 가능" + + + + + + + + diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 041d07eb3..4ff056ec5 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -39,14 +39,15 @@ "Stor forbokstav" "Start automatisk setninger med stor bokstav" "Automatisk punktum" - - + "Autokorrektur" "Retter vanlige stavefeil" "Vis forslag" "Vis foreslåtte ord under skriving" "Autofullføring" "Mellomrom og punktum setter automatisk inn valgt ord" + "Bigram-forslag" + "Bruk forrige ord til å forbedre forslaget" "Ingen" "Grunnleggende" @@ -89,8 +90,7 @@ "Du bruker talekommandoer ved å trykke på mikrofonknappen eller skyve fingeren over tastaturet på skjermen." "Snakk nå" "Arbeider" - - + "Feil. Prøv på nytt." "Kunne ikke koble til" "Feil – for mye tale" @@ -130,4 +130,12 @@ "Dra fingeren på mellomromstasten for å endre språk" "← Trykk på nytt for å lagre" "Ordbok tilgjengelig" + + + + + + + + diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index 00b197bf1..e65e67ccb 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -39,14 +39,15 @@ "Auto-hoofdlettergebruik" "Hoofdletter gebruiken aan het begin van een zin" "Automatische interpunctie" - - + "Snelle oplossingen" "Hiermee worden veelvoorkomende typefouten gecorrigeerd" "Suggesties weergeven" "Voorgestelde woorden weergeven tijdens typen" "Auto-aanvullen" "Gemarkeerd woord automatisch invoegen met spatiebalk en interpunctie" + "Digram-suggesties" + "Vorig woord gebruiken om suggestie te verbeteren" "Geen" "Basis" @@ -89,8 +90,7 @@ "Als u spraakinvoer gebruikt, drukt u op de microfoonknop of schuift u uw vinger over het schermtoetsenbord." "Nu spreken" "Wordt uitgevoerd" - - + "Fout. Probeer het opnieuw." "Kan geen verbinding maken" "Fout, te lange spraakinvoer." @@ -130,4 +130,12 @@ "Schuif uw vinger over de spatiebalk om de taal te wijzigen" "← Tik nogmaals om op te slaan" "Woordenboek beschikbaar" + + + + + + + + diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 0c72727ce..7026f02c6 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -39,14 +39,15 @@ "Wstawiaj wielkie litery" "Zamieniaj na wielką pierwszą literę zdania" "Automatyczna interpunkcja" - - + "Szybkie poprawki" "Poprawia częste błędy wpisywania" "Pokaż sugestie" "Wyświetl sugerowane słowa podczas wpisywania" "Autouzupełnianie" "Spacja i znaki przestankowe wstawiają wyróżnione słowo" + "Sugestie dla bigramów" + "Używaj poprzedniego wyrazu, aby polepszyć sugestię" "Brak" "Podstawowy" @@ -89,8 +90,7 @@ "Aby skorzystać z wprowadzania głosowego, naciśnij przycisk mikrofonu lub przesuń palcem po klawiaturze ekranowej." "Mów teraz" "W toku" - - + "Błąd. Spróbuj ponownie." "Nie można nawiązać połączenia" "Błąd, zbyt długa wypowiedź." @@ -130,4 +130,12 @@ "Przesuń palcem po spacji, aby zmienić język" "← Dotknij ponownie, aby zapisać" "Słownik dostępny" + + + + + + + + diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 35a9cb715..d94d84f35 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -39,14 +39,15 @@ "Letras maiúsculas automáticas" "Colocar inicial maiúscula no início de uma frase" "Pontuação automática" - - + "Correcções rápidas" "Corrige os erros de escrita comuns" "Mostrar sugestões" "Apresentar sugestões de palavras ao escrever" "Conclusão automática" "A barra de espaços e a pontuação inserem automaticamente uma palavra realçada" + "Sugestões Bigram" + "Utilizar a palavra anterior para melhorar a sugestão" "Nenhum" "Básico" @@ -89,8 +90,7 @@ "Para utilizar a entrada de voz, prima o botão do microfone ou deslize o dedo no teclado do ecrã." "Falar agora" "A executar" - - + "Erro. Tente novamente." "Não foi possível ligar" "Erro, discurso demasiado longo." @@ -130,4 +130,12 @@ "Deslize o dedo pela barra de espaço para alterar o idioma" "← Toque novamente para guardar" "Dicionário disponível" + + + + + + + + diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 235fd65ac..a20ecccea 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -39,14 +39,15 @@ "Capitaliz. automática" "Colocar em maiúscula o início de uma frase" "Pontuação automática" - - + "Reparos rápidos" "Corrige erros comuns de digitação" "Mostrar sugestões" "Exibir sugestões de palavras durante a digitação" "Conclusão automática" "Barra de espaço e pontuação inserem a palavra destacada" + "Sugestões de bigrama" + "Usar palavra anterior para melhorar a sugestão" "Nenhum" "Básico" @@ -89,8 +90,7 @@ "Para usar a entrada de voz, pressione o botão com o microfone ou deslize o dedo sobre o teclado na tela." "Fale agora" "Trabalhando" - - + "Erro. Tente novamente." "Não foi possível conectar" "Erro, fala muito longa." @@ -130,4 +130,12 @@ "Deslize o dedo na barra de espaços para alterar o idioma" "← Toque novamente para salvar" "Dicionário disponível" + + + + + + + + diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index e27402c7f..22d557e37 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -39,14 +39,15 @@ "Автоподст. заглавных" "Делать заглавной первую букву предложения" "Автопунктуация" - - + "Быстрое исправление" "Исправлять распространенные опечатки" "Предлагать варианты" "Предлагать варианты слов во время ввода" "Автозавершение" "При нажатии пробела вставлять предложенное слово" + "Биграммные предложения" + "Используйте предыдущее слово, чтобы улучшить предложение" "Нет" "Основной" @@ -89,8 +90,7 @@ "Чтобы использовать голосовой ввод, нажмите кнопку микрофона или проведите пальцем по экранной клавиатуре." "Говорите" "Выполняется обработка" - - + "Ошибка. Повторите попытку." "Ошибка подключения" "Слишком длинная фраза" @@ -130,4 +130,12 @@ "Для изменения языка проведите пальцем по пробелу" "← Нажмите повторно, чтобы сохранить" "Доступен словарь" + + + + + + + + diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 9c6c22159..82f652997 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -39,14 +39,15 @@ "Automatiska versaler" "Använd versal i början av mening" "Automatiska punkter" - - + "Snabba lösningar" "Åtgärdar automatiskt vanliga misstag" "Visa förslag" "Visar ordförslag när du skriver" "Komplettera automatiskt" "Blanksteg och punkt infogar automatiskt markerat ord" + "Bigramförslag" + "Förbättra förslaget med föregående ord" "Inget" "Grundinställningar" @@ -89,8 +90,7 @@ "Om du vill använda röstinmatning trycker du på mikrofonknappen eller drar fingret över tangentbordet på skärmen." "Tala nu" "Fungerar" - - + "Fel. Försök igen." "Det gick inte att ansluta" "Fel, för mycket tal." @@ -130,4 +130,12 @@ "Dra med fingret på blanksteg om du vill ändra språk" "← Peka igen för att spara" "En ordlista är tillgänglig" + + + + + + + + diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 0fbdc7da3..820327b0a 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -39,14 +39,15 @@ "Otomatik olarak büyük harf yap" "Cümlenin baş harfini büyük yap" "Otomatik noktalama" - - + "Hızlı onarımlar" "Yaygın olarak yapılan yazım hatalarını düzeltir" "Önerileri göster" "Yazarken önerilen kelimeleri görüntüle" "Otomatik tamamla" "Boşluk tuşu ve noktalama vurgulanan kelimeyi otomatik ekler" + "Bigram Önerileri" + "Öneriyi geliştirmek için önceki kelimeyi kullanın" "Yok" "Temel" @@ -89,8 +90,7 @@ "Ses girişini kullanmak için mikrofon düğmesine basın veya parmağınızı dokunmatik klavye üzerinde kaydırın." "Şimdi konuşun" "Çalışıyor" - - + "Hata. Lütfen tekrar deneyin." "Bağlanamadı" "Hata, çok uzun konuşma." @@ -130,4 +130,12 @@ "Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın" "← Kaydetmek için tekrar dokunun" "Sözlük kullanılabilir" + + + + + + + + diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 9c9b25708..953c93b5a 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -39,14 +39,15 @@ "自动大写" "句首字母大写" "自动加标点" - - + "快速纠正" "纠正常见的输入错误" "显示建议" "输入时启用联想提示" "自动填写" "按空格键和标点符号时自动插入突出显示的字词" + "双连词建议" + "使用以前的字词改进建议" "无" "基本模式" @@ -89,8 +90,7 @@ "要使用语音输入,请按麦克风按钮或者在屏幕键盘上滑动手指。" "请开始说话" "正在处理" - - + "出错,请重试。" "无法连接" "出错,语音过长。" @@ -130,4 +130,12 @@ "在空格键上滑动手指可更改语言" "← 再次点按即可保存" "提供字典" + + + + + + + + diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 4f83be405..7748589cb 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -39,14 +39,15 @@ "自動大寫" "句首字母大寫" "自動標點" - - + "快速修正" "修正一般打字錯誤" "顯示建議" "打字時顯示建議字詞" "自動完成" "在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤" + "雙連詞建議" + "使用前一個字詞來改善建議" "無" "基本模式" @@ -89,8 +90,7 @@ "如要使用語音輸入,按下 [麥克風] 按鈕,或將手指滑過螢幕小鍵盤即可。" "請說話" "辨識中" - - + "發生錯誤,請再試一次。" "無法連線" "錯誤:語音內容過長。" @@ -130,4 +130,12 @@ "以手指在空白鍵上滑動可變更語言" "← 再次輕按可儲存" "可使用字典" + + + + + + + + From 6dea4254808017374af47b126f179c515bd544a9 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Thu, 5 Aug 2010 15:09:04 -0700 Subject: [PATCH 142/159] Fix for NPE in saveWordInHistory Bug: 2898207 --- java/src/com/android/inputmethod/latin/LatinIME.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 13f018a28..917f89916 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1394,6 +1394,11 @@ public class LatinIME extends InputMethodService mWord.reset(); return; } + // Skip if result is null. It happens in some edge case. + if (TextUtils.isEmpty(result)) { + return; + } + // Make a copy of the CharSequence, since it is/could be a mutable CharSequence final String resultCopy = result.toString(); TypedWordAlternatives entry = new TypedWordAlternatives(resultCopy, From 4e19a93cbd0a5247908eb8b65ac51a0834402fdf Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Tue, 10 Aug 2010 12:13:13 -0700 Subject: [PATCH 143/159] Import revised translations. Change-Id: I19c1bce22c2395b727891f60776946a0eec7145b --- java/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 22d557e37..a1b680ed3 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -46,8 +46,8 @@ "Предлагать варианты слов во время ввода" "Автозавершение" "При нажатии пробела вставлять предложенное слово" - "Биграммные предложения" - "Используйте предыдущее слово, чтобы улучшить предложение" + "Биграммные подсказки " + "Используйте предыдущее слово, чтобы исправить подсказку" "Нет" "Основной" From ac093396ba20437a240dbcf4e2b35f9d5355bd6c Mon Sep 17 00:00:00 2001 From: Jae Yong Sung Date: Tue, 3 Aug 2010 18:28:38 -0700 Subject: [PATCH 144/159] -UserBigram -UnitTest for UserBigram -Changes for number of bigrams to load Change-Id: I2c6fbe6194d34112ccc52c7e199461d2350e8516 --- .../inputmethod/latin/AutoDictionary.java | 10 +- .../inputmethod/latin/BinaryDictionary.java | 10 +- .../inputmethod/latin/ContactsDictionary.java | 4 +- .../latin/ExpandableDictionary.java | 83 ++-- .../android/inputmethod/latin/LatinIME.java | 20 +- .../android/inputmethod/latin/Suggest.java | 14 +- .../latin/UserBigramDictionary.java | 402 ++++++++++++++++++ .../latin/{tests => }/SuggestHelper.java | 97 ++++- .../{tests => }/SuggestPerformanceTests.java | 7 +- .../latin/{tests => }/SuggestTests.java | 4 +- .../inputmethod/latin/UserBigramTests.java | 100 +++++ 11 files changed, 676 insertions(+), 75 deletions(-) create mode 100644 java/src/com/android/inputmethod/latin/UserBigramDictionary.java rename tests/src/com/android/inputmethod/latin/{tests => }/SuggestHelper.java (68%) rename tests/src/com/android/inputmethod/latin/{tests => }/SuggestPerformanceTests.java (97%) rename tests/src/com/android/inputmethod/latin/{tests => }/SuggestTests.java (98%) create mode 100644 tests/src/com/android/inputmethod/latin/UserBigramTests.java diff --git a/java/src/com/android/inputmethod/latin/AutoDictionary.java b/java/src/com/android/inputmethod/latin/AutoDictionary.java index 94331d3f2..4fbb5b012 100644 --- a/java/src/com/android/inputmethod/latin/AutoDictionary.java +++ b/java/src/com/android/inputmethod/latin/AutoDictionary.java @@ -83,14 +83,14 @@ public class AutoDictionary extends ExpandableDictionary { sDictProjectionMap.put(COLUMN_LOCALE, COLUMN_LOCALE); } - private static DatabaseHelper mOpenHelper = null; + private static DatabaseHelper sOpenHelper = null; public AutoDictionary(Context context, LatinIME ime, String locale, int dicTypeId) { super(context, dicTypeId); mIme = ime; mLocale = locale; - if (mOpenHelper == null) { - mOpenHelper = new DatabaseHelper(getContext()); + if (sOpenHelper == null) { + sOpenHelper = new DatabaseHelper(getContext()); } if (mLocale != null && mLocale.length() > 1) { loadDictionary(); @@ -169,7 +169,7 @@ public class AutoDictionary extends ExpandableDictionary { // Nothing pending? Return if (mPendingWrites.isEmpty()) return; // Create a background thread to write the pending entries - new UpdateDbTask(getContext(), mOpenHelper, mPendingWrites, mLocale).execute(); + new UpdateDbTask(getContext(), sOpenHelper, mPendingWrites, mLocale).execute(); // Create a new map for writing new entries into while the old one is written to db mPendingWrites = new HashMap(); } @@ -209,7 +209,7 @@ public class AutoDictionary extends ExpandableDictionary { qb.setProjectionMap(sDictProjectionMap); // Get the database and run the query - SQLiteDatabase db = mOpenHelper.getReadableDatabase(); + SQLiteDatabase db = sOpenHelper.getReadableDatabase(); Cursor c = qb.query(db, null, selection, selectionArgs, null, null, DEFAULT_SORT_ORDER); return c; diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index e2c0c4ccc..69c2b94f2 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -42,8 +42,8 @@ public class BinaryDictionary extends Dictionary { private static final String TAG = "BinaryDictionary"; private static final int MAX_ALTERNATIVES = 16; - private static final int MAX_WORDS = 16; - private static final int MAX_BIGRAMS = 255; // TODO Probably don't need all 255 + private static final int MAX_WORDS = 18; + private static final int MAX_BIGRAMS = 60; private static final int TYPED_LETTER_MULTIPLIER = 2; private static final boolean ENABLE_MISSED_CHARACTERS = true; @@ -140,8 +140,10 @@ public class BinaryDictionary extends Dictionary { Log.w(TAG, "No available memory for binary dictionary"); } finally { try { - for (int i = 0;i < is.length; i++) { - is[i].close(); + if (is != null) { + for (int i = 0; i < is.length; i++) { + is[i].close(); + } } } catch (IOException e) { Log.w(TAG, "Failed to close input stream"); diff --git a/java/src/com/android/inputmethod/latin/ContactsDictionary.java b/java/src/com/android/inputmethod/latin/ContactsDictionary.java index 756782887..ab75868cf 100644 --- a/java/src/com/android/inputmethod/latin/ContactsDictionary.java +++ b/java/src/com/android/inputmethod/latin/ContactsDictionary.java @@ -125,8 +125,8 @@ public class ContactsDictionary extends ExpandableDictionary { super.addWord(word, FREQUENCY_FOR_CONTACTS); if (!TextUtils.isEmpty(prevWord)) { // TODO Do not add email address - super.addBigrams(prevWord, word, - FREQUENCY_FOR_CONTACTS_BIGRAM); + // Not so critical + super.setBigram(prevWord, word, FREQUENCY_FOR_CONTACTS_BIGRAM); } prevWord = word; } diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java index 53f9ed8c8..e954c0818 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java @@ -20,8 +20,6 @@ import java.util.LinkedList; import android.content.Context; import android.os.AsyncTask; -import android.os.SystemClock; -import android.util.Log; /** * Base class for an in-memory dictionary that can grow dynamically and can @@ -325,12 +323,21 @@ public class ExpandableDictionary extends Dictionary { } } + protected int setBigram(String word1, String word2, int frequency) { + return addOrSetBigram(word1, word2, frequency, false); + } + + protected int addBigram(String word1, String word2, int frequency) { + return addOrSetBigram(word1, word2, frequency, true); + } + /** * Adds bigrams to the in-memory trie structure that is being used to retrieve any word - * @param addFrequency adding frequency of the pair + * @param frequency frequency for this bigrams + * @param addFrequency if true, it adds to current frequency * @return returns the final frequency */ - protected int addBigrams(String word1, String word2, int addFrequency) { + private int addOrSetBigram(String word1, String word2, int frequency, boolean addFrequency) { Node firstWord = searchWord(mRoots, word1, 0, null); Node secondWord = searchWord(mRoots, word2, 0, null); LinkedList bigram = firstWord.ngrams; @@ -340,14 +347,18 @@ public class ExpandableDictionary extends Dictionary { } else { for (NextWord nw : bigram) { if (nw.word == secondWord) { - nw.frequency += addFrequency; + if (addFrequency) { + nw.frequency += frequency; + } else { + nw.frequency = frequency; + } return nw.frequency; } } } - NextWord nw = new NextWord(secondWord, addFrequency); + NextWord nw = new NextWord(secondWord, frequency); firstWord.ngrams.add(nw); - return addFrequency; + return frequency; } /** @@ -385,22 +396,44 @@ public class ExpandableDictionary extends Dictionary { return searchWord(childNode.children, word, depth + 1, childNode); } - @Override - public void getBigrams(final WordComposer codes, final CharSequence previousWord, - final WordCallback callback, int[] nextLettersFrequencies) { + // @VisibleForTesting + boolean reloadDictionaryIfRequired() { synchronized (mUpdatingLock) { // If we need to update, start off a background task if (mRequiresReload) startDictionaryLoadingTaskLocked(); // Currently updating contacts, don't return any results. - if (mUpdatingDictionary) return; + return mUpdatingDictionary; } + } + private void runReverseLookUp(final CharSequence previousWord, final WordCallback callback) { Node prevWord = searchNode(mRoots, previousWord, 0, previousWord.length()); if (prevWord != null && prevWord.ngrams != null) { reverseLookUp(prevWord.ngrams, callback); } } + @Override + public void getBigrams(final WordComposer codes, final CharSequence previousWord, + final WordCallback callback, int[] nextLettersFrequencies) { + if (!reloadDictionaryIfRequired()) { + runReverseLookUp(previousWord, callback); + } + } + + /** + * Used only for testing purposes + * This function will wait for loading from database to be done + */ + void waitForDictionaryLoading() { + while (mUpdatingDictionary) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + } + } + /** * reverseLookUp retrieves the full word given a list of terminal nodes and adds those words * through callback. @@ -413,15 +446,18 @@ public class ExpandableDictionary extends Dictionary { for (NextWord nextWord : terminalNodes) { node = nextWord.word; freq = nextWord.frequency; - sb.setLength(0); - do { - sb.insert(0, node.code); - node = node.parent; - } while(node != null); + // TODO Not the best way to limit suggestion threshold + if (freq >= UserBigramDictionary.SUGGEST_THRESHOLD) { + sb.setLength(0); + do { + sb.insert(0, node.code); + node = node.parent; + } while(node != null); - // TODO better way to feed char array? - callback.addWord(sb.toString().toCharArray(), 0, sb.length(), freq, mDicTypeId, - DataType.BIGRAM); + // TODO better way to feed char array? + callback.addWord(sb.toString().toCharArray(), 0, sb.length(), freq, mDicTypeId, + DataType.BIGRAM); + } } } @@ -460,18 +496,11 @@ public class ExpandableDictionary extends Dictionary { @Override protected Void doInBackground(Void... v) { loadDictionaryAsync(); - return null; - } - - @Override - protected void onPostExecute(Void result) { - // TODO Auto-generated method stub synchronized (mUpdatingLock) { mUpdatingDictionary = false; } - super.onPostExecute(result); + return null; } - } static char toLowerCase(char c) { diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 917f89916..3ee9fe8eb 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -163,8 +163,7 @@ public class LatinIME extends InputMethodService KeyboardSwitcher mKeyboardSwitcher; private UserDictionary mUserDictionary; - // User Bigram is disabled for now - //private UserBigramDictionary mUserBigramDictionary; + private UserBigramDictionary mUserBigramDictionary; private ContactsDictionary mContactsDictionary; private AutoDictionary mAutoDictionary; @@ -454,15 +453,12 @@ public class LatinIME extends InputMethodService mAutoDictionary.close(); } mAutoDictionary = new AutoDictionary(this, this, mInputLocale, Suggest.DIC_AUTO); - // User Bigram is disabled for now - /* if (mUserBigramDictionary != null) { mUserBigramDictionary.close(); } mUserBigramDictionary = new UserBigramDictionary(this, this, mInputLocale, - Suggest.DIC_USERBIGRAM); + Suggest.DIC_USER); mSuggest.setUserBigramDictionary(mUserBigramDictionary); - */ mSuggest.setUserDictionary(mUserDictionary); mSuggest.setContactsDictionary(mContactsDictionary); mSuggest.setAutoDictionary(mAutoDictionary); @@ -698,8 +694,7 @@ public class LatinIME extends InputMethodService mKeyboardSwitcher.getInputView().closing(); } if (mAutoDictionary != null) mAutoDictionary.flushPendingWrites(); - // User Bigram is disabled for now - //if (mUserBigramDictionary != null) mUserBigramDictionary.flushPendingWrites(); + if (mUserBigramDictionary != null) mUserBigramDictionary.flushPendingWrites(); } @Override @@ -2007,15 +2002,14 @@ public class LatinIME extends InputMethodService && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) { mAutoDictionary.addWord(suggestion.toString(), frequencyDelta); } - // User Bigram is disabled for now - /* + if (mUserBigramDictionary != null) { - CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection()); + CharSequence prevWord = EditingUtil.getPreviousWord(getCurrentInputConnection(), + mSentenceSeparators); if (!TextUtils.isEmpty(prevWord)) { - mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString(), 1); + mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString()); } } - */ } } diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index cfb691021..a96737f5c 100755 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -78,12 +78,13 @@ public class Suggest implements Dictionary.WordCallback { private Dictionary mUserBigramDictionary; private int mPrefMaxSuggestions = 12; - private int mPrefMaxBigrams = 255; + + private static final int PREF_MAX_BIGRAMS = 60; private boolean mAutoTextEnabled; private int[] mPriorities = new int[mPrefMaxSuggestions]; - private int[] mBigramPriorities = new int[mPrefMaxBigrams]; + private int[] mBigramPriorities = new int[PREF_MAX_BIGRAMS]; // Handle predictive correction for only the first 1280 characters for performance reasons // If we support scripts that need latin characters beyond that, we should probably use some @@ -92,7 +93,7 @@ public class Suggest implements Dictionary.WordCallback { // latin characters. private int[] mNextLettersFrequencies = new int[1280]; private ArrayList mSuggestions = new ArrayList(); - private ArrayList mBigramSuggestions = new ArrayList(); + ArrayList mBigramSuggestions = new ArrayList(); private ArrayList mStringPool = new ArrayList(); private boolean mHaveCorrection; private CharSequence mOriginalWord; @@ -173,7 +174,7 @@ public class Suggest implements Dictionary.WordCallback { } mPrefMaxSuggestions = maxSuggestions; mPriorities = new int[mPrefMaxSuggestions]; - mBigramPriorities = new int[mPrefMaxBigrams]; + mBigramPriorities = new int[PREF_MAX_BIGRAMS]; collectGarbage(mSuggestions, mPrefMaxSuggestions); while (mStringPool.size() < mPrefMaxSuggestions) { StringBuilder sb = new StringBuilder(getApproxMaxWordLength()); @@ -242,7 +243,7 @@ public class Suggest implements Dictionary.WordCallback { || mCorrectionMode == CORRECTION_BASIC)) { // At first character typed, search only the bigrams Arrays.fill(mBigramPriorities, 0); - collectGarbage(mBigramSuggestions, mPrefMaxBigrams); + collectGarbage(mBigramSuggestions, PREF_MAX_BIGRAMS); if (!TextUtils.isEmpty(prevWordForBigram)) { CharSequence lowerPrevWord = prevWordForBigram.toString().toLowerCase(); @@ -401,7 +402,7 @@ public class Suggest implements Dictionary.WordCallback { if(dataType == Dictionary.DataType.BIGRAM) { suggestions = mBigramSuggestions; priorities = mBigramPriorities; - prefMaxSuggestions = mPrefMaxBigrams; + prefMaxSuggestions = PREF_MAX_BIGRAMS; } else { suggestions = mSuggestions; priorities = mPriorities; @@ -443,7 +444,6 @@ public class Suggest implements Dictionary.WordCallback { pos++; } } - if (pos >= prefMaxSuggestions) { return true; } diff --git a/java/src/com/android/inputmethod/latin/UserBigramDictionary.java b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java new file mode 100644 index 000000000..c3eab94f1 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/UserBigramDictionary.java @@ -0,0 +1,402 @@ +/* + * Copyright (C) 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.latin; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteQueryBuilder; +import android.os.AsyncTask; +import android.provider.BaseColumns; +import android.util.Log; + +/** + * Stores all the pairs user types in databases. Prune the database if the size + * gets too big. Unlike AutoDictionary, it even stores the pairs that are already + * in the dictionary. + */ +public class UserBigramDictionary extends ExpandableDictionary { + private static final String TAG = "UserBigramDictionary"; + + /** Any pair being typed or picked */ + private static final int FREQUENCY_FOR_TYPED = 2; + + /** Maximum frequency for all pairs */ + private static final int FREQUENCY_MAX = 127; + + /** + * If this pair is typed 6 times, it would be suggested. + * Should be smaller than ContactsDictionary.FREQUENCY_FOR_CONTACTS_BIGRAM + */ + protected static final int SUGGEST_THRESHOLD = 6 * FREQUENCY_FOR_TYPED; + + /** Maximum number of pairs. Pruning will start when databases goes above this number. */ + private static int sMaxUserBigrams = 10000; + + /** + * When it hits maximum bigram pair, it will delete until you are left with + * only (sMaxUserBigrams - sDeleteUserBigrams) pairs. + * Do not keep this number small to avoid deleting too often. + */ + private static int sDeleteUserBigrams = 1000; + + /** + * Database version should increase if the database structure changes + */ + private static final int DATABASE_VERSION = 1; + + private static final String DATABASE_NAME = "userbigram_dict.db"; + + /** Name of the words table in the database */ + private static final String MAIN_TABLE_NAME = "main"; + // TODO: Consume less space by using a unique id for locale instead of the whole + // 2-5 character string. (Same TODO from AutoDictionary) + private static final String MAIN_COLUMN_ID = BaseColumns._ID; + private static final String MAIN_COLUMN_WORD1 = "word1"; + private static final String MAIN_COLUMN_WORD2 = "word2"; + private static final String MAIN_COLUMN_LOCALE = "locale"; + + /** Name of the frequency table in the database */ + private static final String FREQ_TABLE_NAME = "frequency"; + private static final String FREQ_COLUMN_ID = BaseColumns._ID; + private static final String FREQ_COLUMN_PAIR_ID = "pair_id"; + private static final String FREQ_COLUMN_FREQUENCY = "freq"; + + private final LatinIME mIme; + + /** Locale for which this auto dictionary is storing words */ + private String mLocale; + + private HashSet mPendingWrites = new HashSet(); + private final Object mPendingWritesLock = new Object(); + private static volatile boolean sUpdatingDB = false; + + private final static HashMap sDictProjectionMap; + + static { + sDictProjectionMap = new HashMap(); + sDictProjectionMap.put(MAIN_COLUMN_ID, MAIN_COLUMN_ID); + sDictProjectionMap.put(MAIN_COLUMN_WORD1, MAIN_COLUMN_WORD1); + sDictProjectionMap.put(MAIN_COLUMN_WORD2, MAIN_COLUMN_WORD2); + sDictProjectionMap.put(MAIN_COLUMN_LOCALE, MAIN_COLUMN_LOCALE); + + sDictProjectionMap.put(FREQ_COLUMN_ID, FREQ_COLUMN_ID); + sDictProjectionMap.put(FREQ_COLUMN_PAIR_ID, FREQ_COLUMN_PAIR_ID); + sDictProjectionMap.put(FREQ_COLUMN_FREQUENCY, FREQ_COLUMN_FREQUENCY); + } + + private static DatabaseHelper sOpenHelper = null; + + private static class Bigram { + String word1; + String word2; + int frequency; + + Bigram(String word1, String word2, int frequency) { + this.word1 = word1; + this.word2 = word2; + this.frequency = frequency; + } + + @Override + public boolean equals(Object bigram) { + Bigram bigram2 = (Bigram) bigram; + return (word1.equals(bigram2.word1) && word2.equals(bigram2.word2)); + } + + @Override + public int hashCode() { + return (word1 + " " + word2).hashCode(); + } + } + + public void setDatabaseMax(int maxUserBigram) { + sMaxUserBigrams = maxUserBigram; + } + + public void setDatabaseDelete(int deleteUserBigram) { + sDeleteUserBigrams = deleteUserBigram; + } + + public UserBigramDictionary(Context context, LatinIME ime, String locale, int dicTypeId) { + super(context, dicTypeId); + mIme = ime; + mLocale = locale; + if (sOpenHelper == null) { + sOpenHelper = new DatabaseHelper(getContext()); + } + if (mLocale != null && mLocale.length() > 1) { + loadDictionary(); + } + } + + @Override + public void close() { + flushPendingWrites(); + // Don't close the database as locale changes will require it to be reopened anyway + // Also, the database is written to somewhat frequently, so it needs to be kept alive + // throughout the life of the process. + // mOpenHelper.close(); + super.close(); + } + + /** + * Pair will be added to the userbigram database. + */ + public int addBigrams(String word1, String word2) { + // remove caps + if (mIme != null && mIme.getCurrentWord().isAutoCapitalized()) { + word2 = Character.toLowerCase(word2.charAt(0)) + word2.substring(1); + } + + int freq = super.addBigram(word1, word2, FREQUENCY_FOR_TYPED); + if (freq > FREQUENCY_MAX) freq = FREQUENCY_MAX; + synchronized (mPendingWritesLock) { + if (freq == FREQUENCY_FOR_TYPED || mPendingWrites.isEmpty()) { + mPendingWrites.add(new Bigram(word1, word2, freq)); + } else { + Bigram bi = new Bigram(word1, word2, freq); + mPendingWrites.remove(bi); + mPendingWrites.add(bi); + } + } + + return freq; + } + + /** + * Schedules a background thread to write any pending words to the database. + */ + public void flushPendingWrites() { + synchronized (mPendingWritesLock) { + // Nothing pending? Return + if (mPendingWrites.isEmpty()) return; + // Create a background thread to write the pending entries + new UpdateDbTask(getContext(), sOpenHelper, mPendingWrites, mLocale).execute(); + // Create a new map for writing new entries into while the old one is written to db + mPendingWrites = new HashSet(); + } + } + + /** Used for testing purpose **/ + void waitUntilUpdateDBDone() { + synchronized (mPendingWritesLock) { + while (sUpdatingDB) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + } + return; + } + } + + @Override + public void loadDictionaryAsync() { + // Load the words that correspond to the current input locale + Cursor cursor = query(MAIN_COLUMN_LOCALE + "=?", new String[] { mLocale }); + try { + if (cursor.moveToFirst()) { + int word1Index = cursor.getColumnIndex(MAIN_COLUMN_WORD1); + int word2Index = cursor.getColumnIndex(MAIN_COLUMN_WORD2); + int frequencyIndex = cursor.getColumnIndex(FREQ_COLUMN_FREQUENCY); + while (!cursor.isAfterLast()) { + String word1 = cursor.getString(word1Index); + String word2 = cursor.getString(word2Index); + int frequency = cursor.getInt(frequencyIndex); + // Safeguard against adding really long words. Stack may overflow due + // to recursive lookup + if (word1.length() < MAX_WORD_LENGTH && word2.length() < MAX_WORD_LENGTH) { + super.setBigram(word1, word2, frequency); + } + cursor.moveToNext(); + } + } + } finally { + cursor.close(); + } + } + + /** + * Query the database + */ + private Cursor query(String selection, String[] selectionArgs) { + SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); + + // main INNER JOIN frequency ON (main._id=freq.pair_id) + qb.setTables(MAIN_TABLE_NAME + " INNER JOIN " + FREQ_TABLE_NAME + " ON (" + + MAIN_TABLE_NAME + "." + MAIN_COLUMN_ID + "=" + FREQ_TABLE_NAME + "." + + FREQ_COLUMN_PAIR_ID +")"); + + qb.setProjectionMap(sDictProjectionMap); + + // Get the database and run the query + SQLiteDatabase db = sOpenHelper.getReadableDatabase(); + Cursor c = qb.query(db, + new String[] { MAIN_COLUMN_WORD1, MAIN_COLUMN_WORD2, FREQ_COLUMN_FREQUENCY }, + selection, selectionArgs, null, null, null); + return c; + } + + /** + * This class helps open, create, and upgrade the database file. + */ + private static class DatabaseHelper extends SQLiteOpenHelper { + + DatabaseHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL("PRAGMA foreign_keys = ON;"); + db.execSQL("CREATE TABLE " + MAIN_TABLE_NAME + " (" + + MAIN_COLUMN_ID + " INTEGER PRIMARY KEY," + + MAIN_COLUMN_WORD1 + " TEXT," + + MAIN_COLUMN_WORD2 + " TEXT," + + MAIN_COLUMN_LOCALE + " TEXT" + + ");"); + db.execSQL("CREATE TABLE " + FREQ_TABLE_NAME + " (" + + FREQ_COLUMN_ID + " INTEGER PRIMARY KEY," + + FREQ_COLUMN_PAIR_ID + " INTEGER," + + FREQ_COLUMN_FREQUENCY + " INTEGER," + + "FOREIGN KEY(" + FREQ_COLUMN_PAIR_ID + ") REFERENCES " + MAIN_TABLE_NAME + + "(" + MAIN_COLUMN_ID + ")" + " ON DELETE CASCADE" + + ");"); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + + newVersion + ", which will destroy all old data"); + db.execSQL("DROP TABLE IF EXISTS " + MAIN_TABLE_NAME); + db.execSQL("DROP TABLE IF EXISTS " + FREQ_TABLE_NAME); + onCreate(db); + } + } + + /** + * Async task to write pending words to the database so that it stays in sync with + * the in-memory trie. + */ + private static class UpdateDbTask extends AsyncTask { + private final HashSet mMap; + private final DatabaseHelper mDbHelper; + private final String mLocale; + + public UpdateDbTask(Context context, DatabaseHelper openHelper, + HashSet pendingWrites, String locale) { + mMap = pendingWrites; + mLocale = locale; + mDbHelper = openHelper; + } + + /** Prune any old data if the database is getting too big. */ + private void checkPruneData(SQLiteDatabase db) { + db.execSQL("PRAGMA foreign_keys = ON;"); + Cursor c = db.query(FREQ_TABLE_NAME, new String[] { FREQ_COLUMN_PAIR_ID }, + null, null, null, null, null); + try { + int totalRowCount = c.getCount(); + // prune out old data if we have too much data + if (totalRowCount > sMaxUserBigrams) { + int numDeleteRows = (totalRowCount - sMaxUserBigrams) + sDeleteUserBigrams; + int pairIdColumnId = c.getColumnIndex(FREQ_COLUMN_PAIR_ID); + c.moveToFirst(); + int count = 0; + while (count < numDeleteRows && !c.isAfterLast()) { + String pairId = c.getString(pairIdColumnId); + // Deleting from MAIN table will delete the frequencies + // due to FOREIGN KEY .. ON DELETE CASCADE + db.delete(MAIN_TABLE_NAME, MAIN_COLUMN_ID + "=?", + new String[] { pairId }); + c.moveToNext(); + count++; + } + } + } finally { + c.close(); + } + } + + @Override + protected void onPreExecute() { + sUpdatingDB = true; + } + + @Override + protected Void doInBackground(Void... v) { + SQLiteDatabase db = mDbHelper.getWritableDatabase(); + db.execSQL("PRAGMA foreign_keys = ON;"); + // Write all the entries to the db + Iterator iterator = mMap.iterator(); + while (iterator.hasNext()) { + Bigram bi = iterator.next(); + + // find pair id + Cursor c = db.query(MAIN_TABLE_NAME, new String[] { MAIN_COLUMN_ID }, + MAIN_COLUMN_WORD1 + "=? AND " + MAIN_COLUMN_WORD2 + "=? AND " + + MAIN_COLUMN_LOCALE + "=?", + new String[] { bi.word1, bi.word2, mLocale }, null, null, null); + + int pairId; + if (c.moveToFirst()) { + // existing pair + pairId = c.getInt(c.getColumnIndex(MAIN_COLUMN_ID)); + db.delete(FREQ_TABLE_NAME, FREQ_COLUMN_PAIR_ID + "=?", + new String[] { Integer.toString(pairId) }); + } else { + // new pair + Long pairIdLong = db.insert(MAIN_TABLE_NAME, null, + getContentValues(bi.word1, bi.word2, mLocale)); + pairId = pairIdLong.intValue(); + } + c.close(); + + // insert new frequency + long s = db.insert(FREQ_TABLE_NAME, null, + getFrequencyContentValues(pairId, bi.frequency)); + } + checkPruneData(db); + sUpdatingDB = false; + + return null; + } + + private ContentValues getContentValues(String word1, String word2, String locale) { + ContentValues values = new ContentValues(3); + values.put(MAIN_COLUMN_WORD1, word1); + values.put(MAIN_COLUMN_WORD2, word2); + values.put(MAIN_COLUMN_LOCALE, locale); + return values; + } + + private ContentValues getFrequencyContentValues(int pairId, int frequency) { + ContentValues values = new ContentValues(2); + values.put(FREQ_COLUMN_PAIR_ID, pairId); + values.put(FREQ_COLUMN_FREQUENCY, frequency); + return values; + } + } + +} diff --git a/tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java b/tests/src/com/android/inputmethod/latin/SuggestHelper.java similarity index 68% rename from tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java rename to tests/src/com/android/inputmethod/latin/SuggestHelper.java index 107f04c7c..759bfa18a 100644 --- a/tests/src/com/android/inputmethod/latin/tests/SuggestHelper.java +++ b/tests/src/com/android/inputmethod/latin/SuggestHelper.java @@ -14,13 +14,13 @@ * the License. */ -package com.android.inputmethod.latin.tests; +package com.android.inputmethod.latin; import android.content.Context; -import android.test.AndroidTestCase; import android.text.TextUtils; import android.util.Log; import com.android.inputmethod.latin.Suggest; +import com.android.inputmethod.latin.UserBigramDictionary; import com.android.inputmethod.latin.WordComposer; import java.io.IOException; @@ -29,28 +29,32 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.Channels; import java.util.List; +import java.util.Locale; +import java.util.StringTokenizer; public class SuggestHelper { private Suggest mSuggest; + private UserBigramDictionary mUserBigram; private final String TAG; + /** Uses main dictionary only **/ public SuggestHelper(String tag, Context context, int[] resId) { TAG = tag; - InputStream[] res = null; + InputStream[] is = null; try { // merging separated dictionary into one if dictionary is separated int total = 0; - res = new InputStream[resId.length]; + is = new InputStream[resId.length]; for (int i = 0; i < resId.length; i++) { - res[i] = context.getResources().openRawResource(resId[i]); - total += res[i].available(); + is[i] = context.getResources().openRawResource(resId[i]); + total += is[i].available(); } ByteBuffer byteBuffer = ByteBuffer.allocateDirect(total).order(ByteOrder.nativeOrder()); int got = 0; for (int i = 0; i < resId.length; i++) { - got += Channels.newChannel(res[i]).read(byteBuffer); + got += Channels.newChannel(is[i]).read(byteBuffer); } if (got != total) { Log.w(TAG, "Read " + got + " bytes, expected " + total); @@ -62,8 +66,10 @@ public class SuggestHelper { Log.w(TAG, "No available memory for binary dictionary"); } finally { try { - for (int i = 0;i < res.length; i++) { - res[i].close(); + if (is != null) { + for (int i = 0; i < is.length; i++) { + is[i].close(); + } } } catch (IOException e) { Log.w(TAG, "Failed to close input stream"); @@ -73,6 +79,27 @@ public class SuggestHelper { mSuggest.setCorrectionMode(Suggest.CORRECTION_FULL_BIGRAM); } + /** Uses both main dictionary and user-bigram dictionary **/ + public SuggestHelper(String tag, Context context, int[] resId, int userBigramMax, + int userBigramDelete) { + this(tag, context, resId); + mUserBigram = new UserBigramDictionary(context, null, Locale.US.toString(), + Suggest.DIC_USER); + mUserBigram.setDatabaseMax(userBigramMax); + mUserBigram.setDatabaseDelete(userBigramDelete); + mSuggest.setUserBigramDictionary(mUserBigram); + } + + void changeUserBigramLocale(Context context, Locale locale) { + if (mUserBigram != null) { + flushUserBigrams(); + mUserBigram.close(); + mUserBigram = new UserBigramDictionary(context, null, locale.toString(), + Suggest.DIC_USER); + mSuggest.setUserBigramDictionary(mUserBigram); + } + } + private WordComposer createWordComposer(CharSequence s) { WordComposer word = new WordComposer(); for (int i = 0; i < s.length(); i++) { @@ -125,8 +152,8 @@ public class SuggestHelper { } private void getBigramSuggestions(CharSequence previous, CharSequence typed) { - if(!TextUtils.isEmpty(previous) && (typed.length() > 1)) { - WordComposer firstChar = createWordComposer(typed.charAt(0) + ""); + if (!TextUtils.isEmpty(previous) && (typed.length() > 1)) { + WordComposer firstChar = createWordComposer(Character.toString(typed.charAt(0))); mSuggest.getSuggestions(null, firstChar, false, previous); } } @@ -162,6 +189,54 @@ public class SuggestHelper { return mSuggest.isValidWord(typed); } + boolean isUserBigramSuggestion(CharSequence previous, char typed, + CharSequence expected) { + WordComposer word = createWordComposer(Character.toString(typed)); + + if (mUserBigram == null) return false; + + flushUserBigrams(); + if (!TextUtils.isEmpty(previous) && !TextUtils.isEmpty(Character.toString(typed))) { + WordComposer firstChar = createWordComposer(Character.toString(typed)); + mSuggest.getSuggestions(null, firstChar, false, previous); + boolean reloading = mUserBigram.reloadDictionaryIfRequired(); + if (reloading) mUserBigram.waitForDictionaryLoading(); + mUserBigram.getBigrams(firstChar, previous, mSuggest, null); + } + + List suggestions = mSuggest.mBigramSuggestions; + for (int i = 0; i < suggestions.size(); i++) { + if (TextUtils.equals(suggestions.get(i), expected)) return true; + } + + return false; + } + + void addToUserBigram(String sentence) { + StringTokenizer st = new StringTokenizer(sentence); + String previous = null; + while (st.hasMoreTokens()) { + String current = st.nextToken(); + if (previous != null) { + addToUserBigram(new String[] {previous, current}); + } + previous = current; + } + } + + void addToUserBigram(String[] pair) { + if (mUserBigram != null && pair.length == 2) { + mUserBigram.addBigrams(pair[0], pair[1]); + } + } + + void flushUserBigrams() { + if (mUserBigram != null) { + mUserBigram.flushPendingWrites(); + mUserBigram.waitUntilUpdateDBDone(); + } + } + final int[][] adjacents = { {'a','s','w','q',-1}, {'b','h','v','n','g','j',-1}, diff --git a/tests/src/com/android/inputmethod/latin/tests/SuggestPerformanceTests.java b/tests/src/com/android/inputmethod/latin/SuggestPerformanceTests.java similarity index 97% rename from tests/src/com/android/inputmethod/latin/tests/SuggestPerformanceTests.java rename to tests/src/com/android/inputmethod/latin/SuggestPerformanceTests.java index 473c440f9..7eb66d502 100644 --- a/tests/src/com/android/inputmethod/latin/tests/SuggestPerformanceTests.java +++ b/tests/src/com/android/inputmethod/latin/SuggestPerformanceTests.java @@ -14,16 +14,15 @@ * the License. */ -package com.android.inputmethod.latin.tests; +package com.android.inputmethod.latin; import android.test.AndroidTestCase; import android.util.Log; - +import com.android.inputmethod.latin.tests.R; import java.io.InputStreamReader; import java.io.InputStream; import java.io.BufferedReader; import java.util.StringTokenizer; -import java.util.regex.Pattern; public class SuggestPerformanceTests extends AndroidTestCase { private static final String TAG = "SuggestPerformanceTests"; @@ -122,6 +121,6 @@ public class SuggestPerformanceTests extends AndroidTestCase { * Check the log for detail */ public void testSuggestPerformance() { - assertTrue(runText(false) < runText(true)); + assertTrue(runText(false) <= runText(true)); } } diff --git a/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java b/tests/src/com/android/inputmethod/latin/SuggestTests.java similarity index 98% rename from tests/src/com/android/inputmethod/latin/tests/SuggestTests.java rename to tests/src/com/android/inputmethod/latin/SuggestTests.java index a42422b91..8463ed316 100644 --- a/tests/src/com/android/inputmethod/latin/tests/SuggestTests.java +++ b/tests/src/com/android/inputmethod/latin/SuggestTests.java @@ -14,10 +14,10 @@ * the License. */ -package com.android.inputmethod.latin.tests; +package com.android.inputmethod.latin; import android.test.AndroidTestCase; -import android.util.Log; +import com.android.inputmethod.latin.tests.R; public class SuggestTests extends AndroidTestCase { private static final String TAG = "SuggestTests"; diff --git a/tests/src/com/android/inputmethod/latin/UserBigramTests.java b/tests/src/com/android/inputmethod/latin/UserBigramTests.java new file mode 100644 index 000000000..cbf7bd8e1 --- /dev/null +++ b/tests/src/com/android/inputmethod/latin/UserBigramTests.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2010 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.test.AndroidTestCase; +import com.android.inputmethod.latin.tests.R; +import java.util.Locale; + +public class UserBigramTests extends AndroidTestCase { + private static final String TAG = "UserBigramTests"; + + private static final int SUGGESTION_STARTS = 6; + private static final int MAX_DATA = 20; + private static final int DELETE_DATA = 10; + + private SuggestHelper sh; + + @Override + protected void setUp() { + int[] resId = new int[] { R.raw.test }; + sh = new SuggestHelper(TAG, getTestContext(), resId, MAX_DATA, DELETE_DATA); + } + + /************************** Tests ************************/ + + /** + * Test suggestion started at right time + */ + public void testUserBigram() { + for (int i = 0; i < SUGGESTION_STARTS; i++) sh.addToUserBigram(pair1); + for (int i = 0; i < (SUGGESTION_STARTS - 1); i++) sh.addToUserBigram(pair2); + + assertTrue(sh.isUserBigramSuggestion("user", 'b', "bigram")); + assertFalse(sh.isUserBigramSuggestion("android", 'p', "platform")); + } + + /** + * Test loading correct (locale) bigrams + */ + public void testOpenAndClose() { + for (int i = 0; i < SUGGESTION_STARTS; i++) sh.addToUserBigram(pair1); + assertTrue(sh.isUserBigramSuggestion("user", 'b', "bigram")); + + // change to fr_FR + sh.changeUserBigramLocale(getTestContext(), Locale.FRANCE); + for (int i = 0; i < SUGGESTION_STARTS; i++) sh.addToUserBigram(pair3); + assertTrue(sh.isUserBigramSuggestion("locale", 'f', "france")); + assertFalse(sh.isUserBigramSuggestion("user", 'b', "bigram")); + + // change back to en_US + sh.changeUserBigramLocale(getTestContext(), Locale.US); + assertFalse(sh.isUserBigramSuggestion("locale", 'f', "france")); + assertTrue(sh.isUserBigramSuggestion("user", 'b', "bigram")); + } + + /** + * Test data gets pruned when it is over maximum + */ + public void testPruningData() { + for (int i = 0; i < SUGGESTION_STARTS; i++) sh.addToUserBigram(sentence0); + sh.flushUserBigrams(); + assertTrue(sh.isUserBigramSuggestion("Hello", 'w', "world")); + + sh.addToUserBigram(sentence1); + sh.addToUserBigram(sentence2); + assertTrue(sh.isUserBigramSuggestion("Hello", 'w', "world")); + + // pruning should happen + sh.addToUserBigram(sentence3); + sh.addToUserBigram(sentence4); + + // trying to reopen database to check pruning happened in database + sh.changeUserBigramLocale(getTestContext(), Locale.US); + assertFalse(sh.isUserBigramSuggestion("Hello", 'w', "world")); + } + + final String[] pair1 = new String[] {"user", "bigram"}; + final String[] pair2 = new String[] {"android","platform"}; + final String[] pair3 = new String[] {"locale", "france"}; + final String sentence0 = "Hello world"; + final String sentence1 = "This is a test for user input based bigram"; + final String sentence2 = "It learns phrases that contain both dictionary and nondictionary " + + "words"; + final String sentence3 = "This should give better suggestions than the previous version"; + final String sentence4 = "Android stock keyboard is improving"; +} From 0b0a686281a8b06ec1c669acbd7e4467acf8906d Mon Sep 17 00:00:00 2001 From: Yohei Fujii Date: Wed, 11 Aug 2010 20:50:20 +0900 Subject: [PATCH 145/159] add new preference for popup preview this option is disabled as the default at x-large Bug:2909517 Change-Id: Ifda1b7ff89bc4beeee02ba0f3e01d441a9435b37 --- java/res/values-xlarge/bools.xml | 23 +++++++++++++++++++ java/res/values/bools.xml | 2 ++ java/res/values/strings.xml | 3 +++ java/res/xml/prefs.xml | 7 ++++++ .../android/inputmethod/latin/LatinIME.java | 5 ++++ 5 files changed, 40 insertions(+) create mode 100644 java/res/values-xlarge/bools.xml diff --git a/java/res/values-xlarge/bools.xml b/java/res/values-xlarge/bools.xml new file mode 100644 index 000000000..fe8fc5838 --- /dev/null +++ b/java/res/values-xlarge/bools.xml @@ -0,0 +1,23 @@ + + + + + false + diff --git a/java/res/values/bools.xml b/java/res/values/bools.xml index a0cebbb94..f5f2c3d0e 100644 --- a/java/res/values/bools.xml +++ b/java/res/values/bools.xml @@ -26,4 +26,6 @@ true true + + true diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index e77155d50..d2166f7f5 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -29,6 +29,9 @@ Sound on keypress + + Popup on keypress + Correct typing errors diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index e4c689aa8..11cc3ac42 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -30,6 +30,13 @@ android:persistent="true" /> + + 0 || mShowSuggestions); checkTutorial(attribute.privateImeOptions); @@ -2295,6 +2298,7 @@ public class LatinIME extends InputMethodService SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); mVibrateOn = sp.getBoolean(PREF_VIBRATE_ON, false); mSoundOn = sp.getBoolean(PREF_SOUND_ON, false); + mPopupOn = sp.getBoolean(PREF_POPUP_ON, true); mAutoCap = sp.getBoolean(PREF_AUTO_CAP, true); mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true); mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false); @@ -2421,6 +2425,7 @@ public class LatinIME extends InputMethodService p.println(" TextEntryState.state=" + TextEntryState.getState()); p.println(" mSoundOn=" + mSoundOn); p.println(" mVibrateOn=" + mVibrateOn); + p.println(" mPopupOn=" + mPopupOn); } // Characters per second measurement From 648dcf55a369951eec5c7a29b8035105373b335b Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Thu, 12 Aug 2010 02:10:39 +0900 Subject: [PATCH 146/159] Revert the open-source LatinIME package name - from com.google.android.inputmethod.latin to com.android.inputmethod.latin Related change: https://android-git.corp.google.com/g/60862 bug: 2786392 Change-Id: Ib7c6cfe61db19ef50c401a01497eef5f1f5e239e --- java/Android.mk | 13 +------------ java/AndroidManifest.xml | 12 +++++------- java/res/layout/input_basic.xml | 2 +- java/res/layout/input_basic_highcontrast.xml | 2 +- java/res/layout/input_stone_bold.xml | 2 +- java/res/layout/input_stone_normal.xml | 2 +- java/res/layout/input_stone_popup.xml | 2 +- java/res/layout/input_trans.xml | 2 +- java/res/layout/keyboard_popup_keyboard.xml | 2 +- .../inputmethod/latin/InputLanguageSelection.java | 2 +- .../src/com/android/inputmethod/latin/LatinIME.java | 5 +++-- tests/AndroidManifest.xml | 2 +- 12 files changed, 18 insertions(+), 30 deletions(-) diff --git a/java/Android.mk b/java/Android.mk index 0d5a93db0..4bb8986ee 100755 --- a/java/Android.mk +++ b/java/Android.mk @@ -14,20 +14,9 @@ LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime LOCAL_STATIC_JAVA_LIBRARIES := android-common #LOCAL_AAPT_FLAGS := -0 .dict -# The following flag is required because we use a different package name -# com.google.android.inputmethod.latin than Java package name -# com.android.inputmethod.latin -LOCAL_AAPT_FLAGS := --custom-package com.android.inputmethod.latin -LOCAL_SDK_VERSION := 8 +LOCAL_SDK_VERSION := current LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags -# Define LOCAL_DICTIONARY_RESOURCE_DIR in order to overlay dictionaries. -# The overlay dictionary resource directory should have dictionary files such -# as raw-en/main.dict, raw-es/main.dict per locale. -ifneq ($(strip $(LOCAL_DICTIONARY_RESOURCE_DIR)),) -LOCAL_RESOURCE_DIR := $(LOCAL_DICTIONARY_RESOURCE_DIR) $(LOCAL_PATH)/res -endif - include $(BUILD_PACKAGE) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index f87ce013b..642c717d3 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,7 +1,5 @@ - - + package="com.android.inputmethod.latin"> @@ -10,10 +8,10 @@ - @@ -22,13 +20,13 @@ - + - diff --git a/java/res/layout/input_basic.xml b/java/res/layout/input_basic.xml index ffa59543b..168eba691 100755 --- a/java/res/layout/input_basic.xml +++ b/java/res/layout/input_basic.xml @@ -20,7 +20,7 @@ dictionaries = new ArrayList(); @@ -443,7 +444,7 @@ public class LatinIME extends InputMethodService SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true); - int[] dictionaries = getDictionary(orig, this.getPackageName()); + int[] dictionaries = getDictionary(orig); mSuggest = new Suggest(this, dictionaries); updateAutoTextEnabled(saveLocale); if (mUserDictionary != null) mUserDictionary.close(); diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml index 66cecee8b..210e81489 100644 --- a/tests/AndroidManifest.xml +++ b/tests/AndroidManifest.xml @@ -27,7 +27,7 @@ From fda1ae71b5c9582adf809ef723397ca244752696 Mon Sep 17 00:00:00 2001 From: Yohei Fujii Date: Fri, 13 Aug 2010 19:02:34 +0900 Subject: [PATCH 147/159] Fixed the issue of popup enabled when i change to symbol keyboard. Bug:2909517 Change-Id: I1c010b1079a04ff3b08d690c536fbe8d4414ea14 --- java/src/com/android/inputmethod/latin/KeyboardSwitcher.java | 2 +- java/src/com/android/inputmethod/latin/LatinIME.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index bcf4902f2..ed6adce9e 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -230,7 +230,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } mIsSymbols = isSymbols; - mInputView.setPreviewEnabled(true); + mInputView.setPreviewEnabled(mInputMethodService.getPopupOn()); KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols); LatinKeyboard keyboard = null; keyboard = getKeyboard(id); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 307338404..155e8cbba 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -2261,6 +2261,10 @@ public class LatinIME extends InputMethodService return mWord; } + boolean getPopupOn() { + return mPopupOn; + } + private void updateCorrectionMode() { mHasDictionary = mSuggest != null ? mSuggest.hasMainDictionary() : false; mAutoCorrectOn = (mAutoCorrectEnabled || mQuickFixes) From c9a181b1b340012fbc8c32d23a3294364a7ad27b Mon Sep 17 00:00:00 2001 From: Yohei Fujii Date: Tue, 17 Aug 2010 18:07:54 +0900 Subject: [PATCH 148/159] Fixed default preference issue. Change-Id: I6d12bc054fde0fe3ea03b673e7b5b7d7f8db8d54 --- java/src/com/android/inputmethod/latin/LatinIME.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 155e8cbba..b059b6cfe 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -345,6 +345,7 @@ public class LatinIME extends InputMethodService //setStatusIcon(R.drawable.ime_qwerty); mResources = getResources(); final Configuration conf = mResources.getConfiguration(); + PreferenceManager.setDefaultValues(this, R.xml.prefs, false); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); mLanguageSwitcher = new LanguageSwitcher(this); mLanguageSwitcher.loadLocales(prefs); From 4b892a1daac6094a37ee20760de55fd01651ee99 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 17 Aug 2010 14:53:55 +0200 Subject: [PATCH 149/159] Fix various modifier keys on the Norwegian keyboard. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are some traditional differences between Norwegian and Swedish keyboard layouts -- for instance, few Norwegians would search for ü on the y key, but it is so on the Swedish keyboard. Correct the most obvious differences. Change-Id: Iab53fa51ff7faa2022b10b551e47060a6f2c5652 --- java/res/xml-nb/kbd_qwerty.xml | 12 +++++------- java/res/xml-nb/kbd_qwerty_black.xml | 12 +++++------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/java/res/xml-nb/kbd_qwerty.xml b/java/res/xml-nb/kbd_qwerty.xml index 554bb00eb..d2f0258c1 100644 --- a/java/res/xml-nb/kbd_qwerty.xml +++ b/java/res/xml-nb/kbd_qwerty.xml @@ -46,16 +46,16 @@ android:popupCharacters="ťþ"/> + android:popupCharacters="ýÿ"/> + android:popupCharacters="üúùûū"/> + android:popupCharacters="öóòôõ"/> @@ -64,7 +64,7 @@ + android:popupCharacters="œ"/> diff --git a/java/res/xml-nb/kbd_qwerty_black.xml b/java/res/xml-nb/kbd_qwerty_black.xml index 9d4c52d38..150ff7fc7 100644 --- a/java/res/xml-nb/kbd_qwerty_black.xml +++ b/java/res/xml-nb/kbd_qwerty_black.xml @@ -46,16 +46,16 @@ android:popupCharacters="ťþ"/> + android:popupCharacters="ýÿ"/> + android:popupCharacters="üúùûū"/> + android:popupCharacters="öóòôõ"/> @@ -64,7 +64,7 @@ + android:popupCharacters="œ"/> From c20c5a8d4c29f52075a157098cf8d7192a45ac36 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Fri, 13 Aug 2010 13:29:49 -0700 Subject: [PATCH 150/159] Fixes for correction mode - reliably show the corrections when tapping on a word. Also, continue to show the corrections when user keeps replacing the word repeatedly with different corrections from the suggestion strip. There were problems with tapping suggestions quickly or tapping the same suggestion more than once (same length). Also fixes Bug: 2852891 - Text suggestion appears incorrectly when selecting text that's not a whole word. Changed the TextEntryState states to an enum type instead of int. Needed it to show the states for debugging purposes. --- .../inputmethod/latin/EditingUtil.java | 27 +++- .../android/inputmethod/latin/LatinIME.java | 44 +++-- .../inputmethod/latin/TextEntryState.java | 150 ++++++++++-------- 3 files changed, 142 insertions(+), 79 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/EditingUtil.java b/java/src/com/android/inputmethod/latin/EditingUtil.java index 0c87f8d58..be31cb787 100644 --- a/java/src/com/android/inputmethod/latin/EditingUtil.java +++ b/java/src/com/android/inputmethod/latin/EditingUtil.java @@ -16,12 +16,12 @@ package com.android.inputmethod.latin; -import java.util.regex.Pattern; - import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; +import java.util.regex.Pattern; + /** * Utility methods to deal with editing text through an InputConnection. */ @@ -203,4 +203,27 @@ public class EditingUtil { return null; } } + + /** + * Checks if the cursor is touching/inside a word or the selection is for a whole + * word and no more and no less. + * @param range the Range object that contains the bounds of the word around the cursor + * @param start the start of the selection + * @param end the end of the selection, which could be the same as the start, if text is not + * in selection mode + * @return false if the selection is a partial word or straddling multiple words, true if + * the selection is a full word or there is no selection. + */ + public static boolean isFullWordOrInside(Range range, int start, int end) { + // Is the cursor inside or touching a word? + if (start == end) return true; + + // Is it a selection? Then is the start of the selection the start of the word and + // the size of the selection the size of the word? Then return true + if (start < end + && (range.charsBefore == 0 && range.charsAfter == end - start)) { + return true; + } + return false; + } } diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index b059b6cfe..b1bb84d27 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -752,10 +752,10 @@ public class LatinIME extends InputMethodService mVoiceInputHighlighted = false; } else if (!mPredicting && !mJustAccepted) { switch (TextEntryState.getState()) { - case TextEntryState.STATE_ACCEPTED_DEFAULT: + case ACCEPTED_DEFAULT: TextEntryState.reset(); // fall through - case TextEntryState.STATE_SPACE_AFTER_PICKED: + case SPACE_AFTER_PICKED: mJustAddedAutoSpace = false; // The user moved the cursor. break; } @@ -768,10 +768,10 @@ public class LatinIME extends InputMethodService mLastSelectionEnd = newSelEnd; - // TODO: Uncomment this block when we enable re-editing feature - // If a word is selected + // Check if we should go in or out of correction mode. if (isPredictionOn() && mJustRevertedSeparator == null - && (candidatesStart == candidatesEnd || newSelStart != oldSelStart) + && (candidatesStart == candidatesEnd || newSelStart != oldSelStart + || TextEntryState.isCorrecting()) && (newSelStart < newSelEnd - 1 || (!mPredicting)) && !mVoiceInputHighlighted) { if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) { @@ -1207,7 +1207,7 @@ public class LatinIME extends InputMethodService } postUpdateShiftKeyState(); TextEntryState.backspace(); - if (TextEntryState.getState() == TextEntryState.STATE_UNDO_COMMIT) { + if (TextEntryState.getState() == TextEntryState.State.UNDO_COMMIT) { revertLastWord(deleteChar); ic.endBatchEdit(); return; @@ -1358,13 +1358,13 @@ public class LatinIME extends InputMethodService // Handle the case of ". ." -> " .." with auto-space if necessary // before changing the TextEntryState. - if (TextEntryState.getState() == TextEntryState.STATE_PUNCTUATION_AFTER_ACCEPTED + if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED && primaryCode == KEYCODE_PERIOD) { reswapPeriodAndSpace(); } TextEntryState.typedCharacter((char) primaryCode, true); - if (TextEntryState.getState() == TextEntryState.STATE_PUNCTUATION_AFTER_ACCEPTED + if (TextEntryState.getState() == TextEntryState.State.PUNCTUATION_AFTER_ACCEPTED && primaryCode != KEYCODE_ENTER) { swapPunctuationAndSpace(); } else if (isPredictionOn() && primaryCode == KEYCODE_SPACE) { @@ -1790,8 +1790,16 @@ public class LatinIME extends InputMethodService mJustAddedAutoSpace = true; } - // Fool the state watcher so that a subsequent backspace will not do a revert - TextEntryState.typedCharacter((char) KEYCODE_SPACE, true); + // Fool the state watcher so that a subsequent backspace will not do a revert, unless + // we just did a correction, in which case we need to stay in + // TextEntryState.State.PICKED_SUGGESTION state. + if (!correcting) { + TextEntryState.typedCharacter((char) KEYCODE_SPACE, true); + setNextSuggestions(); + } else { + // In case the cursor position doesn't change, make sure we show the suggestions again. + postUpdateOldSuggestions(); + } if (index == 0 && mCorrectionMode > 0 && !mSuggest.isValidWord(suggestion) && !mSuggest.isValidWord(suggestion.toString().toLowerCase())) { mCandidateView.showAddToDictionaryHint(suggestion); @@ -1820,7 +1828,6 @@ public class LatinIME extends InputMethodService mWordToSuggestions.put(suggestion.toString(), suggestions); } } - // TODO: implement rememberReplacedWord for typed words } /** @@ -1860,7 +1867,10 @@ public class LatinIME extends InputMethodService mPredicting = false; mCommittedLength = suggestion.length(); ((LatinKeyboard) inputView.getKeyboard()).setPreferredLetters(null); - setNextSuggestions(); + // If we just corrected a word, then don't show punctuations + if (!correcting) { + setNextSuggestions(); + } updateShiftKeyState(getCurrentInputEditorInfo()); } @@ -1880,13 +1890,16 @@ public class LatinIME extends InputMethodService EditingUtil.Range range = new EditingUtil.Range(); CharSequence touching = EditingUtil.getWordAtCursor(getCurrentInputConnection(), mWordSeparators, range); - if (touching != null && touching.length() > 1) { + // If it's a selection, check if it's an entire word and no more, no less. + boolean fullword = EditingUtil.isFullWordOrInside(range, mLastSelectionStart, + mLastSelectionEnd); + if (fullword && touching != null && touching.length() > 1) { + // Strip out any trailing word separator if (mWordSeparators.indexOf(touching.charAt(touching.length() - 1)) > 0) { touching = touching.toString().substring(0, touching.length() - 1); } // Search for result in spoken word alternatives - // TODO: possibly combine the spoken suggestions with the typed suggestions. String selectedWord = touching.toString().trim(); if (!mWordToSuggestions.containsKey(selectedWord)){ selectedWord = selectedWord.toLowerCase(); @@ -1911,7 +1924,8 @@ public class LatinIME extends InputMethodService ic.endBatchEdit(); return; } - // If we didn't find a match, search for result in word history + + // If we didn't find a match, search for result in typed word history WordComposer foundWord = null; WordAlternatives alternatives = null; for (WordAlternatives entry : mWordHistory) { diff --git a/java/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java index bc7bf3f71..9011191f1 100644 --- a/java/src/com/android/inputmethod/latin/TextEntryState.java +++ b/java/src/com/android/inputmethod/latin/TextEntryState.java @@ -17,19 +17,22 @@ package com.android.inputmethod.latin; import android.content.Context; +import android.inputmethodservice.Keyboard.Key; import android.text.format.DateFormat; import android.util.Log; -import android.inputmethodservice.Keyboard.Key; - import java.io.FileOutputStream; import java.io.IOException; import java.util.Calendar; public class TextEntryState { + private static final boolean DBG = false; + + private static final String TAG = "TextEntryState"; + private static boolean LOGGING = false; - + private static int sBackspaceCount = 0; private static int sAutoSuggestCount = 0; @@ -46,20 +49,22 @@ public class TextEntryState { private static int sActualChars; - public static final int STATE_UNKNOWN = 0; - public static final int STATE_START = 1; - public static final int STATE_IN_WORD = 2; - public static final int STATE_ACCEPTED_DEFAULT = 3; - public static final int STATE_PICKED_SUGGESTION = 4; - public static final int STATE_PUNCTUATION_AFTER_WORD = 5; - public static final int STATE_PUNCTUATION_AFTER_ACCEPTED = 6; - public static final int STATE_SPACE_AFTER_ACCEPTED = 7; - public static final int STATE_SPACE_AFTER_PICKED = 8; - public static final int STATE_UNDO_COMMIT = 9; - public static final int STATE_CORRECTING = 10; - public static final int STATE_PICKED_CORRECTION = 11; + public enum State { + UNKNOWN, + START, + IN_WORD, + ACCEPTED_DEFAULT, + PICKED_SUGGESTION, + PUNCTUATION_AFTER_WORD, + PUNCTUATION_AFTER_ACCEPTED, + SPACE_AFTER_ACCEPTED, + SPACE_AFTER_PICKED, + UNDO_COMMIT, + CORRECTING, + PICKED_CORRECTION; + } - private static int sState = STATE_UNKNOWN; + private static State sState = State.UNKNOWN; private static FileOutputStream sKeyLocationFile; private static FileOutputStream sUserActionFile; @@ -73,7 +78,7 @@ public class TextEntryState { sWordNotInDictionaryCount = 0; sTypedChars = 0; sActualChars = 0; - sState = STATE_START; + sState = State.START; if (LOGGING) { try { @@ -118,118 +123,133 @@ public class TextEntryState { } sTypedChars += typedWord.length(); sActualChars += actualWord.length(); - sState = STATE_ACCEPTED_DEFAULT; + sState = State.ACCEPTED_DEFAULT; LatinImeLogger.logOnAutoSuggestion(typedWord.toString(), actualWord.toString()); + displayState(); } - // STATE_ACCEPTED_DEFAULT will be changed to other sub-states - // (see "case STATE_ACCEPTED_DEFAULT" in typedCharacter() below), - // and should be restored back to STATE_ACCEPTED_DEFAULT after processing for each sub-state. + // State.ACCEPTED_DEFAULT will be changed to other sub-states + // (see "case ACCEPTED_DEFAULT" in typedCharacter() below), + // and should be restored back to State.ACCEPTED_DEFAULT after processing for each sub-state. public static void backToAcceptedDefault(CharSequence typedWord) { if (typedWord == null) return; switch (sState) { - case STATE_SPACE_AFTER_ACCEPTED: - case STATE_PUNCTUATION_AFTER_ACCEPTED: - case STATE_IN_WORD: - sState = STATE_ACCEPTED_DEFAULT; + case SPACE_AFTER_ACCEPTED: + case PUNCTUATION_AFTER_ACCEPTED: + case IN_WORD: + sState = State.ACCEPTED_DEFAULT; break; } + displayState(); } public static void acceptedTyped(CharSequence typedWord) { sWordNotInDictionaryCount++; - sState = STATE_PICKED_SUGGESTION; + sState = State.PICKED_SUGGESTION; + displayState(); } public static void acceptedSuggestion(CharSequence typedWord, CharSequence actualWord) { sManualSuggestCount++; - int oldState = sState; + State oldState = sState; if (typedWord.equals(actualWord)) { acceptedTyped(typedWord); } - sState = oldState == STATE_CORRECTING ? STATE_PICKED_CORRECTION : STATE_PICKED_SUGGESTION; + if (oldState == State.CORRECTING || oldState == State.PICKED_CORRECTION) { + sState = State.PICKED_CORRECTION; + } else { + sState = State.PICKED_SUGGESTION; + } + displayState(); } public static void selectedForCorrection() { - sState = STATE_CORRECTING; + sState = State.CORRECTING; + displayState(); } public static void typedCharacter(char c, boolean isSeparator) { boolean isSpace = c == ' '; switch (sState) { - case STATE_IN_WORD: + case IN_WORD: if (isSpace || isSeparator) { - sState = STATE_START; + sState = State.START; } else { // State hasn't changed. } break; - case STATE_ACCEPTED_DEFAULT: - case STATE_SPACE_AFTER_PICKED: + case ACCEPTED_DEFAULT: + case SPACE_AFTER_PICKED: if (isSpace) { - sState = STATE_SPACE_AFTER_ACCEPTED; + sState = State.SPACE_AFTER_ACCEPTED; } else if (isSeparator) { - sState = STATE_PUNCTUATION_AFTER_ACCEPTED; + sState = State.PUNCTUATION_AFTER_ACCEPTED; } else { - sState = STATE_IN_WORD; + sState = State.IN_WORD; } break; - case STATE_PICKED_SUGGESTION: - case STATE_PICKED_CORRECTION: + case PICKED_SUGGESTION: + case PICKED_CORRECTION: if (isSpace) { - sState = STATE_SPACE_AFTER_PICKED; + sState = State.SPACE_AFTER_PICKED; } else if (isSeparator) { // Swap - sState = STATE_PUNCTUATION_AFTER_ACCEPTED; + sState = State.PUNCTUATION_AFTER_ACCEPTED; } else { - sState = STATE_IN_WORD; + sState = State.IN_WORD; } break; - case STATE_START: - case STATE_UNKNOWN: - case STATE_SPACE_AFTER_ACCEPTED: - case STATE_PUNCTUATION_AFTER_ACCEPTED: - case STATE_PUNCTUATION_AFTER_WORD: + case START: + case UNKNOWN: + case SPACE_AFTER_ACCEPTED: + case PUNCTUATION_AFTER_ACCEPTED: + case PUNCTUATION_AFTER_WORD: if (!isSpace && !isSeparator) { - sState = STATE_IN_WORD; + sState = State.IN_WORD; } else { - sState = STATE_START; + sState = State.START; } break; - case STATE_UNDO_COMMIT: + case UNDO_COMMIT: if (isSpace || isSeparator) { - sState = STATE_ACCEPTED_DEFAULT; + sState = State.ACCEPTED_DEFAULT; } else { - sState = STATE_IN_WORD; + sState = State.IN_WORD; } break; - case STATE_CORRECTING: - sState = STATE_START; + case CORRECTING: + sState = State.START; break; } + displayState(); } public static void backspace() { - if (sState == STATE_ACCEPTED_DEFAULT) { - sState = STATE_UNDO_COMMIT; + if (sState == State.ACCEPTED_DEFAULT) { + sState = State.UNDO_COMMIT; sAutoSuggestUndoneCount++; LatinImeLogger.logOnAutoSuggestionCanceled(); - } else if (sState == STATE_UNDO_COMMIT) { - sState = STATE_IN_WORD; + } else if (sState == State.UNDO_COMMIT) { + sState = State.IN_WORD; } sBackspaceCount++; + displayState(); } - + public static void reset() { - sState = STATE_START; + sState = State.START; + displayState(); } - - public static int getState() { + + public static State getState() { + if (DBG) { + Log.d(TAG, "Returning state = " + sState); + } return sState; } public static boolean isCorrecting() { - return sState == STATE_CORRECTING || sState == STATE_PICKED_CORRECTION; + return sState == State.CORRECTING || sState == State.PICKED_CORRECTION; } public static void keyPressedAt(Key key, int x, int y) { @@ -248,5 +268,11 @@ public class TextEntryState { } } } + + private static void displayState() { + if (DBG) { + Log.d(TAG, "State = " + sState); + } + } } From 1193da8ed2e3efa189123e01daa8884c8258ee4c Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Tue, 17 Aug 2010 16:56:36 -0700 Subject: [PATCH 151/159] Import revised translations. Change-Id: I975bcb5cf09211c6379cc7e7ad89ea09d91e7ec1 --- java/res/values-cs/strings.xml | 2 ++ java/res/values-da/strings.xml | 2 ++ java/res/values-de/strings.xml | 2 ++ java/res/values-el/strings.xml | 2 ++ java/res/values-es-rUS/strings.xml | 2 ++ java/res/values-es/strings.xml | 2 ++ java/res/values-fr/strings.xml | 2 ++ java/res/values-it/strings.xml | 2 ++ java/res/values-ja/strings.xml | 2 ++ java/res/values-ko/strings.xml | 2 ++ java/res/values-nb/strings.xml | 2 ++ java/res/values-nl/strings.xml | 2 ++ java/res/values-pl/strings.xml | 2 ++ java/res/values-pt-rPT/strings.xml | 2 ++ java/res/values-pt/strings.xml | 2 ++ java/res/values-ru/strings.xml | 2 ++ java/res/values-sv/strings.xml | 2 ++ java/res/values-tr/strings.xml | 2 ++ java/res/values-zh-rCN/strings.xml | 2 ++ java/res/values-zh-rTW/strings.xml | 4 +++- 20 files changed, 41 insertions(+), 1 deletion(-) diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 5abbab0d5..798d0807e 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -24,6 +24,8 @@ "Nastavení klávesnice Android" "Při stisku klávesy vibrovat" "Zvuk při stisku klávesy" + + "Opravovat překlepy" "Povolit opravu chyb vstupu" "Chyby vstupu v zobrazení na šířku" diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 03a3aaa3c..9c525a3e0 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -24,6 +24,8 @@ "Indstillinger for Android-tastatur" "Vibration ved tastetryk" "Lyd ved tastetryk" + + "Ret stavefejl" "Aktiver fejlretning af input" "Inputfejl i landskab" diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index 9e11d5453..047b11420 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -24,6 +24,8 @@ "Android-Tastatureinstellungen" "Vibrieren b. Tastendruck" "Ton bei Tastendruck" + + "Eingabefehler korrigieren" "Korrektur von Eingabefehlern aktivieren" "Eingabefehler im Querformat" diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index 5dea3806a..ef79ea097 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -24,6 +24,8 @@ "Ρυθμίσεις πληκτρολογίου Android" "Δόνηση κατά το πάτημα πλήκτρων" "Ήχος κατά το πάτημα πλήκτρων" + + "Διόρθωση σφαλμάτων πληκτρολόγησης" "Ενεργοποίηση διόρθωσης σφαλμάτων εισόδου" "Σφάλματα οριζόντιας εισαγωγής" diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index f94f7f78b..8cf11dfa2 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -24,6 +24,8 @@ "Configuración de teclado de Android" "Vibrar al pulsar teclas" "Sonar al pulsar las teclas" + + "Corregir errores de escritura" "Habilitar corrección de error de entrada" "Errores de entrada apaisada" diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 1c8f02bba..6d3823918 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -24,6 +24,8 @@ "Ajustes del teclado de Android" "Vibrar al pulsar tecla" "Sonido al pulsar tecla" + + "Corregir errores de escritura" "Habilitar la introducción de corrección de errores" "Errores de introducción de datos en vista horizontal" diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index 74a0a4edf..544789b2d 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -24,6 +24,8 @@ "Paramètres du clavier Android" "Vibrer à chaque touche" "Son à chaque touche" + + "Corriger les fautes de frappe" "Activer la correction des erreurs de saisie" "Erreurs de saisie en mode paysage" diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 52c0b741e..486a60ef8 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -24,6 +24,8 @@ "Impostazioni tastiera Android" "Vibrazione tasti" "Suono tasti" + + "Correggi errori di digitazione" "Attiva la correzione degli errori di inserimento" "Errori di inserimento in visualizzazione orizzontale" diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 58a49a238..cfa5a9746 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -24,6 +24,8 @@ "Androidキーボードの設定" "キー操作バイブ" "キー操作音" + + "入力ミス補正" "入力間違いを自動修正する" "横表示での入力修正" diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index 804526d39..8fd4e63e8 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -24,6 +24,8 @@ "Android 키보드 설정" "키를 누를 때 진동 발생" "키를 누를 때 소리 발생" + + "입력 오류 수정" "입력 오류 수정 사용" "가로 입력 오류" diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 4ff056ec5..7fbac9bdd 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -24,6 +24,8 @@ "Innstillinger for skjermtastatur" "Vibrer ved tastetrykk" "Lyd ved tastetrykk" + + "Rett opp skrivefeil" "Slå på retting av skrivefeil" "Rett opp skrivefeil i breddeformat" diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index e65e67ccb..b4b0ab29f 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -24,6 +24,8 @@ "Instellingen voor Android-toetsenbord" "Trillen bij druk op toets" "Geluid bij druk op een toets" + + "Typefouten corrigeren" "Foutcorrectie tijdens invoer inschakelen" "Invoerfouten in liggende weergave" diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 7026f02c6..8ca1650cd 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -24,6 +24,8 @@ "Ustawienia klawiatury Android" "Wibracja przy naciśnięciu" "Dźwięk przy naciśnięciu" + + "Popraw błędy pisowni" "Włącz poprawianie błędów wprowadzania" "Błędy wprowadzania w orientacji poziomej" diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index d94d84f35..5fbff0fe7 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -24,6 +24,8 @@ "Definições de teclado do Android" "Vibrar ao primir as teclas" "Som ao premir as teclas" + + "Corrigir erros de escrita" "Activar a correcção de erros de entrada" "Erros de entrada na horizontal" diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index a20ecccea..70288efd4 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -24,6 +24,8 @@ "Configurações de teclado Android" "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" diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index a1b680ed3..1898d27eb 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -24,6 +24,8 @@ "Настройки клавиатуры Android" "Виброотклик клавиш" "Звук клавиш" + + "Исправлять опечатки" "Включить исправление ошибок при вводе" "Ошибки при вводе в горизонтальной ориентации" diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 82f652997..49359e8b9 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -24,6 +24,8 @@ "Inställningar för Androids tangentbord" "Vibrera vid tangenttryck" "Knappljud" + + "Rätta skrivfel" "Aktivera rättning av felaktiga inmatningar" "Inmatningsfel i liggande vy" diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 820327b0a..73ad111f3 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -24,6 +24,8 @@ "Android klavye ayarları" "Tuşa basıldığında titret" "Tuşa basıldığında ses çıkar" + + "Yazım hatalarını düzelt" "Giriş hatası düzeltmeyi etkinleştir" "Yatay giriş hataları" diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 953c93b5a..046d1d664 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -24,6 +24,8 @@ "Android 键盘设置" "按键时振动" "按键时播放音效" + + "纠正输入错误" "启用输入错误纠正功能" "横向输入错误" diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 7748589cb..182f71192 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -24,6 +24,8 @@ "Android 鍵盤設定" "按鍵時震動" "按鍵時播放音效" + + "修正輸入錯誤" "啟用輸入錯誤修正功能" "橫向輸入錯誤" @@ -47,7 +49,7 @@ "自動完成" "在反白顯示的字詞處自動插入空白鍵和標點符號鍵盤" "雙連詞建議" - "使用前一個字詞來改善建議" + "根據前一個字詞自動找出更適合的建議" "無" "基本模式" From e68bba227f7fe3ab0a58334949f71a4439ee5211 Mon Sep 17 00:00:00 2001 From: Yohei Fujii Date: Wed, 18 Aug 2010 16:36:42 +0900 Subject: [PATCH 152/159] Fixed the popup default value problem. Bug:2909517 Change-Id: Ic323d38219a2af211b8a8db09746febe4ccbede9 --- java/src/com/android/inputmethod/latin/LatinIME.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index b1bb84d27..3df0a152e 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -345,7 +345,6 @@ public class LatinIME extends InputMethodService //setStatusIcon(R.drawable.ime_qwerty); mResources = getResources(); final Configuration conf = mResources.getConfiguration(); - PreferenceManager.setDefaultValues(this, R.xml.prefs, false); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); mLanguageSwitcher = new LanguageSwitcher(this); mLanguageSwitcher.loadLocales(prefs); @@ -2318,7 +2317,8 @@ public class LatinIME extends InputMethodService SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); mVibrateOn = sp.getBoolean(PREF_VIBRATE_ON, false); mSoundOn = sp.getBoolean(PREF_SOUND_ON, false); - mPopupOn = sp.getBoolean(PREF_POPUP_ON, true); + mPopupOn = sp.getBoolean(PREF_POPUP_ON, + mResources.getBoolean(R.bool.default_popup_preview)); mAutoCap = sp.getBoolean(PREF_AUTO_CAP, true); mQuickFixes = sp.getBoolean(PREF_QUICK_FIXES, true); mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false); From 4c510f83a01d4c0c23e88ba6263f1f2ac063902f Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Wed, 18 Aug 2010 16:27:03 -0700 Subject: [PATCH 153/159] Import Romansh translations. Change-Id: Ib6529182be031be2e54072a87516caee5f0d2c1d --- java/res/values-rm/strings.xml | 145 +++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 java/res/values-rm/strings.xml diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml new file mode 100644 index 000000000..c32a2efa9 --- /dev/null +++ b/java/res/values-rm/strings.xml @@ -0,0 +1,145 @@ + + + + + "Tastatura Android" + "Parameters da la tastatura Android" + "Vibrar cun smatgar in buttun" + "Tun cun smatgar in buttun" + + + "Curreger sbagls d\'endataziun" + "Activar la correctura da sbagls d\'endataziun" + "Sbagls d\'endataziun en il format orizontal" + "Activar la correctura da sbagls d\'endataziun" + "Propostas da pleds" + "Curreger automaticamain il pled precedent" + "Propostas da pleds" + "Parameters da las propostas per pleds" + "Activar la cumplettaziun automatica durant l\'endataziun" + "Cumplettaziun automatica" + "Engrondir il champ da text" + "Zuppentar propostas da pleds en il format orizontal" + "Maiusclas automaticas" + "Scriver grond l\'entschatta da mintga frasa" + "Interpuncziun automatica" + + "Correcturas sveltas" + "Curregia sbagls da tippar currents" + "Mussar las propostas" + "Mussar pleds proponids durant l\'endataziun" + "Cumplettaziun automatica" + "Inserir auto. il pled marcà cun la tasta da vid/interpuncziun" + + + + + + "Nagin" + "Simpel" + "Avanzà" + + "%s : Memorisà" + "àáâãäåæ" + "èéêë" + "ìíîï" + "òóöôõœø" + "ùúûü" + "§ß" + "ñ" + "ç" + "ýÿ" + "Tegnair smatgà per mussar ils accents (à, é, etc.)" + "Smatgar ↶ per serrar la tastatura" + "Acceder a cifras e simbols" + "Smatgar ditg sin il pled dal tut a sanestra per l\'agiuntar al dicziunari" + "Tutgar quest commentari per cuntinuar »" + "Tutgar qua, per serrar quest commentari e cumenzar a tippar!" + "La tastatura vegn adina averta sche Vus tutgais in champ da text." + "Tegnai smatgà ina tasta per mussar ils segns spezials"\n"(ø, ö, ô, ó etc.)." + "Midai a numers e simbols cun tutgar quest buttun." + "Turnai a letras cun smatgar danovamain quest buttun." + "Tegnai smatgà quest buttun per midar ils parameters da tastatura, sco p. ex. la cumplettaziun automatica." + "Empruvai!" + "Dai" + "Vinavant" + "Finì" + "Trametter" + "?123" + "123" + "ABC" + "ALT" + "Cumonds vocals" + "Cumonds vocals en Vossa lingua na vegnan actualmain betg sustegnids, ma la funcziun è disponibla per englais." + "Ils cumonds vocals èn ina funcziunalitad experimentala che utilisescha la renconuschientscha vocala da rait da Google." + "Per deactivar ils cumonds vocals, avri ils parameters da tastatura." + "Per utilisar ils cumonds vocals, smatgai il buttun dal microfon u stritgai cun il det sur la tastatura dal visur." + "Ussa discurrer" + "Operaziun en progress" + + "Errur. Empruvai anc ina giada." + "Impussibel da connectar." + "Errur - discurrì memia ditg." + "Problem audio" + "Errur dal server" + "Betg udì ina frasa vocala" + "Betg chattà correspundenzas" + "Betg installà la tschertga vocala" + "Commentari:"" Stritgai cun il det sur la tastatura per discurrer." + "Commentari:"" Empruvai la proxima giada d\'agiuntar segns d\'interpuncziun sco \"punct\", \"comma\" u \"segn da dumonda\" cun cumonds vocals." + "Interrumper" + "OK" + "Cumonds vocals" + + "Sin la tastatura principala" + "Sin la tastatura da simbols" + "Deactivà" + + + "Microfon sin la tastatura principala" + "Microfon sin la tastatura da simbols" + "Ils cumonds vocals èn deactivads" + + "Trametter automaticamain suenter il cumond vocal" + "Smatgai sin la tasta enter sche Vus exequis ina tschertga u siglis al proxim champ." + "Avrir la tastatura"\n\n"Tutgai inqual champ da text." + "Serrar la tastatura"\n\n"Smatgai il buttun \"Enavos\"." + "Tutgar e tegnair smatgà in buttun per acceder a las opziuns"\n\n"Accedi a segns d\'interpuncziun ed accents." + "Parameters da tastatura"\n\n"Tutgai e tegnai smatgà il buttun ""?123""." + ".com" + ".net" + ".org" + ".gov" + ".edu" + "Metoda d\'endataziun" + "Linguas da cumonds vocals" + "Stritgar cun il det sur la tasta da vid per midar la lingua" + "← Tippar danovamain per memorisar" + "Dicziunari disponibel" + + + + + + + + + From 22ac244d5e831c10d6e0f2a2341ed3a967b0269d Mon Sep 17 00:00:00 2001 From: satok Date: Wed, 11 Aug 2010 23:27:19 +0900 Subject: [PATCH 154/159] Add subtype to method.xml Change-Id: I6006c729f89cc91d5674c19b95cf19ad2cab14cf --- .../res/drawable-hdpi/ic_subtype_keyboard.png | Bin 0 -> 1068 bytes java/res/drawable-hdpi/ic_subtype_mic.png | Bin 0 -> 681 bytes .../res/drawable-mdpi/ic_subtype_keyboard.png | Bin 0 -> 498 bytes java/res/drawable-mdpi/ic_subtype_mic.png | Bin 0 -> 483 bytes java/res/values/strings.xml | 2 + java/res/xml/method.xml | 111 +++++++++++++++++- 6 files changed, 111 insertions(+), 2 deletions(-) create mode 100755 java/res/drawable-hdpi/ic_subtype_keyboard.png create mode 100644 java/res/drawable-hdpi/ic_subtype_mic.png create mode 100755 java/res/drawable-mdpi/ic_subtype_keyboard.png create mode 100644 java/res/drawable-mdpi/ic_subtype_mic.png diff --git a/java/res/drawable-hdpi/ic_subtype_keyboard.png b/java/res/drawable-hdpi/ic_subtype_keyboard.png new file mode 100755 index 0000000000000000000000000000000000000000..7015e266a297927bd2275c633fcffe724c4a8eb1 GIT binary patch literal 1068 zcmV+{1k?M8P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#&PhZ;RCwC#TT5$GK@`4|Yg=nIjrF;b zstd)9D58j>3q?hgg5Vnp)^=4Wf`|)|A}+*@3q@D@1H`5HTDVa}S0aKNmo9XnZPQe( zX_{Qm!EfL&G^x3n3CYbI_}V0sxp%%f&pAm{6h%QRNh)YD@q|5LPuLUoggs$T*c0}I zU5O&J6EeVpgz_v9vV=)~vX=0a5G5Ez!Xv^4Cj2nrWF=lJJZKp)efBEhF>F2w(njbb zT$3+KmG8xyk|H5tv*c)|rCCBLL4=E@wfe%N)q>Xl7AuPg%P@bOFa`6`V?Brkoa}RO z6}`cWF&<#SoJZFqB4gcf0OE5RW*snM)D1+86+_aJ`Bf+%mq5XQJ-I*rYpPc|7Gt0v3@UWqxp z@Lr6u_O2V(+%GI?HQ~K11PCjIwe2(JUJ|5waW6gg92-;>;Z#hMR#jS1HP?17)oQqt za0DjJetQPKrA>Mp;WMsx8NRNB1)PW9X6G+65&s^Xt>#= zW*_!>*ymxNhkYLQdD!P+pND-OZiqZA&5}*8J?6UdxNc5dw;}UzfCb$SYVRRm!KMX` zoQGM~8TqmntQXg9nmk;KSiesk!tAd%@t^%?5dNfvQ_+13Yr9LB5YH!2d6nSb51{d? zchF`YwiUEyKrkoz%2x7loG2YZyHjPx3()wOWos-VSWWuAbPa@4bqq-LkT5VlD>F@c zyWuy@E==}lrJ&UkCjGXB_`cyk8woFhV=?*l_x`X6?i)R+;EE{<7k}OfS zf7POt{kp~G8eIk{zIG?7ojg#ga3JYGbAjJ8?W*{3MOY#7j}X=no)BIlN|xrR1=8rE zoFjZA+#q~+QWUYd*o4@~14suEj&VcigM|iJK4uQ!^rds=L8%Oz>vMTpD&brkp!dXm zu2VSAh5$c4LAZmnu0963>#8`?umYJuXjf}44>Ml{jNmmneo-_Rtgq1(VQH@YqQe)eqX#p6hr{V*DHp(~}hB&s?yvk5kil&PTRC m^A#92*Qoq2#1k%m1sDLbf}Lm^V1F3^0000~KI=mg0I$p*yknV!!l1GYp-uF{<@4{S>xmSjmzhha!=neLJs zCkDU(7ytv zW})((?VM(f12Aq!)>`zK(H>~Y>=J)}RR3QAR_xn7K?$Jp2-$gDt2A>)E(%cE7J#t% z5HPm+vkMLb;*{Vr(cq9tdP8G;qD3nH)0*GBhq48m^e^=%O9<)#OJ4NZ!89 zXYZWE@$v})*wg}9YwAlTxhuf{uDPwUfGXp-$xM0J0_Ea6vLsEgA+$oC1I?ykR7D^t z+JwHqbW0yNBj@*M14f!q9+byBKXKIo|8N< P00000NkvXXu0mjf%Rwia literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/ic_subtype_keyboard.png b/java/res/drawable-mdpi/ic_subtype_keyboard.png new file mode 100755 index 0000000000000000000000000000000000000000..0d7ebd4e579c01416b40087f968ca65aa8537804 GIT binary patch literal 498 zcmVxt*`Q1UOu!1=0N!{^M__=WnhBZ>!d>NyPF8~5+O93?ldQB(lYTz`|6LR@3`3D} zhzytkGhhZhcfi~0x`N|7jEBV7)-c-3tE&1;5Due;agQ0KJ%0WEkuNEb0TXgOKm+K>U}oB(?! z+CI?SpM{!)(m=YSIhkt^n6NH)dYPHM(1#ms3^ipc;}*ke_M!%HXOsL-lbk|-6S5jj zQrd|3lnxHjNo*sUNe+2JiDDAlILahOKzNA#LIY`f8RtwI<@(aEwJ~8CQs6#Dbp&+#28Tx!vnuF?rfEFi z!?`vV;7%C}TUJAm3a%s5!Tizx~lS3GTy-i}O2b$M_Xs05(wrD8#Qi1poj507*qoM6N<$g0uY9y8r+H literal 0 HcmV?d00001 diff --git a/java/res/drawable-mdpi/ic_subtype_mic.png b/java/res/drawable-mdpi/ic_subtype_mic.png new file mode 100644 index 0000000000000000000000000000000000000000..247d5b3a9cec75d14aac825139c52ab6207f1c23 GIT binary patch literal 483 zcmV<90UZ8`P)%nybc3(~$^@kozy`2^xvLC1os@7dA&M&5(vuLxm*@LF<5EhiCD+Sp;Z+C} z0x$vRoF{AvM?%VI31JiiE<-D5dBP8G>%j+N@6RSkpc!~M<4mY#A&^g>45$$TNDf$I z{I+xz_|gXofkNQ_6UYOnCd4VmO?GDebug (Temporary) + keyboard + voice diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml index e5654e96d..fab4bd72b 100644 --- a/java/res/xml/method.xml +++ b/java/res/xml/method.xml @@ -20,7 +20,114 @@ + + + + android:isDefault="@bool/im_is_default"> + + + + + + + + + + + + + + + + + + + + + + + + + + + From f95e94722345ef291adc5833103c1e9210f67fc9 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 19 Aug 2010 18:20:09 +0900 Subject: [PATCH 155/159] Refactor shift state and caps lock state handling code. Move setShifted and setShifLocked methods to KeyboardSwitcher, then delegate to LatinKeyboardView. Bug: 2910379 Change-Id: I5dba70ec0dfc7a1ed67f1e05d54a2bd92252ed24 --- .../inputmethod/latin/KeyboardSwitcher.java | 13 ++++ .../android/inputmethod/latin/LatinIME.java | 64 ++++++++++--------- .../inputmethod/latin/LatinKeyboardView.java | 10 +++ 3 files changed, 56 insertions(+), 31 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index ed6adce9e..d04930303 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -24,6 +24,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; +import android.inputmethodservice.Keyboard; import android.preference.PreferenceManager; import android.view.InflateException; @@ -343,6 +344,18 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha return false; } + void setShifted(boolean shifted) { + if (mInputView != null) { + mInputView.setShifted(shifted); + } + } + + void setShiftLocked(boolean shiftLocked) { + if (mInputView != null) { + mInputView.setShiftLocked(shiftLocked); + } + } + void toggleShift() { if (mCurrentId.equals(mSymbolsId)) { LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 3df0a152e..9bd16adb2 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -195,6 +195,7 @@ public class LatinIME extends InputMethodService private boolean mAutoCorrectEnabled; private boolean mBigramSuggestionEnabled; private boolean mAutoCorrectOn; + // TODO move this state variable outside LatinIME private boolean mCapsLock; private boolean mPasswordText; private boolean mVibrateOn; @@ -967,10 +968,8 @@ public class LatinIME extends InputMethodService public void updateShiftKeyState(EditorInfo attr) { InputConnection ic = getCurrentInputConnection(); - if (attr != null && mKeyboardSwitcher.getInputView() != null - && mKeyboardSwitcher.isAlphabetMode() && ic != null) { - mKeyboardSwitcher.getInputView().setShifted( - mCapsLock || getCursorCapsMode(ic, attr) != 0); + if (attr != null && mKeyboardSwitcher.isAlphabetMode() && ic != null) { + mKeyboardSwitcher.setShifted(mCapsLock || getCursorCapsMode(ic, attr) != 0); } } @@ -1106,11 +1105,7 @@ public class LatinIME extends InputMethodService toggleLanguage(false, false); break; case LatinKeyboardView.KEYCODE_SHIFT_LONGPRESS: - if (mCapsLock) { - handleShift(); - } else { - toggleCapsLock(); - } + handleCapsLock(); break; case Keyboard.KEYCODE_MODE_CHANGE: changeKeyboardMode(); @@ -1235,13 +1230,35 @@ public class LatinIME extends InputMethodService private void handleShift() { mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE); - if (mKeyboardSwitcher.isAlphabetMode()) { - // Alphabet keyboard - checkToggleCapsLock(); - mKeyboardSwitcher.getInputView().setShifted(mCapsLock - || !mKeyboardSwitcher.getInputView().isShifted()); + KeyboardSwitcher switcher = mKeyboardSwitcher; + LatinKeyboardView inputView = switcher.getInputView(); + if (switcher.isAlphabetMode()) { + if (mCapsLock) { + mCapsLock = false; + switcher.setShifted(false); + } else if (inputView != null) { + if (inputView.isShifted()) { + mCapsLock = true; + switcher.setShiftLocked(true); + } else { + switcher.setShifted(true); + } + } } else { - mKeyboardSwitcher.toggleShift(); + switcher.toggleShift(); + } + } + + private void handleCapsLock() { + mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE); + KeyboardSwitcher switcher = mKeyboardSwitcher; + if (switcher.isAlphabetMode()) { + mCapsLock = !mCapsLock; + if (mCapsLock) { + switcher.setShiftLocked(true); + } else { + switcher.setShifted(false); + } } } @@ -1405,20 +1422,6 @@ public class LatinIME extends InputMethodService mWordHistory.add(entry); } - private void checkToggleCapsLock() { - if (mKeyboardSwitcher.getInputView().getKeyboard().isShifted()) { - toggleCapsLock(); - } - } - - private void toggleCapsLock() { - mCapsLock = !mCapsLock; - if (mKeyboardSwitcher.isAlphabetMode()) { - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setShiftLocked( - mCapsLock); - } - } - private void postUpdateSuggestions() { mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS); mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SUGGESTIONS), 100); @@ -2414,8 +2417,7 @@ public class LatinIME extends InputMethodService private void changeKeyboardMode() { mKeyboardSwitcher.toggleSymbols(); if (mCapsLock && mKeyboardSwitcher.isAlphabetMode()) { - ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setShiftLocked( - mCapsLock); + mKeyboardSwitcher.setShiftLocked(mCapsLock); } updateShiftKeyState(getCurrentInputEditorInfo()); diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java index bce2cde25..38d9cefb1 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java @@ -124,6 +124,16 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { return label; } + public boolean setShiftLocked(boolean shiftLocked) { + Keyboard keyboard = getKeyboard(); + if (keyboard != null && keyboard instanceof LatinKeyboard) { + ((LatinKeyboard)keyboard).setShiftLocked(shiftLocked); + invalidateAllKeys(); + return true; + } + return false; + } + /** * This function checks to see if we need to handle any sudden jumps in the pointer location * that could be due to a multi-touch being treated as a move by the firmware or hardware. From 4cd593d02a7671d8391e9eafb5774fb166a3950a Mon Sep 17 00:00:00 2001 From: Yohei Fujii Date: Mon, 23 Aug 2010 18:06:34 +0900 Subject: [PATCH 156/159] Fixed the issue of unsufficient description about popup_on_keypress at strings.xml Bug:2930812 Change-Id: I3a6af4d2a6b0dea1d3391300f7bf9a577daf3c8d --- java/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index c72cba7e6..01d059f53 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -29,7 +29,7 @@ Sound on keypress - + Popup on keypress From f36477ed97d917ac2971278afa018a7617a5a5e5 Mon Sep 17 00:00:00 2001 From: Sriram Raman Date: Tue, 24 Aug 2010 17:01:58 -0400 Subject: [PATCH 157/159] Change LOCAL_SDK_VERSION to 8 (from current) for unbundled branch Change-Id: I5d9344aa7c14e545c6a3bd4aa00287becb13a545 --- java/Android.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/Android.mk b/java/Android.mk index 4bb8986ee..b6bbbf8e7 100755 --- a/java/Android.mk +++ b/java/Android.mk @@ -15,7 +15,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := android-common #LOCAL_AAPT_FLAGS := -0 .dict -LOCAL_SDK_VERSION := current +LOCAL_SDK_VERSION := 8 LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags From f15a019cab85c9e3c7c60231a578d5d8ee4596a1 Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 25 Aug 2010 11:56:06 +0900 Subject: [PATCH 158/159] Make the unbundled LatinIME buildable. Copied method.xml from Gingerbread. Got rid of resources for xlarge. bug: 2786392 Change-Id: I07ff874b39a4e1117c95062f2b8e3ae5acb1b8cf --- java/res/values-xlarge/bools.xml | 23 ------- java/res/values-xlarge/dimens.xml | 26 ------- java/res/xml/method.xml | 111 +----------------------------- 3 files changed, 2 insertions(+), 158 deletions(-) delete mode 100644 java/res/values-xlarge/bools.xml delete mode 100644 java/res/values-xlarge/dimens.xml diff --git a/java/res/values-xlarge/bools.xml b/java/res/values-xlarge/bools.xml deleted file mode 100644 index fe8fc5838..000000000 --- a/java/res/values-xlarge/bools.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - false - diff --git a/java/res/values-xlarge/dimens.xml b/java/res/values-xlarge/dimens.xml deleted file mode 100644 index 4e1c52877..000000000 --- a/java/res/values-xlarge/dimens.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - 72dip - 46dip - 0dip - 35sp - diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml index fab4bd72b..e5654e96d 100644 --- a/java/res/xml/method.xml +++ b/java/res/xml/method.xml @@ -20,114 +20,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:isDefault="@bool/im_is_default" +/> From ac3cae616cfef053fdb59bebe5455dea1d51642c Mon Sep 17 00:00:00 2001 From: Ken Wakasa Date: Wed, 25 Aug 2010 15:53:54 +0900 Subject: [PATCH 159/159] Merge from the private sandbox to the froyo-ub-latinimegoogle Bumped up the version to 0.22. Change-Id: I04497fa0a2acaa1b9632621c9d9f163cf40f6299 --- java/AndroidManifest.xml | 8 +++++++- java/res/values-cs/strings.xml | 4 ++-- java/res/values-da/strings.xml | 4 ++-- java/res/values-de/strings.xml | 4 ++-- java/res/values-el/strings.xml | 4 ++-- java/res/values-es-rUS/strings.xml | 4 ++-- java/res/values-es/strings.xml | 4 ++-- java/res/values-fr-rCA/strings.xml | 2 +- java/res/values-fr/strings.xml | 4 ++-- java/res/values-it/strings.xml | 4 ++-- java/res/values-ja/strings.xml | 4 ++-- java/res/values-ko/strings.xml | 4 ++-- java/res/values-nb/strings.xml | 4 ++-- java/res/values-nl/strings.xml | 4 ++-- java/res/values-pl/strings.xml | 4 ++-- java/res/values-pt-rPT/strings.xml | 4 ++-- java/res/values-pt/strings.xml | 4 ++-- java/res/values-ru/strings.xml | 4 ++-- java/res/values-sv/strings.xml | 4 ++-- java/res/values-tr/strings.xml | 4 ++-- java/res/values-zh-rCN/strings.xml | 4 ++-- java/res/values-zh-rTW/strings.xml | 4 ++-- java/res/values/strings.xml | 4 ++-- java/res/xml/prefs.xml | 2 +- .../com/android/inputmethod/latin/BinaryDictionary.java | 4 ++-- java/src/com/android/inputmethod/latin/LatinIME.java | 4 ++++ native/Android.mk | 8 +++++--- tests/Android.mk | 4 ++-- 28 files changed, 64 insertions(+), 52 deletions(-) diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 642c717d3..1c3341396 100755 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -1,5 +1,11 @@ + package="com.android.inputmethod.latin" + android:versionCode="22" + android:versionName="0.22"> + + + + diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 798d0807e..823027692 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -20,8 +20,8 @@ - "Klávesnice Android" - "Nastavení klávesnice Android" + "Klávesnice Android 2" + "Nastavení klávesnice Android 2" "Při stisku klávesy vibrovat" "Zvuk při stisku klávesy" diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 9c525a3e0..3480a645c 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -20,8 +20,8 @@ - "Android-tastatur" - "Indstillinger for Android-tastatur" + "Android-tastatur 2" + "Indstillinger for Android-tastatur 2" "Vibration ved tastetryk" "Lyd ved tastetryk" diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index 047b11420..d73a72a02 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -20,8 +20,8 @@ - "Android-Tastatur" - "Android-Tastatureinstellungen" + "Android-Tastatur 2" + "Android-Tastatur2einstellungen" "Vibrieren b. Tastendruck" "Ton bei Tastendruck" diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index ef79ea097..754b870ec 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -20,8 +20,8 @@ - "Πληκτρολόγιο Android" - "Ρυθμίσεις πληκτρολογίου Android" + "Πληκτρολόγιο Android 2" + "Ρυθμίσεις πληκτρολογίου Android 2" "Δόνηση κατά το πάτημα πλήκτρων" "Ήχος κατά το πάτημα πλήκτρων" diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 8cf11dfa2..0844582fa 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -20,8 +20,8 @@ - "Teclado de Android" - "Configuración de teclado de Android" + "Teclado de Android 2" + "Configuración de teclado de Android 2" "Vibrar al pulsar teclas" "Sonar al pulsar las teclas" diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 6d3823918..aa46a98e9 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -20,8 +20,8 @@ - "Teclado de Android" - "Ajustes del teclado de Android" + "Teclado de Android 2" + "Ajustes del teclado de Android 2" "Vibrar al pulsar tecla" "Sonido al pulsar tecla" diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml index b56463ed9..e0d456d00 100644 --- a/java/res/values-fr-rCA/strings.xml +++ b/java/res/values-fr-rCA/strings.xml @@ -15,5 +15,5 @@ --> - "Clavier Android" + "Clavier Android 2" diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index 544789b2d..2cfb73323 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -20,8 +20,8 @@ - "Clavier Android" - "Paramètres du clavier Android" + "Clavier Android 2" + "Paramètres du clavier Android 2" "Vibrer à chaque touche" "Son à chaque touche" diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 486a60ef8..9452edd63 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -20,8 +20,8 @@ - "Tastiera Android" - "Impostazioni tastiera Android" + "Tastiera Android 2" + "Impostazioni tastiera Android 2" "Vibrazione tasti" "Suono tasti" diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index cfa5a9746..157e4660d 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -20,8 +20,8 @@ - "Androidキーボード" - "Androidキーボードの設定" + "Androidキーボード 2" + "Androidキーボード 2 の設定" "キー操作バイブ" "キー操作音" diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index 8fd4e63e8..37b91036c 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -20,8 +20,8 @@ - "Android 키보드" - "Android 키보드 설정" + "Android 키보드 2" + "Android 키보드 2 설정" "키를 누를 때 진동 발생" "키를 누를 때 소리 발생" diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 7fbac9bdd..280927da9 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -20,8 +20,8 @@ - "Skjermtastatur" - "Innstillinger for skjermtastatur" + "Skjermtastatur 2" + "Innstillinger for skjermtastatur 2" "Vibrer ved tastetrykk" "Lyd ved tastetrykk" diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index b4b0ab29f..45ca9acc8 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -20,8 +20,8 @@ - "Android-toetsenbord" - "Instellingen voor Android-toetsenbord" + "Android-toetsenbord 2" + "Instellingen voor Android-toetsenbord 2" "Trillen bij druk op toets" "Geluid bij druk op een toets" diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 8ca1650cd..18580c680 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -20,8 +20,8 @@ - "Klawiatura Android" - "Ustawienia klawiatury Android" + "Klawiatura Android 2" + "Ustawienia klawiatury Android 2" "Wibracja przy naciśnięciu" "Dźwięk przy naciśnięciu" diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 5fbff0fe7..ddba099bc 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -20,8 +20,8 @@ - "Teclado do Android" - "Definições de teclado do Android" + "Teclado do Android 2" + "Definições de teclado do Android 2" "Vibrar ao primir as teclas" "Som ao premir as teclas" diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 70288efd4..83f2f4b56 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -20,8 +20,8 @@ - "Teclado Android" - "Configurações de teclado Android" + "Teclado Android 2" + "Configurações de teclado Android 2" "Vibrar ao tocar a tecla" "Som ao tocar a tecla" diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 1898d27eb..e714415d0 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -20,8 +20,8 @@ - "Клавиатура Android" - "Настройки клавиатуры Android" + "Клавиатура Android 2" + "Настройки клавиатуры Android 2" "Виброотклик клавиш" "Звук клавиш" diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 49359e8b9..4a3f77ba1 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -20,8 +20,8 @@ - "Androids tangentbord" - "Inställningar för Androids tangentbord" + "Androids tangentbord 2" + "Inställningar för Androids tangentbord 2" "Vibrera vid tangenttryck" "Knappljud" diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 73ad111f3..486cd2c5e 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -20,8 +20,8 @@ - "Android klavyesi" - "Android klavye ayarları" + "Android klavyesi 2" + "Android klavye 2 ayarları" "Tuşa basıldığında titret" "Tuşa basıldığında ses çıkar" diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 046d1d664..505807c33 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -20,8 +20,8 @@ - "Android 键盘" - "Android 键盘设置" + "Android 键盘 2" + "Android 键盘 2 设置" "按键时振动" "按键时播放音效" diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 182f71192..f8e75786e 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -20,8 +20,8 @@ - "Android 鍵盤" - "Android 鍵盤設定" + "Android 鍵盤 2" + "Android 鍵盤 2 設定" "按鍵時震動" "按鍵時播放音效" diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 01d059f53..ccf8d7b89 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -19,9 +19,9 @@ --> - Android keyboard + Android keyboard 2 - Android keyboard settings + Android keyboard 2 settings Vibrate on keypress diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 11cc3ac42..57d139e43 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -49,7 +49,7 @@ android:title="@string/prefs_enable_log" android:summary="@string/prefs_description_log" android:persistent="true" - android:defaultValue="false" + android:defaultValue="true" />