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 } }