2023-11-09 10:26:17 -05:00

90 lines
3.2 KiB
Kotlin

package net.mezimmah.wkt9.inputmode
import android.text.InputType
import android.view.inputmethod.EditorInfo
import net.mezimmah.wkt9.R
import net.mezimmah.wkt9.WKT9
class InputManager(val context: WKT9) {
private val idleInputHandler: IdleInputHandler = IdleInputHandler(context, context)
private val letterInputHandler: LetterInputHandler = LetterInputHandler(context, context)
private val numberInputHandler: NumberInputHandler = NumberInputHandler(context, context)
private val wordInputHandler: WordInputHandler = WordInputHandler(context, context)
private val numericClasses = listOf(
InputType.TYPE_CLASS_DATETIME,
InputType.TYPE_CLASS_NUMBER,
InputType.TYPE_CLASS_PHONE
)
private val letterVariations = listOf(
InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
InputType.TYPE_TEXT_VARIATION_URI,
InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS,
InputType.TYPE_TEXT_VARIATION_PASSWORD,
InputType.TYPE_TEXT_VARIATION_FILTER,
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD,
InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS,
InputType.TYPE_TEXT_VARIATION_PERSON_NAME
)
private var typeClass: Int = 0
private var typeVariation: Int = 0
private var typeFlags: Int = 0
private var allowSuggestions: Boolean = false
var handler: InputHandler? = null
private set
var mode: InputMode = InputMode.Idle
private set
fun selectHandler(editor: EditorInfo) {
val inputType = editor.inputType
val override = selectOverride(editor.packageName)
typeClass = inputType.and(InputType.TYPE_MASK_CLASS)
typeVariation = inputType.and(InputType.TYPE_MASK_VARIATION)
typeFlags = inputType.and(InputType.TYPE_MASK_FLAGS)
allowSuggestions = typeFlags != InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS
if (override != null) return switchToHandler(override, editor.initialSelEnd)
val handler = if (numericClasses.contains(typeClass)) {
InputMode.Number
} else if (typeClass == InputType.TYPE_CLASS_TEXT) {
if (letterVariations.contains(typeVariation) || mode == InputMode.Letter) {
InputMode.Letter
} else {
InputMode.Word
}
} else {
InputMode.Idle
}
switchToHandler(handler, editor.initialSelEnd)
}
fun switchToHandler(inputMode: InputMode, cursorPosition: Int) {
this.handler?.onFinish()
this.mode = inputMode
this.handler = when (inputMode) {
InputMode.Word -> wordInputHandler
InputMode.Letter -> letterInputHandler
InputMode.Number -> numberInputHandler
else -> idleInputHandler
}.apply {
onStart(typeClass, typeVariation, typeFlags)
onUpdateCursorPosition(cursorPosition)
}
}
private fun selectOverride(packageName: String): InputMode? {
val numeric = context.resources.getStringArray(R.array.input_mode_numeric)
return if (numeric.contains(packageName)) {
InputMode.Number
} else null
}
}