This commit is contained in:
zb
2023-08-31 10:02:01 +02:00
parent cb250e64de
commit f805d8dcf3
4 changed files with 64 additions and 82 deletions

View File

@@ -7,7 +7,7 @@ data class KeyEventResult(
val consumed: Boolean = true,
val finishComposing: Boolean = false,
val startComposing: Boolean = false,
val trackCommits: Boolean = false,
val increaseWeight: Boolean = false,
val codeWord: StringBuilder? = null,
val candidates: List<String>? = null,
val commit: String? = null,

View File

@@ -6,41 +6,36 @@ import java.lang.StringBuilder
class Keypad(
private val keyCodeMapping: KeyCodeMapping,
private val letterLayout: Map<Key, List<Char>>
private val letterLayout: Map<Key, List<Char>>,
numericLayout: Map<Key, Int>
) {
private lateinit var letterKeyMap: Map<Char, Key>
private lateinit var keyIsLetterMap: Map<Key, Boolean>
private var emojiCodes = mapOf(
"❤️" to "143278",
"\uD83D\uDE18" to "15477"
)
private val tag = "WKT9"
private val letterCodeMap: MutableMap<Char, Int> = mutableMapOf()
init {
initKeyMaps(letterLayout)
Log.d(tag, "Keypad")
numericLayout.forEach { (key, code) ->
indexKeyLetters(key, code)
}
}
fun getKey(keyCode: Int): Key? {
return keyCodeMapping.key(keyCode)
private fun indexKeyLetters(key: Key, code: Int) {
letterLayout[key]?.map { letter ->
letterCodeMap[letter] = code
}
}
fun getCharacter(key: Key, idx: Int): Char {
val chars = letterLayout[key]!!
val length = chars.size
val wrappedIdx = idx % (length - 1) + 1
return chars[wrappedIdx]
}
fun getDigit(key: Key): Char? {
val letters = letterLayout[key] ?: return null
return if (letters.isNotEmpty() && letters[0].isDigit()) letters[0] else null
fun getKey(code: Int): Key? {
return keyCodeMapping.key(code)
}
fun getCodeForWord(word: String): String {
if (emojiCodes.keys.contains(word)) return emojiCodes[word]!!
val builder = StringBuilder()
val normalized = word.lowercase()
for (letter in word) {
for (letter in normalized) {
val code = codeForLetter(letter) ?: throw MissingLetterCode("No code found for '$letter'")
builder.append(code)
@@ -49,29 +44,7 @@ class Keypad(
return builder.toString()
}
private fun codeForLetter(letter: Char): Char? {
Log.d("wkt9", "Letter key map: letterKeyMap")
return ' ' //letterKeyMap[letter]?.code
}
private fun initKeyMaps(layout: Map<Key, List<Char>>): Map<Char, Key> {
val letterKeyMap = HashMap<Char, Key>()
val keyIsLetterMap = HashMap<Key, Boolean>()
this.letterKeyMap = letterKeyMap
this.keyIsLetterMap = keyIsLetterMap
for ((key, characters) in layout) {
for (char in characters) {
letterKeyMap[char] = key
if (!KeyLayout.nonAlphaNumeric.contains(char)) {
letterKeyMap[char.uppercaseChar()] = key
keyIsLetterMap[key] = true
} else if (keyIsLetterMap[key] == null) keyIsLetterMap[key] = false
}
}
return letterKeyMap
private fun codeForLetter(letter: Char): Int? {
return letterCodeMap[letter]
}
}