diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 207280e5..28f97a16 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,15 +15,17 @@ The recommended way of building is using Android Studio. As the of time of writi If you have not configured Android Studio yet, follow [the official manual](https://developer.android.com/training/basics/firstapp), then follow the simple steps below to get the project running. - _Import the project in Android Studio._ -- _Prevent the "Default Activity not found" issue._ The app does not have a default view or a launcher icon. For this reason, you must configure Android Studio not to launch anything after installing, otherwise it will fail with "Default Activity not found" or a similar message. To do so: +- _Prevent the "Default Activity not found" issue._ If Android Studio fails to identify the default Activity, you must configure it not to launch anything after installing, otherwise it will fail with "Default Activity not found" or a similar message. To do so: - Open "Edit Configurations..." (Press Shift 3 times and select it from the command list) - Go to "General" tab. - Change "Launch Options" to "Nothing" - Hit "OK" -That's it! Now you should be able to deploy and debug the app on your device. +_You can find more info in this [Github issue](https://github.com/android/input-samples/issues/18)._ -You can find more info in this [Github issue](https://github.com/android/input-samples/issues/18). +_Since this is an IME, it makes little sense to open the configuration screen every time you test on a real device. It may be practical keep "Launch Options" set to "Nothing" at all times, not only when you encounter the error above._ + +That's it! Now you should be able to deploy and debug the app on your device. ### Building a Release .apk The project is configured to build an unsigned release variant by default. @@ -46,21 +48,17 @@ Make sure you have a signing key. If you don't have one, follow the [official ma ## Adding a New Language To support a new language one needs to: -- Add status icons - - Create a proper icon for each screen size. The icon needs to contain the abbreviation of the language. (e.g. "En" for "English"). - - The font must be Roboto or Roboto Lt (Heebo for Hebrew) at an adequate size to fit the icon square with minimum padding. - - The text must be white and the background must be transparent as per the [official Android guide](https://android-doc.github.io/guide/practices/ui_guidelines/icon_design_status_bar.html). - - To simplify the process, you could use Android Studio. It has a built-in icon generator accessible by right-clicking on "drawable" folder -> New -> Image Asset. Then choose "Icon Type": "Notification Icons", "Asset Type": Text, "Trim": No, "Padding": 0%. -- Find a suitable dictionary and add it to `assets/` folder. Two file formats are supported, [see below](#dictionary-formats). +- Find a suitable dictionary and add it to the `assets/` folder. Two file formats are supported, [see below](#dictionary-formats). - Do not forget to include the dictionary license (or readme) file in the `docs/` folder. - Create a new language class in `languages/definitions/` and define its properties. - - `name` is the native name of the language (e.g. "English", "Deutsch", "Українська"). - `locale` contains the language and the country codes (e.g. "en-US", "es-AR", "it-IT"). Refer to the list of [supported locales in Java](https://www.oracle.com/java/technologies/javase/jdk8-jre8-suported-locales.html#util-text). - `dictionaryFile` is the name of the dictionary in `assets/` folder. - - `icon` is the status icon for Predictive mode. - - `abcLowerCaseIcon` and `abcUpperCaseIcon` are the respective status icons for ABC (non-predictive) modes. Note that, you must not set `abcUpperCaseIcon`, if your language has no uppercase and lowercase letters (like Arabic, Asian scripts and Hebrew). - - Set `isPunctuationPartOfWords` to `true`, if the dictionary contains words with apostrophes or dashes, such as: `it's`, `you'll`, `a'tje` or `п'ят`. This will allow using 1-key for typing them (they will appear as suggestions). `false` will enable faster typing when apostrophes or other punctuation are not part of the words (no such words will be suggested). - `characterMap` contains the letters and punctuation marks associated with each key. + - Set `isPunctuationPartOfWords` to `true`, if the dictionary contains words with apostrophes or dashes, such as: `it's`, `you'll`, `a'tje` or `п'ят`. This will allow using 1-key for typing them (they will appear as suggestions). `false` will enable faster typing when apostrophes or other punctuation are not part of the words (no such words will be suggested). + - `abcString` _(optional)_. A custom string to display in ABC mode. By default, the first three letters on 2-key are used (e.g. "ABC" or "АБВ"). Set this if the first letters of the alphabet are _not_ on 2-key, like in Hebrew, or if a different string makes more sense. + - `hasUpperCase` _(optional)_ set to `false` when the language has no upper- and lowercase letters. For example: Arabic, Hebrew, East Asian + languages, and so on. The default is `true`. + - `name` _(optional)_ defaults to the native name of the language (e.g. "English", "Deutsch", "Українська"). Useful to set when the default is ambiguous. For example, both Portuguese in Portugal and Brazil will default to "Português", so assigning "Português brasileiro" would make it clear it's the language used in Brazil. - Finally, add the new language to the list in `LanguageCollection.java`. You only need to add it in one place, in the constructor. Please, be nice and maintain the alphabetical order. @@ -70,7 +68,7 @@ To support a new language one needs to: The most basic format is just a list of words where each word is on a new line. Constraints: -- No single lowercase letters. The application will add them automatically. +- No single lowercase letters. They will be added automatically. - No repeating words. - No digits or garbage characters as part of the words. @@ -110,7 +108,7 @@ To translate Traditional T9 menus and messages in your language, add: `res/value Alternatively, if you don't have Android Studio, you could just use `res/values/strings.xml` as a reference and translate all strings in your file, skipping the ones that have the `translatable="false"` attribute. -## Adding Support for Keys +## Adding Support for New Hardware Keys (Hotkeys) TT9 allows assigning hotkeys for performing different functions. If your phone has a special key that does not appear on the Hotkey configuration screen, you can easily add support for it. - In `preferences/helpers/Hotkeys.java`, find the `generateList()` function. diff --git a/README.md b/README.md index fbea9aa8..3f25246a 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,6 @@ Your PRs are welcome! - The source code, the logo image and the icons are licensed under the conditions described in [LICENSE.txt](LICENSE.txt). - The dictionaries are licensed under the licenses provided in the [respective readme files](docs/dictionaries/), where applicable. Detailed information about the dictionaries is also available there. - [Silver foil photo created by rawpixel.com - www.freepik.com](https://www.freepik.com/photos/silver-foil) -- "Roboto" font is under [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). -- "Heebo" font is under [SIL Open Font License Version 1.1](http://scripts.sil.org/OFL). - "Negotiate" and "Vibrocentric" fonts are under [The Fontspring Desktop/Ebook Font End User License](docs/desktop-ebook-EULA-1.8.txt). ## Privacy Policy diff --git a/res/drawable-anydpi-v24/ime_lang_bg.xml b/res/drawable-anydpi-v24/ime_lang_bg.xml deleted file mode 100644 index c15b21c7..00000000 --- a/res/drawable-anydpi-v24/ime_lang_bg.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_br.xml b/res/drawable-anydpi-v24/ime_lang_br.xml deleted file mode 100644 index 5860b1ad..00000000 --- a/res/drawable-anydpi-v24/ime_lang_br.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_cyrillic_lower.xml b/res/drawable-anydpi-v24/ime_lang_cyrillic_lower.xml deleted file mode 100644 index 3cdb5b60..00000000 --- a/res/drawable-anydpi-v24/ime_lang_cyrillic_lower.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_cyrillic_upper.xml b/res/drawable-anydpi-v24/ime_lang_cyrillic_upper.xml deleted file mode 100644 index f54b1560..00000000 --- a/res/drawable-anydpi-v24/ime_lang_cyrillic_upper.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_de.xml b/res/drawable-anydpi-v24/ime_lang_de.xml deleted file mode 100644 index f928161f..00000000 --- a/res/drawable-anydpi-v24/ime_lang_de.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_en.xml b/res/drawable-anydpi-v24/ime_lang_en.xml deleted file mode 100644 index cbcb6ca2..00000000 --- a/res/drawable-anydpi-v24/ime_lang_en.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_es.xml b/res/drawable-anydpi-v24/ime_lang_es.xml deleted file mode 100644 index afc45851..00000000 --- a/res/drawable-anydpi-v24/ime_lang_es.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_fi.xml b/res/drawable-anydpi-v24/ime_lang_fi.xml deleted file mode 100644 index cd0375ef..00000000 --- a/res/drawable-anydpi-v24/ime_lang_fi.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_fr.xml b/res/drawable-anydpi-v24/ime_lang_fr.xml deleted file mode 100644 index c3c702b6..00000000 --- a/res/drawable-anydpi-v24/ime_lang_fr.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_hebrew.xml b/res/drawable-anydpi-v24/ime_lang_hebrew.xml deleted file mode 100644 index 24196a14..00000000 --- a/res/drawable-anydpi-v24/ime_lang_hebrew.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_hebrew_abc.xml b/res/drawable-anydpi-v24/ime_lang_hebrew_abc.xml deleted file mode 100644 index d7f2753a..00000000 --- a/res/drawable-anydpi-v24/ime_lang_hebrew_abc.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_it.xml b/res/drawable-anydpi-v24/ime_lang_it.xml deleted file mode 100644 index 737fd30d..00000000 --- a/res/drawable-anydpi-v24/ime_lang_it.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_latin_lower.xml b/res/drawable-anydpi-v24/ime_lang_latin_lower.xml deleted file mode 100644 index cc1e23b8..00000000 --- a/res/drawable-anydpi-v24/ime_lang_latin_lower.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_latin_upper.xml b/res/drawable-anydpi-v24/ime_lang_latin_upper.xml deleted file mode 100644 index 57bd3ad1..00000000 --- a/res/drawable-anydpi-v24/ime_lang_latin_upper.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_nb.xml b/res/drawable-anydpi-v24/ime_lang_nb.xml deleted file mode 100644 index cf1ab788..00000000 --- a/res/drawable-anydpi-v24/ime_lang_nb.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_nl.xml b/res/drawable-anydpi-v24/ime_lang_nl.xml deleted file mode 100644 index 7100ee58..00000000 --- a/res/drawable-anydpi-v24/ime_lang_nl.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_ru.xml b/res/drawable-anydpi-v24/ime_lang_ru.xml deleted file mode 100644 index 78cd91a6..00000000 --- a/res/drawable-anydpi-v24/ime_lang_ru.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_sv.xml b/res/drawable-anydpi-v24/ime_lang_sv.xml deleted file mode 100644 index df398391..00000000 --- a/res/drawable-anydpi-v24/ime_lang_sv.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_lang_uk.xml b/res/drawable-anydpi-v24/ime_lang_uk.xml deleted file mode 100644 index 9afe8476..00000000 --- a/res/drawable-anydpi-v24/ime_lang_uk.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-anydpi-v24/ime_number.xml b/res/drawable-anydpi-v24/ime_number.xml deleted file mode 100644 index b439f7ff..00000000 --- a/res/drawable-anydpi-v24/ime_number.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/res/drawable-hdpi/ime_lang_bg.png b/res/drawable-hdpi/ime_lang_bg.png deleted file mode 100644 index 6e13d49d..00000000 Binary files a/res/drawable-hdpi/ime_lang_bg.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_br.png b/res/drawable-hdpi/ime_lang_br.png deleted file mode 100644 index 4307273f..00000000 Binary files a/res/drawable-hdpi/ime_lang_br.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_cyrillic_lower.png b/res/drawable-hdpi/ime_lang_cyrillic_lower.png deleted file mode 100644 index 82cce2d2..00000000 Binary files a/res/drawable-hdpi/ime_lang_cyrillic_lower.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_cyrillic_upper.png b/res/drawable-hdpi/ime_lang_cyrillic_upper.png deleted file mode 100644 index bdd2c392..00000000 Binary files a/res/drawable-hdpi/ime_lang_cyrillic_upper.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_de.png b/res/drawable-hdpi/ime_lang_de.png deleted file mode 100644 index 636b7cb5..00000000 Binary files a/res/drawable-hdpi/ime_lang_de.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_en.png b/res/drawable-hdpi/ime_lang_en.png deleted file mode 100644 index f8132484..00000000 Binary files a/res/drawable-hdpi/ime_lang_en.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_es.png b/res/drawable-hdpi/ime_lang_es.png deleted file mode 100644 index a5f016c6..00000000 Binary files a/res/drawable-hdpi/ime_lang_es.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_fi.png b/res/drawable-hdpi/ime_lang_fi.png deleted file mode 100644 index d8915e95..00000000 Binary files a/res/drawable-hdpi/ime_lang_fi.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_fr.png b/res/drawable-hdpi/ime_lang_fr.png deleted file mode 100644 index 5e08af89..00000000 Binary files a/res/drawable-hdpi/ime_lang_fr.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_hebrew.png b/res/drawable-hdpi/ime_lang_hebrew.png deleted file mode 100644 index afa3d540..00000000 Binary files a/res/drawable-hdpi/ime_lang_hebrew.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_hebrew_abc.png b/res/drawable-hdpi/ime_lang_hebrew_abc.png deleted file mode 100644 index 893ee673..00000000 Binary files a/res/drawable-hdpi/ime_lang_hebrew_abc.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_it.png b/res/drawable-hdpi/ime_lang_it.png deleted file mode 100644 index 1ad64c55..00000000 Binary files a/res/drawable-hdpi/ime_lang_it.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_latin_lower.png b/res/drawable-hdpi/ime_lang_latin_lower.png deleted file mode 100644 index acdbe116..00000000 Binary files a/res/drawable-hdpi/ime_lang_latin_lower.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_latin_upper.png b/res/drawable-hdpi/ime_lang_latin_upper.png deleted file mode 100644 index 375da882..00000000 Binary files a/res/drawable-hdpi/ime_lang_latin_upper.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_nb.png b/res/drawable-hdpi/ime_lang_nb.png deleted file mode 100644 index 0fa7416b..00000000 Binary files a/res/drawable-hdpi/ime_lang_nb.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_nl.png b/res/drawable-hdpi/ime_lang_nl.png deleted file mode 100644 index 29923acb..00000000 Binary files a/res/drawable-hdpi/ime_lang_nl.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_ru.png b/res/drawable-hdpi/ime_lang_ru.png deleted file mode 100644 index ca10c6b6..00000000 Binary files a/res/drawable-hdpi/ime_lang_ru.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_sv.png b/res/drawable-hdpi/ime_lang_sv.png deleted file mode 100644 index ad4bd187..00000000 Binary files a/res/drawable-hdpi/ime_lang_sv.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_lang_uk.png b/res/drawable-hdpi/ime_lang_uk.png deleted file mode 100644 index 0e3862cf..00000000 Binary files a/res/drawable-hdpi/ime_lang_uk.png and /dev/null differ diff --git a/res/drawable-hdpi/ime_number.png b/res/drawable-hdpi/ime_number.png deleted file mode 100644 index d1bca6d7..00000000 Binary files a/res/drawable-hdpi/ime_number.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_bg.png b/res/drawable-mdpi/ime_lang_bg.png deleted file mode 100644 index 38ee79cd..00000000 Binary files a/res/drawable-mdpi/ime_lang_bg.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_br.png b/res/drawable-mdpi/ime_lang_br.png deleted file mode 100644 index a558df02..00000000 Binary files a/res/drawable-mdpi/ime_lang_br.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_cyrillic_lower.png b/res/drawable-mdpi/ime_lang_cyrillic_lower.png deleted file mode 100644 index fc2944ef..00000000 Binary files a/res/drawable-mdpi/ime_lang_cyrillic_lower.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_cyrillic_upper.png b/res/drawable-mdpi/ime_lang_cyrillic_upper.png deleted file mode 100644 index acc8c4e5..00000000 Binary files a/res/drawable-mdpi/ime_lang_cyrillic_upper.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_de.png b/res/drawable-mdpi/ime_lang_de.png deleted file mode 100644 index bc45c7b3..00000000 Binary files a/res/drawable-mdpi/ime_lang_de.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_en.png b/res/drawable-mdpi/ime_lang_en.png deleted file mode 100644 index 012cafaf..00000000 Binary files a/res/drawable-mdpi/ime_lang_en.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_es.png b/res/drawable-mdpi/ime_lang_es.png deleted file mode 100644 index 8c3443f3..00000000 Binary files a/res/drawable-mdpi/ime_lang_es.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_fi.png b/res/drawable-mdpi/ime_lang_fi.png deleted file mode 100644 index 61c31662..00000000 Binary files a/res/drawable-mdpi/ime_lang_fi.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_fr.png b/res/drawable-mdpi/ime_lang_fr.png deleted file mode 100644 index cb7bccba..00000000 Binary files a/res/drawable-mdpi/ime_lang_fr.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_hebrew.png b/res/drawable-mdpi/ime_lang_hebrew.png deleted file mode 100644 index 8be9e98a..00000000 Binary files a/res/drawable-mdpi/ime_lang_hebrew.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_hebrew_abc.png b/res/drawable-mdpi/ime_lang_hebrew_abc.png deleted file mode 100644 index 3ae90314..00000000 Binary files a/res/drawable-mdpi/ime_lang_hebrew_abc.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_it.png b/res/drawable-mdpi/ime_lang_it.png deleted file mode 100644 index a725c630..00000000 Binary files a/res/drawable-mdpi/ime_lang_it.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_latin_lower.png b/res/drawable-mdpi/ime_lang_latin_lower.png deleted file mode 100644 index 913933e5..00000000 Binary files a/res/drawable-mdpi/ime_lang_latin_lower.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_latin_upper.png b/res/drawable-mdpi/ime_lang_latin_upper.png deleted file mode 100644 index e60a3d6d..00000000 Binary files a/res/drawable-mdpi/ime_lang_latin_upper.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_nb.png b/res/drawable-mdpi/ime_lang_nb.png deleted file mode 100644 index d863f134..00000000 Binary files a/res/drawable-mdpi/ime_lang_nb.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_nl.png b/res/drawable-mdpi/ime_lang_nl.png deleted file mode 100644 index 44e703a0..00000000 Binary files a/res/drawable-mdpi/ime_lang_nl.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_ru.png b/res/drawable-mdpi/ime_lang_ru.png deleted file mode 100644 index 1a65c182..00000000 Binary files a/res/drawable-mdpi/ime_lang_ru.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_sv.png b/res/drawable-mdpi/ime_lang_sv.png deleted file mode 100644 index 366008b0..00000000 Binary files a/res/drawable-mdpi/ime_lang_sv.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_lang_uk.png b/res/drawable-mdpi/ime_lang_uk.png deleted file mode 100644 index 06d99702..00000000 Binary files a/res/drawable-mdpi/ime_lang_uk.png and /dev/null differ diff --git a/res/drawable-mdpi/ime_number.png b/res/drawable-mdpi/ime_number.png deleted file mode 100644 index 40dc6a25..00000000 Binary files a/res/drawable-mdpi/ime_number.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_bg.png b/res/drawable-xhdpi/ime_lang_bg.png deleted file mode 100644 index 0e2ea713..00000000 Binary files a/res/drawable-xhdpi/ime_lang_bg.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_br.png b/res/drawable-xhdpi/ime_lang_br.png deleted file mode 100644 index fcd82b6b..00000000 Binary files a/res/drawable-xhdpi/ime_lang_br.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_cyrillic_lower.png b/res/drawable-xhdpi/ime_lang_cyrillic_lower.png deleted file mode 100644 index 6b5048b3..00000000 Binary files a/res/drawable-xhdpi/ime_lang_cyrillic_lower.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_cyrillic_upper.png b/res/drawable-xhdpi/ime_lang_cyrillic_upper.png deleted file mode 100644 index 1c1bdc68..00000000 Binary files a/res/drawable-xhdpi/ime_lang_cyrillic_upper.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_de.png b/res/drawable-xhdpi/ime_lang_de.png deleted file mode 100644 index 36bc737c..00000000 Binary files a/res/drawable-xhdpi/ime_lang_de.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_en.png b/res/drawable-xhdpi/ime_lang_en.png deleted file mode 100644 index 4df14d85..00000000 Binary files a/res/drawable-xhdpi/ime_lang_en.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_es.png b/res/drawable-xhdpi/ime_lang_es.png deleted file mode 100644 index 29b09d38..00000000 Binary files a/res/drawable-xhdpi/ime_lang_es.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_fi.png b/res/drawable-xhdpi/ime_lang_fi.png deleted file mode 100644 index cff57140..00000000 Binary files a/res/drawable-xhdpi/ime_lang_fi.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_fr.png b/res/drawable-xhdpi/ime_lang_fr.png deleted file mode 100644 index 584cdad2..00000000 Binary files a/res/drawable-xhdpi/ime_lang_fr.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_hebrew.png b/res/drawable-xhdpi/ime_lang_hebrew.png deleted file mode 100644 index 8fd921d0..00000000 Binary files a/res/drawable-xhdpi/ime_lang_hebrew.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_hebrew_abc.png b/res/drawable-xhdpi/ime_lang_hebrew_abc.png deleted file mode 100644 index c83d0361..00000000 Binary files a/res/drawable-xhdpi/ime_lang_hebrew_abc.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_it.png b/res/drawable-xhdpi/ime_lang_it.png deleted file mode 100644 index abfa95bb..00000000 Binary files a/res/drawable-xhdpi/ime_lang_it.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_latin_lower.png b/res/drawable-xhdpi/ime_lang_latin_lower.png deleted file mode 100644 index 6c0415db..00000000 Binary files a/res/drawable-xhdpi/ime_lang_latin_lower.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_latin_upper.png b/res/drawable-xhdpi/ime_lang_latin_upper.png deleted file mode 100644 index e329955a..00000000 Binary files a/res/drawable-xhdpi/ime_lang_latin_upper.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_nb.png b/res/drawable-xhdpi/ime_lang_nb.png deleted file mode 100644 index cc2358bd..00000000 Binary files a/res/drawable-xhdpi/ime_lang_nb.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_nl.png b/res/drawable-xhdpi/ime_lang_nl.png deleted file mode 100644 index b2af69dc..00000000 Binary files a/res/drawable-xhdpi/ime_lang_nl.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_ru.png b/res/drawable-xhdpi/ime_lang_ru.png deleted file mode 100644 index 1234865b..00000000 Binary files a/res/drawable-xhdpi/ime_lang_ru.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_sv.png b/res/drawable-xhdpi/ime_lang_sv.png deleted file mode 100644 index 0ac84f18..00000000 Binary files a/res/drawable-xhdpi/ime_lang_sv.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_lang_uk.png b/res/drawable-xhdpi/ime_lang_uk.png deleted file mode 100644 index 3b51af6a..00000000 Binary files a/res/drawable-xhdpi/ime_lang_uk.png and /dev/null differ diff --git a/res/drawable-xhdpi/ime_number.png b/res/drawable-xhdpi/ime_number.png deleted file mode 100644 index 32704046..00000000 Binary files a/res/drawable-xhdpi/ime_number.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_bg.png b/res/drawable-xxhdpi/ime_lang_bg.png deleted file mode 100644 index 39c07f7b..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_bg.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_br.png b/res/drawable-xxhdpi/ime_lang_br.png deleted file mode 100644 index 6430862d..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_br.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_cyrillic_lower.png b/res/drawable-xxhdpi/ime_lang_cyrillic_lower.png deleted file mode 100644 index b5926caf..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_cyrillic_lower.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_cyrillic_upper.png b/res/drawable-xxhdpi/ime_lang_cyrillic_upper.png deleted file mode 100644 index cc670aec..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_cyrillic_upper.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_de.png b/res/drawable-xxhdpi/ime_lang_de.png deleted file mode 100644 index fa7a80b8..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_de.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_en.png b/res/drawable-xxhdpi/ime_lang_en.png deleted file mode 100644 index 218e33a5..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_en.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_es.png b/res/drawable-xxhdpi/ime_lang_es.png deleted file mode 100644 index 501e8714..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_es.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_fi.png b/res/drawable-xxhdpi/ime_lang_fi.png deleted file mode 100644 index 0cd92ca0..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_fi.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_fr.png b/res/drawable-xxhdpi/ime_lang_fr.png deleted file mode 100644 index d8f330f3..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_fr.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_hebrew.png b/res/drawable-xxhdpi/ime_lang_hebrew.png deleted file mode 100644 index 07782232..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_hebrew.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_hebrew_abc.png b/res/drawable-xxhdpi/ime_lang_hebrew_abc.png deleted file mode 100644 index 2aff91bf..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_hebrew_abc.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_it.png b/res/drawable-xxhdpi/ime_lang_it.png deleted file mode 100644 index d78fe985..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_it.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_latin_lower.png b/res/drawable-xxhdpi/ime_lang_latin_lower.png deleted file mode 100644 index e8e7c554..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_latin_lower.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_latin_upper.png b/res/drawable-xxhdpi/ime_lang_latin_upper.png deleted file mode 100644 index 4b21d551..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_latin_upper.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_nb.png b/res/drawable-xxhdpi/ime_lang_nb.png deleted file mode 100644 index f13aa1bf..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_nb.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_nl.png b/res/drawable-xxhdpi/ime_lang_nl.png deleted file mode 100644 index b97ff839..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_nl.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_ru.png b/res/drawable-xxhdpi/ime_lang_ru.png deleted file mode 100644 index 8e5278de..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_ru.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_sv.png b/res/drawable-xxhdpi/ime_lang_sv.png deleted file mode 100644 index 97cf4a69..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_sv.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_lang_uk.png b/res/drawable-xxhdpi/ime_lang_uk.png deleted file mode 100644 index 8520648d..00000000 Binary files a/res/drawable-xxhdpi/ime_lang_uk.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ime_number.png b/res/drawable-xxhdpi/ime_number.png deleted file mode 100644 index be4c4a9b..00000000 Binary files a/res/drawable-xxhdpi/ime_number.png and /dev/null differ diff --git a/res/layout/mainview.xml b/res/layout/mainview.xml index 4ad10f7f..6d1c4e02 100644 --- a/res/layout/mainview.xml +++ b/res/layout/mainview.xml @@ -5,14 +5,29 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + android:layout_height="@dimen/candidate_list_height"> + + + + + + + suggestions, int selectedIndex) { - if (mSuggestionView == null) { + if (suggestionBar == null) { return; } boolean show = suggestions != null && suggestions.size() > 0; - mSuggestionView.setSuggestions(suggestions, selectedIndex); + suggestionBar.setSuggestions(suggestions, selectedIndex); setCandidatesViewShown(show); } private String getComposingText() { - String text = mSuggestionView.getCurrentSuggestion(); + String text = suggestionBar.getCurrentSuggestion(); if (text.length() > 0 && text.length() > mInputMode.getSequenceLength()) { text = text.substring(0, mInputMode.getSequenceLength()); } @@ -499,7 +506,7 @@ public class TraditionalT9 extends KeyPadHandler { // This is why we retry, until there is a visual change. for (int retries = 0; retries < 2 && mLanguage.hasUpperCase(); retries++) { mInputMode.nextTextCase(); - setSuggestions(mInputMode.getSuggestions(), mSuggestionView.getCurrentIndex()); + setSuggestions(mInputMode.getSuggestions(), suggestionBar.getCurrentIndex()); refreshComposingText(); if (!currentSuggestionBefore.equals(getComposingText())) { @@ -521,7 +528,7 @@ public class TraditionalT9 extends KeyPadHandler { settings.saveInputMode(mInputMode.getId()); settings.saveTextCase(mInputMode.getTextCase()); - UI.updateStatusIcon(this, mLanguage, mInputMode); + statusBar.setText(mInputMode.toString()); } @@ -545,9 +552,6 @@ public class TraditionalT9 extends KeyPadHandler { // save it for the next time settings.saveInputLanguage(mLanguage.getId()); - UI.updateStatusIcon(this, mLanguage, mInputMode); - UI.toastInputMode(this, settings, mLanguage, mInputMode); - return true; } @@ -580,7 +584,7 @@ public class TraditionalT9 extends KeyPadHandler { } else if (mInputMode.is123() && allowedInputModes.size() == 1) { mEditing = EDITING_STRICT_NUMERIC; } else { - mEditing = inputType.isFilter() ? EDITING_NOSHOW : EDITING; + mEditing = EDITING; } } diff --git a/src/io/github/sspanak/tt9/ime/helpers/InputType.java b/src/io/github/sspanak/tt9/ime/helpers/InputType.java index d9334d9d..f8ebdedc 100644 --- a/src/io/github/sspanak/tt9/ime/helpers/InputType.java +++ b/src/io/github/sspanak/tt9/ime/helpers/InputType.java @@ -64,10 +64,6 @@ public class InputType { } - /** - * isFilter - * handle filter list cases... do not hijack DPAD center and make sure back's go through proper - */ public boolean isFilter() { if (field == null) { return false; diff --git a/src/io/github/sspanak/tt9/ime/modes/Mode123.java b/src/io/github/sspanak/tt9/ime/modes/Mode123.java index e3f5bb49..eeede02f 100644 --- a/src/io/github/sspanak/tt9/ime/modes/Mode123.java +++ b/src/io/github/sspanak/tt9/ime/modes/Mode123.java @@ -1,5 +1,7 @@ package io.github.sspanak.tt9.ime.modes; +import androidx.annotation.NonNull; + import java.util.ArrayList; public class Mode123 extends InputMode { @@ -24,4 +26,10 @@ public class Mode123 extends InputMode { final public boolean is123() { return true; } public int getSequenceLength() { return 0; } public boolean shouldTrackNumPress() { return false; } + + @NonNull + @Override + public String toString() { + return "123"; + } } diff --git a/src/io/github/sspanak/tt9/ime/modes/ModeABC.java b/src/io/github/sspanak/tt9/ime/modes/ModeABC.java index 631740c8..f9404a64 100644 --- a/src/io/github/sspanak/tt9/ime/modes/ModeABC.java +++ b/src/io/github/sspanak/tt9/ime/modes/ModeABC.java @@ -1,5 +1,7 @@ package io.github.sspanak.tt9.ime.modes; +import androidx.annotation.NonNull; + import java.util.ArrayList; import io.github.sspanak.tt9.languages.Language; @@ -56,4 +58,19 @@ public class ModeABC extends InputMode { @Override public boolean shouldSelectNextSuggestion() { return shouldSelectNextLetter; } + + @NonNull + @Override + public String toString() { + if (language == null) { + return textCase == CASE_LOWER ? "abc" : "ABC"; + } + + String langCode = language.getLocale().getCountry(); + langCode = langCode.length() == 0 ? language.getLocale().getLanguage() : langCode; + + String modeString = language.getAbcString() + " / " + langCode.toUpperCase(); + + return (textCase == CASE_LOWER) ? modeString.toLowerCase(language.getLocale()) : modeString.toUpperCase(language.getLocale()); + } } diff --git a/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java b/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java index 1dacf52c..15309f84 100644 --- a/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java +++ b/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java @@ -4,6 +4,8 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; +import androidx.annotation.NonNull; + import io.github.sspanak.tt9.Logger; import io.github.sspanak.tt9.db.DictionaryDb; import io.github.sspanak.tt9.ime.helpers.InputType; @@ -331,4 +333,21 @@ public class ModePredictive extends InputMode { @Override final public boolean isPredictive() { return true; } @Override public int getSequenceLength() { return digitSequence.length(); } + + @NonNull + @Override + public String toString() { + if (language == null) { + return "Predictive"; + } + + String modeString = language.getName(); + if (textCase == CASE_UPPER) { + return modeString.toUpperCase(language.getLocale()); + } else if (textCase == CASE_LOWER && !settings.getAutoTextCase()) { + return modeString.toLowerCase(language.getLocale()); + } else { + return modeString; + } + } } diff --git a/src/io/github/sspanak/tt9/languages/Language.java b/src/io/github/sspanak/tt9/languages/Language.java index d62120fc..83906bc2 100644 --- a/src/io/github/sspanak/tt9/languages/Language.java +++ b/src/io/github/sspanak/tt9/languages/Language.java @@ -11,14 +11,13 @@ public class Language { private int id; protected String name; protected Locale locale; - protected int icon; protected String dictionaryFile; - protected int abcLowerCaseIcon; - protected int abcUpperCaseIcon; + protected String abcString; protected ArrayList> characterMap = new ArrayList<>(); private final HashMap reverseCharacterMap = new HashMap<>(); // settings + protected boolean hasUpperCase = true; protected boolean isPunctuationPartOfWords; // see the getter for more info final public int getId() { @@ -34,19 +33,31 @@ public class Language { } final public String getName() { - return name; - } + if (name == null) { + name = locale != null ? capitalize(locale.getDisplayLanguage(locale)) : ""; + } - final public int getIcon() { - return icon; + return name; } final public String getDictionaryFile() { return dictionaryFile; } - final public int getAbcIcon(boolean lowerCase) { - return lowerCase ? abcLowerCaseIcon : abcUpperCaseIcon; + final public String getAbcString() { + if (abcString == null) { + ArrayList lettersList = getKeyCharacters(2, false); + + abcString = ""; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < lettersList.size() && i < 3; i++) { + sb.append(lettersList.get(i)); + } + + abcString = sb.toString(); + } + + return abcString; } /** @@ -68,8 +79,8 @@ public class Language { final public boolean isPunctuationPartOfWords() { return isPunctuationPartOfWords; } - final public boolean hasUpperCase() { - return abcUpperCaseIcon != 0; + public boolean hasUpperCase() { + return hasUpperCase; } @@ -164,6 +175,6 @@ public class Language { @NonNull @Override public String toString() { - return name != null ? name : ""; + return getName(); } } diff --git a/src/io/github/sspanak/tt9/languages/definitions/BrazilianPortuguese.java b/src/io/github/sspanak/tt9/languages/definitions/BrazilianPortuguese.java index d9b466e7..7724b60e 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/BrazilianPortuguese.java +++ b/src/io/github/sspanak/tt9/languages/definitions/BrazilianPortuguese.java @@ -3,8 +3,6 @@ package io.github.sspanak.tt9.languages.definitions; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; - public class BrazilianPortuguese extends English { public BrazilianPortuguese() { super(); @@ -12,7 +10,6 @@ public class BrazilianPortuguese extends English { name = "Português brasileiro"; locale = new Locale("pt","BR"); dictionaryFile = "pt-BR-utf8.csv"; - icon = R.drawable.ime_lang_br; isPunctuationPartOfWords = true; diff --git a/src/io/github/sspanak/tt9/languages/definitions/Bulgarian.java b/src/io/github/sspanak/tt9/languages/definitions/Bulgarian.java index aef48f24..3a051b96 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/Bulgarian.java +++ b/src/io/github/sspanak/tt9/languages/definitions/Bulgarian.java @@ -4,18 +4,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Characters; public class Bulgarian extends Language { public Bulgarian() { - name = "Български"; locale = new Locale("bg","BG"); dictionaryFile = "bg-utf8.csv"; - icon = R.drawable.ime_lang_bg; - abcLowerCaseIcon = R.drawable.ime_lang_cyrillic_lower; - abcUpperCaseIcon = R.drawable.ime_lang_cyrillic_upper; isPunctuationPartOfWords = false; diff --git a/src/io/github/sspanak/tt9/languages/definitions/Dutch.java b/src/io/github/sspanak/tt9/languages/definitions/Dutch.java index 7e434007..6b61ecc8 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/Dutch.java +++ b/src/io/github/sspanak/tt9/languages/definitions/Dutch.java @@ -3,16 +3,12 @@ package io.github.sspanak.tt9.languages.definitions; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; - public class Dutch extends English { public Dutch() { super(); - name = "Nederlands"; locale = new Locale("nl","NL"); dictionaryFile = "nl-utf8.csv"; - icon = R.drawable.ime_lang_nl; isPunctuationPartOfWords = true; diff --git a/src/io/github/sspanak/tt9/languages/definitions/English.java b/src/io/github/sspanak/tt9/languages/definitions/English.java index 9d4671e9..feca8216 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/English.java +++ b/src/io/github/sspanak/tt9/languages/definitions/English.java @@ -4,18 +4,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; -import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Characters; +import io.github.sspanak.tt9.languages.Language; public class English extends Language { public English() { - name = "English"; locale = Locale.ENGLISH; dictionaryFile = "en-utf8.csv"; - icon = R.drawable.ime_lang_en; - abcLowerCaseIcon = R.drawable.ime_lang_latin_lower; - abcUpperCaseIcon = R.drawable.ime_lang_latin_upper; isPunctuationPartOfWords = true; diff --git a/src/io/github/sspanak/tt9/languages/definitions/Finnish.java b/src/io/github/sspanak/tt9/languages/definitions/Finnish.java index 837f15e8..346d5c0f 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/Finnish.java +++ b/src/io/github/sspanak/tt9/languages/definitions/Finnish.java @@ -3,20 +3,16 @@ package io.github.sspanak.tt9.languages.definitions; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; - public class Finnish extends English { public Finnish() { super(); - name = "Suomi"; locale = new Locale("fi","FI"); dictionaryFile = "fi-utf8.csv"; - icon = R.drawable.ime_lang_fi; isPunctuationPartOfWords = true; characterMap.get(2).addAll(Arrays.asList("ä", "å")); - characterMap.get(6).addAll(Arrays.asList("ö")); + characterMap.get(6).add("ö"); } } diff --git a/src/io/github/sspanak/tt9/languages/definitions/French.java b/src/io/github/sspanak/tt9/languages/definitions/French.java index 2113d19e..98e965d7 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/French.java +++ b/src/io/github/sspanak/tt9/languages/definitions/French.java @@ -3,16 +3,12 @@ package io.github.sspanak.tt9.languages.definitions; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; - public class French extends English { public French() { super(); - name = "Français"; locale = Locale.FRENCH; dictionaryFile = "fr-utf8.csv"; - icon = R.drawable.ime_lang_fr; isPunctuationPartOfWords = false; diff --git a/src/io/github/sspanak/tt9/languages/definitions/German.java b/src/io/github/sspanak/tt9/languages/definitions/German.java index 6d477308..f4d6335d 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/German.java +++ b/src/io/github/sspanak/tt9/languages/definitions/German.java @@ -2,16 +2,12 @@ package io.github.sspanak.tt9.languages.definitions; import java.util.Locale; -import io.github.sspanak.tt9.R; - public class German extends English { public German() { super(); - name = "Deutsch"; locale = Locale.GERMAN; dictionaryFile = "de-utf8.csv"; - icon = R.drawable.ime_lang_de; isPunctuationPartOfWords = false; diff --git a/src/io/github/sspanak/tt9/languages/definitions/Hebrew.java b/src/io/github/sspanak/tt9/languages/definitions/Hebrew.java index e9d26052..263485ef 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/Hebrew.java +++ b/src/io/github/sspanak/tt9/languages/definitions/Hebrew.java @@ -4,18 +4,16 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; -import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Characters; +import io.github.sspanak.tt9.languages.Language; public class Hebrew extends Language { public Hebrew() { - name = "עברית"; locale = new Locale("iw","IL"); dictionaryFile = "he-utf8.csv"; - icon = R.drawable.ime_lang_hebrew; - abcLowerCaseIcon = R.drawable.ime_lang_hebrew_abc; + abcString = "אבג"; + hasUpperCase = false; isPunctuationPartOfWords = true; characterMap = new ArrayList<>(Arrays.asList( diff --git a/src/io/github/sspanak/tt9/languages/definitions/Italian.java b/src/io/github/sspanak/tt9/languages/definitions/Italian.java index cac48d91..b3e66b4f 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/Italian.java +++ b/src/io/github/sspanak/tt9/languages/definitions/Italian.java @@ -3,16 +3,12 @@ package io.github.sspanak.tt9.languages.definitions; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; - public class Italian extends English { public Italian() { super(); - name = "Italiano"; locale = Locale.ITALIAN; dictionaryFile = "it-utf8.csv"; - icon = R.drawable.ime_lang_it; isPunctuationPartOfWords = false; diff --git a/src/io/github/sspanak/tt9/languages/definitions/Norwegian.java b/src/io/github/sspanak/tt9/languages/definitions/Norwegian.java index 75ad1bbd..fbf83fa9 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/Norwegian.java +++ b/src/io/github/sspanak/tt9/languages/definitions/Norwegian.java @@ -3,16 +3,12 @@ package io.github.sspanak.tt9.languages.definitions; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; - public class Norwegian extends English { public Norwegian() { super(); - name = "Norsk bokmål"; locale = new Locale("nb","NO"); dictionaryFile = "nb-utf8.csv"; - icon = R.drawable.ime_lang_nb; isPunctuationPartOfWords = false; diff --git a/src/io/github/sspanak/tt9/languages/definitions/Russian.java b/src/io/github/sspanak/tt9/languages/definitions/Russian.java index 0a848f95..5c0745f5 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/Russian.java +++ b/src/io/github/sspanak/tt9/languages/definitions/Russian.java @@ -4,18 +4,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; -import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Characters; +import io.github.sspanak.tt9.languages.Language; public class Russian extends Language { public Russian() { - name = "Русский"; locale = new Locale("ru","RU"); dictionaryFile = "ru-utf8.csv"; - icon = R.drawable.ime_lang_ru; - abcLowerCaseIcon = R.drawable.ime_lang_cyrillic_lower; - abcUpperCaseIcon = R.drawable.ime_lang_cyrillic_upper; isPunctuationPartOfWords = false; diff --git a/src/io/github/sspanak/tt9/languages/definitions/Spanish.java b/src/io/github/sspanak/tt9/languages/definitions/Spanish.java index b44631ba..309cdd76 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/Spanish.java +++ b/src/io/github/sspanak/tt9/languages/definitions/Spanish.java @@ -5,17 +5,14 @@ import java.util.Arrays; import java.util.Collections; import java.util.Locale; -import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.languages.Characters; public class Spanish extends English { public Spanish() { super(); - name = "Español"; locale = new Locale("es", "ES"); dictionaryFile = "es-utf8.csv"; - icon = R.drawable.ime_lang_es; isPunctuationPartOfWords = false; diff --git a/src/io/github/sspanak/tt9/languages/definitions/Swedish.java b/src/io/github/sspanak/tt9/languages/definitions/Swedish.java index 4bb64299..15f5d44c 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/Swedish.java +++ b/src/io/github/sspanak/tt9/languages/definitions/Swedish.java @@ -3,21 +3,17 @@ package io.github.sspanak.tt9.languages.definitions; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; - public class Swedish extends English { public Swedish() { super(); - name = "Svenska"; locale = new Locale("sv","SE"); dictionaryFile = "sv-utf8.csv"; - icon = R.drawable.ime_lang_sv; isPunctuationPartOfWords = false; characterMap.get(2).addAll(Arrays.asList("å", "ä")); - characterMap.get(3).addAll(Arrays.asList("é")); - characterMap.get(6).addAll(Arrays.asList("ö")); + characterMap.get(3).add("é"); + characterMap.get(6).add("ö"); } } diff --git a/src/io/github/sspanak/tt9/languages/definitions/Ukrainian.java b/src/io/github/sspanak/tt9/languages/definitions/Ukrainian.java index d24aca95..7512c16e 100644 --- a/src/io/github/sspanak/tt9/languages/definitions/Ukrainian.java +++ b/src/io/github/sspanak/tt9/languages/definitions/Ukrainian.java @@ -4,18 +4,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; -import io.github.sspanak.tt9.R; -import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Characters; +import io.github.sspanak.tt9.languages.Language; public class Ukrainian extends Language { public Ukrainian() { - name = "Українська"; locale = new Locale("uk","UA"); dictionaryFile = "uk-utf8.csv"; - icon = R.drawable.ime_lang_uk; - abcLowerCaseIcon = R.drawable.ime_lang_cyrillic_lower; - abcUpperCaseIcon = R.drawable.ime_lang_cyrillic_upper; isPunctuationPartOfWords = true; diff --git a/src/io/github/sspanak/tt9/ui/UI.java b/src/io/github/sspanak/tt9/ui/UI.java index f56ee5ca..e1ddeeb3 100644 --- a/src/io/github/sspanak/tt9/ui/UI.java +++ b/src/io/github/sspanak/tt9/ui/UI.java @@ -31,33 +31,6 @@ public class UI { tt9.startActivity(prefIntent); } - - /** - * updateStatusIcon - * Set the status icon that is appropriate in current mode (based on - * openwmm-legacy) - */ - public static void updateStatusIcon(TraditionalT9 tt9, Language inputLanguage, InputMode inputMode) { - if (inputMode.isABC()) { - tt9.showStatusIcon(inputLanguage.getAbcIcon(inputMode.getTextCase() == InputMode.CASE_LOWER)); - } else if (inputMode.isPredictive()) { - tt9.showStatusIcon(inputLanguage.getIcon()); - } else if (inputMode.is123()) { - tt9.showStatusIcon(R.drawable.ime_number); - } else { - Logger.w("tt9.UI", "Unknown inputMode mode: " + inputMode + ". Hiding status icon."); - tt9.hideStatusIcon(); - } - } - - public static void toastInputMode(Context context, SettingsStore settings, Language newLanguage, InputMode mode) { - if (mode.isABC() && settings.getNotifyNextLanguageInModeAbc()) { - String toastMessage = newLanguage.getName(); - toastMessage += mode.getTextCase() == InputMode.CASE_LOWER ? " (abc)" : " (ABC)"; - toast(context, toastMessage); - } - } - public static void toast(Context context, CharSequence msg) { Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } diff --git a/src/io/github/sspanak/tt9/ui/bottom/StatusBar.java b/src/io/github/sspanak/tt9/ui/bottom/StatusBar.java new file mode 100644 index 00000000..cab2ad9a --- /dev/null +++ b/src/io/github/sspanak/tt9/ui/bottom/StatusBar.java @@ -0,0 +1,60 @@ +package io.github.sspanak.tt9.ui.bottom; + +import android.content.Context; +import android.view.View; +import android.widget.TextView; + +import androidx.core.content.ContextCompat; + +import io.github.sspanak.tt9.Logger; +import io.github.sspanak.tt9.R; + +public class StatusBar { + private final TextView statusView; + private String statusText; + + + public StatusBar(View mainView) { + statusView = mainView.findViewById(R.id.status_bar); + } + + + public StatusBar setText(String text) { + statusText = "[ " + text + " ]"; + this.render(); + + return this; + } + + public StatusBar setDarkTheme(boolean darkTheme) { + if (statusView == null) { + Logger.w("StatusBar.setDarkTheme", "Not changing the theme of a NULL View."); + return this; + } + + Context context = statusView.getContext(); + + int backgroundColor = ContextCompat.getColor( + context, + darkTheme ? R.color.dark_candidate_background : R.color.candidate_background + ); + int color = ContextCompat.getColor( + context, + darkTheme ? R.color.dark_candidate_color : R.color.candidate_color + ); + + statusView.setBackgroundColor(backgroundColor); + statusView.setTextColor(color); + this.render(); + + return this; + } + + private void render() { + if (statusText == null) { + Logger.w("StatusBar.render", "Not displaying status of NULL mode"); + } + + statusView.setText(statusText); + } +} diff --git a/src/io/github/sspanak/tt9/ui/SuggestionsAdapter.java b/src/io/github/sspanak/tt9/ui/bottom/SuggestionsAdapter.java similarity index 97% rename from src/io/github/sspanak/tt9/ui/SuggestionsAdapter.java rename to src/io/github/sspanak/tt9/ui/bottom/SuggestionsAdapter.java index e97db26e..06095127 100644 --- a/src/io/github/sspanak/tt9/ui/SuggestionsAdapter.java +++ b/src/io/github/sspanak/tt9/ui/bottom/SuggestionsAdapter.java @@ -1,4 +1,4 @@ -package io.github.sspanak.tt9.ui; +package io.github.sspanak.tt9.ui.bottom; import android.content.Context; import android.graphics.Color; diff --git a/src/io/github/sspanak/tt9/ui/SuggestionsView.java b/src/io/github/sspanak/tt9/ui/bottom/SuggestionsBar.java similarity index 76% rename from src/io/github/sspanak/tt9/ui/SuggestionsView.java rename to src/io/github/sspanak/tt9/ui/bottom/SuggestionsBar.java index 4a45c1ea..011fd1cf 100644 --- a/src/io/github/sspanak/tt9/ui/SuggestionsView.java +++ b/src/io/github/sspanak/tt9/ui/bottom/SuggestionsBar.java @@ -1,7 +1,8 @@ -package io.github.sspanak.tt9.ui; +package io.github.sspanak.tt9.ui.bottom; import android.annotation.SuppressLint; import android.content.Context; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.view.View; @@ -17,21 +18,22 @@ import java.util.List; import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.preferences.SettingsStore; -public class SuggestionsView { +public class SuggestionsBar { private final List suggestions = new ArrayList<>(); protected int selectedIndex = 0; + private boolean isDarkThemeEnabled = false; private final RecyclerView mView; private final SettingsStore settings; private SuggestionsAdapter mSuggestionsAdapter; - public SuggestionsView(SettingsStore settings, View mainView) { + public SuggestionsBar(SettingsStore settings, View mainView) { super(); this.settings = settings; - mView = mainView.findViewById(R.id.main_suggestions_list); + mView = mainView.findViewById(R.id.suggestions_bar); mView.setLayoutManager(new LinearLayoutManager(mainView.getContext(), RecyclerView.HORIZONTAL,false)); initDataAdapter(mainView.getContext()); @@ -108,6 +110,8 @@ public class SuggestionsView { @SuppressLint("NotifyDataSetChanged") public void setSuggestions(List newSuggestions, int initialSel) { + ecoSetBackground(newSuggestions); + suggestions.clear(); selectedIndex = 0; @@ -159,14 +163,54 @@ public class SuggestionsView { * https://stackoverflow.com/questions/72382886/system-applies-night-mode-to-views-added-in-service-type-application-overlay */ public void setDarkTheme(boolean darkEnabled) { + isDarkThemeEnabled = darkEnabled; Context context = mView.getContext(); - int backgroundColor = darkEnabled ? R.color.dark_candidate_background : R.color.candidate_background; int defaultColor = darkEnabled ? R.color.dark_candidate_color : R.color.candidate_color; int highlightColor = darkEnabled ? R.color.dark_candidate_selected : R.color.candidate_selected; - mView.setBackgroundColor(ContextCompat.getColor(context, backgroundColor)); mSuggestionsAdapter.setColorDefault(ContextCompat.getColor(context, defaultColor)); mSuggestionsAdapter.setColorHighlight(ContextCompat.getColor(context, highlightColor)); + + setBackground(suggestions); + } + + + /** + * setBackground + * Makes the background transparent, when there are no suggestions and theme-colored, + * when there are suggestions. + */ + private void setBackground(List newSuggestions) { + int newSuggestionsSize = newSuggestions != null ? newSuggestions.size() : 0; + if (newSuggestionsSize == 0) { + mView.setBackgroundColor(Color.TRANSPARENT); + return; + } + + int color = ContextCompat.getColor( + mView.getContext(), + isDarkThemeEnabled ? R.color.dark_candidate_background : R.color.candidate_background + ); + + mView.setBackgroundColor(color); + } + + + /** + * ecoSetBackground + * A performance-optimized version of "setBackground(). + * Determines if the suggestions have changed and only then it changes the background. + */ + private void ecoSetBackground(List newSuggestions) { + int newSuggestionsSize = newSuggestions != null ? newSuggestions.size() : 0; + if ( + (newSuggestionsSize == 0 && suggestions.size() == 0) + || (newSuggestionsSize > 0 && suggestions.size() > 0) + ) { + return; + } + + setBackground(newSuggestions); } }