50 lines
1.2 KiB
Kotlin
50 lines
1.2 KiB
Kotlin
package net.mezimmah.wkt9.keypad
|
|
|
|
import android.util.Log
|
|
import net.mezimmah.wkt9.exception.MissingLetterCode
|
|
import java.lang.StringBuilder
|
|
|
|
class Keypad(
|
|
private val keyCodeMapping: KeyCodeMapping,
|
|
private val letterLayout: Map<Key, List<Char>>,
|
|
|
|
numericLayout: Map<Key, Int>
|
|
) {
|
|
private val tag = "WKT9"
|
|
private val letterCodeMap: MutableMap<Char, Int> = mutableMapOf()
|
|
|
|
init {
|
|
Log.d(tag, "Keypad")
|
|
|
|
numericLayout.forEach { (key, code) ->
|
|
indexKeyLetters(key, code)
|
|
}
|
|
}
|
|
|
|
private fun indexKeyLetters(key: Key, code: Int) {
|
|
letterLayout[key]?.map { letter ->
|
|
letterCodeMap[letter] = code
|
|
}
|
|
}
|
|
|
|
fun getKey(code: Int): Key? {
|
|
return keyCodeMapping.key(code)
|
|
}
|
|
|
|
fun getCodeForWord(word: String): String {
|
|
val builder = StringBuilder()
|
|
val normalized = word.lowercase()
|
|
|
|
for (letter in normalized) {
|
|
val code = codeForLetter(letter) ?: throw MissingLetterCode("No code found for '$letter'")
|
|
|
|
builder.append(code)
|
|
}
|
|
|
|
return builder.toString()
|
|
}
|
|
|
|
fun codeForLetter(letter: Char): Int? {
|
|
return letterCodeMap[letter]
|
|
}
|
|
} |