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
17package com.android.inputmethod.latin.utils;
18
19import android.text.InputType;
20import android.view.inputmethod.EditorInfo;
21
22public final class InputTypeUtils implements InputType {
23    private static final int WEB_TEXT_PASSWORD_INPUT_TYPE =
24            TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_PASSWORD;
25    private static final int WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE =
26            TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS;
27    private static final int NUMBER_PASSWORD_INPUT_TYPE =
28            TYPE_CLASS_NUMBER | TYPE_NUMBER_VARIATION_PASSWORD;
29    private static final int TEXT_PASSWORD_INPUT_TYPE =
30            TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD;
31    private static final int TEXT_VISIBLE_PASSWORD_INPUT_TYPE =
32            TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
33    private static final int[] SUPPRESSING_AUTO_SPACES_FIELD_VARIATION = {
34        InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
35        InputType.TYPE_TEXT_VARIATION_PASSWORD,
36        InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
37        InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD };
38    public static final int IME_ACTION_CUSTOM_LABEL = EditorInfo.IME_MASK_ACTION + 1;
39
40    private InputTypeUtils() {
41        // This utility class is not publicly instantiable.
42    }
43
44    private static boolean isWebEditTextInputType(final int inputType) {
45        return inputType == (TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_WEB_EDIT_TEXT);
46    }
47
48    private static boolean isWebPasswordInputType(final int inputType) {
49        return WEB_TEXT_PASSWORD_INPUT_TYPE != 0
50                && inputType == WEB_TEXT_PASSWORD_INPUT_TYPE;
51    }
52
53    private static boolean isWebEmailAddressInputType(final int inputType) {
54        return WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE != 0
55                && inputType == WEB_TEXT_EMAIL_ADDRESS_INPUT_TYPE;
56    }
57
58    private static boolean isNumberPasswordInputType(final int inputType) {
59        return NUMBER_PASSWORD_INPUT_TYPE != 0
60                && inputType == NUMBER_PASSWORD_INPUT_TYPE;
61    }
62
63    private static boolean isTextPasswordInputType(final int inputType) {
64        return inputType == TEXT_PASSWORD_INPUT_TYPE;
65    }
66
67    private static boolean isWebEmailAddressVariation(int variation) {
68        return variation == TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS;
69    }
70
71    public static boolean isEmailVariation(final int variation) {
72        return variation == TYPE_TEXT_VARIATION_EMAIL_ADDRESS
73                || isWebEmailAddressVariation(variation);
74    }
75
76    public static boolean isWebInputType(final int inputType) {
77        final int maskedInputType =
78                inputType & (TYPE_MASK_CLASS | TYPE_MASK_VARIATION);
79        return isWebEditTextInputType(maskedInputType) || isWebPasswordInputType(maskedInputType)
80                || isWebEmailAddressInputType(maskedInputType);
81    }
82
83    // Please refer to TextView.isPasswordInputType
84    public static boolean isPasswordInputType(final int inputType) {
85        final int maskedInputType =
86                inputType & (TYPE_MASK_CLASS | TYPE_MASK_VARIATION);
87        return isTextPasswordInputType(maskedInputType) || isWebPasswordInputType(maskedInputType)
88                || isNumberPasswordInputType(maskedInputType);
89    }
90
91    // Please refer to TextView.isVisiblePasswordInputType
92    public static boolean isVisiblePasswordInputType(final int inputType) {
93        final int maskedInputType =
94                inputType & (TYPE_MASK_CLASS | TYPE_MASK_VARIATION);
95        return maskedInputType == TEXT_VISIBLE_PASSWORD_INPUT_TYPE;
96    }
97
98    public static boolean isAutoSpaceFriendlyType(final int inputType) {
99        if (TYPE_CLASS_TEXT != (TYPE_MASK_CLASS & inputType)) return false;
100        final int variation = TYPE_MASK_VARIATION & inputType;
101        for (final int fieldVariation : SUPPRESSING_AUTO_SPACES_FIELD_VARIATION) {
102            if (variation == fieldVariation) return false;
103        }
104        return true;
105    }
106
107    public static int getImeOptionsActionIdFromEditorInfo(final EditorInfo editorInfo) {
108        if ((editorInfo.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
109            return EditorInfo.IME_ACTION_NONE;
110        } else if (editorInfo.actionLabel != null) {
111            return IME_ACTION_CUSTOM_LABEL;
112        } else {
113            // Note: this is different from editorInfo.actionId, hence "ImeOptionsActionId"
114            return editorInfo.imeOptions & EditorInfo.IME_MASK_ACTION;
115        }
116    }
117}
118