From 23cccf2455abfde550494f4480fe27b717115cba Mon Sep 17 00:00:00 2001 From: Nehemiah Date: Mon, 4 Dec 2023 05:48:46 -0500 Subject: [PATCH] Get sentence position of cursor --- .../wkt9/inputhandler/DefaultInputHandler.kt | 36 ++++--- .../wkt9/inputhandler/LetterInputHandler.kt | 102 +++++++++--------- .../wkt9/inputhandler/WordInputHandler.kt | 6 ++ .../java/net/mezimmah/wkt9/keypad/Command.kt | 1 + .../main/java/net/mezimmah/wkt9/keypad/Key.kt | 6 ++ 5 files changed, 89 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/net/mezimmah/wkt9/inputhandler/DefaultInputHandler.kt b/app/src/main/java/net/mezimmah/wkt9/inputhandler/DefaultInputHandler.kt index 69c07c2..746e840 100644 --- a/app/src/main/java/net/mezimmah/wkt9/inputhandler/DefaultInputHandler.kt +++ b/app/src/main/java/net/mezimmah/wkt9/inputhandler/DefaultInputHandler.kt @@ -29,18 +29,7 @@ open class DefaultInputHandler( protected var sentenceStart: Boolean = false init { - val textBeforeCursor = getTextBeforeCursor(15) - - if ( - textBeforeCursor.isNullOrEmpty() || - textBeforeCursor.trim().isEmpty() || - sentenceDelimiters.contains(textBeforeCursor.trim().last()) - ) { - sentenceStart = true - wordStart = true - } else if (wordDelimiters.contains(textBeforeCursor.last())) { - wordStart = true - } + setCursorPositionStatus() wkt9.currentInputEditorInfo?.let { val inputType = it.inputType @@ -99,7 +88,26 @@ open class DefaultInputHandler( triggerKeyEvent(key.keyCode) } - protected fun getTextBeforeCursor(count: Int): CharSequence? { - return wkt9.currentInputConnection?.getTextBeforeCursor(count, 0) + protected fun setCursorPositionStatus() { + val textBeforeCursor = getTextBeforeCursor() + + if ( + textBeforeCursor.isNullOrEmpty() || + textBeforeCursor.trim().isEmpty() || + sentenceDelimiters.contains(textBeforeCursor.trim().last()) + ) { + sentenceStart = true + wordStart = true + } else if (wordDelimiters.contains(textBeforeCursor.last())) { + sentenceStart = false + wordStart = true + } else { + sentenceStart = false + wordStart = false + } + } + + private fun getTextBeforeCursor(): CharSequence? { + return wkt9.currentInputConnection?.getTextBeforeCursor(15, 0) } } \ No newline at end of file diff --git a/app/src/main/java/net/mezimmah/wkt9/inputhandler/LetterInputHandler.kt b/app/src/main/java/net/mezimmah/wkt9/inputhandler/LetterInputHandler.kt index 8326e5f..306d29f 100644 --- a/app/src/main/java/net/mezimmah/wkt9/inputhandler/LetterInputHandler.kt +++ b/app/src/main/java/net/mezimmah/wkt9/inputhandler/LetterInputHandler.kt @@ -59,64 +59,22 @@ class LetterInputHandler( updateIcon() } - private fun finalizeWordOrSentence(stats: KeyEventStat) { - if (word.isNotEmpty()) storeWord() + override fun onDeleteWord(word: Word) {} - timeoutJob?.cancel() + override fun onGetSuggestions(results: Array?) {} - val index = stats.repeats % punctuationMarks.count() - val lastIndex = if (stats.repeats > 0) (stats.repeats - 1) % punctuationMarks.count() else null - var beforeCursor = 0 - - if (lastIndex != null) beforeCursor += punctuationMarks[lastIndex].length - - wordStart = true - sentenceStart = index in 1..3 - - wkt9.onCommit(punctuationMarks[index], beforeCursor) - updateIcon() - } - - private fun storeWord() { - val str = word.toString() - val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) - - word.clear() - - scope.launch { - val word = Word( - word = str, - code = keypad.getCodeForWord(str), - weight = 0, - length = str.length, - locale = locale.language - ) - val result = wordDao.selectWord(str, locale.language) - - if (result == null) wordDao.insert(word) - } - } + override fun onFinishComposing() {} + override fun onGetSentenceSuggestions(results: Array?) {} override fun onSwitchLocale(locale: Locale) { this.locale = locale } - - override fun onDeleteWord(word: Word) {} - override fun onGetSuggestions(results: Array?) {} - override fun onGetSentenceSuggestions(results: Array?) {} - override fun onFinishComposing() {} - - override fun toggleCapMode(key: Key) { - super.toggleCapMode(key) - - updateIcon() - } - override fun onRunCommand(command: Command, key: Key, event: KeyEvent, stats: KeyEventStat) { when (command) { Command.CAP_MODE -> toggleCapMode(key) Command.CHARACTER -> composeCharacter(key) Command.DELETE -> delete() + Command.FINISH_DELETE -> finishDelete() Command.INPUT_MODE -> inputMode(key) Command.NUMBER -> triggerOriginalKeyEvent(key) // Command.RECORD -> wkt9.onRecord(true) @@ -125,9 +83,14 @@ class LetterInputHandler( else -> Log.d(tag, "Command not implemented: $command") } } - override fun onWordSelected(word: Word) {} + override fun toggleCapMode(key: Key) { + super.toggleCapMode(key) + + updateIcon() + } + private fun composeCharacter(key: Key) { val composing = timeoutJob?.isActive ?: false @@ -157,11 +120,54 @@ class LetterInputHandler( setComposeTimeout() } + private fun finalizeWordOrSentence(stats: KeyEventStat) { + if (word.isNotEmpty()) storeWord() + + timeoutJob?.cancel() + + val index = stats.repeats % punctuationMarks.count() + val lastIndex = if (stats.repeats > 0) (stats.repeats - 1) % punctuationMarks.count() else null + var beforeCursor = 0 + + if (lastIndex != null) beforeCursor += punctuationMarks[lastIndex].length + + wordStart = true + sentenceStart = index in 1..3 + + wkt9.onCommit(punctuationMarks[index], beforeCursor) + updateIcon() + } + + private fun finishDelete() { + setCursorPositionStatus() + updateIcon() + } + private fun resetKey(key: Key? = null) { lastKey = key repeats = 0 } + private fun storeWord() { + val str = word.toString() + val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) + + word.clear() + + scope.launch { + val word = Word( + word = str, + code = keypad.getCodeForWord(str), + weight = 0, + length = str.length, + locale = locale.language + ) + val result = wordDao.selectWord(str, locale.language) + + if (result == null) wordDao.insert(word) + } + } + private fun finishComposingChar() { wkt9.onCommit() diff --git a/app/src/main/java/net/mezimmah/wkt9/inputhandler/WordInputHandler.kt b/app/src/main/java/net/mezimmah/wkt9/inputhandler/WordInputHandler.kt index 8ce36d8..d6a5c24 100644 --- a/app/src/main/java/net/mezimmah/wkt9/inputhandler/WordInputHandler.kt +++ b/app/src/main/java/net/mezimmah/wkt9/inputhandler/WordInputHandler.kt @@ -90,6 +90,7 @@ class WordInputHandler( Command.CHARACTER -> buildCodeword(key) Command.DELETE -> delete(event.repeatCount) Command.ENTER -> enter(key) + Command.FINISH_DELETE -> finishDelete() Command.INPUT_MODE -> inputMode(key) Command.MOVE_CURSOR -> moveCursor(key) Command.NUMBER -> triggerOriginalKeyEvent(key) @@ -131,6 +132,11 @@ class WordInputHandler( } } + private fun finishDelete() { + setCursorPositionStatus() + updateIcon() + } + private fun enter(key: Key) { if (codeword.isNotEmpty()) wkt9.onCommit("") else triggerOriginalKeyEvent(key) diff --git a/app/src/main/java/net/mezimmah/wkt9/keypad/Command.kt b/app/src/main/java/net/mezimmah/wkt9/keypad/Command.kt index 3e79ced..990cc53 100644 --- a/app/src/main/java/net/mezimmah/wkt9/keypad/Command.kt +++ b/app/src/main/java/net/mezimmah/wkt9/keypad/Command.kt @@ -7,6 +7,7 @@ enum class Command { DELETE, DIAL, ENTER, + FINISH_DELETE, INPUT_MODE, MOVE_CURSOR, NUMBER, diff --git a/app/src/main/java/net/mezimmah/wkt9/keypad/Key.kt b/app/src/main/java/net/mezimmah/wkt9/keypad/Key.kt index e9fb1c5..799f800 100644 --- a/app/src/main/java/net/mezimmah/wkt9/keypad/Key.kt +++ b/app/src/main/java/net/mezimmah/wkt9/keypad/Key.kt @@ -388,6 +388,12 @@ enum class Key( command = Command.DELETE ), + CommandMapping( + events = listOf(Event.afterShortDown, Event.afterLongDown), + inputModes = listOf(InputMode.Word, InputMode.Letter), + command = Command.FINISH_DELETE + ), + CommandMapping( inputModes = listOf(InputMode.Number), overrideConsume = true,