From dce95c28886d07cae28ae82ed27828e126e1effe Mon Sep 17 00:00:00 2001 From: sspanak Date: Fri, 5 Apr 2024 18:46:24 +0300 Subject: [PATCH] code cleanup --- .../github/sspanak/tt9/ime/HotkeyHandler.java | 2 +- .../github/sspanak/tt9/ime/TypingHandler.java | 4 +- .../sspanak/tt9/ime/helpers/InputType.java | 85 +++++++++++++++++++ .../sspanak/tt9/ime/helpers/TextField.java | 83 ------------------ 4 files changed, 88 insertions(+), 86 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java index e8b6595d..d5946b68 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java @@ -290,7 +290,7 @@ public abstract class HotkeyHandler extends TypingHandler { } else { int nextModeIndex = (allowedInputModes.indexOf(mInputMode.getId()) + 1) % allowedInputModes.size(); mInputMode = InputMode.getInstance(settings, mLanguage, inputType, allowedInputModes.get(nextModeIndex)); - mInputMode.setTextFieldCase(textField.determineTextCase(inputType)); + mInputMode.setTextFieldCase(inputType.determineTextCase()); mInputMode.determineNextWordTextCase(textField.getStringBeforeCursor()); resetKeyRepeat(); diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java index c897bb20..486472c7 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java @@ -212,7 +212,7 @@ public abstract class TypingHandler extends KeyPadHandler { */ private void determineTextCase() { mInputMode.defaultTextCase(); - mInputMode.setTextFieldCase(textField.determineTextCase(inputType)); + mInputMode.setTextFieldCase(inputType.determineTextCase()); mInputMode.determineNextWordTextCase(textField.getStringBeforeCursor()); InputModeValidator.validateTextCase(mInputMode, settings.getTextCase()); } @@ -230,7 +230,7 @@ public abstract class TypingHandler extends KeyPadHandler { return InputMode.MODE_PASSTHROUGH; } - allowedInputModes = textField.determineInputModes(inputType); + allowedInputModes = inputType.determineInputModes(); return InputModeValidator.validateMode(settings.getInputMode(), allowedInputModes); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/InputType.java b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/InputType.java index c7f97a0d..9f564518 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/InputType.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/InputType.java @@ -3,6 +3,10 @@ package io.github.sspanak.tt9.ime.helpers; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; +import java.util.ArrayList; + +import io.github.sspanak.tt9.ime.modes.InputMode; + public class InputType { private final InputConnection connection; @@ -117,4 +121,85 @@ public class InputType { private boolean isUri() { return field != null && (field.inputType & android.text.InputType.TYPE_MASK_VARIATION) == android.text.InputType.TYPE_TEXT_VARIATION_URI; } + + + /** + * determineInputModes + * Determine the typing mode based on the input field being edited. Returns an ArrayList of the allowed modes. + * + * @return ArrayList + */ + public ArrayList determineInputModes() { + ArrayList allowedModes = new ArrayList<>(); + + if (field == null) { + allowedModes.add(InputMode.MODE_123); + return allowedModes; + } + + // Calculators (only 0-9 and math) and Dialer (0-9, "#" and "*") fields + // handle all input themselves, so we are supposed to pass through all key presses. + // Note: A Dialer field is not a Phone number field. + if (isSpecialNumeric()) { + allowedModes.add(InputMode.MODE_PASSTHROUGH); + return allowedModes; + } + + switch (field.inputType & android.text.InputType.TYPE_MASK_CLASS) { + case android.text.InputType.TYPE_CLASS_NUMBER: + case android.text.InputType.TYPE_CLASS_DATETIME: + case android.text.InputType.TYPE_CLASS_PHONE: + // Numbers, dates and phone numbers default to the numeric keyboard, + // with no extra features. + allowedModes.add(InputMode.MODE_123); + return allowedModes; + + case android.text.InputType.TYPE_CLASS_TEXT: + // This is general text editing. We will default to the + // normal alphabetic keyboard, and assume that we should + // be doing predictive text (showing candidates as the + // user types). + if (!isPassword()) { + allowedModes.add(InputMode.MODE_PREDICTIVE); + } + + // ↓ fallthrough to add ABC and 123 modes ↓ + + default: + // For all unknown input types, default to the alphabetic + // keyboard with no special features. + allowedModes.add(InputMode.MODE_123); + allowedModes.add(InputMode.MODE_ABC); + + return allowedModes; + } + } + + + /** + * Helper to update the shift state of our keyboard based on the initial + * editor state. + */ + public int determineTextCase() { + if (connection == null || field == null || field.inputType == android.text.InputType.TYPE_NULL) { + return InputMode.CASE_UNDEFINED; + } + + if (isSpecialized()) { + return InputMode.CASE_LOWER; + } + + if (isPersonName()) { + return InputMode.CASE_CAPITALIZE; + } + + switch (field.inputType & android.text.InputType.TYPE_MASK_FLAGS) { + case android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS: + return InputMode.CASE_UPPER; + case android.text.InputType.TYPE_TEXT_FLAG_CAP_WORDS: + return InputMode.CASE_CAPITALIZE; + } + + return InputMode.CASE_UNDEFINED; + } } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java index fb396106..a584356b 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java @@ -12,8 +12,6 @@ import android.view.inputmethod.InputConnection; import androidx.annotation.NonNull; -import java.util.ArrayList; - import io.github.sspanak.tt9.ime.modes.InputMode; import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.LanguageKind; @@ -51,87 +49,6 @@ public class TextField { } - /** - * determineInputModes - * Determine the typing mode based on the input field being edited. Returns an ArrayList of the allowed modes. - * - * @return ArrayList - */ - public ArrayList determineInputModes(InputType inputType) { - ArrayList allowedModes = new ArrayList<>(); - - if (field == null) { - allowedModes.add(InputMode.MODE_123); - return allowedModes; - } - - // Calculators (only 0-9 and math) and Dialer (0-9, "#" and "*") fields - // handle all input themselves, so we are supposed to pass through all key presses. - // Note: A Dialer field is not a Phone number field. - if (inputType.isSpecialNumeric()) { - allowedModes.add(InputMode.MODE_PASSTHROUGH); - return allowedModes; - } - - switch (field.inputType & android.text.InputType.TYPE_MASK_CLASS) { - case android.text.InputType.TYPE_CLASS_NUMBER: - case android.text.InputType.TYPE_CLASS_DATETIME: - case android.text.InputType.TYPE_CLASS_PHONE: - // Numbers, dates and phone numbers default to the numeric keyboard, - // with no extra features. - allowedModes.add(InputMode.MODE_123); - return allowedModes; - - case android.text.InputType.TYPE_CLASS_TEXT: - // This is general text editing. We will default to the - // normal alphabetic keyboard, and assume that we should - // be doing predictive text (showing candidates as the - // user types). - if (!inputType.isPassword()) { - allowedModes.add(InputMode.MODE_PREDICTIVE); - } - - // ↓ fallthrough to add ABC and 123 modes ↓ - - default: - // For all unknown input types, default to the alphabetic - // keyboard with no special features. - allowedModes.add(InputMode.MODE_123); - allowedModes.add(InputMode.MODE_ABC); - - return allowedModes; - } - } - - - /** - * Helper to update the shift state of our keyboard based on the initial - * editor state. - */ - public int determineTextCase(InputType inputType) { - if (connection == null || field == null || field.inputType == android.text.InputType.TYPE_NULL) { - return InputMode.CASE_UNDEFINED; - } - - if (inputType.isSpecialized()) { - return InputMode.CASE_LOWER; - } - - if (inputType.isPersonName()) { - return InputMode.CASE_CAPITALIZE; - } - - switch (field.inputType & android.text.InputType.TYPE_MASK_FLAGS) { - case android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS: - return InputMode.CASE_UPPER; - case android.text.InputType.TYPE_TEXT_FLAG_CAP_WORDS: - return InputMode.CASE_CAPITALIZE; - } - - return InputMode.CASE_UNDEFINED; - } - - public String getStringAfterCursor(int numberOfChars) { CharSequence character = connection != null ? connection.getTextAfterCursor(numberOfChars, 0) : null; return character != null ? character.toString() : "";