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:
parent
d7ead4ba06
commit
1178357b4a
27 changed files with 378 additions and 233 deletions
|
|
@ -56,7 +56,6 @@ def getVersionName = { ->
|
|||
// minor version
|
||||
String commitsSinceLastTag = "0"
|
||||
if (versionTagsCount > 1) {
|
||||
println "VERSION TAG: " + versionTagsCount
|
||||
String lastVersionTag = execThing('git describe --match v[0-9]* --tags --abbrev=0')
|
||||
String gitLogResult = execThing("git log $lastVersionTag..HEAD --oneline")
|
||||
commitsSinceLastTag = gitLogResult == '' ? "0" : gitLogResult.split('\n').size()
|
||||
|
|
|
|||
|
|
@ -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._
|
||||
|
||||
#### 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.
|
||||
### Dictionary Tips
|
||||
|
||||
#### 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.
|
||||
|
||||
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
|
||||
|
||||
#### D-pad Up (↑):
|
||||
|
|
@ -117,4 +127,3 @@ On the Settings screen, you can choose languages for typing, configure the keypa
|
|||
- Select "Traditional T9".
|
||||
|
||||
_The actual menu names may vary depending on your phone, Android version and language._
|
||||
|
||||
|
|
|
|||
|
|
@ -13,9 +13,8 @@
|
|||
<string name="pref_help">Помощ</string>
|
||||
<string name="pref_dark_theme">Тъмен облик</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_load_bad_char">Неуспешно зареждане. Невалидна дума „%1$s“ на ред %2$d за език „%3$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="pref_upside_down_keys">Бутони в обратен ред</string>
|
||||
<string name="pref_upside_down_keys_summary">Включете настройката, ако на първият ред са 7–8–9, вместо 1–2–3.</string>
|
||||
<string name="dictionary_truncate_unselected">Изтрий неизбраните</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -12,9 +12,7 @@
|
|||
<string name="pref_help">Hilfe</string>
|
||||
<string name="pref_dark_theme">Dunkles Thema</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_load_title">Wörterbuch laden</string>
|
||||
<string name="dictionary_not_found">Wird nicht geladen. Wörterbuch für \"%1$s\" nicht gefunden.</string>
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
<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="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_predictive_mode">Texto predictivo</string>
|
||||
<string name="pref_category_keypad">Teclado</string>
|
||||
|
|
@ -21,7 +20,6 @@
|
|||
<string name="dictionary_loading_indeterminate">Cargando diccionario</string>
|
||||
<string name="dictionary_loading">Cargando diccionario (%1$s)…</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_cancel_load">Cancelar la carga</string>
|
||||
<string name="pref_auto_text_case">Mayúsculas automáticas</string>
|
||||
|
|
|
|||
|
|
@ -14,9 +14,8 @@
|
|||
<string name="pref_help">Aide</string>
|
||||
<string name="pref_dark_theme">Thème sombre</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_load_error">Echec du chargement de dictionnaire pour langue «%1$s» (%2$s).</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="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 7–8–9 sur le premier rang, au lieu de 1–2–3.</string>
|
||||
<string name="dictionary_truncate_unselected">Vider les non sélectionnés</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -13,9 +13,7 @@
|
|||
<string name="pref_help">Aiuto</string>
|
||||
<string name="pref_dark_theme">Tema scuro</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_loaded">Caricamento del dizionario terminato.</string>
|
||||
<string name="dictionary_loading">Caricamento del dizionario (%1$s)…</string>
|
||||
|
|
|
|||
|
|
@ -11,8 +11,6 @@
|
|||
<string name="pref_help">Helpen</string>
|
||||
<string name="pref_dark_theme">Donker thema</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_load_title">Woordenboek laden</string>
|
||||
<string name="dictionary_not_found">Laden mislukt. Woordenboek voor %1$s niet gevonden.</string>
|
||||
|
|
|
|||
|
|
@ -13,9 +13,8 @@
|
|||
<string name="pref_help">Помощь</string>
|
||||
<string name="pref_dark_theme">Темная тема</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_load_error">Ошибка загрузки словаря для языка «%1$s» (%2$s).</string>
|
||||
<string name="dictionary_loaded">Загрузка словаря завершена.</string>
|
||||
|
|
@ -52,4 +51,5 @@
|
|||
<string name="add_word_field_placeholder">Введите слово…</string>
|
||||
<string name="pref_upside_down_keys">Перевернутая клавиатура</string>
|
||||
<string name="pref_upside_down_keys_summary">Используйте настройку, если в первом ряду 7–8–9 вместо 1–2–3.</string>
|
||||
<string name="dictionary_truncate_unselected">Очистить невыбранные</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -13,9 +13,8 @@
|
|||
<string name="pref_help">Допомога</string>
|
||||
<string name="pref_dark_theme">Темна тема</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_load_error">Помилка завантаження словника для мови «%1$s» (%2$s).</string>
|
||||
<string name="dictionary_loaded">Завантаження словника завершено.</string>
|
||||
|
|
@ -52,4 +51,5 @@
|
|||
<string name="add_word_field_placeholder">Введіть слово…</string>
|
||||
<string name="pref_upside_down_keys">Зворотна клавіатура</string>
|
||||
<string name="pref_upside_down_keys_summary">Використовуйте налаштування, якщо 7–8–9 у першому рядку замість 1–2–3.</string>
|
||||
<string name="dictionary_truncate_unselected">Очистіть невибрані</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@
|
|||
|
||||
<string name="pref_category_about">About</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_function_keys">Select Hotkeys</string>
|
||||
<string name="pref_category_keypad">Keypad</string>
|
||||
|
|
@ -39,10 +38,11 @@
|
|||
<string name="dictionary_loaded">Dictionary load completed.</string>
|
||||
<string name="dictionary_loading">Loading dictionary (%1$s)…</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_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="function_add_word_key">Add Word key</string>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
app:layout="@layout/pref_text"
|
||||
app:orderingFromXml="true">
|
||||
|
||||
|
||||
<Preference
|
||||
app:key="help"
|
||||
app:layout="@layout/pref_text"
|
||||
|
|
@ -15,103 +14,34 @@
|
|||
android:data="@string/help_url" />
|
||||
</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
|
||||
android:title="@string/pref_category_appearance"
|
||||
app:layout="@layout/pref_category"
|
||||
app:singleLineTitle="true">
|
||||
<Preference
|
||||
app:fragment="io.github.sspanak.tt9.preferences.DictionariesScreen"
|
||||
app:key="screen_dictionaries"
|
||||
app:layout="@layout/pref_text"
|
||||
app:title="@string/pref_choose_languages" />
|
||||
|
||||
<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" />
|
||||
|
||||
</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>
|
||||
<Preference
|
||||
app:fragment="io.github.sspanak.tt9.preferences.KeyPadScreen"
|
||||
app:key="screen_keypad"
|
||||
app:layout="@layout/pref_text"
|
||||
app:title="@string/pref_category_keypad" />
|
||||
|
||||
<PreferenceCategory
|
||||
android:title="@string/pref_category_about"
|
||||
app:layout="@layout/pref_category"
|
||||
app:singleLineTitle="true">
|
||||
|
||||
<Preference
|
||||
app:key="version_info"
|
||||
app:layout="@layout/pref_text"
|
||||
app:title="@string/app_name" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
|
|
|
|||
16
res/xml/prefs_screen_appearance.xml
Normal file
16
res/xml/prefs_screen_appearance.xml
Normal 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>
|
||||
24
res/xml/prefs_screen_dictionaries.xml
Normal file
24
res/xml/prefs_screen_dictionaries.xml
Normal 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>
|
||||
48
res/xml/prefs_screen_keypad.xml
Normal file
48
res/xml/prefs_screen_keypad.xml
Normal 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>
|
||||
|
|
@ -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() {
|
||||
@Override
|
||||
public void run() {
|
||||
getInstance().clearAllTables();
|
||||
if (languageIds == null) {
|
||||
getInstance().clearAllTables();
|
||||
} else if (languageIds.size() > 0) {
|
||||
getInstance().wordsDao().deleteByLanguage(languageIds);
|
||||
}
|
||||
handler.sendEmptyMessage(0);
|
||||
}
|
||||
}.start();
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import androidx.room.Insert;
|
|||
import androidx.room.OnConflictStrategy;
|
||||
import androidx.room.Query;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Dao
|
||||
|
|
@ -12,6 +13,9 @@ interface WordsDao {
|
|||
@Query("SELECT COUNT(id) FROM words WHERE :langId < 0 OR lang = :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")
|
||||
int doesWordExist(int langId, String word);
|
||||
|
||||
|
|
|
|||
|
|
@ -20,17 +20,21 @@ public class Characters {
|
|||
));
|
||||
|
||||
final private static ArrayList<ArrayList<String>> Emoji = new ArrayList<>(Arrays.asList(
|
||||
// smile -> frown
|
||||
// positive
|
||||
new ArrayList<>(Arrays.asList(
|
||||
"🙂", "😀", "🤣", "😉", "😛", "😳", "😲", "😱", "😭", "😢", "🙁"
|
||||
"🙂", "😀", "🤣", "🤓", "😎", "😛", "😉"
|
||||
)),
|
||||
// negative
|
||||
new ArrayList<>(Arrays.asList(
|
||||
"🙁", "😢", "😭", "😱", "😲", "😳", "😐", "😠"
|
||||
)),
|
||||
// hands
|
||||
new ArrayList<>(Arrays.asList(
|
||||
"👍", "👋", "✌️", "👏", "🤝", "💪", "🤘", "🖖", "👎"
|
||||
"👍", "👋", "✌️", "👏", "🖖", "🤘", "🤝", "💪", "👎"
|
||||
)),
|
||||
// emotions
|
||||
new ArrayList<>(Arrays.asList(
|
||||
"❤", "🤗", "😍", "😘", "😇", "😈", "🎉", "🤓", "😎", "🤔", "🥶", "😬"
|
||||
"❤", "🤗", "😍", "😘", "😇", "😈", "🍺", "🎉", "🥱", "🤔", "🥶", "😬"
|
||||
))
|
||||
));
|
||||
|
||||
|
|
|
|||
|
|
@ -7,14 +7,18 @@ import androidx.appcompat.app.ActionBar;
|
|||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
|
||||
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.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.KeyPadScreen;
|
||||
import io.github.sspanak.tt9.preferences.screens.MainSettingsScreen;
|
||||
import io.github.sspanak.tt9.ui.DictionaryLoadingBar;
|
||||
|
||||
public class PreferencesActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
|
||||
|
|
@ -31,39 +35,68 @@ public class PreferencesActivity extends AppCompatActivity implements Preference
|
|||
|
||||
super.onCreate(savedInstanceState);
|
||||
validateFunctionKeys();
|
||||
buildScreen();
|
||||
buildLayout();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceStartFragment(@NonNull PreferenceFragmentCompat caller, @NonNull Preference pref) {
|
||||
// instantiate the new Fragment
|
||||
Fragment fragment;
|
||||
if (pref.getFragment() != null && pref.getFragment().contains("Hotkeys")) {
|
||||
fragment = new HotkeysScreen(this);
|
||||
} else {
|
||||
fragment = new MainSettingsScreen(this);
|
||||
}
|
||||
Fragment fragment = getScreen((getScreenName(pref)));
|
||||
fragment.setArguments(pref.getExtras());
|
||||
|
||||
// replace the existing Fragment with the new Fragment
|
||||
getSupportFragmentManager().beginTransaction()
|
||||
.replace(R.id.preferences_container, fragment)
|
||||
.addToBackStack(null)
|
||||
.commit();
|
||||
|
||||
displayScreen(fragment, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private void applyTheme() {
|
||||
AppCompatDelegate.setDefaultNightMode(
|
||||
settings.getDarkTheme() ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO
|
||||
);
|
||||
/**
|
||||
* getScreenName
|
||||
* 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();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayShowHomeEnabled(true);
|
||||
|
|
@ -71,10 +104,7 @@ public class PreferencesActivity extends AppCompatActivity implements Preference
|
|||
}
|
||||
|
||||
setContentView(R.layout.preferences_container);
|
||||
getSupportFragmentManager()
|
||||
.beginTransaction()
|
||||
.replace(R.id.preferences_container, new MainSettingsScreen(this))
|
||||
.commit();
|
||||
displayScreen(new MainSettingsScreen(this), false);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -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() {
|
||||
if (!settings.areFunctionKeysSet()) {
|
||||
settings.setDefaultKeys();
|
||||
|
|
|
|||
|
|
@ -207,7 +207,7 @@ public class SettingsStore {
|
|||
|
||||
/************* 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 String getDoubleZeroChar() {
|
||||
String character = prefs.getString("pref_double_zero_char", ".");
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import io.github.sspanak.tt9.db.DictionaryLoader;
|
|||
import io.github.sspanak.tt9.ui.UI;
|
||||
|
||||
|
||||
public class ItemTruncateDictionary extends ItemClickable {
|
||||
public class ItemTruncateAll extends ItemClickable {
|
||||
public static final String NAME = "dictionary_truncate";
|
||||
|
||||
private final Context context;
|
||||
|
|
@ -21,7 +21,7 @@ public class ItemTruncateDictionary extends ItemClickable {
|
|||
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);
|
||||
this.context = context;
|
||||
this.loadItem = loadItem;
|
||||
|
|
@ -42,7 +42,7 @@ public class ItemTruncateDictionary extends ItemClickable {
|
|||
loadItem.changeToLoadButton();
|
||||
}
|
||||
|
||||
DictionaryDb.truncateWords(onDictionaryTruncated);
|
||||
DictionaryDb.deleteWords(onDictionaryTruncated);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -10,33 +10,14 @@ import io.github.sspanak.tt9.preferences.PreferencesActivity;
|
|||
import io.github.sspanak.tt9.preferences.items.SectionKeymap;
|
||||
|
||||
public class HotkeysScreen extends BaseScreenFragment {
|
||||
public HotkeysScreen() {
|
||||
init();
|
||||
}
|
||||
public HotkeysScreen() { init(); }
|
||||
public HotkeysScreen(PreferencesActivity activity) { init(activity); }
|
||||
|
||||
public HotkeysScreen(PreferencesActivity activity) {
|
||||
init(activity);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected int getTitle() {
|
||||
return R.string.pref_category_function_keys;
|
||||
}
|
||||
|
||||
|
||||
@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
|
||||
public void onCreate() {
|
||||
createKeymapSection();
|
||||
}
|
||||
|
||||
|
||||
private void createKeymapSection() {
|
||||
DropDownPreference[] dropDowns = {
|
||||
findPreference(SectionKeymap.ITEM_ADD_WORD),
|
||||
findPreference(SectionKeymap.ITEM_BACKSPACE),
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -10,84 +10,25 @@ import java.util.regex.Pattern;
|
|||
import io.github.sspanak.tt9.BuildConfig;
|
||||
import io.github.sspanak.tt9.Logger;
|
||||
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;
|
||||
|
||||
public class MainSettingsScreen extends BaseScreenFragment {
|
||||
private final Pattern releaseVersionRegex = Pattern.compile("^\\d+\\.\\d+$");
|
||||
|
||||
public MainSettingsScreen() {
|
||||
init();
|
||||
}
|
||||
|
||||
public MainSettingsScreen(PreferencesActivity activity) {
|
||||
init(activity);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected int getTitle() {
|
||||
return R.string.app_settings;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected int getXml() {
|
||||
return R.xml.prefs;
|
||||
}
|
||||
public MainSettingsScreen() { init(); }
|
||||
public MainSettingsScreen(PreferencesActivity activity) { init(activity); }
|
||||
|
||||
@Override protected int getTitle() { return R.string.app_settings;}
|
||||
@Override protected int getXml() { return R.xml.prefs; }
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
addHelpLink();
|
||||
createAboutSection();
|
||||
createAppearanceSection();
|
||||
createDictionarySection();
|
||||
createHelpSection();
|
||||
createPredictiveModeSection();
|
||||
}
|
||||
|
||||
|
||||
private void createDictionarySection() {
|
||||
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() {
|
||||
private void addHelpLink() {
|
||||
try {
|
||||
if (!releaseVersionRegex.matcher(BuildConfig.VERSION_NAME).find()) {
|
||||
throw new Exception("VERSION_NAME does not match: \\d+.\\d+");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue