90 lines
3.2 KiB
Kotlin
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
|
|
}
|
|
} |