Khmer.java revision 139773d0167a2cf09c4b6c2c47aa7d980dc413bd
1/*
2 * Copyright (C) 2014 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.layout;
18
19import com.android.inputmethod.keyboard.KeyboardId;
20import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
21import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
22import com.android.inputmethod.latin.Constants;
23
24import java.util.Locale;
25
26/**
27 * The Khmer alphabet keyboard.
28 */
29public final class Khmer extends LayoutBase {
30    private static final String LAYOUT_NAME = "khmer";
31
32    public Khmer(final LayoutCustomizer customizer) {
33        super(customizer, Symbols.class, SymbolsShifted.class);
34    }
35
36    @Override
37    public String getName() { return LAYOUT_NAME; }
38
39    public static class KhmerCustomizer extends LayoutCustomizer {
40        public KhmerCustomizer(final Locale locale) { super(locale); }
41
42        @Override
43        public ExpectedKey getAlphabetKey() { return KHMER_ALPHABET_KEY; }
44
45        @Override
46        public ExpectedKey getCurrencyKey() { return CURRENCY_DOLLAR_WITH_RIEL; }
47
48        @Override
49        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) { return EMPTY_KEYS; }
50
51        // U+1780: "ក" KHMER LETTER KA
52        // U+1781: "ខ" KHMER LETTER KHA
53        // U+1782: "គ" KHMER LETTER KO
54        private static final ExpectedKey KHMER_ALPHABET_KEY = key(
55                "\u1780\u1781\u1782", Constants.CODE_SWITCH_ALPHA_SYMBOL);
56
57        // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
58        private static final ExpectedKey CURRENCY_DOLLAR_WITH_RIEL = key(Symbols.DOLLAR_SIGN,
59                moreKey("\u17DB"), Symbols.CENT_SIGN, Symbols.POUND_SIGN, Symbols.EURO_SIGN,
60                Symbols.YEN_SIGN, Symbols.PESO_SIGN);
61    }
62
63    @Override
64    ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
65        if (isPhone) {
66            return ALPHABET_COMMON;
67        }
68        final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
69        builder.addKeysOnTheRightOfRow(4, (Object[])EXCLAMATION_AND_QUESTION_MARKS);
70        return builder.build();
71    }
72
73    @Override
74    public ExpectedKey[][] getCommonAlphabetShiftLayout(final boolean isPhone,
75            final int elementId) {
76        if (elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
77            return getCommonAlphabetLayout(isPhone);
78        }
79        return ALPHABET_SHIFTED_COMMON;
80    }
81
82    // Helper method to create alphabet layout by adding special function keys.
83    @Override
84    ExpectedKeyboardBuilder convertCommonLayoutToKeyboard(final ExpectedKeyboardBuilder builder,
85            final boolean isPhone) {
86        final LayoutCustomizer customizer = getCustomizer();
87        builder.setKeysOfRow(5, (Object[])customizer.getSpaceKeys(isPhone));
88        builder.addKeysOnTheLeftOfRow(5, (Object[])customizer.getKeysLeftToSpacebar(isPhone));
89        builder.addKeysOnTheRightOfRow(5, (Object[])customizer.getKeysRightToSpacebar(isPhone));
90        if (isPhone) {
91            builder.addKeysOnTheRightOfRow(4, DELETE_KEY)
92                    .addKeysOnTheLeftOfRow(5, customizer.getSymbolsKey())
93                    .addKeysOnTheRightOfRow(5, key(ENTER_KEY, EMOJI_KEY));
94        } else {
95            builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
96                    .addKeysOnTheRightOfRow(3, ENTER_KEY)
97                    .addKeysOnTheLeftOfRow(5,
98                            customizer.getSymbolsKey(), key(SHORTCUT_KEY, SETTINGS_KEY))
99                    .addKeysOnTheRightOfRow(5, EMOJI_KEY);
100        }
101        builder.addKeysOnTheLeftOfRow(4, (Object[])customizer.getLeftShiftKeys(isPhone))
102                .addKeysOnTheRightOfRow(4, (Object[])customizer.getRightShiftKeys(isPhone));
103        return builder;
104    }
105
106    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
107            .setKeysOfRow(1,
108                    // U+17E1: "១" KHMER DIGIT ONE
109                    // U+17F1: "៱" KHMER SYMBOL LEK ATTAK MUOY
110                    key("\u17E1", joinMoreKeys("1", "\u17F1")),
111                    // U+17E2: "២" KHMER DIGIT TWO
112                    // U+17F2: "៲" KHMER SYMBOL LEK ATTAK PII
113                    key("\u17E2", joinMoreKeys("2", "\u17F2")),
114                    // U+17E3: "៣" KHMER DIGIT THREE
115                    // U+17F3: "៳" KHMER SYMBOL LEK ATTAK BEI
116                    key("\u17E3", joinMoreKeys("3", "\u17F3")),
117                    // U+17E4: "៤" KHMER DIGIT FOUR
118                    // U+17F4: "៴" KHMER SYMBOL LEK ATTAK BUON
119                    key("\u17E4", joinMoreKeys("4", "\u17F4")),
120                    // U+17E5: "៥" KHMER DIGIT FIVE
121                    // U+17F5: "៵" KHMER SYMBOL LEK ATTAK PRAM
122                    key("\u17E5", joinMoreKeys("5", "\u17F5")),
123                    // U+17E6: "៦" KHMER DIGIT SIX
124                    // U+17F6: "៶" KHMER SYMBOL LEK ATTAK PRAM-MUOY
125                    key("\u17E6", joinMoreKeys("6", "\u17F6")),
126                    // U+17E7: "៧" KHMER DIGIT SEVEN
127                    // U+17F7: "៷" KHMER SYMBOL LEK ATTAK PRAM-PII
128                    key("\u17E7", joinMoreKeys("7", "\u17F7")),
129                    // U+17E8: "៨" KHMER DIGIT EIGHT
130                    // U+17F8: "៸" KHMER SYMBOL LEK ATTAK PRAM-BEI
131                    key("\u17E8", joinMoreKeys("8", "\u17F8")),
132                    // U+17E9: "៩" KHMER DIGIT NINE
133                    // U+17F9: "៹" KHMER SYMBOL LEK ATTAK PRAM-BUON
134                    key("\u17E9", joinMoreKeys("9", "\u17F9")),
135                    // U+17E0: "០" KHMER DIGIT ZERO
136                    // U+17F0: "៰" KHMER SYMBOL LEK ATTAK SON
137                    key("\u17E0", joinMoreKeys("0", "\u17F0")),
138                    // U+17A5: "ឥ" KHMER INDEPENDENT VOWEL QI
139                    // U+17A6: "ឦ" KHMER INDEPENDENT VOWEL QII
140                    key("\u17A5", moreKey("\u17A6")),
141                    // U+17B2: "ឲ" KHMER INDEPENDENT VOWEL QOO TYPE TWO
142                    // U+17B1: "ឱ" KHMER INDEPENDENT VOWEL QOO TYPE ONE
143                    key("\u17B2", moreKey("\u17B1")))
144            .setKeysOfRow(2,
145                    // U+1786: "ឆ" KHMER LETTER CHA
146                    // U+17B9: "ឹ" KHMER VOWEL SIGN Y
147                    // U+17C1: "េ" KHMER VOWEL SIGN E
148                    // U+179A: "រ" KHMER LETTER RO
149                    // U+178F: "ត" KHMER LETTER TA
150                    // U+1799: "យ" KHMER LETTER YO
151                    // U+17BB: "ុ" KHMER VOWEL SIGN U
152                    // U+17B7: "ិ" KHMER VOWEL SIGN I
153                    // U+17C4: "ោ" KHMER VOWEL SIGN OO
154                    // U+1795: "ផ" KHMER LETTER PHA
155                    // U+17C0: "ៀ" KHMER VOWEL SIGN IE
156                    "\u1786", "\u17B9", "\u17C1", "\u179A", "\u178F", "\u1799", "\u17BB", "\u17B7",
157                    "\u17C4", "\u1795", "\u17C0",
158                    // U+17AA: "ឪ" KHMER INDEPENDENT VOWEL QUUV
159                    // U+17A7: "ឧ" KHMER INDEPENDENT VOWEL QU
160                    // U+17B1: "ឱ" KHMER INDEPENDENT VOWEL QOO TYPE ONE
161                    // U+17B3: "ឳ" KHMER INDEPENDENT VOWEL QAU
162                    // U+17A9: "ឩ" KHMER INDEPENDENT VOWEL QUU
163                    // U+17A8: "ឨ" KHMER INDEPENDENT VOWEL QUK
164                    key("\u17AA", joinMoreKeys("\u17A7", "\u17B1", "\u17B3", "\u17A9", "\u17A8")))
165            .setKeysOfRow(3,
166                    // U+17B6: "ា" KHMER VOWEL SIGN AA
167                    // U+179F: "ស" KHMER LETTER SA
168                    // U+178A: "ដ" KHMER LETTER DA
169                    // U+1790: "ថ" KHMER LETTER THA
170                    // U+1784: "ង" KHMER LETTER NGO
171                    // U+17A0: "ហ" KHMER LETTER HA
172                    // U+17D2: "្" KHMER SIGN COENG
173                    // U+1780: "ក" KHMER LETTER KA
174                    // U+179B: "ល" KHMER LETTER LO
175                    // U+17BE: "ើ" KHMER VOWEL SIGN OE
176                    // U+17CB: "់" KHMER SIGN BANTOC
177                    "\u17B6", "\u179F", "\u178A", "\u1790", "\u1784", "\u17A0", "\u17D2", "\u1780",
178                    "\u179B", "\u17BE", "\u17CB",
179                    // U+17AE: "ឮ" KHMER INDEPENDENT VOWEL LYY
180                    // U+17AD: "ឭ" KHMER INDEPENDENT VOWEL LY
181                    // U+17B0: "ឰ" KHMER INDEPENDENT VOWEL QAI
182                    key("\u17AE", joinMoreKeys("\u17AD", "\u17B0")))
183            .setKeysOfRow(4,
184                    // U+178B: "ឋ" KHMER LETTER TTHA
185                    // U+1781: "ខ" KHMER LETTER KHA
186                    // U+1785: "ច" KHMER LETTER CA
187                    // U+179C: "វ" KHMER LETTER VO
188                    // U+1794: "ប" KHMER LETTER BA
189                    // U+1793: "ន" KHMER LETTER NO
190                    // U+1798: "ម" KHMER LETTER MO
191                    // U+17BB/U+17C6: "ុំ" KHMER VOWEL SIGN U/KHMER SIGN NIKAHIT
192                    // U+17D4: "។" KHMER SIGN KHAN
193                    // U+17CA: "៊" KHMER SIGN TRIISAP
194                    "\u178B", "\u1781", "\u1785", "\u179C", "\u1794", "\u1793", "\u1798",
195                    "\u17BB\u17C6", "\u17D4", "\u17CA")
196            .build();
197
198    private static final ExpectedKey[][] ALPHABET_SHIFTED_COMMON = new ExpectedKeyboardBuilder()
199            .setKeysOfRow(1,
200                    key("!", ZWJ_KEY),
201                    // U+17D7: "ៗ" KHMER SIGN LEK TOO
202                    key("\u17D7", ZWNJ_KEY),
203                    // U+17D1: "៑" KHMER SIGN VIRIAM
204                    key("\"", moreKey("\u17D1")),
205                    // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
206                    key("\u17DB", joinMoreKeys(Symbols.DOLLAR_SIGN, Symbols.EURO_SIGN)),
207                    // U+17D6: "៖" KHMER SIGN CAMNUC PII KUUH
208                    key("%", moreKey("\u17D6")),
209                    // U+17CD: "៍" KHMER SIGN TOANDAKHIAT
210                    // U+17D9: "៙" KHMER SIGN PHNAEK MUAN
211                    key("\u17CD", moreKey("\u17D9")),
212                    // U+17D0: "័" KHMER SIGN SAMYOK SANNYA
213                    // U+17DA: "៚" KHMER SIGN KOOMUUT
214                    key("\u17D0", moreKey("\u17DA")),
215                    // U+17CF: "៏" KHMER SIGN AHSDA
216                    key("\u17CF", moreKey("*")),
217                    // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
218                    key("(", joinMoreKeys("{", "\u00AB")),
219                    // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
220                    key(")", joinMoreKeys("}", "\u00BB")),
221                    // U+17CC: "៌" KHMER SIGN ROBAT
222                    // U+00D7: "×" MULTIPLICATION SIGN
223                    key("\u17CC", moreKey("\u00D7")),
224                    // U+17CE: "៎" KHMER SIGN KAKABAT
225                    "\u17CE")
226            .setKeysOfRow(2,
227                    // U+1788: "ឈ" KHMER LETTER CHO
228                    // U+17DC: "ៜ" KHMER SIGN AVAKRAHASANYA
229                    key("\u1788", moreKey("\u17DC")),
230                    // U+17BA: "ឺ" KHMER VOWEL SIGN YY
231                    // U+17DD: "៝" KHMER SIGN ATTHACAN
232                    key("\u17BA", moreKey("\u17DD")),
233                    // U+17C2: "ែ" KHMER VOWEL SIGN AE
234                    "\u17C2",
235                    // U+17AC: "ឬ" KHMER INDEPENDENT VOWEL RYY
236                    // U+17AB: "ឫ" KHMER INDEPENDENT VOWEL RY
237                    key("\u17AC", moreKey("\u17AB")),
238                    // U+1791: "ទ" KHMER LETTER TO
239                    // U+17BD: "ួ" KHMER VOWEL SIGN UA
240                    // U+17BC: "ូ" KHMER VOWEL SIGN UU
241                    // U+17B8: "ី" KHMER VOWEL SIGN II
242                    // U+17C5: "ៅ" KHMER VOWEL SIGN AU
243                    // U+1797: "ភ" KHMER LETTER PHO
244                    // U+17BF: "ឿ" KHMER VOWEL SIGN YA
245                    // U+17B0: "ឰ" KHMER INDEPENDENT VOWEL QAI
246                    "\u1791", "\u17BD", "\u17BC", "\u17B8", "\u17C5", "\u1797", "\u17BF", "\u17B0")
247            .setKeysOfRow(3,
248                    // U+17B6/U+17C6: "ាំ" KHMER VOWEL SIGN AA/KHMER SIGN NIKAHIT
249                    // U+17C3: "ៃ" KHMER VOWEL SIGN AI
250                    // U+178C: "ឌ" KHMER LETTER DO
251                    // U+1792: "ធ" KHMER LETTER THO
252                    // U+17A2: "អ" KHMER LETTER QAE
253                    "\u17B6\u17C6", "\u17C3", "\u178C", "\u1792", "\u17A2",
254                    // U+17C7: "ះ" KHMER SIGN REAHMUK
255                    // U+17C8: "ៈ" KHMER SIGN YUUKALEAPINTU
256                    key("\u17C7", moreKey("\u17C8")),
257                    // U+1789: "ញ" KHMER LETTER NYO
258                    "\u1789",
259                    // U+1782: "គ" KHMER LETTER KO
260                    // U+179D: "ឝ" KHMER LETTER SHA
261                    key("\u1782", moreKey("\u179D")),
262                    // U+17A1: "ឡ" KHMER LETTER LA
263                    // U+17C4/U+17C7: "ោះ" KHMER VOWEL SIGN OO/KHMER SIGN REAHMUK
264                    // U+17C9: "៉" KHMER SIGN MUUSIKATOAN
265                    // U+17AF: "ឯ" KHMER INDEPENDENT VOWEL QE
266                    "\u17A1", "\u17C4\u17C7", "\u17C9", "\u17AF")
267            .setKeysOfRow(4,
268                    // U+178D: "ឍ" KHMER LETTER TTHO
269                    // U+1783: "ឃ" KHMER LETTER KHO
270                    // U+1787: "ជ" KHMER LETTER CO
271                    // U+17C1/U+17C7: "េះ" KHMER VOWEL SIGN E/KHMER SIGN REAHMUK
272                    "\u178D", "\u1783", "\u1787", "\u17C1\u17C7",
273                    // U+1796: "ព" KHMER LETTER PO
274                    // U+179E: "ឞ" KHMER LETTER SSO
275                    key("\u1796", moreKey("\u179E")),
276                    // U+178E: "ណ" KHMER LETTER NNO
277                    // U+17C6: "ំ" KHMER SIGN NIKAHIT
278                    // U+17BB/U+17C7: "ុះ" KHMER VOWEL SIGN U/KHMER SIGN REAHMUK
279                    // U+17D5: "៕" KHMER SIGN BARIYOOSAN
280                    "\u178E", "\u17C6", "\u17BB\u17C7", "\u17D5", "?")
281            .build();
282}
283