2019-12-31 18:19:35 +01:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2012 The Android Open Source Project
|
2023-10-17 13:44:01 +02:00
|
|
|
* modified
|
|
|
|
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
|
2019-12-31 18:19:35 +01:00
|
|
|
*/
|
|
|
|
|
2024-01-31 18:32:43 +01:00
|
|
|
package helium314.keyboard.latin.common;
|
2019-12-31 18:19:35 +01:00
|
|
|
|
2023-09-01 08:08:36 +02:00
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
|
2024-01-31 18:32:43 +01:00
|
|
|
import helium314.keyboard.latin.BuildConfig;
|
2019-12-31 18:19:35 +01:00
|
|
|
|
|
|
|
public final class Constants {
|
|
|
|
|
|
|
|
public static final class Color {
|
|
|
|
/**
|
|
|
|
* The alpha value for fully opaque.
|
|
|
|
*/
|
|
|
|
public final static int ALPHA_OPAQUE = 255;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static final class ImeOption {
|
|
|
|
/**
|
|
|
|
* The private IME option used to indicate that no microphone should be shown for a given
|
|
|
|
* text field. For instance, this is specified by the search dialog when the dialog is
|
|
|
|
* already showing a voice search button.
|
|
|
|
*/
|
|
|
|
public static final String NO_MICROPHONE = "noMicrophoneKey";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The private IME option used to suppress the floating gesture preview for a given text
|
|
|
|
* field. This overrides the corresponding keyboard settings preference.
|
2024-01-31 18:32:43 +01:00
|
|
|
* {@link helium314.keyboard.latin.settings.SettingsValues#mGestureFloatingPreviewTextEnabled}
|
2019-12-31 18:19:35 +01:00
|
|
|
*/
|
|
|
|
public static final String NO_FLOATING_GESTURE_PREVIEW = "noGestureFloatingPreview";
|
|
|
|
|
|
|
|
private ImeOption() {
|
|
|
|
// This utility class is not publicly instantiable.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static final class Subtype {
|
|
|
|
/**
|
|
|
|
* The subtype mode used to indicate that the subtype is a keyboard.
|
|
|
|
*/
|
|
|
|
public static final String KEYBOARD_MODE = "keyboard";
|
|
|
|
|
2023-12-21 18:27:49 +01:00
|
|
|
// some extra values:
|
|
|
|
// TrySuppressingImeSwitcher: not documented, but used in Android source
|
|
|
|
// AsciiCapable: not used, but recommended for Android 9- because of known issues
|
|
|
|
// SupportTouchPositionCorrection: never read, never used outside AOSP keyboard -> can be removed?
|
|
|
|
// EmojiCapable: there is some description in Constants, but actually it's never read
|
|
|
|
// KeyboardLayoutSet: obvious
|
2019-12-31 18:19:35 +01:00
|
|
|
public static final class ExtraValue {
|
|
|
|
/**
|
|
|
|
* The subtype extra value used to indicate that this subtype is capable of
|
|
|
|
* entering ASCII characters.
|
|
|
|
*/
|
|
|
|
public static final String ASCII_CAPABLE = "AsciiCapable";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The subtype extra value used to indicate that this subtype is enabled
|
|
|
|
* when the default subtype is not marked as ascii capable.
|
|
|
|
*/
|
|
|
|
public static final String ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE =
|
|
|
|
"EnabledWhenDefaultIsNotAsciiCapable";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The subtype extra value used to indicate that this subtype is capable of
|
|
|
|
* entering emoji characters.
|
|
|
|
*/
|
|
|
|
public static final String EMOJI_CAPABLE = "EmojiCapable";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The subtype extra value used to indicate that the display name of this subtype
|
|
|
|
* contains a "%s" for printf-like replacement and it should be replaced by
|
|
|
|
* this extra value.
|
|
|
|
* This extra value is supported on JellyBean and later.
|
|
|
|
*/
|
|
|
|
public static final String UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME =
|
|
|
|
"UntranslatableReplacementStringInSubtypeName";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The subtype extra value used to indicate this subtype keyboard layout set name.
|
|
|
|
* This extra value is private to LatinIME.
|
|
|
|
*/
|
|
|
|
public static final String KEYBOARD_LAYOUT_SET = "KeyboardLayoutSet";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The subtype extra value used to indicate that this subtype is an additional subtype
|
|
|
|
* that the user defined. This extra value is private to LatinIME.
|
|
|
|
*/
|
|
|
|
public static final String IS_ADDITIONAL_SUBTYPE = "isAdditionalSubtype";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The subtype extra value used to specify the combining rules.
|
|
|
|
*/
|
|
|
|
public static final String COMBINING_RULES = "CombiningRules";
|
|
|
|
|
|
|
|
private ExtraValue() {
|
|
|
|
// This utility class is not publicly instantiable.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private Subtype() {
|
|
|
|
// This utility class is not publicly instantiable.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static final class TextUtils {
|
|
|
|
/**
|
|
|
|
* Capitalization mode for {@link android.text.TextUtils#getCapsMode}: don't capitalize
|
|
|
|
* characters. This value may be used with
|
|
|
|
* {@link android.text.TextUtils#CAP_MODE_CHARACTERS},
|
|
|
|
* {@link android.text.TextUtils#CAP_MODE_WORDS}, and
|
|
|
|
* {@link android.text.TextUtils#CAP_MODE_SENTENCES}.
|
|
|
|
*/
|
|
|
|
// TODO: Straighten this out. It's bizarre to have to use android.text.TextUtils.CAP_MODE_*
|
|
|
|
// except for OFF that is in Constants.TextUtils.
|
|
|
|
public static final int CAP_MODE_OFF = 0;
|
|
|
|
|
|
|
|
private TextUtils() {
|
|
|
|
// This utility class is not publicly instantiable.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static final int NOT_A_CODE = -1;
|
|
|
|
public static final int NOT_A_CURSOR_POSITION = -1;
|
|
|
|
// TODO: replace the following constants with state in InputTransaction?
|
|
|
|
public static final int NOT_A_COORDINATE = -1;
|
|
|
|
public static final int SUGGESTION_STRIP_COORDINATE = -2;
|
|
|
|
public static final int EXTERNAL_KEYBOARD_COORDINATE = -4;
|
|
|
|
|
|
|
|
// A hint on how many characters to cache from the TextView. A good value of this is given by
|
|
|
|
// how many characters we need to be able to almost always find the caps mode.
|
|
|
|
public static final int EDITOR_CONTENTS_CACHE_SIZE = 1024;
|
|
|
|
// How many characters we accept for the recapitalization functionality. This needs to be
|
|
|
|
// large enough for all reasonable purposes, but avoid purposeful attacks. 100k sounds about
|
|
|
|
// right for this.
|
|
|
|
public static final int MAX_CHARACTERS_FOR_RECAPITALIZATION = 1024 * 100;
|
|
|
|
|
|
|
|
// Key events coming any faster than this are long-presses.
|
|
|
|
public static final int LONG_PRESS_MILLISECONDS = 200;
|
|
|
|
// TODO: Set this value appropriately.
|
2023-08-28 19:50:55 +02:00
|
|
|
public static final int GET_SUGGESTED_WORDS_TIMEOUT = BuildConfig.DEBUG ? 500 : 200; // debug build is slow, and timeout is annoying for testing
|
2019-12-31 18:19:35 +01:00
|
|
|
// How many continuous deletes at which to start deleting at a higher speed.
|
|
|
|
public static final int DELETE_ACCELERATE_AT = 20;
|
|
|
|
|
|
|
|
public static final String WORD_SEPARATOR = " ";
|
|
|
|
|
|
|
|
public static boolean isValidCoordinate(final int coordinate) {
|
|
|
|
// Detect {@link NOT_A_COORDINATE}, {@link SUGGESTION_STRIP_COORDINATE},
|
|
|
|
// and {@link SPELL_CHECKER_COORDINATE}.
|
|
|
|
return coordinate >= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Custom request code used in
|
2024-01-31 18:32:43 +01:00
|
|
|
* {@link helium314.keyboard.keyboard.KeyboardActionListener#onCustomRequest(int)}.
|
2019-12-31 18:19:35 +01:00
|
|
|
*/
|
|
|
|
// The code to show input method picker.
|
|
|
|
public static final int CUSTOM_CODE_SHOW_INPUT_METHOD_PICKER = 1;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Some common keys code. Must be positive.
|
|
|
|
*/
|
|
|
|
public static final int CODE_ENTER = '\n';
|
|
|
|
public static final int CODE_TAB = '\t';
|
|
|
|
public static final int CODE_SPACE = ' ';
|
|
|
|
public static final int CODE_PERIOD = '.';
|
|
|
|
public static final int CODE_COMMA = ',';
|
|
|
|
public static final int CODE_DASH = '-';
|
|
|
|
public static final int CODE_SINGLE_QUOTE = '\'';
|
|
|
|
public static final int CODE_DOUBLE_QUOTE = '"';
|
|
|
|
public static final int CODE_SLASH = '/';
|
|
|
|
public static final int CODE_BACKSLASH = '\\';
|
|
|
|
public static final int CODE_VERTICAL_BAR = '|';
|
|
|
|
public static final int CODE_COMMERCIAL_AT = '@';
|
|
|
|
public static final int CODE_PLUS = '+';
|
|
|
|
public static final int CODE_PERCENT = '%';
|
|
|
|
public static final int CODE_CLOSING_PARENTHESIS = ')';
|
|
|
|
public static final int CODE_CLOSING_SQUARE_BRACKET = ']';
|
|
|
|
public static final int CODE_CLOSING_CURLY_BRACKET = '}';
|
|
|
|
public static final int CODE_CLOSING_ANGLE_BRACKET = '>';
|
2023-12-19 09:40:38 +01:00
|
|
|
public static final int CODE_INVERTED_QUESTION_MARK = '¿';
|
|
|
|
public static final int CODE_INVERTED_EXCLAMATION_MARK = '¡';
|
2019-12-31 18:19:35 +01:00
|
|
|
public static final int CODE_GRAVE_ACCENT = '`';
|
|
|
|
public static final int CODE_CIRCUMFLEX_ACCENT = '^';
|
|
|
|
public static final int CODE_TILDE = '~';
|
|
|
|
|
|
|
|
public static final String REGEXP_PERIOD = "\\.";
|
|
|
|
public static final String STRING_SPACE = " ";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Special keys code. Must be negative.
|
|
|
|
* These should be aligned with constants in
|
2024-01-31 18:32:43 +01:00
|
|
|
* {@link helium314.keyboard.keyboard.internal.KeyboardCodesSet}.
|
2019-12-31 18:19:35 +01:00
|
|
|
*/
|
|
|
|
public static final int CODE_SHIFT = -1;
|
|
|
|
public static final int CODE_CAPSLOCK = -2;
|
|
|
|
public static final int CODE_SWITCH_ALPHA_SYMBOL = -3;
|
|
|
|
public static final int CODE_OUTPUT_TEXT = -4;
|
|
|
|
public static final int CODE_DELETE = -5;
|
|
|
|
public static final int CODE_SETTINGS = -6;
|
|
|
|
public static final int CODE_SHORTCUT = -7;
|
|
|
|
public static final int CODE_ACTION_NEXT = -8;
|
|
|
|
public static final int CODE_ACTION_PREVIOUS = -9;
|
|
|
|
public static final int CODE_LANGUAGE_SWITCH = -10;
|
|
|
|
public static final int CODE_EMOJI = -11;
|
2022-01-13 13:45:48 +01:00
|
|
|
public static final int CODE_CLIPBOARD = -12;
|
|
|
|
public static final int CODE_SHIFT_ENTER = -13;
|
|
|
|
public static final int CODE_SYMBOL_SHIFT = -14;
|
|
|
|
public static final int CODE_ALPHA_FROM_EMOJI = -15;
|
|
|
|
public static final int CODE_ALPHA_FROM_CLIPBOARD = -16;
|
2022-02-20 16:14:12 +01:00
|
|
|
public static final int CODE_START_ONE_HANDED_MODE = -17;
|
|
|
|
public static final int CODE_STOP_ONE_HANDED_MODE = -18;
|
|
|
|
public static final int CODE_SWITCH_ONE_HANDED_MODE = -19;
|
2023-08-26 08:57:46 +02:00
|
|
|
public static final int CODE_NUMPAD = -20;
|
|
|
|
public static final int CODE_ALPHA_FROM_NUMPAD = -21;
|
|
|
|
public static final int CODE_SYMBOL_FROM_NUMPAD = -22;
|
2023-09-24 21:31:37 +02:00
|
|
|
public static final int CODE_SELECT_ALL = -23;
|
2023-12-11 23:19:04 +01:00
|
|
|
public static final int CODE_COPY = -24;
|
|
|
|
public static final int CODE_LEFT = -25;
|
|
|
|
public static final int CODE_RIGHT = -26;
|
|
|
|
public static final int CODE_UP = -27;
|
|
|
|
public static final int CODE_DOWN = -28;
|
2023-12-15 19:27:47 +01:00
|
|
|
public static final int CODE_UNDO = -29;
|
|
|
|
public static final int CODE_REDO = -30;
|
2024-01-01 13:16:49 +01:00
|
|
|
public static final int CODE_TOGGLE_AUTOCORRECT = -31;
|
|
|
|
public static final int CODE_TOGGLE_INCOGNITO = -32;
|
2024-01-18 10:18:22 +01:00
|
|
|
public static final int CODE_HOME = -33;
|
|
|
|
public static final int CODE_END = -34;
|
|
|
|
public static final int CODE_SELECT_WORD = -35;
|
2019-12-31 18:19:35 +01:00
|
|
|
// Code value representing the code is not specified.
|
2023-12-15 19:27:47 +01:00
|
|
|
public static final int CODE_UNSPECIFIED = -200;
|
2019-12-31 18:19:35 +01:00
|
|
|
|
|
|
|
public static boolean isLetterCode(final int code) {
|
|
|
|
return code >= CODE_SPACE;
|
|
|
|
}
|
|
|
|
|
2023-09-01 08:08:36 +02:00
|
|
|
@NonNull
|
2019-12-31 18:19:35 +01:00
|
|
|
public static String printableCode(final int code) {
|
|
|
|
switch (code) {
|
|
|
|
case CODE_SHIFT: return "shift";
|
|
|
|
case CODE_CAPSLOCK: return "capslock";
|
|
|
|
case CODE_SWITCH_ALPHA_SYMBOL: return "symbol";
|
|
|
|
case CODE_OUTPUT_TEXT: return "text";
|
|
|
|
case CODE_DELETE: return "delete";
|
|
|
|
case CODE_SETTINGS: return "settings";
|
|
|
|
case CODE_SHORTCUT: return "shortcut";
|
|
|
|
case CODE_ACTION_NEXT: return "actionNext";
|
|
|
|
case CODE_ACTION_PREVIOUS: return "actionPrevious";
|
|
|
|
case CODE_LANGUAGE_SWITCH: return "languageSwitch";
|
|
|
|
case CODE_EMOJI: return "emoji";
|
2022-01-13 13:45:48 +01:00
|
|
|
case CODE_CLIPBOARD: return "clipboard";
|
2019-12-31 18:19:35 +01:00
|
|
|
case CODE_SHIFT_ENTER: return "shiftEnter";
|
|
|
|
case CODE_ALPHA_FROM_EMOJI: return "alpha";
|
2022-01-13 13:45:48 +01:00
|
|
|
case CODE_ALPHA_FROM_CLIPBOARD: return "alpha";
|
2019-12-31 18:19:35 +01:00
|
|
|
case CODE_UNSPECIFIED: return "unspec";
|
|
|
|
case CODE_TAB: return "tab";
|
|
|
|
case CODE_ENTER: return "enter";
|
|
|
|
case CODE_SPACE: return "space";
|
2022-02-20 16:14:12 +01:00
|
|
|
case CODE_START_ONE_HANDED_MODE: return "startOneHandedMode";
|
|
|
|
case CODE_STOP_ONE_HANDED_MODE: return "stopOneHandedMode";
|
|
|
|
case CODE_SWITCH_ONE_HANDED_MODE: return "switchOneHandedMode";
|
2023-08-26 08:57:46 +02:00
|
|
|
case CODE_NUMPAD: return "numpad";
|
|
|
|
case CODE_ALPHA_FROM_NUMPAD: return "alphaNumpad";
|
|
|
|
case CODE_SYMBOL_FROM_NUMPAD: return "symbolNumpad";
|
2019-12-31 18:19:35 +01:00
|
|
|
default:
|
|
|
|
if (code < CODE_SPACE) return String.format("\\u%02X", code);
|
|
|
|
if (code < 0x100) return String.format("%c", code);
|
|
|
|
if (code < 0x10000) return String.format("\\u%04X", code);
|
|
|
|
return String.format("\\U%05X", code);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Screen metrics (a.k.a. Device form factor) constants of
|
2024-01-31 18:32:43 +01:00
|
|
|
* {@link helium314.keyboard.latin.R.integer#config_screen_metrics}.
|
2019-12-31 18:19:35 +01:00
|
|
|
*/
|
|
|
|
public static final int SCREEN_METRICS_SMALL_PHONE = 0;
|
|
|
|
public static final int SCREEN_METRICS_LARGE_PHONE = 1;
|
|
|
|
public static final int SCREEN_METRICS_LARGE_TABLET = 2;
|
|
|
|
public static final int SCREEN_METRICS_SMALL_TABLET = 3;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Default capacity of gesture points container.
|
2024-01-31 18:32:43 +01:00
|
|
|
* This constant is used by {@link helium314.keyboard.keyboard.internal.BatchInputArbiter}
|
2019-12-31 18:19:35 +01:00
|
|
|
* and etc. to preallocate regions that contain gesture event points.
|
|
|
|
*/
|
|
|
|
public static final int DEFAULT_GESTURE_POINTS_CAPACITY = 128;
|
|
|
|
|
|
|
|
public static final int MAX_IME_DECODER_RESULTS = 20;
|
|
|
|
public static final int DECODER_SCORE_SCALAR = 1000000;
|
|
|
|
public static final int DECODER_MAX_SCORE = 1000000000;
|
|
|
|
|
|
|
|
public static final int EVENT_BACKSPACE = 1;
|
|
|
|
public static final int EVENT_REJECTION = 2;
|
|
|
|
public static final int EVENT_REVERT = 3;
|
|
|
|
|
|
|
|
private Constants() {
|
|
|
|
// This utility class is not publicly instantiable.
|
|
|
|
}
|
|
|
|
}
|