diff --git a/app/src/main/java/net/mezimmah/wkt9/inputmode/BaseInputMode.kt b/app/src/main/java/net/mezimmah/wkt9/inputmode/BaseInputMode.kt new file mode 100644 index 0000000..90d41ef --- /dev/null +++ b/app/src/main/java/net/mezimmah/wkt9/inputmode/BaseInputMode.kt @@ -0,0 +1,153 @@ +package net.mezimmah.wkt9.inputmode + +import net.mezimmah.wkt9.keypad.Key +import net.mezimmah.wkt9.keypad.KeyCommandResolver +import net.mezimmah.wkt9.keypad.KeyEventResult +import net.mezimmah.wkt9.keypad.KeyLayout + +open class BaseInputMode: InputMode { + protected val keyCommandResolver: KeyCommandResolver = KeyCommandResolver.getBasic() + protected var newKey = true + protected var keyIndex = 0 + protected var lastKey: Key? = null + + override lateinit var mode: String + protected set + + override lateinit var status: Status + protected set + + override fun onKeyDown(key: Key, composing: Boolean): KeyEventResult { + keyStats(key) + + return KeyEventResult() + } + + override fun onKeyLongDown(key: Key, composing: Boolean): KeyEventResult { + return KeyEventResult() + } + + override fun onKeyDownRepeatedly(key: Key, repeat: Int, composing: Boolean): KeyEventResult { + return KeyEventResult() + } + + override fun afterKeyDown(key: Key, composing: Boolean): KeyEventResult { + return KeyEventResult() + } + + override fun afterKeyLongDown(key: Key, keyDownMS: Long, composing: Boolean): KeyEventResult { + return KeyEventResult() + } + + protected open fun commitNumber(key: Key, composing: Boolean): KeyEventResult { + val number = KeyLayout.numeric[key] ?: return KeyEventResult(true) + + return KeyEventResult( + consumed = true, + finishComposing = composing, + commit = number.toString() + ) + } + + protected open fun deleteCharacter(repeat: Int = 0, composing: Boolean): KeyEventResult { + return KeyEventResult( + finishComposing = composing, + deleteBeforeCursor = 1 + ) + } + + protected open fun finalizeWordOrSentence(composing: Boolean): KeyEventResult { + if (composing && !newKey) return navigateRight() + + return KeyEventResult( + finishComposing = composing, + startComposing = true, + candidates = listOf(" ", ". ", "? ", "! ", ", ", ": ", "; "), + timeout = 700 + ) + } + + protected fun focus(): KeyEventResult { + return KeyEventResult( + consumed = true, + focus = true + ) + } + + protected fun functionMode(): KeyEventResult { + return KeyEventResult( + consumed = true, + functionMode = true + ) + } + + protected open fun goBack(composing: Boolean): KeyEventResult { + return KeyEventResult( + consumed = false, + finishComposing = composing + ) + } + + protected open fun goHome(repeat: Int, composing: Boolean): KeyEventResult { + if (repeat > 1) return KeyEventResult(true) + + return KeyEventResult( + consumed = true, + finishComposing = composing, + goHome = true + ) + } + + protected open fun navigateLeft(): KeyEventResult { + return KeyEventResult( + consumed = true, + left = true + ) + } + + protected open fun navigateRight(): KeyEventResult { + return KeyEventResult( + consumed = true, + right = true + ) + } + + protected open fun record(composing: Boolean): KeyEventResult { + return KeyEventResult( + consumed = true, + finishComposing = composing, + record = true + ) + } + + protected open fun switchMode(composing: Boolean): KeyEventResult { + return KeyEventResult( + consumed = true, + finishComposing = composing, + switchInputMode = WKT9InputMode.ALPHA + ) + } + + protected fun transcribe(composing: Boolean): KeyEventResult { + return KeyEventResult( + consumed = true, + finishComposing = composing, + transcribe = true + ) + } + + private fun keyStats(key: Key) { + when (key != lastKey) { + true -> { + newKey = true + keyIndex = 0 + } + false -> { + newKey = false + keyIndex++ + } + } + + lastKey = key + } +} \ No newline at end of file diff --git a/app/src/main/java/net/mezimmah/wkt9/inputmode/WordInputMode.kt b/app/src/main/java/net/mezimmah/wkt9/inputmode/WordInputMode.kt index 5857597..ecfc1c2 100644 --- a/app/src/main/java/net/mezimmah/wkt9/inputmode/WordInputMode.kt +++ b/app/src/main/java/net/mezimmah/wkt9/inputmode/WordInputMode.kt @@ -3,30 +3,23 @@ package net.mezimmah.wkt9.inputmode import android.util.Log import net.mezimmah.wkt9.keypad.Command import net.mezimmah.wkt9.keypad.Key -import net.mezimmah.wkt9.keypad.KeyCommandResolver import net.mezimmah.wkt9.keypad.KeyEventResult import net.mezimmah.wkt9.keypad.KeyLayout import java.lang.StringBuilder -class WordInputMode: InputMode { +class WordInputMode: BaseInputMode() { private val tag = "WKT9" - private val keyCommandResolver: KeyCommandResolver = KeyCommandResolver.getBasic() private val codeWord = StringBuilder() - private var newKey = true - private var keyIndex = 0 - private var lastKey: Key? = null - - override val mode: String = "word" - - override var status: Status = Status.CAP - private set init { - Log.d(tag, "Started word input mode.") + mode = "word" + status = Status.CAP + + Log.d(tag, "Started $mode input mode.") } override fun onKeyDown(key: Key, composing: Boolean): KeyEventResult { - keyStats(key) + super.onKeyDown(key, composing) return when(keyCommandResolver.getCommand(key)) { Command.BACK -> KeyEventResult(consumed = false) @@ -73,6 +66,42 @@ class WordInputMode: InputMode { } } + override fun deleteCharacter(repeat: Int, composing: Boolean): KeyEventResult { + if (repeat == 0) codeWord.clear() + + return super.deleteCharacter(repeat, composing) + } + + override fun finalizeWordOrSentence(composing: Boolean): KeyEventResult { + codeWord.clear() + + return super.finalizeWordOrSentence(composing) + } + + override fun goBack(composing: Boolean): KeyEventResult { + reset() + + return super.goBack(composing) + } + + override fun goHome(repeat: Int, composing: Boolean): KeyEventResult { + reset() + + return super.goHome(repeat, composing) + } + + override fun record(composing: Boolean): KeyEventResult { + codeWord.clear() + + return super.record(composing) + } + + override fun switchMode(composing: Boolean): KeyEventResult { + reset() + + return super.switchMode(composing) + } + private fun buildCodeWord(key: Key, composing: Boolean): KeyEventResult { val startComposing = codeWord.isEmpty() val code = KeyLayout.numeric[key] @@ -86,109 +115,6 @@ class WordInputMode: InputMode { ) } - private fun commitNumber(key: Key, composing: Boolean): KeyEventResult { - val number = KeyLayout.numeric[key] ?: return KeyEventResult(true) - - return KeyEventResult( - consumed = true, - finishComposing = composing, - commit = number.toString() - ) - } - - private fun deleteCharacter(repeat: Int = 0, composing: Boolean): KeyEventResult { - if (repeat == 0) codeWord.clear() - - return KeyEventResult( - finishComposing = composing, - deleteBeforeCursor = 1 - ) - } - - private fun finalizeWordOrSentence(composing: Boolean): KeyEventResult { - if (composing && !newKey) return navigateRight() - - val finishComposing = codeWord.isNotEmpty() && composing - - codeWord.clear() - - return KeyEventResult( - finishComposing = finishComposing, - startComposing = true, - increaseWeight = true, - candidates = listOf(" ", ". ", "? ", "! ", ", ", ": ", "; "), - timeout = 700 - ) - } - - private fun focus(): KeyEventResult { - return KeyEventResult( - consumed = true, - focus = true - ) - } - - private fun functionMode(): KeyEventResult { - return KeyEventResult( - consumed = true, - functionMode = true - ) - } - - private fun goBack(composing: Boolean): KeyEventResult { - reset() - - return KeyEventResult( - consumed = false, - finishComposing = composing - ) - } - - private fun goHome(repeat: Int, composing: Boolean): KeyEventResult { - if (repeat > 1) return KeyEventResult(true) - - reset() - - return KeyEventResult( - consumed = true, - finishComposing = composing, - goHome = true - ) - } - - private fun keyStats(key: Key) { - when (key != lastKey) { - true -> { - newKey = true - keyIndex = 0 - } - false -> { - newKey = false - keyIndex++ - } - } - - lastKey = key - } - - private fun navigateLeft(): KeyEventResult { - return KeyEventResult(left = true) - } - - private fun navigateRight(): KeyEventResult { - return KeyEventResult(right = true) - } - - private fun record(composing: Boolean): KeyEventResult { - codeWord.clear() - - return KeyEventResult( - consumed = true, - finishComposing = composing, - record = true - ) - } - private fun reset() { codeWord.clear() newKey = true @@ -211,22 +137,4 @@ class WordInputMode: InputMode { updateWordStatus = composing ) } - - private fun switchMode(composing: Boolean): KeyEventResult { - reset() - - return KeyEventResult( - consumed = true, - finishComposing = composing, - switchInputMode = WKT9InputMode.ALPHA - ) - } - - private fun transcribe(composing: Boolean): KeyEventResult { - return KeyEventResult( - consumed = true, - finishComposing = composing, - transcribe = true - ) - } } \ No newline at end of file