Home | History | Annotate | Download | only in smartdial
      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
     51   public boolean isValidDialpadAlphabeticChar(char ch) {
     52     return (ch >= 'a' && ch <= 'z');
     53   }
     54 
     55   @Override
     56   public boolean isValidDialpadNumericChar(char ch) {
     57     return (ch >= '0' && ch <= '9');
     58   }
     59 
     60   @Override
     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
     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 '':
    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
    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
    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