From 21254d895c378dc7a187558f7744d8aaa70b8cba Mon Sep 17 00:00:00 2001 From: Helium314 Date: Thu, 1 Feb 2024 08:51:17 +0100 Subject: [PATCH] add "block offensive words" setting to spell checker settings too and make sure we have settingsValues when using spell checker only --- .../main/java/helium314/keyboard/latin/App.kt | 13 ++---- .../latin/DictionaryFacilitatorImpl.java | 4 +- .../settings/CorrectionSettingsFragment.java | 5 +-- .../keyboard/latin/settings/Settings.java | 1 + .../latin/settings/SettingsValues.java | 3 +- .../AndroidSpellCheckerService.java | 44 ++++++++++++------- .../SpellCheckerSettingsFragment.java | 5 ++- .../main/res/xml/prefs_screen_correction.xml | 4 +- .../main/res/xml/spell_checker_settings.xml | 10 ++++- 9 files changed, 51 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index 118904ad..92bc48d1 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -10,7 +10,6 @@ import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.settings.USER_DICTIONARY_SUFFIX import helium314.keyboard.latin.utils.DeviceProtectedUtils import helium314.keyboard.latin.utils.DictionaryInfoUtils -import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.upgradeToolbarPref import java.io.File @@ -35,7 +34,6 @@ class App : Application() { fun checkVersionUpgrade(context: Context) { val prefs = DeviceProtectedUtils.getSharedPreferences(context) val oldVersion = prefs.getInt(Settings.PREF_VERSION_CODE, 0) - Log.d("test", "old v $oldVersion, current ${BuildConfig.VERSION_CODE}") if (oldVersion == BuildConfig.VERSION_CODE) return upgradeToolbarPref(prefs) @@ -88,7 +86,6 @@ private fun upgradesWhenComingFromOldAppName(context: Context) { } prefs.all.toMap().forEach { if (it.key.startsWith("pref_key_") && it.key != "pref_key_longpress_timeout") { - Log.d("test", "adjusting ${it.key}") var remove = true when (val value = it.value) { is Boolean -> prefs.edit().putBoolean(it.key.substringAfter("pref_key_"), value).apply() @@ -101,7 +98,6 @@ private fun upgradesWhenComingFromOldAppName(context: Context) { if (remove) prefs.edit().remove(it.key).apply() } else if (it.key.startsWith("pref_")) { - Log.d("test", "adjusting ${it.key}") var remove = true when (val value = it.value) { is Boolean -> prefs.edit().putBoolean(it.key.substringAfter("pref_"), value).apply() @@ -113,26 +109,25 @@ private fun upgradesWhenComingFromOldAppName(context: Context) { } if (remove) prefs.edit().remove(it.key).apply() - } else { - Log.d("test", "keeping ${it.key}") } } // change more_keys to popup_keys if (prefs.contains("more_keys_order")) { - Log.d("test", "more_keys_order") prefs.edit().putString(Settings.PREF_POPUP_KEYS_ORDER, prefs.getString("more_keys_order", "")).apply() prefs.edit().remove("more_keys_order").apply() } if (prefs.contains("more_keys_labels_order")) { - Log.d("test", "more_keys_labels_order") prefs.edit().putString(Settings.PREF_POPUP_KEYS_LABELS_ORDER, prefs.getString("more_keys_labels_order", "")).apply() prefs.edit().remove("more_keys_labels_order").apply() } if (prefs.contains("more_more_keys")) { - Log.d("test", "more_more_keys") prefs.edit().putString(Settings.PREF_MORE_POPUP_KEYS, prefs.getString("more_more_keys", "")).apply() prefs.edit().remove("more_more_keys").apply() } + if (prefs.contains("spellcheck_use_contacts")) { + prefs.edit().putBoolean(Settings.PREF_USE_CONTACTS, prefs.getBoolean("spellcheck_use_contacts", false)).apply() + prefs.edit().remove("spellcheck_use_contacts").apply() + } // upgrade additional subtype locale strings val additionalSubtypes = mutableListOf() Settings.readPrefAdditionalSubtypes(prefs, context.resources).split(";").forEach { diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java index 5ef3e859..ca9f9140 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java @@ -12,6 +12,7 @@ import android.provider.UserDictionary; import android.text.TextUtils; import helium314.keyboard.latin.settings.SettingsValues; +import helium314.keyboard.latin.utils.DeviceProtectedUtils; import helium314.keyboard.latin.utils.Log; import android.util.LruCache; @@ -29,6 +30,7 @@ import helium314.keyboard.latin.personalization.UserHistoryDictionary; import helium314.keyboard.latin.settings.Settings; import helium314.keyboard.latin.settings.SettingsValuesForSuggestion; import helium314.keyboard.latin.utils.ExecutorUtils; +import helium314.keyboard.latin.utils.SubtypeUtilsKt; import helium314.keyboard.latin.utils.SuggestionResults; import java.io.File; @@ -342,7 +344,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { subDictTypesToUse.add(Dictionary.TYPE_USER); final List allLocales = new ArrayList<>() {{ add(newLocale); - addAll(Settings.getInstance().getCurrent().mSecondaryLocales); + addAll(Settings.getSecondaryLocales(DeviceProtectedUtils.getSharedPreferences(context), newLocale)); }}; // Do not use contacts dictionary if we do not have permissions to read contacts. diff --git a/app/src/main/java/helium314/keyboard/latin/settings/CorrectionSettingsFragment.java b/app/src/main/java/helium314/keyboard/latin/settings/CorrectionSettingsFragment.java index 269bdd05..6cb03d80 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/CorrectionSettingsFragment.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/CorrectionSettingsFragment.java @@ -19,7 +19,6 @@ import androidx.preference.TwoStatePreference; import helium314.keyboard.latin.R; import helium314.keyboard.latin.permissions.PermissionsManager; import helium314.keyboard.latin.permissions.PermissionsUtil; -import helium314.keyboard.latin.spellcheck.AndroidSpellCheckerService; public final class CorrectionSettingsFragment extends SubScreenFragment implements SharedPreferences.OnSharedPreferenceChangeListener, @@ -32,14 +31,14 @@ public final class CorrectionSettingsFragment extends SubScreenFragment super.onCreate(icicle); addPreferencesFromResource(R.xml.prefs_screen_correction); - mLookupContactsPreference = findPreference(AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY); + mLookupContactsPreference = findPreference(Settings.PREF_USE_CONTACTS); refreshEnabledSettings(); } @Override public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) { - if (AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY.equals(key) + if (Settings.PREF_USE_CONTACTS.equals(key) && prefs.getBoolean(key, false) && !PermissionsUtil.checkAllPermissionsGranted(getActivity(), Manifest.permission.READ_CONTACTS) ) { diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 5a752c85..957928d5 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -112,6 +112,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_GESTURE_FLOATING_PREVIEW_TEXT = "gesture_floating_preview_text"; public static final String PREF_GESTURE_SPACE_AWARE = "gesture_space_aware"; public static final String PREF_SHOW_SETUP_WIZARD_ICON = "show_setup_wizard_icon"; + public static final String PREF_USE_CONTACTS = "use_contacts"; // one-handed mode gravity, enablement and scale, stored separately per orientation public static final String PREF_ONE_HANDED_MODE_PREFIX = "one_handed_mode_enabled_p_"; diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index e171a5d1..fb137261 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -22,7 +22,6 @@ import helium314.keyboard.latin.InputAttributes; import helium314.keyboard.latin.R; import helium314.keyboard.latin.RichInputMethodManager; import helium314.keyboard.latin.common.Colors; -import helium314.keyboard.latin.spellcheck.AndroidSpellCheckerService; import helium314.keyboard.latin.utils.InputTypeUtils; import helium314.keyboard.latin.utils.Log; import helium314.keyboard.latin.utils.MoreKeysUtilsKt; @@ -222,7 +221,7 @@ public class SettingsValues { mMoreKeyLabelSources = MoreKeysUtilsKt.getEnabledMoreKeys(prefs, Settings.PREF_POPUP_KEYS_LABELS_ORDER + "_" + selectedSubtype.getLocale(), moreKeyLabelDefault); mAddToPersonalDictionary = prefs.getBoolean(Settings.PREF_ADD_TO_PERSONAL_DICTIONARY, false); - mUseContactsDictionary = prefs.getBoolean(AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY, false); + mUseContactsDictionary = prefs.getBoolean(Settings.PREF_USE_CONTACTS, false); mCustomNavBarColor = prefs.getBoolean(Settings.PREF_NAVBAR_COLOR, false); mNarrowKeyGaps = prefs.getBoolean(Settings.PREF_NARROW_KEY_GAPS, true); mSettingsValuesForSuggestion = new SettingsValuesForSuggestion( diff --git a/app/src/main/java/helium314/keyboard/latin/spellcheck/AndroidSpellCheckerService.java b/app/src/main/java/helium314/keyboard/latin/spellcheck/AndroidSpellCheckerService.java index 2608c6a3..ed6d982f 100644 --- a/app/src/main/java/helium314/keyboard/latin/spellcheck/AndroidSpellCheckerService.java +++ b/app/src/main/java/helium314/keyboard/latin/spellcheck/AndroidSpellCheckerService.java @@ -21,11 +21,13 @@ import helium314.keyboard.keyboard.KeyboardId; import helium314.keyboard.keyboard.KeyboardLayoutSet; import helium314.keyboard.latin.DictionaryFacilitator; import helium314.keyboard.latin.DictionaryFacilitatorLruCache; +import helium314.keyboard.latin.InputAttributes; import helium314.keyboard.latin.NgramContext; import helium314.keyboard.latin.R; import helium314.keyboard.latin.RichInputMethodSubtype; import helium314.keyboard.latin.SuggestedWords; import helium314.keyboard.latin.common.ComposedData; +import helium314.keyboard.latin.settings.Settings; import helium314.keyboard.latin.settings.SettingsValuesForSuggestion; import helium314.keyboard.latin.utils.AdditionalSubtypeUtils; import helium314.keyboard.latin.utils.DeviceProtectedUtils; @@ -43,8 +45,6 @@ import java.util.concurrent.Semaphore; public final class AndroidSpellCheckerService extends SpellCheckerService implements SharedPreferences.OnSharedPreferenceChangeListener { - public static final String PREF_USE_CONTACTS_KEY = "spellcheck_use_contacts"; - public static final int SPELLCHECKER_DUMMY_KEYBOARD_WIDTH = 480; public static final int SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT = 301; @@ -53,20 +53,17 @@ public final class AndroidSpellCheckerService extends SpellCheckerService private static final String[] EMPTY_STRING_ARRAY = new String[0]; private final int MAX_NUM_OF_THREADS_READ_DICTIONARY = 2; - private final Semaphore mSemaphore = new Semaphore(MAX_NUM_OF_THREADS_READ_DICTIONARY, - true /* fair */); + private final Semaphore mSemaphore = new Semaphore(MAX_NUM_OF_THREADS_READ_DICTIONARY, true); // TODO: Make each spell checker session has its own session id. private final ConcurrentLinkedQueue mSessionIdPool = new ConcurrentLinkedQueue<>(); private final DictionaryFacilitatorLruCache mDictionaryFacilitatorCache = - new DictionaryFacilitatorLruCache(this /* context */, DICTIONARY_NAME_PREFIX); + new DictionaryFacilitatorLruCache(this, DICTIONARY_NAME_PREFIX); private final ConcurrentHashMap mKeyboardCache = new ConcurrentHashMap<>(); // The threshold for a suggestion to be considered "recommended". private float mRecommendedThreshold; - // TODO: make a spell checker option to block offensive words or not - private final SettingsValuesForSuggestion mSettingsValuesForSuggestion = - new SettingsValuesForSuggestion(true, false); + private SettingsValuesForSuggestion mSettingsValuesForSuggestion; public static final String SINGLE_QUOTE = "'"; public static final String APOSTROPHE = "’"; @@ -84,7 +81,9 @@ public final class AndroidSpellCheckerService extends SpellCheckerService mRecommendedThreshold = Float.parseFloat(getString(R.string.spellchecker_recommended_threshold_value)); final SharedPreferences prefs = DeviceProtectedUtils.getSharedPreferences(this); prefs.registerOnSharedPreferenceChangeListener(this); - onSharedPreferenceChanged(prefs, PREF_USE_CONTACTS_KEY); + onSharedPreferenceChanged(prefs, Settings.PREF_USE_CONTACTS); + final boolean blockOffensive = Settings.readBlockPotentiallyOffensive(prefs, getResources()); + mSettingsValuesForSuggestion = new SettingsValuesForSuggestion(blockOffensive, false); SubtypeSettingsKt.init(this); } @@ -94,9 +93,13 @@ public final class AndroidSpellCheckerService extends SpellCheckerService @Override public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) { - if (!PREF_USE_CONTACTS_KEY.equals(key)) return; - final boolean useContactsDictionary = prefs.getBoolean(PREF_USE_CONTACTS_KEY, true); - mDictionaryFacilitatorCache.setUseContactsDictionary(useContactsDictionary); + if (Settings.PREF_USE_CONTACTS.equals(key)) { + final boolean useContactsDictionary = prefs.getBoolean(Settings.PREF_USE_CONTACTS, true); + mDictionaryFacilitatorCache.setUseContactsDictionary(useContactsDictionary); + } else if (Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE.equals(key)) { + final boolean blockOffensive = Settings.readBlockPotentiallyOffensive(prefs, getResources()); + mSettingsValuesForSuggestion = new SettingsValuesForSuggestion(blockOffensive, false); + } } @Override @@ -121,8 +124,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService * @return the empty SuggestionsInfo with the appropriate flags set. */ public static SuggestionsInfo getInDictEmptySuggestions() { - return new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY, - EMPTY_STRING_ARRAY); + return new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY, EMPTY_STRING_ARRAY); } public boolean isValidWord(final Locale locale, final String word) { @@ -142,8 +144,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService mSemaphore.acquireUninterruptibly(); try { sessionId = mSessionIdPool.poll(); - DictionaryFacilitator dictionaryFacilitatorForLocale = - mDictionaryFacilitatorCache.get(locale); + DictionaryFacilitator dictionaryFacilitatorForLocale = mDictionaryFacilitatorCache.get(locale); return dictionaryFacilitatorForLocale.getSuggestionResults(composedData, ngramContext, keyboard, mSettingsValuesForSuggestion, sessionId, SuggestedWords.INPUT_STYLE_TYPING); @@ -188,6 +189,15 @@ public final class AndroidSpellCheckerService extends SpellCheckerService } private Keyboard createKeyboardForLocale(final Locale locale) { + if (Settings.getInstance().getCurrent() == null) { + // creating a keyboard reads SettingsValues from Settings instance + // maybe it would be "more correct" to create an instance of SettingsValues and use that one instead + // but creating a global one if not existing should be fine too + Settings.init(this); + final EditorInfo editorInfo = new EditorInfo(); + editorInfo.inputType = InputType.TYPE_CLASS_TEXT; + Settings.getInstance().loadSettings(this, locale, new InputAttributes(editorInfo, false, getPackageName())); + } final String keyboardLayoutName = SubtypeSettingsKt.getMatchingLayoutSetNameForLocale(locale); final InputMethodSubtype subtype = AdditionalSubtypeUtils.createDummyAdditionalSubtype(locale, keyboardLayoutName); final KeyboardLayoutSet keyboardLayoutSet = createKeyboardSetForSpellChecker(subtype); @@ -201,7 +211,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService return builder .setKeyboardGeometry(SPELLCHECKER_DUMMY_KEYBOARD_WIDTH, SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT) .setSubtype(RichInputMethodSubtype.getRichInputMethodSubtype(subtype)) - .setIsSpellChecker(true /* isSpellChecker */) + .setIsSpellChecker(true) .disableTouchPositionCorrectionData() .build(); } diff --git a/app/src/main/java/helium314/keyboard/latin/spellcheck/SpellCheckerSettingsFragment.java b/app/src/main/java/helium314/keyboard/latin/spellcheck/SpellCheckerSettingsFragment.java index 12849602..d8205733 100644 --- a/app/src/main/java/helium314/keyboard/latin/spellcheck/SpellCheckerSettingsFragment.java +++ b/app/src/main/java/helium314/keyboard/latin/spellcheck/SpellCheckerSettingsFragment.java @@ -16,6 +16,7 @@ import androidx.preference.SwitchPreference; import helium314.keyboard.latin.R; import helium314.keyboard.latin.permissions.PermissionsManager; import helium314.keyboard.latin.permissions.PermissionsUtil; +import helium314.keyboard.latin.settings.Settings; import helium314.keyboard.latin.settings.SubScreenFragment; import helium314.keyboard.latin.utils.ActivityThemeUtils; @@ -32,7 +33,7 @@ public final class SpellCheckerSettingsFragment extends SubScreenFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.spell_checker_settings); - mLookupContactsPreference = findPreference(AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY); + mLookupContactsPreference = findPreference(Settings.PREF_USE_CONTACTS); turnOffLookupContactsIfNoPermission(); ActivityThemeUtils.setActivityTheme(requireActivity()); @@ -40,7 +41,7 @@ public final class SpellCheckerSettingsFragment extends SubScreenFragment @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (!TextUtils.equals(key, AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY) || sharedPreferences.getBoolean(key, false)) { + if (!TextUtils.equals(key, Settings.PREF_USE_CONTACTS) || sharedPreferences.getBoolean(key, false)) { return; } diff --git a/app/src/main/res/xml/prefs_screen_correction.xml b/app/src/main/res/xml/prefs_screen_correction.xml index e35be0ca..33fc9b3b 100644 --- a/app/src/main/res/xml/prefs_screen_correction.xml +++ b/app/src/main/res/xml/prefs_screen_correction.xml @@ -100,10 +100,10 @@ android:persistent="true" /> + +