This commit is contained in:
zb
2023-08-24 21:09:06 +02:00
commit 40a21c6588
67 changed files with 81748 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
package net.mezimmah.wkt9.keypad
import net.mezimmah.wkt9.exception.MissingLetterCode
import java.lang.StringBuilder
class Keypad(
private val keyCodeMapping: KeyCodeMapping,
private val letterLayout: Map<Key, List<Char>>
) {
private lateinit var letterKeyMap: Map<Char, Key>
private lateinit var keyIsLetterMap: Map<Key, Boolean>
private var emojiCodes = mapOf(
"❤️" to "143278",
"\uD83D\uDE18" to "15477"
)
init {
initKeyMaps(letterLayout)
}
fun getKey(keyCode: Int): Key? {
return keyCodeMapping.key(keyCode)
}
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 getCodeForWord(word: String): String {
if (emojiCodes.keys.contains(word)) return emojiCodes[word]!!
val builder = StringBuilder()
for (letter in word) {
val code = codeForLetter(letter) ?: throw MissingLetterCode("No code found for '$letter'")
builder.append(code)
}
return builder.toString()
}
private fun codeForLetter(letter: Char): Char? {
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
}
}