1 /*
2  * Copyright (C) 2016 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 
17 package com.android.dialer.smartdial;
18 
19 public class LatinSmartDialMap implements SmartDialMap {
20 
21   private static final char[] LATIN_LETTERS_TO_DIGITS = {
22     '2',
23     '2',
24     '2', // A,B,C -> 2
25     '3',
26     '3',
27     '3', // D,E,F -> 3
28     '4',
29     '4',
30     '4', // G,H,I -> 4
31     '5',
32     '5',
33     '5', // J,K,L -> 5
34     '6',
35     '6',
36     '6', // M,N,O -> 6
37     '7',
38     '7',
39     '7',
40     '7', // P,Q,R,S -> 7
41     '8',
42     '8',
43     '8', // T,U,V -> 8
44     '9',
45     '9',
46     '9',
47     '9' // W,X,Y,Z -> 9
48   };
49 
50   @Override
isValidDialpadAlphabeticChar(char ch)51   public boolean isValidDialpadAlphabeticChar(char ch) {
52     return (ch >= 'a' && ch <= 'z');
53   }
54 
55   @Override
isValidDialpadNumericChar(char ch)56   public boolean isValidDialpadNumericChar(char ch) {
57     return (ch >= '0' && ch <= '9');
58   }
59 
60   @Override
isValidDialpadCharacter(char ch)61   public boolean isValidDialpadCharacter(char ch) {
62     return (isValidDialpadAlphabeticChar(ch) || isValidDialpadNumericChar(ch));
63   }
64 
65   /*
66    * The switch statement in this function was generated using the python code:
67    * from unidecode import unidecode
68    * for i in range(192, 564):
69    *     char = unichr(i)
70    *     decoded = unidecode(char)
71    *     # Unicode characters that decompose into multiple characters i.e.
72    *     #  into ss are not supported for now
73    *     if (len(decoded) == 1 and decoded.isalpha()):
74    *         print "case '" + char + "': return '" + unidecode(char) +  "';"
75    *
76    * This gives us a way to map characters containing accents/diacritics to their
77    * alphabetic equivalents. The unidecode library can be found at:
78    * http://pypi.python.org/pypi/Unidecode/0.04.1
79    *
80    * Also remaps all upper case latin characters to their lower case equivalents.
81    */
82   @Override
normalizeCharacter(char ch)83   public char normalizeCharacter(char ch) {
84     switch (ch) {
85       case 'À':
86         return 'a';
87       case 'Á':
88         return 'a';
89       case 'Â':
90         return 'a';
91       case 'Ã':
92         return 'a';
93       case 'Ä':
94         return 'a';
95       case 'Å':
96         return 'a';
97       case 'Ç':
98         return 'c';
99       case 'È':
100         return 'e';
101       case 'É':
102         return 'e';
103       case 'Ê':
104         return 'e';
105       case 'Ë':
106         return 'e';
107       case 'Ì':
108         return 'i';
109       case 'Í':
110         return 'i';
111       case 'Î':
112         return 'i';
113       case 'Ï':
114         return 'i';
115       case 'Ð':
116         return 'd';
117       case 'Ñ':
118         return 'n';
119       case 'Ò':
120         return 'o';
121       case 'Ó':
122         return 'o';
123       case 'Ô':
124         return 'o';
125       case 'Õ':
126         return 'o';
127       case 'Ö':
128         return 'o';
129       case '×':
130         return 'x';
131       case 'Ø':
132         return 'o';
133       case 'Ù':
134         return 'u';
135       case 'Ú':
136         return 'u';
137       case 'Û':
138         return 'u';
139       case 'Ü':
140         return 'u';
141       case 'Ý':
142         return 'u';
143       case 'à':
144         return 'a';
145       case 'á':
146         return 'a';
147       case 'â':
148         return 'a';
149       case 'ã':
150         return 'a';
151       case 'ä':
152         return 'a';
153       case 'å':
154         return 'a';
155       case 'ç':
156         return 'c';
157       case 'è':
158         return 'e';
159       case 'é':
160         return 'e';
161       case 'ê':
162         return 'e';
163       case 'ë':
164         return 'e';
165       case 'ì':
166         return 'i';
167       case 'í':
168         return 'i';
169       case 'î':
170         return 'i';
171       case 'ï':
172         return 'i';
173       case 'ð':
174         return 'd';
175       case 'ñ':
176         return 'n';
177       case 'ò':
178         return 'o';
179       case 'ó':
180         return 'o';
181       case 'ô':
182         return 'o';
183       case 'õ':
184         return 'o';
185       case 'ö':
186         return 'o';
187       case 'ø':
188         return 'o';
189       case 'ù':
190         return 'u';
191       case 'ú':
192         return 'u';
193       case 'û':
194         return 'u';
195       case 'ü':
196         return 'u';
197       case 'ý':
198         return 'y';
199       case 'ÿ':
200         return 'y';
201       case 'Ā':
202         return 'a';
203       case 'ā':
204         return 'a';
205       case 'Ă':
206         return 'a';
207       case 'ă':
208         return 'a';
209       case 'Ą':
210         return 'a';
211       case 'ą':
212         return 'a';
213       case 'Ć':
214         return 'c';
215       case 'ć':
216         return 'c';
217       case 'Ĉ':
218         return 'c';
219       case 'ĉ':
220         return 'c';
221       case 'Ċ':
222         return 'c';
223       case 'ċ':
224         return 'c';
225       case 'Č':
226         return 'c';
227       case 'č':
228         return 'c';
229       case 'Ď':
230         return 'd';
231       case 'ď':
232         return 'd';
233       case 'Đ':
234         return 'd';
235       case 'đ':
236         return 'd';
237       case 'Ē':
238         return 'e';
239       case 'ē':
240         return 'e';
241       case 'Ĕ':
242         return 'e';
243       case 'ĕ':
244         return 'e';
245       case 'Ė':
246         return 'e';
247       case 'ė':
248         return 'e';
249       case 'Ę':
250         return 'e';
251       case 'ę':
252         return 'e';
253       case 'Ě':
254         return 'e';
255       case 'ě':
256         return 'e';
257       case 'Ĝ':
258         return 'g';
259       case 'ĝ':
260         return 'g';
261       case 'Ğ':
262         return 'g';
263       case 'ğ':
264         return 'g';
265       case 'Ġ':
266         return 'g';
267       case 'ġ':
268         return 'g';
269       case 'Ģ':
270         return 'g';
271       case 'ģ':
272         return 'g';
273       case 'Ĥ':
274         return 'h';
275       case 'ĥ':
276         return 'h';
277       case 'Ħ':
278         return 'h';
279       case 'ħ':
280         return 'h';
281       case 'Ĩ':
282         return 'i';
283       case 'ĩ':
284         return 'i';
285       case 'Ī':
286         return 'i';
287       case 'ī':
288         return 'i';
289       case 'Ĭ':
290         return 'i';
291       case 'ĭ':
292         return 'i';
293       case 'Į':
294         return 'i';
295       case 'į':
296         return 'i';
297       case 'İ':
298         return 'i';
299       case 'ı':
300         return 'i';
301       case 'Ĵ':
302         return 'j';
303       case 'ĵ':
304         return 'j';
305       case 'Ķ':
306         return 'k';
307       case 'ķ':
308         return 'k';
309       case 'ĸ':
310         return 'k';
311       case 'Ĺ':
312         return 'l';
313       case 'ĺ':
314         return 'l';
315       case 'Ļ':
316         return 'l';
317       case 'ļ':
318         return 'l';
319       case 'Ľ':
320         return 'l';
321       case 'ľ':
322         return 'l';
323       case 'Ŀ':
324         return 'l';
325       case 'ŀ':
326         return 'l';
327       case 'Ł':
328         return 'l';
329       case 'ł':
330         return 'l';
331       case 'Ń':
332         return 'n';
333       case 'ń':
334         return 'n';
335       case 'Ņ':
336         return 'n';
337       case 'ņ':
338         return 'n';
339       case 'Ň':
340         return 'n';
341       case 'ň':
342         return 'n';
343       case 'Ō':
344         return 'o';
345       case 'ō':
346         return 'o';
347       case 'Ŏ':
348         return 'o';
349       case 'ŏ':
350         return 'o';
351       case 'Ő':
352         return 'o';
353       case 'ő':
354         return 'o';
355       case 'Ŕ':
356         return 'r';
357       case 'ŕ':
358         return 'r';
359       case 'Ŗ':
360         return 'r';
361       case 'ŗ':
362         return 'r';
363       case 'Ř':
364         return 'r';
365       case 'ř':
366         return 'r';
367       case 'Ś':
368         return 's';
369       case 'ś':
370         return 's';
371       case 'Ŝ':
372         return 's';
373       case 'ŝ':
374         return 's';
375       case 'Ş':
376         return 's';
377       case 'ş':
378         return 's';
379       case 'Š':
380         return 's';
381       case 'š':
382         return 's';
383       case 'Ţ':
384         return 't';
385       case 'ţ':
386         return 't';
387       case 'Ť':
388         return 't';
389       case 'ť':
390         return 't';
391       case 'Ŧ':
392         return 't';
393       case 'ŧ':
394         return 't';
395       case 'Ũ':
396         return 'u';
397       case 'ũ':
398         return 'u';
399       case 'Ū':
400         return 'u';
401       case 'ū':
402         return 'u';
403       case 'Ŭ':
404         return 'u';
405       case 'ŭ':
406         return 'u';
407       case 'Ů':
408         return 'u';
409       case 'ů':
410         return 'u';
411       case 'Ű':
412         return 'u';
413       case 'ű':
414         return 'u';
415       case 'Ų':
416         return 'u';
417       case 'ų':
418         return 'u';
419       case 'Ŵ':
420         return 'w';
421       case 'ŵ':
422         return 'w';
423       case 'Ŷ':
424         return 'y';
425       case 'ŷ':
426         return 'y';
427       case 'Ÿ':
428         return 'y';
429       case 'Ź':
430         return 'z';
431       case 'ź':
432         return 'z';
433       case 'Ż':
434         return 'z';
435       case 'ż':
436         return 'z';
437       case 'Ž':
438         return 'z';
439       case 'ž':
440         return 'z';
441       case 'ſ':
442         return 's';
443       case 'ƀ':
444         return 'b';
445       case 'Ɓ':
446         return 'b';
447       case 'Ƃ':
448         return 'b';
449       case 'ƃ':
450         return 'b';
451       case 'Ɔ':
452         return 'o';
453       case 'Ƈ':
454         return 'c';
455       case 'ƈ':
456         return 'c';
457       case 'Ɖ':
458         return 'd';
459       case 'Ɗ':
460         return 'd';
461       case 'Ƌ':
462         return 'd';
463       case 'ƌ':
464         return 'd';
465       case 'ƍ':
466         return 'd';
467       case 'Ɛ':
468         return 'e';
469       case 'Ƒ':
470         return 'f';
471       case 'ƒ':
472         return 'f';
473       case 'Ɠ':
474         return 'g';
475       case 'Ɣ':
476         return 'g';
477       case 'Ɩ':
478         return 'i';
479       case 'Ɨ':
480         return 'i';
481       case 'Ƙ':
482         return 'k';
483       case 'ƙ':
484         return 'k';
485       case 'ƚ':
486         return 'l';
487       case 'ƛ':
488         return 'l';
489       case 'Ɯ':
490         return 'w';
491       case 'Ɲ':
492         return 'n';
493       case 'ƞ':
494         return 'n';
495       case 'Ɵ':
496         return 'o';
497       case 'Ơ':
498         return 'o';
499       case 'ơ':
500         return 'o';
501       case 'Ƥ':
502         return 'p';
503       case 'ƥ':
504         return 'p';
505       case 'ƫ':
506         return 't';
507       case 'Ƭ':
508         return 't';
509       case 'ƭ':
510         return 't';
511       case 'Ʈ':
512         return 't';
513       case 'Ư':
514         return 'u';
515       case 'ư':
516         return 'u';
517       case 'Ʊ':
518         return 'y';
519       case 'Ʋ':
520         return 'v';
521       case 'Ƴ':
522         return 'y';
523       case 'ƴ':
524         return 'y';
525       case 'Ƶ':
526         return 'z';
527       case 'ƶ':
528         return 'z';
529       case 'ƿ':
530         return 'w';
531       case 'Ǎ':
532         return 'a';
533       case 'ǎ':
534         return 'a';
535       case 'Ǐ':
536         return 'i';
537       case 'ǐ':
538         return 'i';
539       case 'Ǒ':
540         return 'o';
541       case 'ǒ':
542         return 'o';
543       case 'Ǔ':
544         return 'u';
545       case 'ǔ':
546         return 'u';
547       case 'Ǖ':
548         return 'u';
549       case 'ǖ':
550         return 'u';
551       case 'Ǘ':
552         return 'u';
553       case 'ǘ':
554         return 'u';
555       case 'Ǚ':
556         return 'u';
557       case 'ǚ':
558         return 'u';
559       case 'Ǜ':
560         return 'u';
561       case 'ǜ':
562         return 'u';
563       case 'Ǟ':
564         return 'a';
565       case 'ǟ':
566         return 'a';
567       case 'Ǡ':
568         return 'a';
569       case 'ǡ':
570         return 'a';
571       case 'Ǥ':
572         return 'g';
573       case 'ǥ':
574         return 'g';
575       case 'Ǧ':
576         return 'g';
577       case 'ǧ':
578         return 'g';
579       case 'Ǩ':
580         return 'k';
581       case 'ǩ':
582         return 'k';
583       case 'Ǫ':
584         return 'o';
585       case 'ǫ':
586         return 'o';
587       case 'Ǭ':
588         return 'o';
589       case 'ǭ':
590         return 'o';
591       case 'ǰ':
592         return 'j';
593       case 'Dz':
594         return 'd';
595       case 'Ǵ':
596         return 'g';
597       case 'ǵ':
598         return 'g';
599       case 'Ƿ':
600         return 'w';
601       case 'Ǹ':
602         return 'n';
603       case 'ǹ':
604         return 'n';
605       case 'Ǻ':
606         return 'a';
607       case 'ǻ':
608         return 'a';
609       case 'Ǿ':
610         return 'o';
611       case 'ǿ':
612         return 'o';
613       case 'Ȁ':
614         return 'a';
615       case 'ȁ':
616         return 'a';
617       case 'Ȃ':
618         return 'a';
619       case 'ȃ':
620         return 'a';
621       case 'Ȅ':
622         return 'e';
623       case 'ȅ':
624         return 'e';
625       case 'Ȇ':
626         return 'e';
627       case 'ȇ':
628         return 'e';
629       case 'Ȉ':
630         return 'i';
631       case 'ȉ':
632         return 'i';
633       case 'Ȋ':
634         return 'i';
635       case 'ȋ':
636         return 'i';
637       case 'Ȍ':
638         return 'o';
639       case 'ȍ':
640         return 'o';
641       case 'Ȏ':
642         return 'o';
643       case 'ȏ':
644         return 'o';
645       case 'Ȑ':
646         return 'r';
647       case 'ȑ':
648         return 'r';
649       case 'Ȓ':
650         return 'r';
651       case 'ȓ':
652         return 'r';
653       case 'Ȕ':
654         return 'u';
655       case 'ȕ':
656         return 'u';
657       case 'Ȗ':
658         return 'u';
659       case 'ȗ':
660         return 'u';
661       case 'Ș':
662         return 's';
663       case 'ș':
664         return 's';
665       case 'Ț':
666         return 't';
667       case 'ț':
668         return 't';
669       case 'Ȝ':
670         return 'y';
671       case 'ȝ':
672         return 'y';
673       case 'Ȟ':
674         return 'h';
675       case 'ȟ':
676         return 'h';
677       case 'Ȥ':
678         return 'z';
679       case 'ȥ':
680         return 'z';
681       case 'Ȧ':
682         return 'a';
683       case 'ȧ':
684         return 'a';
685       case 'Ȩ':
686         return 'e';
687       case 'ȩ':
688         return 'e';
689       case 'Ȫ':
690         return 'o';
691       case 'ȫ':
692         return 'o';
693       case 'Ȭ':
694         return 'o';
695       case 'ȭ':
696         return 'o';
697       case 'Ȯ':
698         return 'o';
699       case 'ȯ':
700         return 'o';
701       case 'Ȱ':
702         return 'o';
703       case 'ȱ':
704         return 'o';
705       case 'Ȳ':
706         return 'y';
707       case 'ȳ':
708         return 'y';
709       case 'A':
710         return 'a';
711       case 'B':
712         return 'b';
713       case 'C':
714         return 'c';
715       case 'D':
716         return 'd';
717       case 'E':
718         return 'e';
719       case 'F':
720         return 'f';
721       case 'G':
722         return 'g';
723       case 'H':
724         return 'h';
725       case 'I':
726         return 'i';
727       case 'J':
728         return 'j';
729       case 'K':
730         return 'k';
731       case 'L':
732         return 'l';
733       case 'M':
734         return 'm';
735       case 'N':
736         return 'n';
737       case 'O':
738         return 'o';
739       case 'P':
740         return 'p';
741       case 'Q':
742         return 'q';
743       case 'R':
744         return 'r';
745       case 'S':
746         return 's';
747       case 'T':
748         return 't';
749       case 'U':
750         return 'u';
751       case 'V':
752         return 'v';
753       case 'W':
754         return 'w';
755       case 'X':
756         return 'x';
757       case 'Y':
758         return 'y';
759       case 'Z':
760         return 'z';
761       default:
762         return ch;
763     }
764   }
765 
766   @Override
getDialpadIndex(char ch)767   public byte getDialpadIndex(char ch) {
768     if (ch >= '0' && ch <= '9') {
769       return (byte) (ch - '0');
770     } else if (ch >= 'a' && ch <= 'z') {
771       return (byte) (LATIN_LETTERS_TO_DIGITS[ch - 'a'] - '0');
772     } else {
773       return -1;
774     }
775   }
776 
777   @Override
getDialpadNumericCharacter(char ch)778   public char getDialpadNumericCharacter(char ch) {
779     if (ch >= 'a' && ch <= 'z') {
780       return LATIN_LETTERS_TO_DIGITS[ch - 'a'];
781     }
782     return ch;
783   }
784 }
785