diff --git a/app/src/main/java/net/mezimmah/wkt9/WKT9.kt b/app/src/main/java/net/mezimmah/wkt9/WKT9.kt index c2cbf5a..d13abef 100644 --- a/app/src/main/java/net/mezimmah/wkt9/WKT9.kt +++ b/app/src/main/java/net/mezimmah/wkt9/WKT9.kt @@ -17,6 +17,8 @@ import android.view.inputmethod.InputMethodManager import android.view.textservice.SentenceSuggestionsInfo import android.view.textservice.SpellCheckerSession import android.view.textservice.SuggestionsInfo +import android.view.textservice.TextInfo +import android.view.textservice.TextServicesManager import android.widget.LinearLayout import android.widget.TextView import android.widget.Toast @@ -47,11 +49,6 @@ import okio.IOException import java.io.File import java.util.Locale - -//val info = arrayOf(TextInfo("banan#", 0, 6, 0, 0)) -// -//spellCheckerSession?.getSentenceSuggestions(info, 10) - class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListener { private val tag = "WKT9" @@ -210,10 +207,8 @@ class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListene val inputClass = inputType?.and(InputType.TYPE_MASK_CLASS) ?: 0 val typeVariation = inputType?.and(InputType.TYPE_MASK_VARIATION) ?: 0 val typeFlags = inputType?.and(InputType.TYPE_MASK_FLAGS) ?: 0 -// val textServiceManager = getSystemService(TEXT_SERVICES_MANAGER_SERVICE) as TextServicesManager cursorPosition = attribute?.initialSelEnd ?: 0 -// spellCheckerSession = textServiceManager.newSpellCheckerSession(null, locale, this, false) val forceNumeric = resources.getStringArray(R.array.input_mode_numeric) @@ -259,14 +254,18 @@ class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListene } override fun onGetSentenceSuggestions(suggestionsInfo: Array?) { + clearCandidates() + suggestionsInfo?.map { val suggestions = it.getSuggestionsInfoAt(0) for (index in 0 until suggestions.suggestionsCount) { val suggestion = suggestions.getSuggestionAt(index) - Log.d(tag, "Suggestion: $suggestion") + candidates.add(suggestion) } + + if (candidates.isNotEmpty()) loadCandidates() } } @@ -344,28 +343,41 @@ class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListene InputType.TYPE_TEXT_VARIATION_PERSON_NAME ) - if (letterVariations.contains(variation)) { + val mode: WKT9InputMode = if (letterVariations.contains(variation)) { allowSuggestions = false - enableInputMode(WKT9InputMode.ALPHA) + WKT9InputMode.ALPHA } else if (lastInputMode == WKT9InputMode.ALPHA) { allowSuggestions = flags != InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS - enableInputMode(WKT9InputMode.ALPHA) - } else enableInputMode(WKT9InputMode.WORD) + WKT9InputMode.ALPHA + } else { + allowSuggestions = flags != InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS + + WKT9InputMode.WORD + } + + spellCheckerSession = if (allowSuggestions) { + val textServiceManager = getSystemService(TEXT_SERVICES_MANAGER_SERVICE) as TextServicesManager + + textServiceManager.newSpellCheckerSession(null, locale, this, false) + } else { + spellCheckerSession?.apply { + cancel() + close() + } + + null + } + + enableInputMode(mode) } private fun finishComposingText(): Boolean { return if (composing) { composing = false - lastComposedString?.let { - commitHistory.add(it) - - lastComposedString = null - } - - if (allowSuggestions) Log.d(tag, "History: $commitHistory") + if (allowSuggestions && inputMode is AlphaInputMode) handleSuggestions() updateInputStatus() @@ -373,6 +385,28 @@ class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListene } else false } + private fun handleSuggestions() { + val lastComposed = lastComposedString ?: return + val lastChar = lastComposed.lowercase().last() + val code = keypad.codeForLetter(lastChar) + + if (lastComposed.length != 1 || code == null) { + commitHistory.clear() + + return + } + + commitHistory.add(lastComposed) + + loadSuggestions(commitHistory.joinToString("")) + } + + private fun loadSuggestions(word: String) { + val info = arrayOf(TextInfo(word.plus("#"), 0, word.length + 1, 0, 0)) + + spellCheckerSession?.getSentenceSuggestions(info, 10) + } + @SuppressLint("DiscouragedApi") private fun getIconResource(): Int { val mode = inputMode?.mode ?: return resources.getIdentifier("wkt9", "drawable", packageName) @@ -447,11 +481,11 @@ class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListene return false } - private fun loadCandidates(highLight: Int? = null) { + private fun loadCandidates() { val candidatesView = inputView?.findViewById(R.id.suggestions) ?: return candidates.forEachIndexed { index, candidate -> - val layout = if (index == highLight) R.layout.current_suggestion else R.layout.suggestion + val layout = if (index == candidateIndex) R.layout.current_suggestion else R.layout.suggestion val candidateView = layoutInflater.inflate(layout, null) val textView = candidateView.findViewById(R.id.suggestion_text) @@ -486,7 +520,7 @@ class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListene this.candidates.add(candidate) } - loadCandidates(candidateIndex) + loadCandidates() composeText(this.candidates[candidateIndex]) handleComposeTimeout(timeout) } @@ -500,7 +534,7 @@ class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListene if (!hasCandidates) return@launch - loadCandidates(candidateIndex) + loadCandidates() composeText(candidates[candidateIndex], 1) handleComposeTimeout(timeout) } @@ -582,7 +616,7 @@ class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListene if (candidateIndex < 0) candidateIndex = candidates.count() - 1 clearCandidateUI() - loadCandidates(candidateIndex) + loadCandidates() composeText(candidates[candidateIndex]) handleComposeTimeout(this.timeout) } @@ -632,7 +666,7 @@ class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListene if (candidateIndex >= candidates.count()) candidateIndex = 0 clearCandidateUI() - loadCandidates(candidateIndex) + loadCandidates() composeText(candidates[candidateIndex]) handleComposeTimeout(this.timeout) } @@ -701,7 +735,7 @@ class WKT9: InputMethodService(), SpellCheckerSession.SpellCheckerSessionListene } showStatusIcon(getIconResource()) - loadCandidates(candidateIndex) + loadCandidates() composeText(candidates[candidateIndex]) } diff --git a/app/src/main/java/net/mezimmah/wkt9/keypad/Keypad.kt b/app/src/main/java/net/mezimmah/wkt9/keypad/Keypad.kt index ca1c1a6..fbbeb08 100644 --- a/app/src/main/java/net/mezimmah/wkt9/keypad/Keypad.kt +++ b/app/src/main/java/net/mezimmah/wkt9/keypad/Keypad.kt @@ -44,7 +44,7 @@ class Keypad( return builder.toString() } - private fun codeForLetter(letter: Char): Int? { + fun codeForLetter(letter: Char): Int? { return letterCodeMap[letter] } } \ No newline at end of file