1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.inputmethod.latin.common;
18 
19 import com.android.inputmethod.annotations.UsedForTesting;
20 
21 import javax.annotation.Nonnull;
22 
23 public final class Constants {
24 
25     public static final class Color {
26         /**
27          * The alpha value for fully opaque.
28          */
29         public final static int ALPHA_OPAQUE = 255;
30     }
31 
32     public static final class ImeOption {
33         /**
34          * The private IME option used to indicate that no microphone should be shown for a given
35          * text field. For instance, this is specified by the search dialog when the dialog is
36          * already showing a voice search button.
37          *
38          * @deprecated Use {@link ImeOption#NO_MICROPHONE} with package name prefixed.
39          */
40         @SuppressWarnings("dep-ann")
41         public static final String NO_MICROPHONE_COMPAT = "nm";
42 
43         /**
44          * The private IME option used to indicate that no microphone should be shown for a given
45          * text field. For instance, this is specified by the search dialog when the dialog is
46          * already showing a voice search button.
47          */
48         public static final String NO_MICROPHONE = "noMicrophoneKey";
49 
50         /**
51          * The private IME option used to indicate that no settings key should be shown for a given
52          * text field.
53          */
54         public static final String NO_SETTINGS_KEY = "noSettingsKey";
55 
56         /**
57          * The private IME option used to indicate that the given text field needs ASCII code points
58          * input.
59          *
60          * @deprecated Use EditorInfo#IME_FLAG_FORCE_ASCII.
61          */
62         @SuppressWarnings("dep-ann")
63         public static final String FORCE_ASCII = "forceAscii";
64 
65         /**
66          * The private IME option used to suppress the floating gesture preview for a given text
67          * field. This overrides the corresponding keyboard settings preference.
68          * {@link com.android.inputmethod.latin.settings.SettingsValues#mGestureFloatingPreviewTextEnabled}
69          */
70         public static final String NO_FLOATING_GESTURE_PREVIEW = "noGestureFloatingPreview";
71 
ImeOption()72         private ImeOption() {
73             // This utility class is not publicly instantiable.
74         }
75     }
76 
77     public static final class Subtype {
78         /**
79          * The subtype mode used to indicate that the subtype is a keyboard.
80          */
81         public static final String KEYBOARD_MODE = "keyboard";
82 
83         public static final class ExtraValue {
84             /**
85              * The subtype extra value used to indicate that this subtype is capable of
86              * entering ASCII characters.
87              */
88             public static final String ASCII_CAPABLE = "AsciiCapable";
89 
90             /**
91              * The subtype extra value used to indicate that this subtype is enabled
92              * when the default subtype is not marked as ascii capable.
93              */
94             public static final String ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE =
95                     "EnabledWhenDefaultIsNotAsciiCapable";
96 
97             /**
98              * The subtype extra value used to indicate that this subtype is capable of
99              * entering emoji characters.
100              */
101             public static final String EMOJI_CAPABLE = "EmojiCapable";
102 
103             /**
104              * The subtype extra value used to indicate that this subtype requires a network
105              * connection to work.
106              */
107             public static final String REQ_NETWORK_CONNECTIVITY = "requireNetworkConnectivity";
108 
109             /**
110              * The subtype extra value used to indicate that the display name of this subtype
111              * contains a "%s" for printf-like replacement and it should be replaced by
112              * this extra value.
113              * This extra value is supported on JellyBean and later.
114              */
115             public static final String UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME =
116                     "UntranslatableReplacementStringInSubtypeName";
117 
118             /**
119              * The subtype extra value used to indicate this subtype keyboard layout set name.
120              * This extra value is private to LatinIME.
121              */
122             public static final String KEYBOARD_LAYOUT_SET = "KeyboardLayoutSet";
123 
124             /**
125              * The subtype extra value used to indicate that this subtype is an additional subtype
126              * that the user defined. This extra value is private to LatinIME.
127              */
128             public static final String IS_ADDITIONAL_SUBTYPE = "isAdditionalSubtype";
129 
130             /**
131              * The subtype extra value used to specify the combining rules.
132              */
133             public static final String COMBINING_RULES = "CombiningRules";
134 
ExtraValue()135             private ExtraValue() {
136                 // This utility class is not publicly instantiable.
137             }
138         }
139 
Subtype()140         private Subtype() {
141             // This utility class is not publicly instantiable.
142         }
143     }
144 
145     public static final class TextUtils {
146         /**
147          * Capitalization mode for {@link android.text.TextUtils#getCapsMode}: don't capitalize
148          * characters.  This value may be used with
149          * {@link android.text.TextUtils#CAP_MODE_CHARACTERS},
150          * {@link android.text.TextUtils#CAP_MODE_WORDS}, and
151          * {@link android.text.TextUtils#CAP_MODE_SENTENCES}.
152          */
153         // TODO: Straighten this out. It's bizarre to have to use android.text.TextUtils.CAP_MODE_*
154         // except for OFF that is in Constants.TextUtils.
155         public static final int CAP_MODE_OFF = 0;
156 
TextUtils()157         private TextUtils() {
158             // This utility class is not publicly instantiable.
159         }
160     }
161 
162     public static final int NOT_A_CODE = -1;
163     public static final int NOT_A_CURSOR_POSITION = -1;
164     // TODO: replace the following constants with state in InputTransaction?
165     public static final int NOT_A_COORDINATE = -1;
166     public static final int SUGGESTION_STRIP_COORDINATE = -2;
167     public static final int EXTERNAL_KEYBOARD_COORDINATE = -4;
168 
169     // A hint on how many characters to cache from the TextView. A good value of this is given by
170     // how many characters we need to be able to almost always find the caps mode.
171     public static final int EDITOR_CONTENTS_CACHE_SIZE = 1024;
172     // How many characters we accept for the recapitalization functionality. This needs to be
173     // large enough for all reasonable purposes, but avoid purposeful attacks. 100k sounds about
174     // right for this.
175     public static final int MAX_CHARACTERS_FOR_RECAPITALIZATION = 1024 * 100;
176 
177     // Key events coming any faster than this are long-presses.
178     public static final int LONG_PRESS_MILLISECONDS = 200;
179     // TODO: Set this value appropriately.
180     public static final int GET_SUGGESTED_WORDS_TIMEOUT = 200;
181     // How many continuous deletes at which to start deleting at a higher speed.
182     public static final int DELETE_ACCELERATE_AT = 20;
183 
184     public static final String WORD_SEPARATOR = " ";
185 
isValidCoordinate(final int coordinate)186     public static boolean isValidCoordinate(final int coordinate) {
187         // Detect {@link NOT_A_COORDINATE}, {@link SUGGESTION_STRIP_COORDINATE},
188         // and {@link SPELL_CHECKER_COORDINATE}.
189         return coordinate >= 0;
190     }
191 
192     /**
193      * Custom request code used in
194      * {@link com.android.inputmethod.keyboard.KeyboardActionListener#onCustomRequest(int)}.
195      */
196     // The code to show input method picker.
197     public static final int CUSTOM_CODE_SHOW_INPUT_METHOD_PICKER = 1;
198 
199     /**
200      * Some common keys code. Must be positive.
201      */
202     public static final int CODE_ENTER = '\n';
203     public static final int CODE_TAB = '\t';
204     public static final int CODE_SPACE = ' ';
205     public static final int CODE_PERIOD = '.';
206     public static final int CODE_COMMA = ',';
207     public static final int CODE_DASH = '-';
208     public static final int CODE_SINGLE_QUOTE = '\'';
209     public static final int CODE_DOUBLE_QUOTE = '"';
210     public static final int CODE_SLASH = '/';
211     public static final int CODE_BACKSLASH = '\\';
212     public static final int CODE_VERTICAL_BAR = '|';
213     public static final int CODE_COMMERCIAL_AT = '@';
214     public static final int CODE_PLUS = '+';
215     public static final int CODE_PERCENT = '%';
216     public static final int CODE_CLOSING_PARENTHESIS = ')';
217     public static final int CODE_CLOSING_SQUARE_BRACKET = ']';
218     public static final int CODE_CLOSING_CURLY_BRACKET = '}';
219     public static final int CODE_CLOSING_ANGLE_BRACKET = '>';
220     public static final int CODE_INVERTED_QUESTION_MARK = 0xBF; // ¿
221     public static final int CODE_INVERTED_EXCLAMATION_MARK = 0xA1; // ¡
222     public static final int CODE_GRAVE_ACCENT = '`';
223     public static final int CODE_CIRCUMFLEX_ACCENT = '^';
224     public static final int CODE_TILDE = '~';
225 
226     public static final String REGEXP_PERIOD = "\\.";
227     public static final String STRING_SPACE = " ";
228 
229     /**
230      * Special keys code. Must be negative.
231      * These should be aligned with constants in
232      * {@link com.android.inputmethod.keyboard.internal.KeyboardCodesSet}.
233      */
234     public static final int CODE_SHIFT = -1;
235     public static final int CODE_CAPSLOCK = -2;
236     public static final int CODE_SWITCH_ALPHA_SYMBOL = -3;
237     public static final int CODE_OUTPUT_TEXT = -4;
238     public static final int CODE_DELETE = -5;
239     public static final int CODE_SETTINGS = -6;
240     public static final int CODE_SHORTCUT = -7;
241     public static final int CODE_ACTION_NEXT = -8;
242     public static final int CODE_ACTION_PREVIOUS = -9;
243     public static final int CODE_LANGUAGE_SWITCH = -10;
244     public static final int CODE_EMOJI = -11;
245     public static final int CODE_SHIFT_ENTER = -12;
246     public static final int CODE_SYMBOL_SHIFT = -13;
247     public static final int CODE_ALPHA_FROM_EMOJI = -14;
248     // Code value representing the code is not specified.
249     public static final int CODE_UNSPECIFIED = -15;
250 
isLetterCode(final int code)251     public static boolean isLetterCode(final int code) {
252         return code >= CODE_SPACE;
253     }
254 
255     @Nonnull
printableCode(final int code)256     public static String printableCode(final int code) {
257         switch (code) {
258         case CODE_SHIFT: return "shift";
259         case CODE_CAPSLOCK: return "capslock";
260         case CODE_SWITCH_ALPHA_SYMBOL: return "symbol";
261         case CODE_OUTPUT_TEXT: return "text";
262         case CODE_DELETE: return "delete";
263         case CODE_SETTINGS: return "settings";
264         case CODE_SHORTCUT: return "shortcut";
265         case CODE_ACTION_NEXT: return "actionNext";
266         case CODE_ACTION_PREVIOUS: return "actionPrevious";
267         case CODE_LANGUAGE_SWITCH: return "languageSwitch";
268         case CODE_EMOJI: return "emoji";
269         case CODE_SHIFT_ENTER: return "shiftEnter";
270         case CODE_ALPHA_FROM_EMOJI: return "alpha";
271         case CODE_UNSPECIFIED: return "unspec";
272         case CODE_TAB: return "tab";
273         case CODE_ENTER: return "enter";
274         case CODE_SPACE: return "space";
275         default:
276             if (code < CODE_SPACE) return String.format("\\u%02X", code);
277             if (code < 0x100) return String.format("%c", code);
278             if (code < 0x10000) return String.format("\\u%04X", code);
279             return String.format("\\U%05X", code);
280         }
281     }
282 
283     @Nonnull
printableCodes(@onnull final int[] codes)284     public static String printableCodes(@Nonnull final int[] codes) {
285         final StringBuilder sb = new StringBuilder();
286         boolean addDelimiter = false;
287         for (final int code : codes) {
288             if (code == NOT_A_CODE) break;
289             if (addDelimiter) sb.append(", ");
290             sb.append(printableCode(code));
291             addDelimiter = true;
292         }
293         return "[" + sb + "]";
294     }
295 
296     /**
297      * Screen metrics (a.k.a. Device form factor) constants of
298      * {@link com.android.inputmethod.latin.R.integer#config_screen_metrics}.
299      */
300     public static final int SCREEN_METRICS_SMALL_PHONE = 0;
301     public static final int SCREEN_METRICS_LARGE_PHONE = 1;
302     public static final int SCREEN_METRICS_LARGE_TABLET = 2;
303     public static final int SCREEN_METRICS_SMALL_TABLET = 3;
304 
305     @UsedForTesting
isPhone(final int screenMetrics)306     public static boolean isPhone(final int screenMetrics) {
307         return screenMetrics == SCREEN_METRICS_SMALL_PHONE
308                 || screenMetrics == SCREEN_METRICS_LARGE_PHONE;
309     }
310 
311     @UsedForTesting
isTablet(final int screenMetrics)312     public static boolean isTablet(final int screenMetrics) {
313         return screenMetrics == SCREEN_METRICS_SMALL_TABLET
314                 || screenMetrics == SCREEN_METRICS_LARGE_TABLET;
315     }
316 
317     /**
318      * Default capacity of gesture points container.
319      * This constant is used by {@link com.android.inputmethod.keyboard.internal.BatchInputArbiter}
320      * and etc. to preallocate regions that contain gesture event points.
321      */
322     public static final int DEFAULT_GESTURE_POINTS_CAPACITY = 128;
323 
324     public static final int MAX_IME_DECODER_RESULTS = 20;
325     public static final int DECODER_SCORE_SCALAR = 1000000;
326     public static final int DECODER_MAX_SCORE = 1000000000;
327 
328     public static final int EVENT_BACKSPACE = 1;
329     public static final int EVENT_REJECTION = 2;
330     public static final int EVENT_REVERT = 3;
331 
Constants()332     private Constants() {
333         // This utility class is not publicly instantiable.
334     }
335 }
336