diff --git a/README.md b/README.md
index 58c3f5ae..3ab52e52 100644
--- a/README.md
+++ b/README.md
@@ -33,3 +33,6 @@ As with many other open-source projects, this one is also maintained by its auth
- [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).
- "Negotiate" and "Vibrocentric" fonts are under [The Fontspring Desktop/Ebook Font End User License](docs/desktop-ebook-EULA-1.8.txt).
+
+## Privacy Policy
+Traditional T9 does not collect any information about you or about the way you are using using the application.
diff --git a/docs/user-manual.md b/docs/user-manual.md
index 02731639..0ebabfed 100644
--- a/docs/user-manual.md
+++ b/docs/user-manual.md
@@ -1,7 +1,7 @@
# Traditional T9
TT9 is an IME (Input Method Editor) for Android devices with hardware keypad. It supports multiple languages and predictive text typing. _NOTE: TT9 is not usable on touchscreen-only devices._
-All Source code and documentation are available on Github: [https://github.com/sspanak/tt9](https://github.com/sspanak/tt9).
+All source code, documentation and the privacy policy are available on Github: [https://github.com/sspanak/tt9](https://github.com/sspanak/tt9).
## Initial Setup
After installing, in order to use Traditional T9, you need to enable it as an Android keyboard. To do so:
@@ -41,6 +41,8 @@ _Predictive mode only._
Filtering can also be used to type unknown words. Let's say you want to type "Anakin", which is not in the dictionary. Start with "A", then press Right to hide "B" and "C". Now press 6-key. Since the filter is on, in addition to the real dictionary words, it will provide all possible combinations for 6: "Am", "An", "Ao". Select "An" and press Right to confirm your selection. Now pressing 2-key, will provide "Ana", "Anb", "Anc". You can keep going, until you complete "Anakin".
+When filtering is enabled, the base text will become bold and italicized.
+
#### D-pad Left (←):
_Predictive mode only._
@@ -102,13 +104,4 @@ On the Settings screen, you can choose languages for typing, configure the keypa
To access it:
- Start typing in a text field to wake up TT9.
- Use the on-screen gear button or press the Settings Key.
-
-## License
-- The source code, the logo image and the icons are licensed under [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0).
-- The dictionaries are licensed under the licenses provided in the [respective readme files](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).
-- "Negotiate" and "Vibrocentric" fonts are under [The Fontspring Desktop/Ebook Font End User License](desktop-ebook-EULA-1.8.txt).
-
-## Privacy Policy
-Traditional T9 does not collect any information about you or about the way you are using using the application.
+-
\ No newline at end of file
diff --git a/res/layout/pref_category.xml b/res/layout/pref_category.xml
new file mode 100644
index 00000000..8780e4a2
--- /dev/null
+++ b/res/layout/pref_category.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/res/layout/pref_dropdown.xml b/res/layout/pref_dropdown.xml
new file mode 100644
index 00000000..4120f0a5
--- /dev/null
+++ b/res/layout/pref_dropdown.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/pref_switch.xml b/res/layout/pref_switch.xml
new file mode 100644
index 00000000..a88c0e73
--- /dev/null
+++ b/res/layout/pref_switch.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/pref_text.xml b/res/layout/pref_text.xml
new file mode 100644
index 00000000..46756b20
--- /dev/null
+++ b/res/layout/pref_text.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/res/layout/preferences_container.xml b/res/layout/preferences_container.xml
index c15650e3..4f42572e 100644
--- a/res/layout/preferences_container.xml
+++ b/res/layout/preferences_container.xml
@@ -5,5 +5,5 @@
android:id="@+id/preferences_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- tools:context=".preferences.PreferencesFragment">
+ tools:context=".preferences.screens.MainSettingsScreen">
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 9b2df599..c2238251 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -49,4 +49,5 @@
Започвай автоматично изреченията с главни букви.
Подсказващ режим
Няма речник за език „%1$s“. Заредете го в Настройки.
+ Клавиатура
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index abd9ceb3..c81ebab6 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -21,4 +21,5 @@
Wörterbuch laden
Wird nicht geladen. Wörterbuch für \"%1$s\" nicht gefunden.
Lade Wörterbuch
+ Tastenfeld
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index f404311e..98a61a60 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -40,4 +40,5 @@
Commencer automatiquement les phrases avec une majuscule.
Pas de dictionnaire pour langue «%1$s». Veuillez le charger à l\'écran Paramètres.
Impossible d\'ajouter un mot, si aucune langue n\'est choisie.
+ Clavier
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 17c698da..be4df61f 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -27,5 +27,6 @@
Scorciatoie da tastiera
Caricamento del dizionario
Caricamento annullato.
+ Tastiera
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 1e0b8ccd..af560d59 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -21,4 +21,5 @@
Laden mislukt. Woordenboek voor %1$s niet gevonden.
Woordenboek succesvol gewist.
Woordenboek laden
+ Toetsenbord
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 1c4ec745..5d1fbbef 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -30,4 +30,5 @@
Загрузка словаря
Загрузка отменена.
Режим подсказки
+ Клавиатура
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 4aff2d52..6ff1c0e6 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -27,4 +27,5 @@
Помилка завантаження. Словник «%1$s» не знайдено.
Завантаження словника
Завантаження скасовано.
+ Клавіатура
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 81b9401d..782c8b87 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -1,10 +1,17 @@
- 25sp
- 17sp
+ 26sp
+ 18sp
6sp
1sp
44dp
24sp
+
+ 30dp
+ 12dp
+ 16dp
+ 18dp
+ 22sp
+ 19sp
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 696f52a4..669bd31d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -19,6 +19,7 @@
Dictionaries
Predictive Mode
Select Hotkeys
+ Keypad
Automatic Space
Automatically add a space after punctuation or words.
diff --git a/res/xml/prefs.xml b/res/xml/prefs.xml
index bbfcdeb9..1e28e887 100644
--- a/res/xml/prefs.xml
+++ b/res/xml/prefs.xml
@@ -1,12 +1,13 @@
@@ -37,92 +38,63 @@
-
-
-
-
-
-
-
-
-
-
-
-
+ android:title="@string/pref_category_keypad"
+ app:layout="@layout/pref_category">
-
+ app:fragment="io.github.sspanak.tt9.preferences.PreferencesHotkeysFragment"
+ app:key="screen_hotkeys"
+ app:layout="@layout/pref_text"
+ app:title="@string/pref_category_function_keys" />
-
diff --git a/res/xml/prefs_screen_hotkeys.xml b/res/xml/prefs_screen_hotkeys.xml
new file mode 100644
index 00000000..695a42f9
--- /dev/null
+++ b/res/xml/prefs_screen_hotkeys.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/io/github/sspanak/tt9/ime/TextHelper.java b/src/io/github/sspanak/tt9/ime/TextHelper.java
index 66b65bfa..821f4da9 100644
--- a/src/io/github/sspanak/tt9/ime/TextHelper.java
+++ b/src/io/github/sspanak/tt9/ime/TextHelper.java
@@ -9,7 +9,7 @@ import android.text.style.UnderlineSpan;
import io.github.sspanak.tt9.Logger;
public class TextHelper {
- public static CharSequence highlightComposingText(CharSequence word, int start, int end) {
+ public static CharSequence highlightComposingText(CharSequence word, int start, int end, boolean highlightMore) {
if (end < start || start < 0) {
Logger.w("tt9.util.highlightComposingText", "Cannot highlight invalid composing text range: [" + start + ", " + end + "]");
return word;
@@ -28,6 +28,15 @@ public class TextHelper {
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
);
+ if (highlightMore) {
+ styledWord.setSpan(
+ new StyleSpan(Typeface.BOLD_ITALIC),
+ start,
+ Math.min(word.length(), end),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
+ );
+ }
+
return styledWord;
}
}
diff --git a/src/io/github/sspanak/tt9/ime/TraditionalT9.java b/src/io/github/sspanak/tt9/ime/TraditionalT9.java
index 68e78468..89af5197 100644
--- a/src/io/github/sspanak/tt9/ime/TraditionalT9.java
+++ b/src/io/github/sspanak/tt9/ime/TraditionalT9.java
@@ -441,7 +441,7 @@ public class TraditionalT9 extends KeyPadHandler {
private void setComposingTextWithWordStemIndication(CharSequence word) {
if (mInputMode.getWordStem().length() > 0) {
- setComposingText(TextHelper.highlightComposingText(word, 0, mInputMode.getWordStem().length()));
+ setComposingText(TextHelper.highlightComposingText(word, 0, mInputMode.getWordStem().length(), mInputMode.isStemFilterFuzzy()));
} else {
setComposingText(word);
}
diff --git a/src/io/github/sspanak/tt9/ime/modes/InputMode.java b/src/io/github/sspanak/tt9/ime/modes/InputMode.java
index 45fa3423..46915ab7 100644
--- a/src/io/github/sspanak/tt9/ime/modes/InputMode.java
+++ b/src/io/github/sspanak/tt9/ime/modes/InputMode.java
@@ -115,6 +115,7 @@ abstract public class InputMode {
// Stem filtering.
// Where applicable, return "true" if the mode supports it and the operation was possible.
public boolean clearWordStem() { return false; }
+ public boolean isStemFilterFuzzy() { return false; }
public String getWordStem() { return ""; }
public boolean setWordStem(Language language, String stem, boolean exact) { return false; }
diff --git a/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java b/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java
index 9ba4654f..8430cfd8 100644
--- a/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java
+++ b/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java
@@ -275,6 +275,15 @@ public class ModePredictive extends InputMode {
}
+ /**
+ * isStemFilterFuzzy
+ * Returns how strict the stem filter is.
+ */
+ @Override
+ public boolean isStemFilterFuzzy() {
+ return isStemFuzzy;
+ }
+
/**
* loadStaticSuggestions
* Similar to "loadSuggestions()", but loads suggestions that are not in the database.
diff --git a/src/io/github/sspanak/tt9/preferences/PreferencesActivity.java b/src/io/github/sspanak/tt9/preferences/PreferencesActivity.java
index 67e91c6c..18c63934 100644
--- a/src/io/github/sspanak/tt9/preferences/PreferencesActivity.java
+++ b/src/io/github/sspanak/tt9/preferences/PreferencesActivity.java
@@ -2,16 +2,24 @@ package io.github.sspanak.tt9.preferences;
import android.os.Bundle;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
+import androidx.fragment.app.Fragment;
+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.HotkeysScreen;
import io.github.sspanak.tt9.ui.DictionaryLoadingBar;
-public class PreferencesActivity extends AppCompatActivity {
- SettingsStore settings;
+public class PreferencesActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+ public SettingsStore settings;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -26,6 +34,27 @@ public class PreferencesActivity extends AppCompatActivity {
}
+ @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.setArguments(pref.getExtras());
+
+ // replace the existing Fragment with the new Fragment
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.preferences_container, fragment)
+ .addToBackStack(null)
+ .commit();
+
+ return true;
+ }
+
+
private void applyTheme() {
AppCompatDelegate.setDefaultNightMode(
settings.getDarkTheme() ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO
@@ -34,14 +63,29 @@ public class PreferencesActivity extends AppCompatActivity {
private void buildScreen() {
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayShowHomeEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(true); // hide the "back" button, if visible
+ }
+
setContentView(R.layout.preferences_container);
getSupportFragmentManager()
.beginTransaction()
- .replace(R.id.preferences_container, new PreferencesFragment(this))
+ .replace(R.id.preferences_container, new MainSettingsScreen(this))
.commit();
}
+ public void setScreenTitle(int title) {
+ // set the title
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setTitle(title);
+ }
+ }
+
+
private void validateFunctionKeys() {
if (!settings.areFunctionKeysSet()) {
settings.setDefaultKeys();
@@ -49,12 +93,12 @@ public class PreferencesActivity extends AppCompatActivity {
}
- DictionaryLoadingBar getDictionaryProgressBar() {
+ public DictionaryLoadingBar getDictionaryProgressBar() {
return DictionaryLoadingBar.getInstance(this);
}
- DictionaryLoader getDictionaryLoader() {
+ public DictionaryLoader getDictionaryLoader() {
return DictionaryLoader.getInstance(this);
}
}
diff --git a/src/io/github/sspanak/tt9/preferences/PreferencesFragment.java b/src/io/github/sspanak/tt9/preferences/PreferencesFragment.java
deleted file mode 100644
index 3b2c2bf0..00000000
--- a/src/io/github/sspanak/tt9/preferences/PreferencesFragment.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package io.github.sspanak.tt9.preferences;
-
-import android.os.Bundle;
-
-import androidx.preference.DropDownPreference;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceFragmentCompat;
-
-import java.util.Arrays;
-
-import io.github.sspanak.tt9.BuildConfig;
-import io.github.sspanak.tt9.Logger;
-import io.github.sspanak.tt9.R;
-
-public class PreferencesFragment extends PreferenceFragmentCompat {
- private PreferencesActivity activity;
-
- public PreferencesFragment() {
- super();
- init();
- }
-
- public PreferencesFragment(PreferencesActivity activity) {
- super();
- this.activity = activity;
- init();
- }
-
-
- private void init() {
- if (activity == null) {
- activity = (PreferencesActivity) getActivity();
- }
- }
-
-
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- setPreferencesFromResource(R.xml.prefs, rootKey);
-
- if (activity == null) {
- Logger.w(
- "tt9/PreferencesFragment",
- "Starting up without an Activity. Preference Items will not be fully initialized."
- );
- return;
- }
-
- createDictionarySection();
- createAppearanceSection();
- createKeymapSection();
- createAboutSection();
- }
-
-
- 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 createKeymapSection() {
- DropDownPreference[] dropDowns = {
- findPreference(SectionKeymap.ITEM_ADD_WORD),
- findPreference(SectionKeymap.ITEM_BACKSPACE),
- findPreference(SectionKeymap.ITEM_NEXT_INPUT_MODE),
- findPreference(SectionKeymap.ITEM_NEXT_LANGUAGE),
- findPreference(SectionKeymap.ITEM_SHOW_SETTINGS),
- };
- SectionKeymap section = new SectionKeymap(Arrays.asList(dropDowns), activity, activity.settings);
- section.populate().activate();
-
- (new ItemResetKeys(findPreference(ItemResetKeys.NAME), activity, activity.settings, section))
- .enableClickHandler();
- }
-
- private void createAboutSection() {
- Preference vi = findPreference("version_info");
- if (vi != null) {
- vi.setSummary(BuildConfig.VERSION_FULL);
- }
- }
-}
diff --git a/src/io/github/sspanak/tt9/preferences/SettingsStore.java b/src/io/github/sspanak/tt9/preferences/SettingsStore.java
index b677ba63..df0fb0a9 100644
--- a/src/io/github/sspanak/tt9/preferences/SettingsStore.java
+++ b/src/io/github/sspanak/tt9/preferences/SettingsStore.java
@@ -15,6 +15,7 @@ import java.util.Set;
import io.github.sspanak.tt9.Logger;
import io.github.sspanak.tt9.ime.modes.InputMode;
import io.github.sspanak.tt9.languages.LanguageCollection;
+import io.github.sspanak.tt9.preferences.items.SectionKeymap;
public class SettingsStore {
diff --git a/src/io/github/sspanak/tt9/preferences/ItemClickable.java b/src/io/github/sspanak/tt9/preferences/items/ItemClickable.java
similarity index 92%
rename from src/io/github/sspanak/tt9/preferences/ItemClickable.java
rename to src/io/github/sspanak/tt9/preferences/items/ItemClickable.java
index c1afa905..7d6e4c24 100644
--- a/src/io/github/sspanak/tt9/preferences/ItemClickable.java
+++ b/src/io/github/sspanak/tt9/preferences/items/ItemClickable.java
@@ -1,10 +1,10 @@
-package io.github.sspanak.tt9.preferences;
+package io.github.sspanak.tt9.preferences.items;
import androidx.preference.Preference;
import io.github.sspanak.tt9.Logger;
-public abstract class ItemClickable {
+abstract class ItemClickable {
protected final int CLICK_DEBOUNCE_TIME = 250;
private long lastClickTime = 0;
diff --git a/src/io/github/sspanak/tt9/preferences/ItemLoadDictionary.java b/src/io/github/sspanak/tt9/preferences/items/ItemLoadDictionary.java
similarity index 90%
rename from src/io/github/sspanak/tt9/preferences/ItemLoadDictionary.java
rename to src/io/github/sspanak/tt9/preferences/items/ItemLoadDictionary.java
index f8d2c4cc..52e8b1a9 100644
--- a/src/io/github/sspanak/tt9/preferences/ItemLoadDictionary.java
+++ b/src/io/github/sspanak/tt9/preferences/items/ItemLoadDictionary.java
@@ -1,4 +1,4 @@
-package io.github.sspanak.tt9.preferences;
+package io.github.sspanak.tt9.preferences.items;
import android.content.Context;
import android.os.Handler;
@@ -14,6 +14,7 @@ import io.github.sspanak.tt9.db.DictionaryImportAlreadyRunningException;
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.DictionaryLoadingBar;
import io.github.sspanak.tt9.ui.UI;
@@ -27,7 +28,7 @@ public class ItemLoadDictionary extends ItemClickable {
private final DictionaryLoadingBar progressBar;
- ItemLoadDictionary(Preference item, Context context, SettingsStore settings, DictionaryLoader loader, DictionaryLoadingBar progressBar) {
+ public ItemLoadDictionary(Preference item, Context context, SettingsStore settings, DictionaryLoader loader, DictionaryLoadingBar progressBar) {
super(item);
this.context = context;
diff --git a/src/io/github/sspanak/tt9/preferences/ItemResetKeys.java b/src/io/github/sspanak/tt9/preferences/items/ItemResetKeys.java
similarity index 75%
rename from src/io/github/sspanak/tt9/preferences/ItemResetKeys.java
rename to src/io/github/sspanak/tt9/preferences/items/ItemResetKeys.java
index 7b473312..1c8c5e95 100644
--- a/src/io/github/sspanak/tt9/preferences/ItemResetKeys.java
+++ b/src/io/github/sspanak/tt9/preferences/items/ItemResetKeys.java
@@ -1,10 +1,11 @@
-package io.github.sspanak.tt9.preferences;
+package io.github.sspanak.tt9.preferences.items;
import android.content.Context;
import androidx.preference.Preference;
import io.github.sspanak.tt9.R;
+import io.github.sspanak.tt9.preferences.SettingsStore;
import io.github.sspanak.tt9.ui.UI;
@@ -16,7 +17,7 @@ public class ItemResetKeys extends ItemClickable {
private final SettingsStore settings;
- ItemResetKeys(Preference item, Context context, SettingsStore settings, SectionKeymap dropdowns) {
+ public ItemResetKeys(Preference item, Context context, SettingsStore settings, SectionKeymap dropdowns) {
super(item);
this.context = context;
this.dropdowns = dropdowns;
diff --git a/src/io/github/sspanak/tt9/preferences/ItemSelectLanguage.java b/src/io/github/sspanak/tt9/preferences/items/ItemSelectLanguage.java
similarity index 90%
rename from src/io/github/sspanak/tt9/preferences/ItemSelectLanguage.java
rename to src/io/github/sspanak/tt9/preferences/items/ItemSelectLanguage.java
index c63b5349..b62db3c9 100644
--- a/src/io/github/sspanak/tt9/preferences/ItemSelectLanguage.java
+++ b/src/io/github/sspanak/tt9/preferences/items/ItemSelectLanguage.java
@@ -1,4 +1,4 @@
-package io.github.sspanak.tt9.preferences;
+package io.github.sspanak.tt9.preferences.items;
import androidx.preference.MultiSelectListPreference;
@@ -7,6 +7,7 @@ import java.util.HashSet;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection;
+import io.github.sspanak.tt9.preferences.SettingsStore;
public class ItemSelectLanguage {
public static final String NAME = "pref_languages";
@@ -14,7 +15,7 @@ public class ItemSelectLanguage {
private final SettingsStore settings;
private final MultiSelectListPreference item;
- ItemSelectLanguage(MultiSelectListPreference multiSelect, SettingsStore settings) {
+ public ItemSelectLanguage(MultiSelectListPreference multiSelect, SettingsStore settings) {
this.item = multiSelect;
this.settings = settings;
}
diff --git a/src/io/github/sspanak/tt9/preferences/ItemToggleDarkTheme.java b/src/io/github/sspanak/tt9/preferences/items/ItemToggleDarkTheme.java
similarity index 93%
rename from src/io/github/sspanak/tt9/preferences/ItemToggleDarkTheme.java
rename to src/io/github/sspanak/tt9/preferences/items/ItemToggleDarkTheme.java
index 68293198..c582256c 100644
--- a/src/io/github/sspanak/tt9/preferences/ItemToggleDarkTheme.java
+++ b/src/io/github/sspanak/tt9/preferences/items/ItemToggleDarkTheme.java
@@ -1,4 +1,4 @@
-package io.github.sspanak.tt9.preferences;
+package io.github.sspanak.tt9.preferences.items;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.preference.Preference;
diff --git a/src/io/github/sspanak/tt9/preferences/ItemTruncateDictionary.java b/src/io/github/sspanak/tt9/preferences/items/ItemTruncateDictionary.java
similarity index 86%
rename from src/io/github/sspanak/tt9/preferences/ItemTruncateDictionary.java
rename to src/io/github/sspanak/tt9/preferences/items/ItemTruncateDictionary.java
index dd5a4c1c..455a3410 100644
--- a/src/io/github/sspanak/tt9/preferences/ItemTruncateDictionary.java
+++ b/src/io/github/sspanak/tt9/preferences/items/ItemTruncateDictionary.java
@@ -1,4 +1,4 @@
-package io.github.sspanak.tt9.preferences;
+package io.github.sspanak.tt9.preferences.items;
import android.content.Context;
import android.os.Handler;
@@ -21,7 +21,7 @@ public class ItemTruncateDictionary extends ItemClickable {
private final ItemLoadDictionary loadItem;
- ItemTruncateDictionary(Preference item, ItemLoadDictionary loadItem, Context context, DictionaryLoader loader) {
+ public ItemTruncateDictionary(Preference item, ItemLoadDictionary loadItem, Context context, DictionaryLoader loader) {
super(item);
this.context = context;
this.loadItem = loadItem;
diff --git a/src/io/github/sspanak/tt9/preferences/SectionKeymap.java b/src/io/github/sspanak/tt9/preferences/items/SectionKeymap.java
similarity index 98%
rename from src/io/github/sspanak/tt9/preferences/SectionKeymap.java
rename to src/io/github/sspanak/tt9/preferences/items/SectionKeymap.java
index edd13181..d2de81ee 100644
--- a/src/io/github/sspanak/tt9/preferences/SectionKeymap.java
+++ b/src/io/github/sspanak/tt9/preferences/items/SectionKeymap.java
@@ -1,4 +1,4 @@
-package io.github.sspanak.tt9.preferences;
+package io.github.sspanak.tt9.preferences.items;
import android.content.Context;
import android.content.res.Resources;
@@ -15,6 +15,7 @@ import java.util.Objects;
import io.github.sspanak.tt9.Logger;
import io.github.sspanak.tt9.R;
+import io.github.sspanak.tt9.preferences.SettingsStore;
public class SectionKeymap {
public static final String ITEM_ADD_WORD = "key_add_word";
diff --git a/src/io/github/sspanak/tt9/preferences/screens/BaseScreenFragment.java b/src/io/github/sspanak/tt9/preferences/screens/BaseScreenFragment.java
new file mode 100644
index 00000000..62f25821
--- /dev/null
+++ b/src/io/github/sspanak/tt9/preferences/screens/BaseScreenFragment.java
@@ -0,0 +1,75 @@
+package io.github.sspanak.tt9.preferences.screens;
+
+import android.os.Bundle;
+import android.view.MenuItem;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceFragmentCompat;
+
+import io.github.sspanak.tt9.Logger;
+import io.github.sspanak.tt9.preferences.PreferencesActivity;
+
+abstract class BaseScreenFragment extends PreferenceFragmentCompat {
+ protected PreferencesActivity activity;
+
+
+ protected void init(PreferencesActivity activity) {
+ this.activity = activity;
+ init();
+ }
+
+
+ protected void init() {
+ if (activity == null) {
+ activity = (PreferencesActivity) getActivity();
+ setScreenTitle();
+ }
+ }
+
+
+ private void setScreenTitle() {
+ if (activity != null) {
+ activity.setScreenTitle(getTitle());
+ }
+ }
+
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setHasOptionsMenu(true); // enable "back" in "onOptionsItemSelected()"
+ setPreferencesFromResource(getXml(), rootKey);
+
+ if (activity == null) {
+ Logger.w(
+ "tt9/MainSettingsScreen",
+ "Starting up without an Activity. Preference Items will not be fully initialized."
+ );
+ return;
+ }
+
+ onCreate();
+ }
+
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ setScreenTitle();
+ }
+
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ if (item.getItemId() == android.R.id.home && activity != null && !super.onOptionsItemSelected(item)) {
+ activity.onBackPressed();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+
+ abstract protected int getTitle();
+ abstract protected int getXml();
+ abstract protected void onCreate();
+}
diff --git a/src/io/github/sspanak/tt9/preferences/screens/HotkeysScreen.java b/src/io/github/sspanak/tt9/preferences/screens/HotkeysScreen.java
new file mode 100644
index 00000000..f2dcd5b3
--- /dev/null
+++ b/src/io/github/sspanak/tt9/preferences/screens/HotkeysScreen.java
@@ -0,0 +1,53 @@
+package io.github.sspanak.tt9.preferences.screens;
+
+import androidx.preference.DropDownPreference;
+
+import java.util.Arrays;
+
+import io.github.sspanak.tt9.R;
+import io.github.sspanak.tt9.preferences.items.ItemResetKeys;
+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(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
+ public void onCreate() {
+ createKeymapSection();
+ }
+
+
+ private void createKeymapSection() {
+ DropDownPreference[] dropDowns = {
+ findPreference(SectionKeymap.ITEM_ADD_WORD),
+ findPreference(SectionKeymap.ITEM_BACKSPACE),
+ findPreference(SectionKeymap.ITEM_NEXT_INPUT_MODE),
+ findPreference(SectionKeymap.ITEM_NEXT_LANGUAGE),
+ findPreference(SectionKeymap.ITEM_SHOW_SETTINGS),
+ };
+ SectionKeymap section = new SectionKeymap(Arrays.asList(dropDowns), activity, activity.settings);
+ section.populate().activate();
+
+ (new ItemResetKeys(findPreference(ItemResetKeys.NAME), activity, activity.settings, section))
+ .enableClickHandler();
+ }
+}
diff --git a/src/io/github/sspanak/tt9/preferences/screens/MainSettingsScreen.java b/src/io/github/sspanak/tt9/preferences/screens/MainSettingsScreen.java
new file mode 100644
index 00000000..fdaa6211
--- /dev/null
+++ b/src/io/github/sspanak/tt9/preferences/screens/MainSettingsScreen.java
@@ -0,0 +1,79 @@
+package io.github.sspanak.tt9.preferences.screens;
+
+import androidx.preference.Preference;
+
+import io.github.sspanak.tt9.BuildConfig;
+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.ItemToggleDarkTheme;
+import io.github.sspanak.tt9.preferences.items.ItemTruncateDictionary;
+import io.github.sspanak.tt9.preferences.PreferencesActivity;
+
+public class MainSettingsScreen extends BaseScreenFragment {
+ 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() {
+ createDictionarySection();
+ createAppearanceSection();
+ createAboutSection();
+ }
+
+
+ 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 createAboutSection() {
+ Preference vi = findPreference("version_info");
+ if (vi != null) {
+ vi.setSummary(BuildConfig.VERSION_FULL);
+ }
+ }
+}