1
0
Fork 0

Settings Reorganization

All categories are now on separate screens

Added a 'Clear Unselected' dictionary option

The 'auto space' setting is now on by default

Reorganized the emoji and added 4 new ones
This commit is contained in:
Dimo Karaivanov 2023-02-20 12:51:42 +02:00
parent d7ead4ba06
commit 1178357b4a
27 changed files with 378 additions and 233 deletions

View file

@ -56,7 +56,6 @@ def getVersionName = { ->
// minor version // minor version
String commitsSinceLastTag = "0" String commitsSinceLastTag = "0"
if (versionTagsCount > 1) { if (versionTagsCount > 1) {
println "VERSION TAG: " + versionTagsCount
String lastVersionTag = execThing('git describe --match v[0-9]* --tags --abbrev=0') String lastVersionTag = execThing('git describe --match v[0-9]* --tags --abbrev=0')
String gitLogResult = execThing("git log $lastVersionTag..HEAD --oneline") String gitLogResult = execThing("git log $lastVersionTag..HEAD --oneline")
commitsSinceLastTag = gitLogResult == '' ? "0" : gitLogResult.split('\n').size() commitsSinceLastTag = gitLogResult == '' ? "0" : gitLogResult.split('\n').size()

View file

@ -20,13 +20,23 @@ With the default settings, it is only possible to type in 123 and ABC modes. In
_If you don't do the above, there will be no suggestions when typing in Predictive mode._ _If you don't do the above, there will be no suggestions when typing in Predictive mode._
#### Dictionary Tips ### Dictionary Tips
Once a dictionary is loaded, it will stay there until you use the Clear option. This means you can enable and disable languages without reloading their dictionaries every time. Just do it once, only the first time.
#### Loading a Dictionary
Once a dictionary is loaded, it will stay there until you use one of the "clear" options. This means you can enable and disable languages without reloading their dictionaries every time. Just do it once, only the first time.
It also means that if you need to start using language X, you can safely disable all other languages, load only dictionary X (and save time!), then re-enable all languages you used before. It also means that if you need to start using language X, you can safely disable all other languages, load only dictionary X (and save time!), then re-enable all languages you used before.
Have in mind reloading a dictionary will reset the suggestion popularity to the factory defaults _(your custom added words will not be affected)_. However, there should be nothing to worry about. For the most part, you will see little to no difference in the suggestion order, unless you oftenly use uncommon words. Have in mind reloading a dictionary will reset the suggestion popularity to the factory defaults _(your custom added words will not be affected)_. However, there should be nothing to worry about. For the most part, you will see little to no difference in the suggestion order, unless you oftenly use uncommon words.
#### Clearing a Dictionary
If you have stopped using languages X or Y, you could disable them and also use "Clear Unselected", to delete their dictionaries and free some memory.
To delete everything, regardless of the selection, use "Clear All".
In all cases, clearing a dictionary deletes both all factory and all custom added words.
## Hotkeys ## Hotkeys
#### D-pad Up (↑): #### D-pad Up (↑):
@ -117,4 +127,3 @@ On the Settings screen, you can choose languages for typing, configure the keypa
- Select "Traditional T9". - Select "Traditional T9".
_The actual menu names may vary depending on your phone, Android version and language._ _The actual menu names may vary depending on your phone, Android version and language._

View file

@ -13,9 +13,8 @@
<string name="pref_help">Помощ</string> <string name="pref_help">Помощ</string>
<string name="pref_dark_theme">Тъмен облик</string> <string name="pref_dark_theme">Тъмен облик</string>
<string name="pref_choose_languages">Езици</string> <string name="pref_choose_languages">Езици</string>
<string name="dictionary_truncate_title">Изтрий речник</string> <string name="dictionary_truncate_title">Изтрий всички</string>
<string name="pref_category_dictionaries">Речници</string>
<string name="dictionary_cancel_load">Отмени зареждането</string> <string name="dictionary_cancel_load">Отмени зареждането</string>
<string name="dictionary_load_bad_char">Неуспешно зареждане. Невалидна дума „%1$s“ на ред %2$d за език „%3$s“.</string> <string name="dictionary_load_bad_char">Неуспешно зареждане. Невалидна дума „%1$s“ на ред %2$d за език „%3$s“.</string>
<string name="dictionary_load_error">Несупешно зареждане на речник за език „%1$s“ (%2$s).</string> <string name="dictionary_load_error">Несупешно зареждане на речник за език „%1$s“ (%2$s).</string>
@ -52,4 +51,5 @@
<string name="add_word_field_placeholder">Напишете дума…</string> <string name="add_word_field_placeholder">Напишете дума…</string>
<string name="pref_upside_down_keys">Бутони в обратен ред</string> <string name="pref_upside_down_keys">Бутони в обратен ред</string>
<string name="pref_upside_down_keys_summary">Включете настройката, ако на първият ред са 789, вместо 123.</string> <string name="pref_upside_down_keys_summary">Включете настройката, ако на първият ред са 789, вместо 123.</string>
<string name="dictionary_truncate_unselected">Изтрий неизбраните</string>
</resources> </resources>

View file

@ -12,9 +12,7 @@
<string name="pref_help">Hilfe</string> <string name="pref_help">Hilfe</string>
<string name="pref_dark_theme">Dunkles Thema</string> <string name="pref_dark_theme">Dunkles Thema</string>
<string name="pref_choose_languages">Sprachen</string> <string name="pref_choose_languages">Sprachen</string>
<string name="dictionary_truncate_title">Wörterbuch löschen</string>
<string name="pref_category_dictionaries">Wörterbücher</string>
<string name="dictionary_loading">Lade Wörterbuch (%1$s)…</string> <string name="dictionary_loading">Lade Wörterbuch (%1$s)…</string>
<string name="dictionary_load_title">Wörterbuch laden</string> <string name="dictionary_load_title">Wörterbuch laden</string>
<string name="dictionary_not_found">Wird nicht geladen. Wörterbuch für \"%1$s\" nicht gefunden.</string> <string name="dictionary_not_found">Wird nicht geladen. Wörterbuch für \"%1$s\" nicht gefunden.</string>

View file

@ -9,7 +9,6 @@
<string name="add_word_exist">La palabra \"%1$s\" ya esta en el diccionario.</string> <string name="add_word_exist">La palabra \"%1$s\" ya esta en el diccionario.</string>
<string name="add_word_title">Agregar palabra</string> <string name="add_word_title">Agregar palabra</string>
<string name="pref_category_appearance">Apariencia</string> <string name="pref_category_appearance">Apariencia</string>
<string name="pref_category_dictionaries">Diccionarios</string>
<string name="pref_category_function_keys">Teclas de acceso rápido</string> <string name="pref_category_function_keys">Teclas de acceso rápido</string>
<string name="pref_category_predictive_mode">Texto predictivo</string> <string name="pref_category_predictive_mode">Texto predictivo</string>
<string name="pref_category_keypad">Teclado</string> <string name="pref_category_keypad">Teclado</string>
@ -21,7 +20,6 @@
<string name="dictionary_loading_indeterminate">Cargando diccionario</string> <string name="dictionary_loading_indeterminate">Cargando diccionario</string>
<string name="dictionary_loading">Cargando diccionario (%1$s)…</string> <string name="dictionary_loading">Cargando diccionario (%1$s)…</string>
<string name="pref_category_about">Sobre esta aplicación</string> <string name="pref_category_about">Sobre esta aplicación</string>
<string name="dictionary_truncate_title">Eliminar el diccionario</string>
<string name="dictionary_truncated">Diccionario eliminado con éxito.</string> <string name="dictionary_truncated">Diccionario eliminado con éxito.</string>
<string name="dictionary_cancel_load">Cancelar la carga</string> <string name="dictionary_cancel_load">Cancelar la carga</string>
<string name="pref_auto_text_case">Mayúsculas automáticas</string> <string name="pref_auto_text_case">Mayúsculas automáticas</string>

View file

@ -14,9 +14,8 @@
<string name="pref_help">Aide</string> <string name="pref_help">Aide</string>
<string name="pref_dark_theme">Thème sombre</string> <string name="pref_dark_theme">Thème sombre</string>
<string name="pref_choose_languages">Langues</string> <string name="pref_choose_languages">Langues</string>
<string name="dictionary_truncate_title">Vider le dictionaire</string> <string name="dictionary_truncate_title">Vider tous</string>
<string name="pref_category_dictionaries">Dictionnaires</string>
<string name="dictionary_cancel_load">Annuler le chargement</string> <string name="dictionary_cancel_load">Annuler le chargement</string>
<string name="dictionary_load_error">Echec du chargement de dictionnaire pour langue «%1$s» (%2$s).</string> <string name="dictionary_load_error">Echec du chargement de dictionnaire pour langue «%1$s» (%2$s).</string>
<string name="dictionary_loaded">Chargement du dictionnaire terminé.</string> <string name="dictionary_loaded">Chargement du dictionnaire terminé.</string>
@ -43,4 +42,5 @@
<string name="add_word_field_placeholder">Tapez un mot…</string> <string name="add_word_field_placeholder">Tapez un mot…</string>
<string name="pref_upside_down_keys">Inverser l\'ordre des clés</string> <string name="pref_upside_down_keys">Inverser l\'ordre des clés</string>
<string name="pref_upside_down_keys_summary">Activez le paramètre s\'il y a 789 sur le premier rang, au lieu de 123.</string> <string name="pref_upside_down_keys_summary">Activez le paramètre s\'il y a 789 sur le premier rang, au lieu de 123.</string>
<string name="dictionary_truncate_unselected">Vider les non sélectionnés</string>
</resources> </resources>

View file

@ -13,9 +13,7 @@
<string name="pref_help">Aiuto</string> <string name="pref_help">Aiuto</string>
<string name="pref_dark_theme">Tema scuro</string> <string name="pref_dark_theme">Tema scuro</string>
<string name="pref_choose_languages">Lingue</string> <string name="pref_choose_languages">Lingue</string>
<string name="dictionary_truncate_title">Eliminare il dizionario</string>
<string name="pref_category_dictionaries">Dizionari</string>
<string name="dictionary_cancel_load">Annullare il caricamento</string> <string name="dictionary_cancel_load">Annullare il caricamento</string>
<string name="dictionary_loaded">Caricamento del dizionario terminato.</string> <string name="dictionary_loaded">Caricamento del dizionario terminato.</string>
<string name="dictionary_loading">Caricamento del dizionario (%1$s)…</string> <string name="dictionary_loading">Caricamento del dizionario (%1$s)…</string>

View file

@ -11,8 +11,6 @@
<string name="pref_help">Helpen</string> <string name="pref_help">Helpen</string>
<string name="pref_dark_theme">Donker thema</string> <string name="pref_dark_theme">Donker thema</string>
<string name="pref_choose_languages">Talen</string> <string name="pref_choose_languages">Talen</string>
<string name="dictionary_truncate_title">Woordenboek wissen</string>
<string name="pref_category_dictionaries">Woordenboeken</string>
<string name="dictionary_loading">Woordenboek laden (%1$s)…</string> <string name="dictionary_loading">Woordenboek laden (%1$s)…</string>
<string name="dictionary_load_title">Woordenboek laden</string> <string name="dictionary_load_title">Woordenboek laden</string>
<string name="dictionary_not_found">Laden mislukt. Woordenboek voor %1$s niet gevonden.</string> <string name="dictionary_not_found">Laden mislukt. Woordenboek voor %1$s niet gevonden.</string>

View file

@ -13,9 +13,8 @@
<string name="pref_help">Помощь</string> <string name="pref_help">Помощь</string>
<string name="pref_dark_theme">Темная тема</string> <string name="pref_dark_theme">Темная тема</string>
<string name="pref_choose_languages">Языки</string> <string name="pref_choose_languages">Языки</string>
<string name="dictionary_truncate_title">Очистить словарь</string> <string name="dictionary_truncate_title">Очистить все</string>
<string name="pref_category_dictionaries">Словари</string>
<string name="dictionary_cancel_load">Отменить загрузку</string> <string name="dictionary_cancel_load">Отменить загрузку</string>
<string name="dictionary_load_error">Ошибка загрузки словаря для языка «%1$s» (%2$s).</string> <string name="dictionary_load_error">Ошибка загрузки словаря для языка «%1$s» (%2$s).</string>
<string name="dictionary_loaded">Загрузка словаря завершена.</string> <string name="dictionary_loaded">Загрузка словаря завершена.</string>
@ -52,4 +51,5 @@
<string name="add_word_field_placeholder">Введите слово…</string> <string name="add_word_field_placeholder">Введите слово…</string>
<string name="pref_upside_down_keys">Перевернутая клавиатура</string> <string name="pref_upside_down_keys">Перевернутая клавиатура</string>
<string name="pref_upside_down_keys_summary">Используйте настройку, если в первом ряду 789 вместо 123.</string> <string name="pref_upside_down_keys_summary">Используйте настройку, если в первом ряду 789 вместо 123.</string>
<string name="dictionary_truncate_unselected">Очистить невыбранные</string>
</resources> </resources>

View file

@ -13,9 +13,8 @@
<string name="pref_help">Допомога</string> <string name="pref_help">Допомога</string>
<string name="pref_dark_theme">Темна тема</string> <string name="pref_dark_theme">Темна тема</string>
<string name="pref_choose_languages">Мови</string> <string name="pref_choose_languages">Мови</string>
<string name="dictionary_truncate_title">Очистити словник</string> <string name="dictionary_truncate_title">Очистіть усі</string>
<string name="pref_category_dictionaries">Словники</string>
<string name="dictionary_cancel_load">Скасувати завантаження</string> <string name="dictionary_cancel_load">Скасувати завантаження</string>
<string name="dictionary_load_error">Помилка завантаження словника для мови «%1$s» (%2$s).</string> <string name="dictionary_load_error">Помилка завантаження словника для мови «%1$s» (%2$s).</string>
<string name="dictionary_loaded">Завантаження словника завершено.</string> <string name="dictionary_loaded">Завантаження словника завершено.</string>
@ -52,4 +51,5 @@
<string name="add_word_field_placeholder">Введіть слово…</string> <string name="add_word_field_placeholder">Введіть слово…</string>
<string name="pref_upside_down_keys">Зворотна клавіатура</string> <string name="pref_upside_down_keys">Зворотна клавіатура</string>
<string name="pref_upside_down_keys_summary">Використовуйте налаштування, якщо 789 у першому рядку замість 123.</string> <string name="pref_upside_down_keys_summary">Використовуйте налаштування, якщо 789 у першому рядку замість 123.</string>
<string name="dictionary_truncate_unselected">Очистіть невибрані</string>
</resources> </resources>

View file

@ -15,7 +15,6 @@
<string name="pref_category_about">About</string> <string name="pref_category_about">About</string>
<string name="pref_category_appearance">Appearance</string> <string name="pref_category_appearance">Appearance</string>
<string name="pref_category_dictionaries">Dictionaries</string>
<string name="pref_category_predictive_mode">Predictive Mode</string> <string name="pref_category_predictive_mode">Predictive Mode</string>
<string name="pref_category_function_keys">Select Hotkeys</string> <string name="pref_category_function_keys">Select Hotkeys</string>
<string name="pref_category_keypad">Keypad</string> <string name="pref_category_keypad">Keypad</string>
@ -39,10 +38,11 @@
<string name="dictionary_loaded">Dictionary load completed.</string> <string name="dictionary_loaded">Dictionary load completed.</string>
<string name="dictionary_loading">Loading dictionary (%1$s)…</string> <string name="dictionary_loading">Loading dictionary (%1$s)…</string>
<string name="dictionary_loading_indeterminate">Loading dictionary</string> <string name="dictionary_loading_indeterminate">Loading dictionary</string>
<string name="dictionary_load_title">Load dictionary</string> <string name="dictionary_load_title">Load Dictionary</string>
<string name="dictionary_missing_go_load_it">No dictionary for language \"%1$s\". Go to Settings to load it.</string> <string name="dictionary_missing_go_load_it">No dictionary for language \"%1$s\". Go to Settings to load it.</string>
<string name="dictionary_not_found">Loading failed. Dictionary for \"%1$s\" not found.</string> <string name="dictionary_not_found">Loading failed. Dictionary for \"%1$s\" not found.</string>
<string name="dictionary_truncate_title">Clear dictionary</string> <string name="dictionary_truncate_title">Clear All</string>
<string name="dictionary_truncate_unselected">Clear Unselected</string>
<string name="dictionary_truncated">Dictionary successfully cleared.</string> <string name="dictionary_truncated">Dictionary successfully cleared.</string>
<string name="function_add_word_key">Add Word key</string> <string name="function_add_word_key">Add Word key</string>

View file

@ -4,7 +4,6 @@
app:layout="@layout/pref_text" app:layout="@layout/pref_text"
app:orderingFromXml="true"> app:orderingFromXml="true">
<Preference <Preference
app:key="help" app:key="help"
app:layout="@layout/pref_text" app:layout="@layout/pref_text"
@ -15,103 +14,34 @@
android:data="@string/help_url" /> android:data="@string/help_url" />
</Preference> </Preference>
<Preference
app:fragment="io.github.sspanak.tt9.preferences.AppearanceScreen"
app:key="screen_appearance"
app:layout="@layout/pref_text"
app:title="@string/pref_category_appearance" />
<PreferenceCategory <Preference
android:title="@string/pref_category_appearance" app:fragment="io.github.sspanak.tt9.preferences.DictionariesScreen"
app:layout="@layout/pref_category" app:key="screen_dictionaries"
app:singleLineTitle="true"> app:layout="@layout/pref_text"
app:title="@string/pref_choose_languages" />
<SwitchPreferenceCompat <Preference
app:defaultValue="true" app:fragment="io.github.sspanak.tt9.preferences.KeyPadScreen"
app:key="pref_dark_theme" app:key="screen_keypad"
app:layout="@layout/pref_switch" app:layout="@layout/pref_text"
app:title="@string/pref_dark_theme" /> app:title="@string/pref_category_keypad" />
<SwitchPreferenceCompat
app:defaultValue="true"
app:key="pref_show_soft_keys"
app:layout="@layout/pref_switch"
app:title="@string/pref_show_soft_function_keys" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/pref_category_dictionaries"
app:layout="@layout/pref_category"
app:singleLineTitle="true">
<MultiSelectListPreference
app:key="pref_languages"
app:layout="@layout/pref_text"
app:title="@string/pref_choose_languages" />
<Preference
app:key="dictionary_load"
app:layout="@layout/pref_text"
app:title="@string/dictionary_load_title" />
<Preference
app:key="dictionary_truncate"
app:layout="@layout/pref_text"
app:title="@string/dictionary_truncate_title" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/pref_category_predictive_mode"
app:layout="@layout/pref_category"
app:singleLineTitle="true">
<SwitchPreferenceCompat
app:key="auto_space"
app:layout="@layout/pref_switch"
app:title="@string/pref_auto_space"
app:summary="@string/pref_auto_space_summary" />
<SwitchPreferenceCompat
app:defaultValue="true"
app:key="auto_text_case"
app:layout="@layout/pref_switch"
app:summary="@string/pref_auto_text_case_summary"
app:title="@string/pref_auto_text_case" />
<DropDownPreference
app:defaultValue=" "
app:iconSpaceReserved="false"
app:key="pref_double_zero_char"
app:layout="@layout/pref_dropdown"
app:title="@string/pref_double_zero_char" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/pref_category_keypad"
app:layout="@layout/pref_category">
<Preference
app:fragment="io.github.sspanak.tt9.preferences.PreferencesHotkeysFragment"
app:key="screen_hotkeys"
app:layout="@layout/pref_text"
app:title="@string/pref_category_function_keys" />
<SwitchPreferenceCompat
app:defaultValue="false"
app:key="pref_upside_down_keys"
app:layout="@layout/pref_switch"
app:summary="@string/pref_upside_down_keys_summary"
app:title="@string/pref_upside_down_keys" />
</PreferenceCategory>
<PreferenceCategory <PreferenceCategory
android:title="@string/pref_category_about" android:title="@string/pref_category_about"
app:layout="@layout/pref_category" app:layout="@layout/pref_category"
app:singleLineTitle="true"> app:singleLineTitle="true">
<Preference <Preference
app:key="version_info" app:key="version_info"
app:layout="@layout/pref_text" app:layout="@layout/pref_text"
app:title="@string/app_name" /> app:title="@string/app_name" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto" app:orderingFromXml="true">
<SwitchPreferenceCompat
app:defaultValue="true"
app:key="pref_dark_theme"
app:layout="@layout/pref_switch"
app:title="@string/pref_dark_theme" />
<SwitchPreferenceCompat
app:defaultValue="true"
app:key="pref_show_soft_keys"
app:layout="@layout/pref_switch"
app:title="@string/pref_show_soft_function_keys" />
</PreferenceScreen>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto" app:orderingFromXml="true">
<MultiSelectListPreference
app:key="pref_languages"
app:layout="@layout/pref_text"
app:title="@string/pref_choose_languages" />
<Preference
app:key="dictionary_load"
app:layout="@layout/pref_text"
app:title="@string/dictionary_load_title" />
<Preference
app:key="dictionary_truncate_unselected"
app:layout="@layout/pref_text"
app:title="@string/dictionary_truncate_unselected" />
<Preference
app:key="dictionary_truncate"
app:layout="@layout/pref_text"
app:title="@string/dictionary_truncate_title" />
</PreferenceScreen>

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:orderingFromXml="true">
<Preference
app:fragment="io.github.sspanak.tt9.preferences.HotkeysScreen"
app:key="screen_hotkeys"
app:layout="@layout/pref_text"
app:title="@string/pref_category_function_keys" />
<SwitchPreferenceCompat
app:defaultValue="false"
app:key="pref_upside_down_keys"
app:layout="@layout/pref_switch"
app:summary="@string/pref_upside_down_keys_summary"
app:title="@string/pref_upside_down_keys" />
<PreferenceCategory
android:title="@string/pref_category_predictive_mode"
app:layout="@layout/pref_category"
app:singleLineTitle="true">
<SwitchPreferenceCompat
app:defaultValue="true"
app:key="auto_space"
app:layout="@layout/pref_switch"
app:title="@string/pref_auto_space"
app:summary="@string/pref_auto_space_summary" />
<SwitchPreferenceCompat
app:defaultValue="true"
app:key="auto_text_case"
app:layout="@layout/pref_switch"
app:summary="@string/pref_auto_text_case_summary"
app:title="@string/pref_auto_text_case" />
<DropDownPreference
app:defaultValue="."
app:iconSpaceReserved="false"
app:key="pref_double_zero_char"
app:layout="@layout/pref_dropdown"
app:title="@string/pref_double_zero_char" />
</PreferenceCategory>
</PreferenceScreen>

View file

@ -106,11 +106,20 @@ public class DictionaryDb {
} }
public static void truncateWords(Handler handler) { public static void deleteWords(Handler handler) {
deleteWords(handler, null);
}
public static void deleteWords(Handler handler, ArrayList<Integer> languageIds) {
new Thread() { new Thread() {
@Override @Override
public void run() { public void run() {
getInstance().clearAllTables(); if (languageIds == null) {
getInstance().clearAllTables();
} else if (languageIds.size() > 0) {
getInstance().wordsDao().deleteByLanguage(languageIds);
}
handler.sendEmptyMessage(0); handler.sendEmptyMessage(0);
} }
}.start(); }.start();

View file

@ -5,6 +5,7 @@ import androidx.room.Insert;
import androidx.room.OnConflictStrategy; import androidx.room.OnConflictStrategy;
import androidx.room.Query; import androidx.room.Query;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Dao @Dao
@ -12,6 +13,9 @@ interface WordsDao {
@Query("SELECT COUNT(id) FROM words WHERE :langId < 0 OR lang = :langId") @Query("SELECT COUNT(id) FROM words WHERE :langId < 0 OR lang = :langId")
int count(int langId); int count(int langId);
@Query("DELETE FROM words WHERE LANG IN(:langIds)")
int deleteByLanguage(ArrayList<Integer> langIds);
@Query("SELECT COUNT(id) FROM words WHERE lang = :langId AND word = :word") @Query("SELECT COUNT(id) FROM words WHERE lang = :langId AND word = :word")
int doesWordExist(int langId, String word); int doesWordExist(int langId, String word);

View file

@ -20,17 +20,21 @@ public class Characters {
)); ));
final private static ArrayList<ArrayList<String>> Emoji = new ArrayList<>(Arrays.asList( final private static ArrayList<ArrayList<String>> Emoji = new ArrayList<>(Arrays.asList(
// smile -> frown // positive
new ArrayList<>(Arrays.asList( new ArrayList<>(Arrays.asList(
"🙂", "😀", "🤣", "😉", "😛", "😳", "😲", "😱", "😭", "😢", "🙁" "🙂", "😀", "🤣", "🤓", "😎", "😛", "😉"
)),
// negative
new ArrayList<>(Arrays.asList(
"🙁", "😢", "😭", "😱", "😲", "😳", "😐", "😠"
)), )),
// hands // hands
new ArrayList<>(Arrays.asList( new ArrayList<>(Arrays.asList(
"👍", "👋", "✌️", "👏", "🤝", "💪", "🤘", "🖖", "👎" "👍", "👋", "✌️", "👏", "🖖", "🤘", "🤝", "💪", "👎"
)), )),
// emotions // emotions
new ArrayList<>(Arrays.asList( new ArrayList<>(Arrays.asList(
"", "🤗", "😍", "😘", "😇", "😈", "🎉", "🤓", "😎", "🤔", "🥶", "😬" "", "🤗", "😍", "😘", "😇", "😈", "🍺", "🎉", "🥱", "🤔", "🥶", "😬"
)) ))
)); ));

View file

@ -7,14 +7,18 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.app.AppCompatDelegate;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceFragmentCompat;
import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.DictionaryDb; import io.github.sspanak.tt9.db.DictionaryDb;
import io.github.sspanak.tt9.db.DictionaryLoader; import io.github.sspanak.tt9.db.DictionaryLoader;
import io.github.sspanak.tt9.preferences.screens.MainSettingsScreen; import io.github.sspanak.tt9.preferences.screens.AppearanceScreen;
import io.github.sspanak.tt9.preferences.screens.DictionariesScreen;
import io.github.sspanak.tt9.preferences.screens.HotkeysScreen; import io.github.sspanak.tt9.preferences.screens.HotkeysScreen;
import io.github.sspanak.tt9.preferences.screens.KeyPadScreen;
import io.github.sspanak.tt9.preferences.screens.MainSettingsScreen;
import io.github.sspanak.tt9.ui.DictionaryLoadingBar; import io.github.sspanak.tt9.ui.DictionaryLoadingBar;
public class PreferencesActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { public class PreferencesActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
@ -31,39 +35,68 @@ public class PreferencesActivity extends AppCompatActivity implements Preference
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
validateFunctionKeys(); validateFunctionKeys();
buildScreen(); buildLayout();
} }
@Override @Override
public boolean onPreferenceStartFragment(@NonNull PreferenceFragmentCompat caller, @NonNull Preference pref) { public boolean onPreferenceStartFragment(@NonNull PreferenceFragmentCompat caller, @NonNull Preference pref) {
// instantiate the new Fragment Fragment fragment = getScreen((getScreenName(pref)));
Fragment fragment;
if (pref.getFragment() != null && pref.getFragment().contains("Hotkeys")) {
fragment = new HotkeysScreen(this);
} else {
fragment = new MainSettingsScreen(this);
}
fragment.setArguments(pref.getExtras()); fragment.setArguments(pref.getExtras());
displayScreen(fragment, true);
// replace the existing Fragment with the new Fragment
getSupportFragmentManager().beginTransaction()
.replace(R.id.preferences_container, fragment)
.addToBackStack(null)
.commit();
return true; return true;
} }
private void applyTheme() { /**
AppCompatDelegate.setDefaultNightMode( * getScreenName
settings.getDarkTheme() ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO * Determines the name of the screen for the given preference, as defined in the preference's "fragment" attribute.
); * Expected format: "current.package.name.screens.SomeNameScreen"
*/
private String getScreenName(@NonNull Preference pref) {
String screenClassName = pref.getFragment();
return screenClassName != null ? screenClassName.replaceFirst("^.+?([^.]+)Screen$", "$1") : "";
} }
private void buildScreen() { /**
* getScreen
* Finds a screen fragment by name. If there is no fragment with such name, the main screen
* fragment will be returned.
*/
private Fragment getScreen(String name) {
switch (name) {
case "Appearance":
return new AppearanceScreen(this);
case "Dictionaries":
return new DictionariesScreen(this);
case "Hotkeys":
return new HotkeysScreen(this);
case "KeyPad":
return new KeyPadScreen(this);
default:
return new MainSettingsScreen(this);
}
}
/**
* displayScreen
* Replaces the currently displayed screen fragment with a new one.
*/
private void displayScreen(Fragment screen, boolean addToBackStack) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.preferences_container, screen);
if (addToBackStack) {
transaction.addToBackStack(screen.getClass().getSimpleName());
}
transaction.commit();
}
private void buildLayout() {
ActionBar actionBar = getSupportActionBar(); ActionBar actionBar = getSupportActionBar();
if (actionBar != null) { if (actionBar != null) {
actionBar.setDisplayShowHomeEnabled(true); actionBar.setDisplayShowHomeEnabled(true);
@ -71,10 +104,7 @@ public class PreferencesActivity extends AppCompatActivity implements Preference
} }
setContentView(R.layout.preferences_container); setContentView(R.layout.preferences_container);
getSupportFragmentManager() displayScreen(new MainSettingsScreen(this), false);
.beginTransaction()
.replace(R.id.preferences_container, new MainSettingsScreen(this))
.commit();
} }
@ -87,6 +117,13 @@ public class PreferencesActivity extends AppCompatActivity implements Preference
} }
private void applyTheme() {
AppCompatDelegate.setDefaultNightMode(
settings.getDarkTheme() ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO
);
}
private void validateFunctionKeys() { private void validateFunctionKeys() {
if (!settings.areFunctionKeysSet()) { if (!settings.areFunctionKeysSet()) {
settings.setDefaultKeys(); settings.setDefaultKeys();

View file

@ -207,7 +207,7 @@ public class SettingsStore {
/************* typing settings *************/ /************* typing settings *************/
public boolean getAutoSpace() { return prefs.getBoolean("auto_space", false); } public boolean getAutoSpace() { return prefs.getBoolean("auto_space", true); }
public boolean getAutoTextCase() { return prefs.getBoolean("auto_text_case", true); } public boolean getAutoTextCase() { return prefs.getBoolean("auto_text_case", true); }
public String getDoubleZeroChar() { public String getDoubleZeroChar() {
String character = prefs.getString("pref_double_zero_char", "."); String character = prefs.getString("pref_double_zero_char", ".");

View file

@ -13,7 +13,7 @@ import io.github.sspanak.tt9.db.DictionaryLoader;
import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.ui.UI;
public class ItemTruncateDictionary extends ItemClickable { public class ItemTruncateAll extends ItemClickable {
public static final String NAME = "dictionary_truncate"; public static final String NAME = "dictionary_truncate";
private final Context context; private final Context context;
@ -21,7 +21,7 @@ public class ItemTruncateDictionary extends ItemClickable {
private final ItemLoadDictionary loadItem; private final ItemLoadDictionary loadItem;
public ItemTruncateDictionary(Preference item, ItemLoadDictionary loadItem, Context context, DictionaryLoader loader) { public ItemTruncateAll(Preference item, ItemLoadDictionary loadItem, Context context, DictionaryLoader loader) {
super(item); super(item);
this.context = context; this.context = context;
this.loadItem = loadItem; this.loadItem = loadItem;
@ -42,7 +42,7 @@ public class ItemTruncateDictionary extends ItemClickable {
loadItem.changeToLoadButton(); loadItem.changeToLoadButton();
} }
DictionaryDb.truncateWords(onDictionaryTruncated); DictionaryDb.deleteWords(onDictionaryTruncated);
return true; return true;
} }

View file

@ -0,0 +1,64 @@
package io.github.sspanak.tt9.preferences.items;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import androidx.preference.Preference;
import java.util.ArrayList;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.DictionaryDb;
import io.github.sspanak.tt9.db.DictionaryLoader;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection;
import io.github.sspanak.tt9.preferences.SettingsStore;
import io.github.sspanak.tt9.ui.UI;
public class ItemTruncateUnselected extends ItemClickable {
public static final String NAME = "dictionary_truncate_unselected";
private final Context context;
private final DictionaryLoader loader;
private final ItemLoadDictionary loadItem;
private final SettingsStore settings;
public ItemTruncateUnselected(Preference item, ItemLoadDictionary loadItem, Context context, SettingsStore settings, DictionaryLoader loader) {
super(item);
this.context = context;
this.loadItem = loadItem;
this.settings = settings;
this.loader = loader;
}
private final Handler onDictionaryTruncated = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
UI.toast(context, R.string.dictionary_truncated);
}
};
@Override
protected boolean onClick(Preference p) {
if (loader != null && loader.isRunning()) {
loader.stop();
loadItem.changeToLoadButton();
}
ArrayList<Integer> unselectedLanguageIds = new ArrayList<>();
ArrayList<Integer> selectedLanguageIds = settings.getEnabledLanguageIds();
for (Language lang : LanguageCollection.getAll(false)) {
if (!selectedLanguageIds.contains(lang.getId())) {
unselectedLanguageIds.add(lang.getId());
}
}
DictionaryDb.deleteWords(onDictionaryTruncated, unselectedLanguageIds);
return true;
}
}

View file

@ -0,0 +1,18 @@
package io.github.sspanak.tt9.preferences.screens;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.items.ItemToggleDarkTheme;
public class AppearanceScreen extends BaseScreenFragment {
public AppearanceScreen() { init(); }
public AppearanceScreen(PreferencesActivity activity) { init(activity); }
@Override protected int getTitle() { return R.string.pref_category_appearance; }
@Override protected int getXml() { return R.xml.prefs_screen_appearance; }
@Override
protected void onCreate() {
(new ItemToggleDarkTheme(findPreference(ItemToggleDarkTheme.NAME))).enableToggleHandler();
}
}

View file

@ -0,0 +1,51 @@
package io.github.sspanak.tt9.preferences.screens;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.items.ItemLoadDictionary;
import io.github.sspanak.tt9.preferences.items.ItemSelectLanguage;
import io.github.sspanak.tt9.preferences.items.ItemTruncateAll;
import io.github.sspanak.tt9.preferences.items.ItemTruncateUnselected;
public class DictionariesScreen extends BaseScreenFragment {
public DictionariesScreen() { init(); }
public DictionariesScreen(PreferencesActivity activity) { init(activity); }
@Override protected int getTitle() { return R.string.pref_choose_languages; }
@Override protected int getXml() { return R.xml.prefs_screen_dictionaries; }
@Override
protected void onCreate() {
ItemSelectLanguage multiSelect = new ItemSelectLanguage(
findPreference(ItemSelectLanguage.NAME),
activity.settings
);
multiSelect.populate().enableValidation();
ItemLoadDictionary loadItem = new ItemLoadDictionary(
findPreference(ItemLoadDictionary.NAME),
activity,
activity.settings,
activity.getDictionaryLoader(),
activity.getDictionaryProgressBar()
);
loadItem.enableClickHandler();
ItemTruncateAll truncateItem = new ItemTruncateAll(
findPreference(ItemTruncateAll.NAME),
loadItem,
activity,
activity.getDictionaryLoader()
);
truncateItem.enableClickHandler();
ItemTruncateUnselected truncateSelectedItem = new ItemTruncateUnselected(
findPreference(ItemTruncateUnselected.NAME),
loadItem,
activity,
activity.settings,
activity.getDictionaryLoader()
);
truncateSelectedItem.enableClickHandler();
}
}

View file

@ -10,33 +10,14 @@ import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.items.SectionKeymap; import io.github.sspanak.tt9.preferences.items.SectionKeymap;
public class HotkeysScreen extends BaseScreenFragment { public class HotkeysScreen extends BaseScreenFragment {
public HotkeysScreen() { public HotkeysScreen() { init(); }
init(); public HotkeysScreen(PreferencesActivity activity) { init(activity); }
}
public HotkeysScreen(PreferencesActivity activity) { @Override protected int getTitle() { return R.string.pref_category_function_keys; }
init(activity); @Override protected int getXml() { return R.xml.prefs_screen_hotkeys; }
}
@Override
protected int getTitle() {
return R.string.pref_category_function_keys;
}
@Override
protected int getXml() {
return R.xml.prefs_screen_hotkeys;
}
@Override @Override
public void onCreate() { public void onCreate() {
createKeymapSection();
}
private void createKeymapSection() {
DropDownPreference[] dropDowns = { DropDownPreference[] dropDowns = {
findPreference(SectionKeymap.ITEM_ADD_WORD), findPreference(SectionKeymap.ITEM_ADD_WORD),
findPreference(SectionKeymap.ITEM_BACKSPACE), findPreference(SectionKeymap.ITEM_BACKSPACE),

View file

@ -0,0 +1,18 @@
package io.github.sspanak.tt9.preferences.screens;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.items.ItemSelectZeroKeyCharacter;
public class KeyPadScreen extends BaseScreenFragment {
public KeyPadScreen() { init(); }
public KeyPadScreen(PreferencesActivity activity) { init(activity); }
@Override protected int getTitle() { return R.string.pref_category_keypad; }
@Override protected int getXml() { return R.xml.prefs_screen_keypad; }
@Override
protected void onCreate() {
(new ItemSelectZeroKeyCharacter(findPreference(ItemSelectZeroKeyCharacter.NAME), activity)).populate().activate();
}
}

View file

@ -10,84 +10,25 @@ import java.util.regex.Pattern;
import io.github.sspanak.tt9.BuildConfig; import io.github.sspanak.tt9.BuildConfig;
import io.github.sspanak.tt9.Logger; import io.github.sspanak.tt9.Logger;
import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.preferences.items.ItemLoadDictionary;
import io.github.sspanak.tt9.preferences.items.ItemSelectLanguage;
import io.github.sspanak.tt9.preferences.items.ItemSelectZeroKeyCharacter;
import io.github.sspanak.tt9.preferences.items.ItemToggleDarkTheme;
import io.github.sspanak.tt9.preferences.items.ItemTruncateDictionary;
import io.github.sspanak.tt9.preferences.PreferencesActivity; import io.github.sspanak.tt9.preferences.PreferencesActivity;
public class MainSettingsScreen extends BaseScreenFragment { public class MainSettingsScreen extends BaseScreenFragment {
private final Pattern releaseVersionRegex = Pattern.compile("^\\d+\\.\\d+$"); private final Pattern releaseVersionRegex = Pattern.compile("^\\d+\\.\\d+$");
public MainSettingsScreen() { public MainSettingsScreen() { init(); }
init(); public MainSettingsScreen(PreferencesActivity activity) { init(activity); }
}
public MainSettingsScreen(PreferencesActivity activity) {
init(activity);
}
@Override
protected int getTitle() {
return R.string.app_settings;
}
@Override
protected int getXml() {
return R.xml.prefs;
}
@Override protected int getTitle() { return R.string.app_settings;}
@Override protected int getXml() { return R.xml.prefs; }
@Override @Override
public void onCreate() { public void onCreate() {
addHelpLink();
createAboutSection(); createAboutSection();
createAppearanceSection();
createDictionarySection();
createHelpSection();
createPredictiveModeSection();
} }
private void createDictionarySection() { private void addHelpLink() {
ItemSelectLanguage multiSelect = new ItemSelectLanguage(
findPreference(ItemSelectLanguage.NAME),
activity.settings
);
multiSelect.populate().enableValidation();
ItemLoadDictionary loadItem = new ItemLoadDictionary(
findPreference(ItemLoadDictionary.NAME),
activity,
activity.settings,
activity.getDictionaryLoader(),
activity.getDictionaryProgressBar()
);
loadItem.enableClickHandler();
ItemTruncateDictionary truncateItem = new ItemTruncateDictionary(
findPreference(ItemTruncateDictionary.NAME),
loadItem,
activity,
activity.getDictionaryLoader()
);
truncateItem.enableClickHandler();
}
private void createAppearanceSection() {
(new ItemToggleDarkTheme(findPreference(ItemToggleDarkTheme.NAME))).enableToggleHandler();
}
private void createPredictiveModeSection() {
(new ItemSelectZeroKeyCharacter(findPreference(ItemSelectZeroKeyCharacter.NAME), activity)).populate().activate();
}
private void createHelpSection() {
try { try {
if (!releaseVersionRegex.matcher(BuildConfig.VERSION_NAME).find()) { if (!releaseVersionRegex.matcher(BuildConfig.VERSION_NAME).find()) {
throw new Exception("VERSION_NAME does not match: \\d+.\\d+"); throw new Exception("VERSION_NAME does not match: \\d+.\\d+");