KeyboardCodesSet.java revision c0a732f0320b0d125610adf23d14d742860b5fd3
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.keyboard.internal;
18
19import com.android.inputmethod.latin.Constants;
20import com.android.inputmethod.latin.utils.CollectionUtils;
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_capslock",
47        "key_switch_alpha_symbol",
48        "key_output_text",
49        "key_delete",
50        "key_settings",
51        "key_shortcut",
52        "key_action_next",
53        "key_action_previous",
54        "key_shift_enter",
55        "key_language_switch",
56        "key_unspecified",
57        "key_left_parenthesis",
58        "key_right_parenthesis",
59        "key_less_than",
60        "key_greater_than",
61        "key_left_square_bracket",
62        "key_right_square_bracket",
63        "key_left_curly_bracket",
64        "key_right_curly_bracket",
65    };
66
67    private static final int CODE_LEFT_PARENTHESIS = '(';
68    private static final int CODE_RIGHT_PARENTHESIS = ')';
69    private static final int CODE_LESS_THAN_SIGN = '<';
70    private static final int CODE_GREATER_THAN_SIGN = '>';
71    private static final int CODE_LEFT_SQUARE_BRACKET = '[';
72    private static final int CODE_RIGHT_SQUARE_BRACKET = ']';
73    private static final int CODE_LEFT_CURLY_BRACKET = '{';
74    private static final int CODE_RIGHT_CURLY_BRACKET = '}';
75
76    // This array should be aligned with the array RTL below.
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_CAPSLOCK,
83        Constants.CODE_SWITCH_ALPHA_SYMBOL,
84        Constants.CODE_OUTPUT_TEXT,
85        Constants.CODE_DELETE,
86        Constants.CODE_SETTINGS,
87        Constants.CODE_SHORTCUT,
88        Constants.CODE_ACTION_NEXT,
89        Constants.CODE_ACTION_PREVIOUS,
90        Constants.CODE_SHIFT_ENTER,
91        Constants.CODE_LANGUAGE_SWITCH,
92        Constants.CODE_UNSPECIFIED,
93        CODE_LEFT_PARENTHESIS,
94        CODE_RIGHT_PARENTHESIS,
95        CODE_LESS_THAN_SIGN,
96        CODE_GREATER_THAN_SIGN,
97        CODE_LEFT_SQUARE_BRACKET,
98        CODE_RIGHT_SQUARE_BRACKET,
99        CODE_LEFT_CURLY_BRACKET,
100        CODE_RIGHT_CURLY_BRACKET,
101    };
102
103    private static final int[] RTL = {
104        DEFAULT[0],
105        DEFAULT[1],
106        DEFAULT[2],
107        DEFAULT[3],
108        DEFAULT[4],
109        DEFAULT[5],
110        DEFAULT[6],
111        DEFAULT[7],
112        DEFAULT[8],
113        DEFAULT[9],
114        DEFAULT[10],
115        DEFAULT[11],
116        DEFAULT[12],
117        DEFAULT[13],
118        DEFAULT[14],
119        CODE_RIGHT_PARENTHESIS,
120        CODE_LEFT_PARENTHESIS,
121        CODE_GREATER_THAN_SIGN,
122        CODE_LESS_THAN_SIGN,
123        CODE_RIGHT_SQUARE_BRACKET,
124        CODE_LEFT_SQUARE_BRACKET,
125        CODE_RIGHT_CURLY_BRACKET,
126        CODE_LEFT_CURLY_BRACKET,
127    };
128
129    private static final String LANGUAGE_DEFAULT = "DEFAULT";
130    private static final String LANGUAGE_ARABIC = "ar";
131    private static final String LANGUAGE_PERSIAN = "fa";
132    private static final String LANGUAGE_HEBREW = "iw";
133
134    private static final Object[] LANGUAGE_AND_CODES = {
135        LANGUAGE_DEFAULT, DEFAULT,
136        LANGUAGE_ARABIC, RTL,
137        LANGUAGE_PERSIAN, RTL,
138        LANGUAGE_HEBREW, RTL,
139    };
140
141    static {
142        if (DEFAULT.length != RTL.length || DEFAULT.length != ID_TO_NAME.length) {
143            throw new RuntimeException("Internal inconsistency");
144        }
145        for (int i = 0; i < ID_TO_NAME.length; i++) {
146            sNameToIdMap.put(ID_TO_NAME[i], i);
147        }
148
149        for (int i = 0; i < LANGUAGE_AND_CODES.length; i += 2) {
150            final String language = (String)LANGUAGE_AND_CODES[i];
151            final int[] codes = (int[])LANGUAGE_AND_CODES[i + 1];
152            sLanguageToCodesMap.put(language, codes);
153        }
154    }
155}
156