1 package com.android.dialer.dialpad;
2 
3 public class LatinSmartDialMap implements SmartDialMap {
4 
5     private static final char[] LATIN_LETTERS_TO_DIGITS = {
6         '2', '2', '2', // A,B,C -> 2
7         '3', '3', '3', // D,E,F -> 3
8         '4', '4', '4', // G,H,I -> 4
9         '5', '5', '5', // J,K,L -> 5
10         '6', '6', '6', // M,N,O -> 6
11         '7', '7', '7', '7', // P,Q,R,S -> 7
12         '8', '8', '8', // T,U,V -> 8
13         '9', '9', '9', '9' // W,X,Y,Z -> 9
14     };
15 
16     @Override
isValidDialpadAlphabeticChar(char ch)17     public boolean isValidDialpadAlphabeticChar(char ch) {
18         return (ch >= 'a' && ch <= 'z');
19     }
20 
21     @Override
isValidDialpadNumericChar(char ch)22     public boolean isValidDialpadNumericChar(char ch) {
23         return (ch >= '0' && ch <= '9');
24     }
25 
26     @Override
isValidDialpadCharacter(char ch)27     public boolean isValidDialpadCharacter(char ch) {
28         return (isValidDialpadAlphabeticChar(ch) || isValidDialpadNumericChar(ch));
29     }
30 
31     /*
32      * The switch statement in this function was generated using the python code:
33      * from unidecode import unidecode
34      * for i in range(192, 564):
35      *     char = unichr(i)
36      *     decoded = unidecode(char)
37      *     # Unicode characters that decompose into multiple characters i.e.
38      *     #  into ss are not supported for now
39      *     if (len(decoded) == 1 and decoded.isalpha()):
40      *         print "case '" + char + "': return '" + unidecode(char) +  "';"
41      *
42      * This gives us a way to map characters containing accents/diacritics to their
43      * alphabetic equivalents. The unidecode library can be found at:
44      * http://pypi.python.org/pypi/Unidecode/0.04.1
45      *
46      * Also remaps all upper case latin characters to their lower case equivalents.
47      */
48     @Override
normalizeCharacter(char ch)49     public char normalizeCharacter(char ch) {
50         switch (ch) {
51             case 'À': return 'a';
52             case 'Á': return 'a';
53             case 'Â': return 'a';
54             case 'Ã': return 'a';
55             case 'Ä': return 'a';
56             case 'Å': return 'a';
57             case 'Ç': return 'c';
58             case 'È': return 'e';
59             case 'É': return 'e';
60             case 'Ê': return 'e';
61             case 'Ë': return 'e';
62             case 'Ì': return 'i';
63             case 'Í': return 'i';
64             case 'Î': return 'i';
65             case 'Ï': return 'i';
66             case 'Ð': return 'd';
67             case 'Ñ': return 'n';
68             case 'Ò': return 'o';
69             case 'Ó': return 'o';
70             case 'Ô': return 'o';
71             case 'Õ': return 'o';
72             case 'Ö': return 'o';
73             case '×': return 'x';
74             case 'Ø': return 'o';
75             case 'Ù': return 'u';
76             case 'Ú': return 'u';
77             case 'Û': return 'u';
78             case 'Ü': return 'u';
79             case 'Ý': return 'u';
80             case 'à': return 'a';
81             case 'á': return 'a';
82             case 'â': return 'a';
83             case 'ã': return 'a';
84             case 'ä': return 'a';
85             case 'å': return 'a';
86             case 'ç': return 'c';
87             case 'è': return 'e';
88             case 'é': return 'e';
89             case 'ê': return 'e';
90             case 'ë': return 'e';
91             case 'ì': return 'i';
92             case 'í': return 'i';
93             case 'î': return 'i';
94             case 'ï': return 'i';
95             case 'ð': return 'd';
96             case 'ñ': return 'n';
97             case 'ò': return 'o';
98             case 'ó': return 'o';
99             case 'ô': return 'o';
100             case 'õ': return 'o';
101             case 'ö': return 'o';
102             case 'ø': return 'o';
103             case 'ù': return 'u';
104             case 'ú': return 'u';
105             case 'û': return 'u';
106             case 'ü': return 'u';
107             case 'ý': return 'y';
108             case 'ÿ': return 'y';
109             case 'Ā': return 'a';
110             case 'ā': return 'a';
111             case 'Ă': return 'a';
112             case 'ă': return 'a';
113             case 'Ą': return 'a';
114             case 'ą': return 'a';
115             case 'Ć': return 'c';
116             case 'ć': return 'c';
117             case 'Ĉ': return 'c';
118             case 'ĉ': return 'c';
119             case 'Ċ': return 'c';
120             case 'ċ': return 'c';
121             case 'Č': return 'c';
122             case 'č': return 'c';
123             case 'Ď': return 'd';
124             case 'ď': return 'd';
125             case 'Đ': return 'd';
126             case 'đ': return 'd';
127             case 'Ē': return 'e';
128             case 'ē': return 'e';
129             case 'Ĕ': return 'e';
130             case 'ĕ': return 'e';
131             case 'Ė': return 'e';
132             case 'ė': return 'e';
133             case 'Ę': return 'e';
134             case 'ę': return 'e';
135             case 'Ě': return 'e';
136             case 'ě': return 'e';
137             case 'Ĝ': return 'g';
138             case 'ĝ': return 'g';
139             case 'Ğ': return 'g';
140             case 'ğ': return 'g';
141             case 'Ġ': return 'g';
142             case 'ġ': return 'g';
143             case 'Ģ': return 'g';
144             case 'ģ': return 'g';
145             case 'Ĥ': return 'h';
146             case 'ĥ': return 'h';
147             case 'Ħ': return 'h';
148             case 'ħ': return 'h';
149             case 'Ĩ': return 'i';
150             case 'ĩ': return 'i';
151             case 'Ī': return 'i';
152             case 'ī': return 'i';
153             case 'Ĭ': return 'i';
154             case 'ĭ': return 'i';
155             case 'Į': return 'i';
156             case 'į': return 'i';
157             case 'İ': return 'i';
158             case 'ı': return 'i';
159             case 'Ĵ': return 'j';
160             case 'ĵ': return 'j';
161             case 'Ķ': return 'k';
162             case 'ķ': return 'k';
163             case 'ĸ': return 'k';
164             case 'Ĺ': return 'l';
165             case 'ĺ': return 'l';
166             case 'Ļ': return 'l';
167             case 'ļ': return 'l';
168             case 'Ľ': return 'l';
169             case 'ľ': return 'l';
170             case 'Ŀ': return 'l';
171             case 'ŀ': return 'l';
172             case 'Ł': return 'l';
173             case 'ł': return 'l';
174             case 'Ń': return 'n';
175             case 'ń': return 'n';
176             case 'Ņ': return 'n';
177             case 'ņ': return 'n';
178             case 'Ň': return 'n';
179             case 'ň': return 'n';
180             case 'Ō': return 'o';
181             case 'ō': return 'o';
182             case 'Ŏ': return 'o';
183             case 'ŏ': return 'o';
184             case 'Ő': return 'o';
185             case 'ő': return 'o';
186             case 'Ŕ': return 'r';
187             case 'ŕ': return 'r';
188             case 'Ŗ': return 'r';
189             case 'ŗ': return 'r';
190             case 'Ř': return 'r';
191             case 'ř': return 'r';
192             case 'Ś': return 's';
193             case 'ś': return 's';
194             case 'Ŝ': return 's';
195             case 'ŝ': return 's';
196             case 'Ş': return 's';
197             case 'ş': return 's';
198             case 'Š': return 's';
199             case 'š': return 's';
200             case 'Ţ': return 't';
201             case 'ţ': return 't';
202             case 'Ť': return 't';
203             case 'ť': return 't';
204             case 'Ŧ': return 't';
205             case 'ŧ': return 't';
206             case 'Ũ': return 'u';
207             case 'ũ': return 'u';
208             case 'Ū': return 'u';
209             case 'ū': return 'u';
210             case 'Ŭ': return 'u';
211             case 'ŭ': return 'u';
212             case 'Ů': return 'u';
213             case 'ů': return 'u';
214             case 'Ű': return 'u';
215             case 'ű': return 'u';
216             case 'Ų': return 'u';
217             case 'ų': return 'u';
218             case 'Ŵ': return 'w';
219             case 'ŵ': return 'w';
220             case 'Ŷ': return 'y';
221             case 'ŷ': return 'y';
222             case 'Ÿ': return 'y';
223             case 'Ź': return 'z';
224             case 'ź': return 'z';
225             case 'Ż': return 'z';
226             case 'ż': return 'z';
227             case 'Ž': return 'z';
228             case 'ž': return 'z';
229             case 'ſ': return 's';
230             case 'ƀ': return 'b';
231             case 'Ɓ': return 'b';
232             case 'Ƃ': return 'b';
233             case 'ƃ': return 'b';
234             case 'Ɔ': return 'o';
235             case 'Ƈ': return 'c';
236             case 'ƈ': return 'c';
237             case 'Ɖ': return 'd';
238             case 'Ɗ': return 'd';
239             case 'Ƌ': return 'd';
240             case 'ƌ': return 'd';
241             case 'ƍ': return 'd';
242             case 'Ɛ': return 'e';
243             case 'Ƒ': return 'f';
244             case 'ƒ': return 'f';
245             case 'Ɠ': return 'g';
246             case 'Ɣ': return 'g';
247             case 'Ɩ': return 'i';
248             case 'Ɨ': return 'i';
249             case 'Ƙ': return 'k';
250             case 'ƙ': return 'k';
251             case 'ƚ': return 'l';
252             case 'ƛ': return 'l';
253             case 'Ɯ': return 'w';
254             case 'Ɲ': return 'n';
255             case 'ƞ': return 'n';
256             case 'Ɵ': return 'o';
257             case 'Ơ': return 'o';
258             case 'ơ': return 'o';
259             case 'Ƥ': return 'p';
260             case 'ƥ': return 'p';
261             case 'ƫ': return 't';
262             case 'Ƭ': return 't';
263             case 'ƭ': return 't';
264             case 'Ʈ': return 't';
265             case 'Ư': return 'u';
266             case 'ư': return 'u';
267             case 'Ʊ': return 'y';
268             case 'Ʋ': return 'v';
269             case 'Ƴ': return 'y';
270             case 'ƴ': return 'y';
271             case 'Ƶ': return 'z';
272             case 'ƶ': return 'z';
273             case 'ƿ': return 'w';
274             case 'Ǎ': return 'a';
275             case 'ǎ': return 'a';
276             case 'Ǐ': return 'i';
277             case 'ǐ': return 'i';
278             case 'Ǒ': return 'o';
279             case 'ǒ': return 'o';
280             case 'Ǔ': return 'u';
281             case 'ǔ': return 'u';
282             case 'Ǖ': return 'u';
283             case 'ǖ': return 'u';
284             case 'Ǘ': return 'u';
285             case 'ǘ': return 'u';
286             case 'Ǚ': return 'u';
287             case 'ǚ': return 'u';
288             case 'Ǜ': return 'u';
289             case 'ǜ': return 'u';
290             case 'Ǟ': return 'a';
291             case 'ǟ': return 'a';
292             case 'Ǡ': return 'a';
293             case 'ǡ': return 'a';
294             case 'Ǥ': return 'g';
295             case 'ǥ': return 'g';
296             case 'Ǧ': return 'g';
297             case 'ǧ': return 'g';
298             case 'Ǩ': return 'k';
299             case 'ǩ': return 'k';
300             case 'Ǫ': return 'o';
301             case 'ǫ': return 'o';
302             case 'Ǭ': return 'o';
303             case 'ǭ': return 'o';
304             case 'ǰ': return 'j';
305             case 'Dz': return 'd';
306             case 'Ǵ': return 'g';
307             case 'ǵ': return 'g';
308             case 'Ƿ': return 'w';
309             case 'Ǹ': return 'n';
310             case 'ǹ': return 'n';
311             case 'Ǻ': return 'a';
312             case 'ǻ': return 'a';
313             case 'Ǿ': return 'o';
314             case 'ǿ': return 'o';
315             case 'Ȁ': return 'a';
316             case 'ȁ': return 'a';
317             case 'Ȃ': return 'a';
318             case 'ȃ': return 'a';
319             case 'Ȅ': return 'e';
320             case 'ȅ': return 'e';
321             case 'Ȇ': return 'e';
322             case 'ȇ': return 'e';
323             case 'Ȉ': return 'i';
324             case 'ȉ': return 'i';
325             case 'Ȋ': return 'i';
326             case 'ȋ': return 'i';
327             case 'Ȍ': return 'o';
328             case 'ȍ': return 'o';
329             case 'Ȏ': return 'o';
330             case 'ȏ': return 'o';
331             case 'Ȑ': return 'r';
332             case 'ȑ': return 'r';
333             case 'Ȓ': return 'r';
334             case 'ȓ': return 'r';
335             case 'Ȕ': return 'u';
336             case 'ȕ': return 'u';
337             case 'Ȗ': return 'u';
338             case 'ȗ': return 'u';
339             case 'Ș': return 's';
340             case 'ș': return 's';
341             case 'Ț': return 't';
342             case 'ț': return 't';
343             case 'Ȝ': return 'y';
344             case 'ȝ': return 'y';
345             case 'Ȟ': return 'h';
346             case 'ȟ': return 'h';
347             case 'Ȥ': return 'z';
348             case 'ȥ': return 'z';
349             case 'Ȧ': return 'a';
350             case 'ȧ': return 'a';
351             case 'Ȩ': return 'e';
352             case 'ȩ': return 'e';
353             case 'Ȫ': return 'o';
354             case 'ȫ': return 'o';
355             case 'Ȭ': return 'o';
356             case 'ȭ': return 'o';
357             case 'Ȯ': return 'o';
358             case 'ȯ': return 'o';
359             case 'Ȱ': return 'o';
360             case 'ȱ': return 'o';
361             case 'Ȳ': return 'y';
362             case 'ȳ': return 'y';
363             case 'A': return 'a';
364             case 'B': return 'b';
365             case 'C': return 'c';
366             case 'D': return 'd';
367             case 'E': return 'e';
368             case 'F': return 'f';
369             case 'G': return 'g';
370             case 'H': return 'h';
371             case 'I': return 'i';
372             case 'J': return 'j';
373             case 'K': return 'k';
374             case 'L': return 'l';
375             case 'M': return 'm';
376             case 'N': return 'n';
377             case 'O': return 'o';
378             case 'P': return 'p';
379             case 'Q': return 'q';
380             case 'R': return 'r';
381             case 'S': return 's';
382             case 'T': return 't';
383             case 'U': return 'u';
384             case 'V': return 'v';
385             case 'W': return 'w';
386             case 'X': return 'x';
387             case 'Y': return 'y';
388             case 'Z': return 'z';
389             default:
390                 return ch;
391         }
392     }
393 
394     @Override
getDialpadIndex(char ch)395     public byte getDialpadIndex(char ch) {
396         if (ch >= '0' && ch <= '9') {
397             return (byte) (ch - '0');
398         } else if (ch >= 'a' && ch <= 'z') {
399             return (byte) (LATIN_LETTERS_TO_DIGITS[ch - 'a'] - '0');
400         } else {
401             return -1;
402         }
403     }
404 
405     @Override
getDialpadNumericCharacter(char ch)406     public char getDialpadNumericCharacter(char ch) {
407         if (ch >= 'a' && ch <= 'z') {
408             return LATIN_LETTERS_TO_DIGITS[ch - 'a'];
409         }
410         return ch;
411     }
412 
413 }
414