Fast progress

This commit is contained in:
Nehemiah of Zebulun 2023-08-25 16:45:45 +02:00
parent 40a21c6588
commit 0a39862571
8 changed files with 72 additions and 19 deletions

1
.idea/gradle.xml generated
View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings"> <component name="GradleSettings">
<option name="linkedExternalProjectsSettings"> <option name="linkedExternalProjectsSettings">
<GradleProjectSettings> <GradleProjectSettings>

1
.idea/misc.xml generated
View File

@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">

View File

@ -96,6 +96,8 @@ class WKT9: InputMethodService() {
inputMode = null inputMode = null
cursorPosition = 0 cursorPosition = 0
clearCandidates()
} }
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
@ -209,10 +211,8 @@ class WKT9: InputMethodService() {
return currentInputConnection?.setComposingText(text, cursorPosition) ?: false return currentInputConnection?.setComposingText(text, cursorPosition) ?: false
} }
private fun deleteText(beforeCursor: Int, afterCursor: Int): Boolean { private fun deleteText(beforeCursor: Int, afterCursor: Int) {
val cursorPosition = currentInputEditorInfo?.initialSelEnd ?: 0 currentInputConnection?.deleteSurroundingText(beforeCursor, afterCursor)
return commitText("", cursorPosition - beforeCursor, cursorPosition + afterCursor, 1)
} }
// Todo: inputType // Todo: inputType
@ -238,6 +238,8 @@ class WKT9: InputMethodService() {
if (res.startComposing) markComposingRegion() if (res.startComposing) markComposingRegion()
if (!res.codeWord.isNullOrEmpty()) onCodeWordUpdate(res.codeWord) if (!res.codeWord.isNullOrEmpty()) onCodeWordUpdate(res.codeWord)
if (!res.candidates.isNullOrEmpty()) onCandidates(res.candidates) if (!res.candidates.isNullOrEmpty()) onCandidates(res.candidates)
if (res.deleteBeforeCursor > 0 || res.deleteAfterCursor > 0) onDelete(res.deleteBeforeCursor, res.deleteAfterCursor)
if (res.left) onLeft()
if (res.right) onRight() if (res.right) onRight()
return res.consumed return res.consumed
@ -292,10 +294,33 @@ class WKT9: InputMethodService() {
} }
} }
private fun onDelete(beforeCursor: Int, afterCursor: Int) {
clearCandidates()
deleteText(beforeCursor, afterCursor)
}
private fun onLeft() {
if (candidates.isEmpty()) return
candidateIndex--
if (candidateIndex < 0) candidateIndex = candidates.count() - 1
clearCandidateUI()
loadCandidates(candidateIndex)
composeText(candidates[candidateIndex])
}
private fun onRight() { private fun onRight() {
if (candidates.isEmpty()) return if (candidates.isEmpty()) return
Log.d(tag, "Let's have some fun!!") candidateIndex++
if (candidateIndex >= candidates.count()) candidateIndex = 0
clearCandidateUI()
loadCandidates(candidateIndex)
composeText(candidates[candidateIndex])
} }
private suspend fun queryT9Candidates(codeWord: StringBuilder, limit: Int = 10): Boolean { private suspend fun queryT9Candidates(codeWord: StringBuilder, limit: Int = 10): Boolean {

View File

@ -6,6 +6,7 @@ import net.mezimmah.wkt9.keypad.Key
import net.mezimmah.wkt9.keypad.KeyCommandResolver import net.mezimmah.wkt9.keypad.KeyCommandResolver
import net.mezimmah.wkt9.keypad.KeyEventResult import net.mezimmah.wkt9.keypad.KeyEventResult
import java.lang.StringBuilder import java.lang.StringBuilder
import java.lang.annotation.Native
class WordInputMode: InputMode { class WordInputMode: InputMode {
private val tag = "WKT9" private val tag = "WKT9"
@ -21,8 +22,10 @@ class WordInputMode: InputMode {
return when(keyCommandResolver.getCommand(key)) { return when(keyCommandResolver.getCommand(key)) {
Command.CHARACTER -> buildCodeWord(key) Command.CHARACTER -> buildCodeWord(key)
// Command.SELECT -> true // Command.SELECT -> true
// Command.DELETE -> delete() Command.DELETE -> deleteCharacter()
Command.SPACE -> finalizeWordOrSentence() Command.SPACE -> finalizeWordOrSentence()
Command.LEFT -> navigateLeft()
Command.RIGHT -> navigateRight()
// Command.CYCLE_CANDIDATES -> cycleCandidates() // Command.CYCLE_CANDIDATES -> cycleCandidates()
else -> KeyEventResult() else -> KeyEventResult()
} }
@ -35,9 +38,10 @@ class WordInputMode: InputMode {
} }
override fun onKeyDownRepeatedly(key: Key, repeat: Int): KeyEventResult { override fun onKeyDownRepeatedly(key: Key, repeat: Int): KeyEventResult {
// Log.d(tag, "onKeyDownRepeatedly") return when(keyCommandResolver.getCommand(key, repeat = repeat)) {
Command.DELETE -> deleteCharacter(repeat)
return KeyEventResult() else -> KeyEventResult()
}
} }
override fun afterKeyDown(key: Key): KeyEventResult { override fun afterKeyDown(key: Key): KeyEventResult {
@ -64,8 +68,19 @@ class WordInputMode: InputMode {
) )
} }
private fun deleteCharacter(repeat: Int = 0): KeyEventResult {
if (repeat % 2 != 0) return KeyEventResult()
codeWord.clear()
return KeyEventResult(
finishComposing = true,
deleteBeforeCursor = 1
)
}
private fun finalizeWordOrSentence(): KeyEventResult { private fun finalizeWordOrSentence(): KeyEventResult {
if (!newKey) return KeyEventResult(right = true) if (!newKey) return navigateRight()
val finishComposing = codeWord.isNotEmpty() val finishComposing = codeWord.isNotEmpty()
@ -92,4 +107,12 @@ class WordInputMode: InputMode {
lastKey = key lastKey = key
} }
private fun navigateLeft(): KeyEventResult {
return KeyEventResult(left = true)
}
private fun navigateRight(): KeyEventResult {
return KeyEventResult(right = true)
}
} }

View File

@ -11,6 +11,8 @@ enum class Command {
SHIFT_MODE, SHIFT_MODE,
SWITCH_MODE, SWITCH_MODE,
NAVIGATE, NAVIGATE,
RIGHT,
LEFT,
RECORD, RECORD,
TRANSCRIBE TRANSCRIBE
} }

View File

@ -39,12 +39,12 @@ class KeyCommandResolver (
Key.N8 to Command.CHARACTER, Key.N8 to Command.CHARACTER,
Key.N9 to Command.CHARACTER, Key.N9 to Command.CHARACTER,
Key.LEFT to Command.NAVIGATE, Key.LEFT to Command.LEFT,
Key.RIGHT to Command.NAVIGATE, Key.RIGHT to Command.RIGHT,
Key.UP to Command.NAVIGATE, Key.UP to Command.NAVIGATE,
Key.DOWN to Command.NAVIGATE, Key.DOWN to Command.NAVIGATE,
Key.STAR to Command.CYCLE_CANDIDATES, Key.STAR to Command.DELETE,
Key.DELETE to Command.DELETE, Key.DELETE to Command.DELETE,
Key.SELECT to Command.SELECT Key.SELECT to Command.SELECT
)), )),
@ -70,12 +70,11 @@ class KeyCommandResolver (
)), )),
afterLong = HashMap(mapOf( afterLong = HashMap(mapOf(
Key.DELETE to Command.DELETE,
Key.SELECT to Command.TRANSCRIBE, Key.SELECT to Command.TRANSCRIBE,
)), )),
onRepeat = HashMap(mapOf( onRepeat = HashMap(mapOf(
Key.DELETE to Command.DELETE, Key.STAR to Command.DELETE,
)) ))
) )
} }

View File

@ -8,5 +8,8 @@ data class KeyEventResult(
val startComposing: Boolean = false, val startComposing: Boolean = false,
val codeWord: StringBuilder? = null, val codeWord: StringBuilder? = null,
val candidates: List<String>? = null, val candidates: List<String>? = null,
val deleteBeforeCursor: Int = 0,
val deleteAfterCursor: Int = 0,
val left: Boolean = false,
val right: Boolean = false val right: Boolean = false
) )

View File

@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<TextView <TextView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/current_suggestion" android:id="@+id/suggestion"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginRight="2dp"
android:padding="8dp" android:padding="8dp"
android:background="@drawable/suggestion_current_border" android:background="@drawable/suggestion_current_border"
android:textFontWeight="600" android:textFontWeight="600"
android:textSize="20dp" android:textSize="20sp"
android:minWidth="40dp"
android:textAlignment="center"
android:textColor="@color/current_suggestion" /> android:textColor="@color/current_suggestion" />