diff --git a/java/res/values/strings-uix.xml b/java/res/values/strings-uix.xml
index d69782d46d..2f8458f774 100644
--- a/java/res/values/strings-uix.xml
+++ b/java/res/values/strings-uix.xml
@@ -182,9 +182,14 @@
Update
+ Manage the word \"%s\"
Blacklist the word \"%s\" from being suggested?
+ Add to dictionary
+
Blacklist
+ Added to dictionary
+ Already in dictionary
Disable emoji suggestions
diff --git a/java/src/org/futo/inputmethod/latin/LatinIME.kt b/java/src/org/futo/inputmethod/latin/LatinIME.kt
index 44243e6c35..e788253426 100644
--- a/java/src/org/futo/inputmethod/latin/LatinIME.kt
+++ b/java/src/org/futo/inputmethod/latin/LatinIME.kt
@@ -9,7 +9,9 @@ import android.graphics.Color
import android.inputmethodservice.InputMethodService
import android.os.Build
import android.os.Bundle
+import android.provider.UserDictionary
import android.util.Log
+import android.widget.Toast
import android.view.KeyEvent
import android.view.View
import android.view.ViewGroup
@@ -56,6 +58,7 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.futo.inputmethod.accessibility.AccessibilityUtils
+import org.futo.inputmethod.compat.UserDictionaryCompatUtils
import org.futo.inputmethod.engine.ExpandableSuggestionBarConfiguration
import org.futo.inputmethod.engine.IMEManager
import org.futo.inputmethod.engine.general.WordLearner
@@ -837,6 +840,41 @@ class LatinIME : InputMethodServiceCompose(), LatinIMELegacy.SuggestionStripCont
uixManager.requestForgetWord(suggestedWordInfo)
}
+ fun addSuggestedWordToDictionary(suggestedWordInfo: SuggestedWordInfo) = lifecycleScope.launch {
+ val word = suggestedWordInfo.mWord
+ val settings = Settings.getInstance().current
+ val locale = settings.mLocale
+ val wasAdded = withContext(Dispatchers.Default) {
+ val selection = "${UserDictionary.Words.WORD}=? AND ${UserDictionary.Words.LOCALE}=?" +
+ " AND (${UserDictionary.Words.SHORTCUT} is null OR ${UserDictionary.Words.SHORTCUT}='')"
+ val alreadyPresent = contentResolver.query(
+ UserDictionary.Words.CONTENT_URI,
+ arrayOf(UserDictionary.Words.WORD),
+ selection,
+ arrayOf(word, locale.toString()),
+ null
+ )?.use { it.moveToFirst() } == true
+
+ if (!alreadyPresent) {
+ UserDictionaryCompatUtils.addWord(this@LatinIME, word, 250, null, locale)
+ }
+
+ !alreadyPresent
+ }
+
+ if (wasAdded) {
+ imeManager.getActiveIME(settings).requestSuggestionRefresh()
+ }
+ Toast.makeText(
+ this@LatinIME,
+ getString(
+ if (wasAdded) R.string.keyboard_suggest_added_to_dictionary
+ else R.string.keyboard_suggest_already_in_dictionary
+ ),
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+
fun blacklistWord(suggestedWordInfo: SuggestedWordInfo?) = lifecycleScope.launch {
val word = suggestedWordInfo?.mWord
if(word != null) {
diff --git a/java/src/org/futo/inputmethod/latin/uix/UixManager.kt b/java/src/org/futo/inputmethod/latin/uix/UixManager.kt
index 6191a1e09c..01e04724e2 100644
--- a/java/src/org/futo/inputmethod/latin/uix/UixManager.kt
+++ b/java/src/org/futo/inputmethod/latin/uix/UixManager.kt
@@ -1503,23 +1503,34 @@ class UixManager(private val latinIME: LatinIME) {
}
fun requestForgetWord(suggestedWordInfo: SuggestedWords.SuggestedWordInfo) {
+ val isEmojiSuggestion = suggestedWordInfo.mKindAndFlags == SuggestedWordInfo.KIND_EMOJI_SUGGESTION
keyboardManagerForAction.requestDialog(
- latinIME.getString(R.string.keyboard_suggest_blacklist_body, suggestedWordInfo.mWord),
- listOf(
- DialogRequestItem(latinIME.getString(R.string.cancel)) { },
- DialogRequestItem(latinIME.getString(R.string.keyboard_suggest_add_word_to_blacklist)) {
- latinIME.blacklistWord(suggestedWordInfo)
- },
- ) + if(suggestedWordInfo.mKindAndFlags == SuggestedWordInfo.KIND_EMOJI_SUGGESTION) {
- listOf(
- DialogRequestItem(latinIME.getString(R.string.keyboard_suggest_disable_emojis)) {
- runBlocking { latinIME.setSetting(SHOW_EMOJI_SUGGESTIONS, false) }
- latinIME.blacklistWord(null)
- }
- )
- } else {
- listOf()
- }
+ latinIME.getString(
+ if (isEmojiSuggestion) R.string.keyboard_suggest_blacklist_body
+ else R.string.keyboard_suggest_manage_word_body,
+ suggestedWordInfo.mWord
+ ),
+ listOf(DialogRequestItem(latinIME.getString(R.string.cancel)) { }) +
+ if (isEmojiSuggestion) {
+ listOf(
+ DialogRequestItem(latinIME.getString(R.string.keyboard_suggest_add_word_to_blacklist)) {
+ latinIME.blacklistWord(suggestedWordInfo)
+ },
+ DialogRequestItem(latinIME.getString(R.string.keyboard_suggest_disable_emojis)) {
+ runBlocking { latinIME.setSetting(SHOW_EMOJI_SUGGESTIONS, false) }
+ latinIME.blacklistWord(null)
+ }
+ )
+ } else {
+ listOf(
+ DialogRequestItem(latinIME.getString(R.string.keyboard_suggest_add_to_dictionary)) {
+ latinIME.addSuggestedWordToDictionary(suggestedWordInfo)
+ },
+ DialogRequestItem(latinIME.getString(R.string.keyboard_suggest_add_word_to_blacklist)) {
+ latinIME.blacklistWord(suggestedWordInfo)
+ }
+ )
+ }
) { }
val v = latinIME.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator?