From 079de4c4751bd41a378b718a63e29b9f02043a64 Mon Sep 17 00:00:00 2001 From: Clam Date: Tue, 21 Oct 2014 01:17:02 +1100 Subject: [PATCH] Added initial German support. Updated gradle things, fixed bugs: * Made the Gradle script act a bit better in regards to calcing dict sizes * Fixed some error messages * Hopefully fixed crash on no dict load * Fixed issue where some characters and cases weren't added to db --- .gitignore | 19 +- AndroidManifest.xml | 6 +- build.gradle | 14 +- gradle/wrapper/gradle-wrapper.properties | 4 +- res/values-ru/arrays.xml | 14 +- res/values-ru/strings.xml | 12 +- res/values/arrays.xml | 8 +- res/values/strings.xml | 5 +- .../nyanya/android/traditionalt9/CharMap.java | 205 ++++++++++-------- .../android/traditionalt9/LangHelper.java | 14 +- .../nyanya/android/traditionalt9/T9DB.java | 34 +-- .../android/traditionalt9/TraditionalT9.java | 7 +- .../traditionalt9/TraditionalT9Settings.java | 22 +- 13 files changed, 200 insertions(+), 164 deletions(-) diff --git a/.gitignore b/.gitignore index 9a24713f..aff35e08 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,35 @@ -# built application files +# Built application files *.apk *.ap_ -# files for the dex VM +# Files for the Dalvik VM *.dex # Java class files *.class -# generated files +# Generated files bin/ -build/ gen/ +# Gradle files +.gradle/ +build/ + # Local configuration file (sdk path, etc) local.properties -# Eclipse project files -.classpath -.project - # Proguard folder generated by Eclipse proguard/ +# Log Files +*.log + # Intellij project files *.iws *.iml .idea/ #Other -.gradle/ assets/dict.properties t9build.properties \ No newline at end of file diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a3808d01..e85e8a13 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -4,10 +4,8 @@ android:versionCode="4" android:versionName="git" > - - + + Properties props = getProps() int verNum = Integer.valueOf(props.getProperty("verNum", "0")) @@ -77,8 +78,8 @@ def computeVersionNumber = { -> } android { - compileSdkVersion 10 - buildToolsVersion "19.0.0" + compileSdkVersion 8 + buildToolsVersion "19.1" sourceSets { main { @@ -128,14 +129,13 @@ android { } task getDictSizes { - inputs.files 'assets/en-utf8.txt', 'assets/ru-utf8.txt' + inputs.dir fileTree(dir:'assets', excludes:['dict.properties']) outputs.file "t9build.properties" doLast { ant.echo("Calculating dict size...") - FileCollection dicts = files("assets/en-utf8.txt", "assets/ru-utf8.txt") - - dicts.each {File file -> + inputs.getFiles().each {File file -> + ant.echo("dict: "+ file.name) ant.propertyfile(file:"assets/dict.properties") { entry(key: "size."+ file.name, value: file.length()) } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 79327a0c..d38784a6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Mar 22 23:26:27 EST 2014 +#Sun Oct 19 13:30:51 EST 2014 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-all.zip diff --git a/res/values-ru/arrays.xml b/res/values-ru/arrays.xml index dc780296..f4a40a51 100644 --- a/res/values-ru/arrays.xml +++ b/res/values-ru/arrays.xml @@ -5,21 +5,11 @@ Текст Цифры - - 0 - 1 - 2 - - - 0 - + English Русский - - - 0 - 1 + Немецкий diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 9742b23f..a24fd6cf 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -2,14 +2,13 @@ Настройки Добавить слово - Невозможно добавить слово с таким символом %1$s. + Невозможно добавить слово с таким символом %1$s (%2$s). Невозможно добавить слово. Слово (%1$s) уже есть в словаре. Слово (%1$s) уже есть в словаре %2$s. Traditional T9 Отмена Hello world! - T9 Клавиатура T9 Цифры Добавить слово @@ -28,23 +27,22 @@ Режим ввода по умолчанию Загрузить словарь IME Загрузить словарь - Восстановление словаря... + Восстановление словаря… Загрузка словаря - Загрузка пользовательского словаря... + Загрузка пользовательского словаря… Загрузить свой словарь - SDcard/traditionalt9/user.lang.dict (lang: en/ru) Мультиязычная поддержка Очистить IME словарь Предупреждение: Будет выполнена очстка словаря. Продолжить? Очистить словарь - Очистка словаря... Пожалуйста, подождите... + Очистка словаря… Пожалуйста, подождите… Query test Ошибка: Внешняя память недоступна. Восстановление невозможно. Ошибка: Файл встановления не найден. Восстановить базу данных IME При восстановлении существующая база данных будет очищена. Если это нежелательно, то сначала выберите \"%1$s\" перед использованием этой опции. Сохранить словарь - Сохранение словаря... + Сохранение словаря… Test func Hold Icon О программе diff --git a/res/values/arrays.xml b/res/values/arrays.xml index d03349ee..905df4f8 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -5,22 +5,24 @@ Text Number - + 0 1 2 - + 0 English Russian + German - + 0 1 + 2 diff --git a/res/values/strings.xml b/res/values/strings.xml index 11b1368a..cb8fb5b6 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3,7 +3,6 @@ https://github.com/Clam-/TraditionalT9/wiki/Traditional-T9-keypad-IME-for-Android Traditional T9 Traditional T9 - English Numbers Default Input Mode Default mode used for \'normal\' text entry @@ -26,7 +25,7 @@ OK Close Blank word not added. - Cannot add word with unmappable symbol for %1$s. + Cannot add word with unmappable character for %1$s (%2$s). Word (%1$s) already in DB. Word (%1$s) already in DB for %2$s. Cancel @@ -43,7 +42,7 @@ "Show help Load dictionary Load user dictionary - SDcard/traditionalt9/user.lang.dict (lang: en/ru) + SDcard/traditionalt9/user.lang.dict (lang: en/ru/de) Nuke dictionary Backup dictionary Restore dictionary diff --git a/src/org/nyanya/android/traditionalt9/CharMap.java b/src/org/nyanya/android/traditionalt9/CharMap.java index 3497eb0d..1e1deffc 100644 --- a/src/org/nyanya/android/traditionalt9/CharMap.java +++ b/src/org/nyanya/android/traditionalt9/CharMap.java @@ -9,101 +9,120 @@ import java.util.Map; import android.util.Log; public class CharMap { - protected static final AbstractList> CHARTABLE = new ArrayList>(2); - static { - Map enMap = new HashMap(); - enMap.put('.', 1); enMap.put(',', 1); enMap.put('!', 1); enMap.put('?', 1); - enMap.put('-', 1); enMap.put('"', 1); enMap.put('\'', 1); enMap.put('@', 1); - enMap.put('#', 1); enMap.put('$', 1); enMap.put('%', 1); enMap.put('&', 1); - enMap.put('*', 1); enMap.put('(', 1); enMap.put(')', 1); enMap.put('1', 1); - enMap.put(':', 1); enMap.put(';', 1); enMap.put('/', 1); enMap.put('\\', 1); - enMap.put('+', 1); enMap.put('=', 1); enMap.put('<', 1); enMap.put('>', 1); - enMap.put('[', 1); enMap.put(']', 1); enMap.put('{', 1); enMap.put('}', 1); - enMap.put('^', 1); enMap.put('|', 1); enMap.put('_', 1); enMap.put('~', 1); - enMap.put('`', 1); - enMap.put('a', 2); enMap.put('\u00e1', 2); enMap.put('\u00e4', 2); - enMap.put('\u00e2', 2); enMap.put('\u00e0', 2); enMap.put('\u00e5', 2); - enMap.put('b', 2); enMap.put('c', 2); enMap.put('\u00e7', 2); - enMap.put('2', 2); enMap.put('d', 3); enMap.put('e', 3); - enMap.put('\u00e9', 3); enMap.put('\u00eb', 3); enMap.put('\u00e8', 3); - enMap.put('\u00ea', 3); enMap.put('f', 3); enMap.put('3', 3); - enMap.put('g', 4); enMap.put('h', 4); enMap.put('i', 4); - enMap.put('\u00ed', 4); enMap.put('\u00ef', 4); enMap.put('4', 4); - enMap.put('j', 5); enMap.put('k', 5); enMap.put('l', 5); - enMap.put('5', 5); enMap.put('m', 6); enMap.put('n', 6); - enMap.put('\u00f1', 6); enMap.put('o', 6); enMap.put('\u00f3', 6); - enMap.put('\u00f6', 6); enMap.put('\u00f4', 6); enMap.put('\u00fb', 6); - enMap.put('6', 6); enMap.put('p', 7); enMap.put('q', 7); - enMap.put('r', 7); enMap.put('s', 7); enMap.put('7', 7); - enMap.put('t', 8); enMap.put('u', 8); enMap.put('\u00fc', 8); - enMap.put('v', 8); enMap.put('8', 8); enMap.put('w', 9); - enMap.put('x', 9); enMap.put('y', 9); enMap.put('z', 9); - enMap.put('9', 9); enMap.put('+', 0); enMap.put('0', 0); - CHARTABLE.add(0, Collections.unmodifiableMap(enMap)); + protected static final AbstractList> CHARTABLE = new ArrayList>(LangHelper.NLANGS); + static { + // English + Map enMap = new HashMap(); + enMap.put('.', 1); enMap.put(',', 1); enMap.put('!', 1); enMap.put('?', 1); + enMap.put('-', 1); enMap.put('"', 1); enMap.put('\'', 1); enMap.put('@', 1); + enMap.put('#', 1); enMap.put('$', 1); enMap.put('%', 1); enMap.put('&', 1); + enMap.put('*', 1); enMap.put('(', 1); enMap.put(')', 1); enMap.put('1', 1); + enMap.put(':', 1); enMap.put(';', 1); enMap.put('/', 1); enMap.put('\\', 1); + enMap.put('+', 1); enMap.put('=', 1); enMap.put('<', 1); enMap.put('>', 1); + enMap.put('[', 1); enMap.put(']', 1); enMap.put('{', 1); enMap.put('}', 1); + enMap.put('^', 1); enMap.put('|', 1); enMap.put('_', 1); enMap.put('~', 1); + enMap.put('`', 1); + enMap.put('a', 2); enMap.put('á', 2); enMap.put('ä', 2); enMap.put('â', 2); + enMap.put('à', 2); enMap.put('å', 2); enMap.put('b', 2); enMap.put('c', 2); + enMap.put('ç', 2); enMap.put('2', 2); + enMap.put('d', 3); enMap.put('e', 3); enMap.put('é', 3); enMap.put('ë', 3); + enMap.put('è', 3); enMap.put('ê', 3); enMap.put('f', 3); enMap.put('3', 3); + enMap.put('g', 4); enMap.put('h', 4); enMap.put('i', 4); enMap.put('í', 4); + enMap.put('ï', 4); enMap.put('4', 4); + enMap.put('j', 5); enMap.put('k', 5); enMap.put('l', 5); enMap.put('5', 5); + enMap.put('m', 6); enMap.put('n', 6); enMap.put('ñ', 6); enMap.put('o', 6); + enMap.put('ó', 6); enMap.put('ö', 6); enMap.put('ô', 6); enMap.put('6', 6); + enMap.put('p', 7); enMap.put('q', 7); enMap.put('r', 7); enMap.put('s', 7); + enMap.put('7', 7); + enMap.put('t', 8); enMap.put('u', 8); enMap.put('û', 6); enMap.put('ü', 8); + enMap.put('v', 8); enMap.put('8', 8); enMap.put('w', 9); + enMap.put('x', 9); enMap.put('y', 9); enMap.put('z', 9); + enMap.put('9', 9); enMap.put('+', 0); enMap.put('0', 0); + // for German support reusing the same table since it already had special characters + enMap.put('€', 1); + enMap.put('ß', 7); + CHARTABLE.add(0, Collections.unmodifiableMap(enMap)); - Map ruMap = new HashMap(); - ruMap.put('.', 1); ruMap.put(',', 1); ruMap.put('!', 1); ruMap.put('?', 1); - ruMap.put('-', 1); ruMap.put('"', 1); ruMap.put('\'', 1); ruMap.put('@', 1); - ruMap.put('#', 1); ruMap.put('$', 1); ruMap.put('%', 1); ruMap.put('&', 1); - ruMap.put('*', 1); ruMap.put('(', 1); ruMap.put(')', 1); ruMap.put('1', 1); - ruMap.put(':', 1); ruMap.put(';', 1); ruMap.put('/', 1); ruMap.put('\\', 1); - ruMap.put('+', 1); ruMap.put('=', 1); ruMap.put('<', 1); ruMap.put('>', 1); - ruMap.put('[', 1); ruMap.put(']', 1); ruMap.put('{', 1); ruMap.put('}', 1); - ruMap.put('^', 1); ruMap.put('|', 1); ruMap.put('_', 1); ruMap.put('~', 1); - ruMap.put('`', 1); ruMap.put('1', 1); - ruMap.put('а', 2); ruMap.put('б', 2); ruMap.put('в', 2); ruMap.put('г', 2); - ruMap.put('2', 2); - ruMap.put('д', 3); ruMap.put('е', 3); ruMap.put('ё', 3); ruMap.put('ж', 3); - ruMap.put('з', 3); ruMap.put('3', 3); - ruMap.put('и', 4); ruMap.put('й', 4); ruMap.put('к', 4); ruMap.put('л', 4); - ruMap.put('4', 4); - ruMap.put('м', 5); ruMap.put('н', 5); ruMap.put('о', 5); ruMap.put('п', 5); - ruMap.put('5', 5); - ruMap.put('р', 6); ruMap.put('с', 6); ruMap.put('т', 6); ruMap.put('у', 6); - ruMap.put('6', 6); - ruMap.put('ф', 7); ruMap.put('х', 7); ruMap.put('ц', 7); ruMap.put('ч', 7); - ruMap.put('7', 7); - ruMap.put('ш', 8); ruMap.put('щ', 8); ruMap.put('ъ', 8); ruMap.put('ы', 8); - ruMap.put('8', 8); - ruMap.put('ь', 9); ruMap.put('э', 9); ruMap.put('ю', 9); ruMap.put('я', 9); - ruMap.put('9', 9); - ruMap.put('+', 0); ruMap.put('0', 0); - CHARTABLE.add(1, Collections.unmodifiableMap(ruMap)); - } + // Russian + Map ruMap = new HashMap(); + ruMap.put('.', 1); ruMap.put(',', 1); ruMap.put('!', 1); ruMap.put('?', 1); + ruMap.put('-', 1); ruMap.put('"', 1); ruMap.put('\'', 1); ruMap.put('@', 1); + ruMap.put('#', 1); ruMap.put('$', 1); ruMap.put('%', 1); ruMap.put('&', 1); + ruMap.put('*', 1); ruMap.put('(', 1); ruMap.put(')', 1); ruMap.put('1', 1); + ruMap.put(':', 1); ruMap.put(';', 1); ruMap.put('/', 1); ruMap.put('\\', 1); + ruMap.put('+', 1); ruMap.put('=', 1); ruMap.put('<', 1); ruMap.put('>', 1); + ruMap.put('[', 1); ruMap.put(']', 1); ruMap.put('{', 1); ruMap.put('}', 1); + ruMap.put('^', 1); ruMap.put('|', 1); ruMap.put('_', 1); ruMap.put('~', 1); + ruMap.put('`', 1); ruMap.put('1', 1); + ruMap.put('а', 2); ruMap.put('б', 2); ruMap.put('в', 2); ruMap.put('г', 2); + ruMap.put('2', 2); + ruMap.put('д', 3); ruMap.put('е', 3); ruMap.put('ё', 3); ruMap.put('ж', 3); + ruMap.put('з', 3); ruMap.put('3', 3); + ruMap.put('и', 4); ruMap.put('й', 4); ruMap.put('к', 4); ruMap.put('л', 4); + ruMap.put('4', 4); + ruMap.put('м', 5); ruMap.put('н', 5); ruMap.put('о', 5); ruMap.put('п', 5); + ruMap.put('5', 5); + ruMap.put('р', 6); ruMap.put('с', 6); ruMap.put('т', 6); ruMap.put('у', 6); + ruMap.put('6', 6); + ruMap.put('ф', 7); ruMap.put('х', 7); ruMap.put('ц', 7); ruMap.put('ч', 7); + ruMap.put('7', 7); + ruMap.put('ш', 8); ruMap.put('щ', 8); ruMap.put('ъ', 8); ruMap.put('ы', 8); + ruMap.put('8', 8); + ruMap.put('ь', 9); ruMap.put('э', 9); ruMap.put('ю', 9); ruMap.put('я', 9); + ruMap.put('9', 9); + ruMap.put('+', 0); ruMap.put('0', 0); + CHARTABLE.add(1, Collections.unmodifiableMap(ruMap)); - protected static final char[][] ENT9TABLE = { { '0', '+' }, - { '.', ',', '?', '!', '"', '\'', '-', '@', '$', '%', '&', '*', '(', ')', '_', '1' }, - { 'a', 'b', 'c', 'A', 'B', 'C', '2' }, { 'd', 'e', 'f', 'D', 'E', 'F', '3' }, - { 'g', 'h', 'i', 'G', 'H', 'I', '4' }, { 'j', 'k', 'l', 'J', 'K', 'L', '5' }, - { 'm', 'n', 'o', 'M', 'N', 'O', '6' }, { 'p', 'q', 'r', 's', 'P', 'Q', 'R', 'S', '7' }, - { 't', 'u', 'v', 'T', 'U', 'V', '8' }, { 'w', 'x', 'y', 'z', 'W', 'X', 'Y', 'Z', '9' }, - { ' ', '\n' } }; - protected static final char[][] RUT9TABLE = { { '0', '+' }, - { '.', ',', '?', '!', '"', '\'', '-', '@', '$', '%', '&', '*', '(', ')', '_', '1' }, - { 'а', 'б', 'в', 'г', 'А', 'Б', 'В', 'Г', '2' }, { 'д', 'е', 'ё', 'ж', 'з', 'Д', 'Е', 'Ё', 'Ж', 'З', '3' }, - { 'и', 'й', 'к', 'л', 'И', 'Й', 'К', 'Л', '4' }, { 'м', 'н', 'о', 'п', 'М', 'Н', 'О', 'П', '5' }, - { 'р', 'с', 'т', 'у', 'Р', 'С', 'Т', 'У', '6' }, { 'ф', 'х', 'ц', 'ч', 'Ф', 'Х', 'Ц', 'Ч', '7' }, - { 'ш', 'щ', 'ъ', 'ы', 'Ш', 'Щ', 'Ъ', 'Ы', '8' }, { 'ь', 'э', 'ю', 'я', 'Ь', 'Э', 'Ю', 'Я', '9' }, - { ' ', '\n' } }; - protected static final char[][][] T9TABLE = {ENT9TABLE, RUT9TABLE}; + //German (lol pretty simple, hopefully.) + CHARTABLE.add(2, Collections.unmodifiableMap(enMap)); + } - protected static final int[] ENT9CAPSTART = { 0, 0, 3, 3, 3, 3, 3, 4, 3, 4, 0 }; - protected static final int [] RUT9CAPSTART = {0, 0, 4, 5, 4, 4, 4, 4, 4, 4, 0}; - protected static final int[][] T9CAPSTART = {ENT9CAPSTART, RUT9CAPSTART}; + protected static final char[][] ENT9TABLE = { { '0', '+' }, + { '.', ',', '?', '!', '"', '\'', '-', '@', '$', '%', '&', '*', '(', ')', '_', '1' }, + { 'a', 'b', 'c', 'A', 'B', 'C', '2' }, { 'd', 'e', 'f', 'D', 'E', 'F', '3' }, + { 'g', 'h', 'i', 'G', 'H', 'I', '4' }, { 'j', 'k', 'l', 'J', 'K', 'L', '5' }, + { 'm', 'n', 'o', 'M', 'N', 'O', '6' }, { 'p', 'q', 'r', 's', 'P', 'Q', 'R', 'S', '7' }, + { 't', 'u', 'v', 'T', 'U', 'V', '8' }, { 'w', 'x', 'y', 'z', 'W', 'X', 'Y', 'Z', '9' }, + { ' ', '\n' } }; + protected static final char[][] RUT9TABLE = { { '0', '+' }, + { '.', ',', '?', '!', '"', '\'', '-', '@', '$', '%', '&', '*', '(', ')', '_', '1' }, + { 'а', 'б', 'в', 'г', 'А', 'Б', 'В', 'Г', '2' }, { 'д', 'е', 'ё', 'ж', 'з', 'Д', 'Е', 'Ё', 'Ж', 'З', '3' }, + { 'и', 'й', 'к', 'л', 'И', 'Й', 'К', 'Л', '4' }, { 'м', 'н', 'о', 'п', 'М', 'Н', 'О', 'П', '5' }, + { 'р', 'с', 'т', 'у', 'Р', 'С', 'Т', 'У', '6' }, { 'ф', 'х', 'ц', 'ч', 'Ф', 'Х', 'Ц', 'Ч', '7' }, + { 'ш', 'щ', 'ъ', 'ы', 'Ш', 'Щ', 'Ъ', 'Ы', '8' }, { 'ь', 'э', 'ю', 'я', 'Ь', 'Э', 'Ю', 'Я', '9' }, + { ' ', '\n' } }; + protected static final char[][] DET9TABLE = { + { '0', '+' }, + { '.', ',', '?', '!', '"', '\'', '-', '@', '€', '$', '%', '&', '*', '(', ')', '_', '1' }, + { 'a', 'á', 'ä', 'â', 'à', 'å', 'b', 'c', 'ç', 'A', 'Á', 'Ä', 'Â', 'À', 'Å', 'B', 'C', 'Ç', '2' }, + { 'd', 'e', 'é','ë','è','ê', 'f', 'D', 'E', 'É', 'Ë', 'È', 'Ê', 'F', '3' }, + { 'g', 'h', 'i', 'í', 'ï', 'G', 'H', 'I', 'Í', 'Ï', '4' }, + { 'j', 'k', 'l', 'J', 'K', 'L', '5' }, + { 'm', 'n', 'ñ', 'o', 'ó','ö','ô', 'M', 'N', 'Ñ', 'O', 'Ó', 'Ö', 'Ô', '6' }, + { 'p', 'q', 'r', 's', 'ß', 'P', 'Q', 'R', 'S', '7' }, + { 't', 'u', 'û','ü', 'v', 'T', 'U', 'Û', 'Ü', 'V', '8' }, + { 'w', 'x', 'y', 'z', 'W', 'X', 'Y', 'Z', '9' }, + { ' ', '\n' } }; + protected static final char[][][] T9TABLE = {ENT9TABLE, RUT9TABLE, DET9TABLE}; - protected static String getStringSequence(String word, int lang) { - StringBuilder seq = new StringBuilder(); - String tword = word.toLowerCase(LangHelper.LOCALES[lang]); - for (int i = 0; i < word.length(); i++) { - char c = tword.charAt(i); - Integer z = CharMap.CHARTABLE.get(lang).get(c); - if (z == null) { - Log.e("getStringSequence", - "ERROR: " + (int) c + " NOT FOUND FOR [" + lang + "] (" + Integer.toHexString((int) c) + ") Index: " + i); - throw new NullPointerException(); - } - seq.append(z.toString()); - } - return seq.toString(); - } + protected static final int[] ENT9CAPSTART = { 0, 0, 3, 3, 3, 3, 3, 4, 3, 4, 0 }; + protected static final int [] RUT9CAPSTART = {0, 0, 4, 5, 4, 4, 4, 4, 4, 4, 0}; + protected static final int[] DET9CAPSTART = { 0, 0, 9, 7, 5, 3, 7, 5, 5, 4, 0 }; + protected static final int[][] T9CAPSTART = {ENT9CAPSTART, RUT9CAPSTART, DET9CAPSTART}; + + protected static String getStringSequence(String word, int lang) { + StringBuilder seq = new StringBuilder(); + String tword = word.toLowerCase(LangHelper.LOCALES[lang]); + for (int i = 0; i < word.length(); i++) { + char c = tword.charAt(i); + Integer z = CharMap.CHARTABLE.get(lang).get(c); + if (z == null) { + Log.e("getStringSequence", + "ERROR: " + (int) c + " NOT FOUND FOR [" + lang + "] (" + Integer.toHexString((int) c) + ") Index: " + i); + throw new NullPointerException(); + } + seq.append(z.toString()); + } + return seq.toString(); + } } diff --git a/src/org/nyanya/android/traditionalt9/LangHelper.java b/src/org/nyanya/android/traditionalt9/LangHelper.java index db066739..9f1e3b9e 100644 --- a/src/org/nyanya/android/traditionalt9/LangHelper.java +++ b/src/org/nyanya/android/traditionalt9/LangHelper.java @@ -8,8 +8,9 @@ public class LangHelper { protected static final Locale RUSSIAN = new Locale("ru","RU"); protected static final int EN = 0; protected static final int RU = 1; - protected static final Locale[] LOCALES = {Locale.ENGLISH, RUSSIAN}; - protected static final String[] LANGS = {"EN", "RU"}; + protected static final int DE = 1; + protected static final Locale[] LOCALES = {Locale.ENGLISH, RUSSIAN, Locale.GERMAN}; + protected static final String[] LANGS = {"EN", "RU", "DE"}; protected static final int NLANGS = LANGS.length; @@ -31,7 +32,14 @@ public class LangHelper { {R.drawable.ime_ru_lang_lower, R.drawable.ime_ru_lang_single, R.drawable.ime_ru_lang_upper}, //LANG {R.drawable.ime_ru_text_lower, R.drawable.ime_ru_text_single, R.drawable.ime_ru_text_upper}, //TEXT {R.drawable.ime_number}, //NUM - } + }, + { + // German resources + {R.drawable.ime_de_lang_lower, R.drawable.ime_de_lang_single, R.drawable.ime_de_lang_upper}, //LANG + {R.drawable.ime_en_text_lower, R.drawable.ime_en_text_single, R.drawable.ime_en_text_upper}, //TEXT + {R.drawable.ime_number}, //NUM + }, + }; protected static int[] buildLangs(CharSequence s) { diff --git a/src/org/nyanya/android/traditionalt9/T9DB.java b/src/org/nyanya/android/traditionalt9/T9DB.java index 59373245..b87cd9a3 100644 --- a/src/org/nyanya/android/traditionalt9/T9DB.java +++ b/src/org/nyanya/android/traditionalt9/T9DB.java @@ -154,7 +154,7 @@ public class T9DB { try { seq = CharMap.getStringSequence(iword, lang); } catch (NullPointerException e) { - throw new DBException(r.getString(R.string.add_word_badchar, LangHelper.LANGS[lang])); + throw new DBException(r.getString(R.string.add_word_badchar, LangHelper.LANGS[lang], iword)); } // add int sequence into num table ContentValues values = new ContentValues(); @@ -211,22 +211,24 @@ public class T9DB { return result; } else { int islen = is.length(); - char c = is.charAt(islen - 1); - c++; - q = "SELECT " + COLUMN_WORD + " FROM " + WORD_TABLE_NAME + - " WHERE " + COLUMN_LANG + "=? AND " + COLUMN_SEQ + " >= '" + is + "1" + - "' AND " + COLUMN_SEQ + " < '" + is.substring(0, islen - 1) + c + "'" + - " ORDER BY " + COLUMN_FREQUENCY + " DESC, " + COLUMN_SEQ + " ASC" + - " LIMIT " + (MAX_RESULTS - hits); - cur = db.rawQuery(q, new String[] { String.valueOf(lang) }); + if (islen >= 2) { + char c = is.charAt(islen - 1); + c++; + q = "SELECT " + COLUMN_WORD + " FROM " + WORD_TABLE_NAME + + " WHERE " + COLUMN_LANG + "=? AND " + COLUMN_SEQ + " >= '" + is + "1" + + "' AND " + COLUMN_SEQ + " < '" + is.substring(0, islen - 1) + c + "'" + + " ORDER BY " + COLUMN_FREQUENCY + " DESC, " + COLUMN_SEQ + " ASC" + + " LIMIT " + (MAX_RESULTS - hits); + cur = db.rawQuery(q, new String[]{String.valueOf(lang)}); - if (cur.moveToFirst()) { - result = cur.getString(0); + if (cur.moveToFirst()) { + result = cur.getString(0); + } + if (result == null) { + result = ""; + } + cur.close(); } - if (result == null) { - result = ""; - } - cur.close(); } return result; } @@ -256,7 +258,7 @@ public class T9DB { } cur.close(); - if (hits < MINHITS) { + if ((hits < MINHITS) && (islen <= 2)) { char c = is.charAt(islen - 1); c++; String q = "SELECT " + COLUMN_ID + ", " + COLUMN_WORD + diff --git a/src/org/nyanya/android/traditionalt9/TraditionalT9.java b/src/org/nyanya/android/traditionalt9/TraditionalT9.java index 605073c4..67b6c8e9 100644 --- a/src/org/nyanya/android/traditionalt9/TraditionalT9.java +++ b/src/org/nyanya/android/traditionalt9/TraditionalT9.java @@ -562,8 +562,7 @@ public class TraditionalT9 extends InputMethodService implements if (interfacehandler != null) { interfacehandler.setPressed(keyCode, true); } - case KeyEvent.KEYCODE_FOCUS: - // pass-through + // pass-through case KeyEvent.KEYCODE_0: case KeyEvent.KEYCODE_1: case KeyEvent.KEYCODE_2: @@ -767,7 +766,7 @@ public class TraditionalT9 extends InputMethodService implements if (interfacehandler != null) { interfacehandler.setPressed(keyCode, false); } - // pass-through + // pass-through case KeyEvent.KEYCODE_0: case KeyEvent.KEYCODE_1: case KeyEvent.KEYCODE_2: @@ -780,7 +779,7 @@ public class TraditionalT9 extends InputMethodService implements case KeyEvent.KEYCODE_9: case KeyEvent.KEYCODE_POUND: case KeyEvent.KEYCODE_STAR: - case KeyEvent.KEYCODE_FOCUS: + //case KeyEvent.KEYCODE_FOCUS: // if (!isInputViewShown()){ // Log.d("onKeyUp", "showing window."); // //showWindow(true); diff --git a/src/org/nyanya/android/traditionalt9/TraditionalT9Settings.java b/src/org/nyanya/android/traditionalt9/TraditionalT9Settings.java index 335a8e7f..140ddd09 100644 --- a/src/org/nyanya/android/traditionalt9/TraditionalT9Settings.java +++ b/src/org/nyanya/android/traditionalt9/TraditionalT9Settings.java @@ -327,6 +327,7 @@ public class TraditionalT9Settings extends PreferenceActivity implements final int freqColumn = wordhelp.getColumnIndex(T9DB.COLUMN_FREQUENCY); final int seqColumn = wordhelp.getColumnIndex(T9DB.COLUMN_SEQ); + // load CHARTABLE and then load T9table, just to cover all bases. for (Map.Entry entry : CharMap.CHARTABLE.get(lang).entrySet()) { wordhelp.prepareForReplace(); wordhelp.bind(langColumn, Integer.toString(lang)); @@ -334,6 +335,25 @@ public class TraditionalT9Settings extends PreferenceActivity implements wordhelp.bind(wordColumn, Character.toString(entry.getKey())); wordhelp.bind(freqColumn, 0); wordhelp.execute(); + // upper case + wordhelp.prepareForReplace(); + wordhelp.bind(langColumn, Integer.toString(lang)); + wordhelp.bind(seqColumn, Integer.toString(entry.getValue())); + wordhelp.bind(wordColumn, Character.toString(Character.toUpperCase(entry.getKey()))); + wordhelp.bind(freqColumn, 0); + wordhelp.execute(); + } + char[][] chartable = CharMap.T9TABLE[lang]; + for (int numkey=0; numkey