KeyboardCodesSet.java revision dcfceaff1b18b102d7fe875b48b84c24cbd822d9
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License. You may obtain a copy of
6 * 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, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations under
14 * the License.
15 */
16
17package com.android.inputmethod.keyboard.internal;
18
19import com.android.inputmethod.latin.CollectionUtils;
20import com.android.inputmethod.latin.Constants;
21
22import java.util.HashMap;
23
24public final class KeyboardCodesSet {
25    private static final HashMap<String, int[]> sLanguageToCodesMap = CollectionUtils.newHashMap();
26    private static final HashMap<String, Integer> sNameToIdMap = CollectionUtils.newHashMap();
27
28    private int[] mCodes = DEFAULT;
29
30    public void setLanguage(final String language) {
31        final int[] codes = sLanguageToCodesMap.get(language);
32        mCodes = (codes != null) ? codes : DEFAULT;
33    }
34
35    public int getCode(final String name) {
36        Integer id = sNameToIdMap.get(name);
37        if (id == null) throw new RuntimeException("Unknown key code: " + name);
38        return mCodes[id];
39    }
40
41    private static final String[] ID_TO_NAME = {
42        "key_tab",
43        "key_enter",
44        "key_space",
45        "key_shift",
46        "key_switch_alpha_symbol",
47        "key_output_text",
48        "key_delete",
49        "key_settings",
50        "key_shortcut",
51        "key_action_enter",
52        "key_action_next",
53        "key_action_previous",
54        "key_shift_enter",
55        "key_language_switch",
56        "key_research",
57        "key_unspecified",
58        "key_left_parenthesis",
59        "key_right_parenthesis",
60        "key_less_than",
61        "key_greater_than",
62        "key_left_square_bracket",
63        "key_right_square_bracket",
64        "key_left_curly_bracket",
65        "key_right_curly_bracket",
66    };
67
68    private static final int CODE_LEFT_PARENTHESIS = '(';
69    private static final int CODE_RIGHT_PARENTHESIS = ')';
70    private static final int CODE_LESS_THAN_SIGN = '<';
71    private static final int CODE_GREATER_THAN_SIGN = '>';
72    private static final int CODE_LEFT_SQUARE_BRACKET = '[';
73    private static final int CODE_RIGHT_SQUARE_BRACKET = ']';
74    private static final int CODE_LEFT_CURLY_BRACKET = '{';
75    private static final int CODE_RIGHT_CURLY_BRACKET = '}';
76
77    private static final int[] DEFAULT = {
78        Constants.CODE_TAB,
79        Constants.CODE_ENTER,
80        Constants.CODE_SPACE,
81        Constants.CODE_SHIFT,
82        Constants.CODE_SWITCH_ALPHA_SYMBOL,
83        Constants.CODE_OUTPUT_TEXT,
84        Constants.CODE_DELETE,
85        Constants.CODE_SETTINGS,
86        Constants.CODE_SHORTCUT,
87        Constants.CODE_ACTION_ENTER,
88        Constants.CODE_ACTION_NEXT,
89        Constants.CODE_ACTION_PREVIOUS,
90        Constants.CODE_SHIFT_ENTER,
91        Constants.CODE_LANGUAGE_SWITCH,
92        Constants.CODE_RESEARCH,
93        Constants.CODE_UNSPECIFIED,
94        CODE_LEFT_PARENTHESIS,
95        CODE_RIGHT_PARENTHESIS,
96        CODE_LESS_THAN_SIGN,
97        CODE_GREATER_THAN_SIGN,
98        CODE_LEFT_SQUARE_BRACKET,
99        CODE_RIGHT_SQUARE_BRACKET,
100        CODE_LEFT_CURLY_BRACKET,
101        CODE_RIGHT_CURLY_BRACKET,
102    };
103
104    private static final int[] RTL = {
105        DEFAULT[0],
106        DEFAULT[1],
107        DEFAULT[2],
108        DEFAULT[3],
109        DEFAULT[4],
110        DEFAULT[5],
111        DEFAULT[6],
112        DEFAULT[7],
113        DEFAULT[8],
114        DEFAULT[9],
115        DEFAULT[10],
116        DEFAULT[11],
117        DEFAULT[12],
118        DEFAULT[13],
119        DEFAULT[14],
120        CODE_RIGHT_PARENTHESIS,
121        CODE_LEFT_PARENTHESIS,
122        CODE_GREATER_THAN_SIGN,
123        CODE_LESS_THAN_SIGN,
124        CODE_RIGHT_SQUARE_BRACKET,
125        CODE_LEFT_SQUARE_BRACKET,
126        CODE_RIGHT_CURLY_BRACKET,
127        CODE_LEFT_CURLY_BRACKET,
128    };
129
130    private static final String LANGUAGE_DEFAULT = "DEFAULT";
131    private static final String LANGUAGE_ARABIC = "ar";
132    private static final String LANGUAGE_PERSIAN = "fa";
133    private static final String LANGUAGE_HEBREW = "iw";
134
135    private static final Object[] LANGUAGE_AND_CODES = {
136        LANGUAGE_DEFAULT, DEFAULT,
137        LANGUAGE_ARABIC, RTL,
138        LANGUAGE_PERSIAN, RTL,
139        LANGUAGE_HEBREW, RTL,
140    };
141
142    static {
143        for (int i = 0; i < ID_TO_NAME.length; i++) {
144            sNameToIdMap.put(ID_TO_NAME[i], i);
145        }
146
147        for (int i = 0; i < LANGUAGE_AND_CODES.length; i += 2) {
148            final String language = (String)LANGUAGE_AND_CODES[i];
149            final int[] codes = (int[])LANGUAGE_AND_CODES[i + 1];
150            sLanguageToCodesMap.put(language, codes);
151        }
152    }
153}
154