Home | History | Annotate | Download | only in map
      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.map;
     18 
     19 import android.support.v4.util.SimpleArrayMap;
     20 import com.android.dialer.dialpadview.DialpadCharMappings;
     21 import com.google.common.base.Optional;
     22 
     23 /** A {@link SmartDialMap} for the Latin alphabet, which is for T9 dialpad searching. */
     24 @SuppressWarnings("Guava")
     25 final class LatinSmartDialMap extends SmartDialMap {
     26 
     27   private static LatinSmartDialMap instance;
     28 
     29   static LatinSmartDialMap getInstance() {
     30     if (instance == null) {
     31       instance = new LatinSmartDialMap();
     32     }
     33 
     34     return instance;
     35   }
     36 
     37   private LatinSmartDialMap() {}
     38 
     39   /*
     40    * The switch statement in this function was generated using the python code:
     41    * from unidecode import unidecode
     42    * for i in range(192, 564):
     43    *     char = unichr(i)
     44    *     decoded = unidecode(char)
     45    *     # Unicode characters that decompose into multiple characters i.e.
     46    *     #  into ss are not supported for now
     47    *     if (len(decoded) == 1 and decoded.isalpha()):
     48    *         print "case '" + char + "': return Optional.of('" + unidecode(char) +  "');"
     49    *
     50    * This gives us a way to map characters containing accents/diacritics to their
     51    * alphabetic equivalents. The unidecode library can be found at:
     52    * http://pypi.python.org/pypi/Unidecode/0.04.1
     53    *
     54    * Also remaps all upper case latin characters to their lower case equivalents.
     55    */
     56   @Override
     57   Optional<Character> normalizeCharacter(char ch) {
     58     if (isValidDialpadAlphabeticChar(ch)) {
     59       return Optional.of(ch);
     60     }
     61 
     62     switch (ch) {
     63       case '':
     64         return Optional.of('a');
     65       case '':
     66         return Optional.of('a');
     67       case '':
     68         return Optional.of('a');
     69       case '':
     70         return Optional.of('a');
     71       case '':
     72         return Optional.of('a');
     73       case '':
     74         return Optional.of('a');
     75       case '':
     76         return Optional.of('c');
     77       case '':
     78         return Optional.of('e');
     79       case '':
     80         return Optional.of('e');
     81       case '':
     82         return Optional.of('e');
     83       case '':
     84         return Optional.of('e');
     85       case '':
     86         return Optional.of('i');
     87       case '':
     88         return Optional.of('i');
     89       case '':
     90         return Optional.of('i');
     91       case '':
     92         return Optional.of('i');
     93       case '':
     94         return Optional.of('d');
     95       case '':
     96         return Optional.of('n');
     97       case '':
     98         return Optional.of('o');
     99       case '':
    100         return Optional.of('o');
    101       case '':
    102         return Optional.of('o');
    103       case '':
    104         return Optional.of('o');
    105       case '':
    106         return Optional.of('o');
    107       case '':
    108         return Optional.of('x');
    109       case '':
    110         return Optional.of('o');
    111       case '':
    112         return Optional.of('u');
    113       case '':
    114         return Optional.of('u');
    115       case '':
    116         return Optional.of('u');
    117       case '':
    118         return Optional.of('u');
    119       case '':
    120         return Optional.of('u');
    121       case '':
    122         return Optional.of('a');
    123       case '':
    124         return Optional.of('a');
    125       case '':
    126         return Optional.of('a');
    127       case '':
    128         return Optional.of('a');
    129       case '':
    130         return Optional.of('a');
    131       case '':
    132         return Optional.of('a');
    133       case '':
    134         return Optional.of('c');
    135       case '':
    136         return Optional.of('e');
    137       case '':
    138         return Optional.of('e');
    139       case '':
    140         return Optional.of('e');
    141       case '':
    142         return Optional.of('e');
    143       case '':
    144         return Optional.of('i');
    145       case '':
    146         return Optional.of('i');
    147       case '':
    148         return Optional.of('i');
    149       case '':
    150         return Optional.of('i');
    151       case '':
    152         return Optional.of('d');
    153       case '':
    154         return Optional.of('n');
    155       case '':
    156         return Optional.of('o');
    157       case '':
    158         return Optional.of('o');
    159       case '':
    160         return Optional.of('o');
    161       case '':
    162         return Optional.of('o');
    163       case '':
    164         return Optional.of('o');
    165       case '':
    166         return Optional.of('o');
    167       case '':
    168         return Optional.of('u');
    169       case '':
    170         return Optional.of('u');
    171       case '':
    172         return Optional.of('u');
    173       case '':
    174         return Optional.of('u');
    175       case '':
    176         return Optional.of('y');
    177       case '':
    178         return Optional.of('y');
    179       case '':
    180         return Optional.of('a');
    181       case '':
    182         return Optional.of('a');
    183       case '':
    184         return Optional.of('a');
    185       case '':
    186         return Optional.of('a');
    187       case '':
    188         return Optional.of('a');
    189       case '':
    190         return Optional.of('a');
    191       case '':
    192         return Optional.of('c');
    193       case '':
    194         return Optional.of('c');
    195       case '':
    196         return Optional.of('c');
    197       case '':
    198         return Optional.of('c');
    199       case '':
    200         return Optional.of('c');
    201       case '':
    202         return Optional.of('c');
    203       case '':
    204         return Optional.of('c');
    205       case '':
    206         return Optional.of('c');
    207       case '':
    208         return Optional.of('d');
    209       case '':
    210         return Optional.of('d');
    211       case '':
    212         return Optional.of('d');
    213       case '':
    214         return Optional.of('d');
    215       case '':
    216         return Optional.of('e');
    217       case '':
    218         return Optional.of('e');
    219       case '':
    220         return Optional.of('e');
    221       case '':
    222         return Optional.of('e');
    223       case '':
    224         return Optional.of('e');
    225       case '':
    226         return Optional.of('e');
    227       case '':
    228         return Optional.of('e');
    229       case '':
    230         return Optional.of('e');
    231       case '':
    232         return Optional.of('e');
    233       case '':
    234         return Optional.of('e');
    235       case '':
    236         return Optional.of('g');
    237       case '':
    238         return Optional.of('g');
    239       case '':
    240         return Optional.of('g');
    241       case '':
    242         return Optional.of('g');
    243       case '':
    244         return Optional.of('g');
    245       case '':
    246         return Optional.of('g');
    247       case '':
    248         return Optional.of('g');
    249       case '':
    250         return Optional.of('g');
    251       case '':
    252         return Optional.of('h');
    253       case '':
    254         return Optional.of('h');
    255       case '':
    256         return Optional.of('h');
    257       case '':
    258         return Optional.of('h');
    259       case '':
    260         return Optional.of('i');
    261       case '':
    262         return Optional.of('i');
    263       case '':
    264         return Optional.of('i');
    265       case '':
    266         return Optional.of('i');
    267       case '':
    268         return Optional.of('i');
    269       case '':
    270         return Optional.of('i');
    271       case '':
    272         return Optional.of('i');
    273       case '':
    274         return Optional.of('i');
    275       case '':
    276         return Optional.of('i');
    277       case '':
    278         return Optional.of('i');
    279       case '':
    280         return Optional.of('j');
    281       case '':
    282         return Optional.of('j');
    283       case '':
    284         return Optional.of('k');
    285       case '':
    286         return Optional.of('k');
    287       case '':
    288         return Optional.of('k');
    289       case '':
    290         return Optional.of('l');
    291       case '':
    292         return Optional.of('l');
    293       case '':
    294         return Optional.of('l');
    295       case '':
    296         return Optional.of('l');
    297       case '':
    298         return Optional.of('l');
    299       case '':
    300         return Optional.of('l');
    301       case '':
    302         return Optional.of('l');
    303       case '':
    304         return Optional.of('l');
    305       case '':
    306         return Optional.of('l');
    307       case '':
    308         return Optional.of('l');
    309       case '':
    310         return Optional.of('n');
    311       case '':
    312         return Optional.of('n');
    313       case '':
    314         return Optional.of('n');
    315       case '':
    316         return Optional.of('n');
    317       case '':
    318         return Optional.of('n');
    319       case '':
    320         return Optional.of('n');
    321       case '':
    322         return Optional.of('o');
    323       case '':
    324         return Optional.of('o');
    325       case '':
    326         return Optional.of('o');
    327       case '':
    328         return Optional.of('o');
    329       case '':
    330         return Optional.of('o');
    331       case '':
    332         return Optional.of('o');
    333       case '':
    334         return Optional.of('r');
    335       case '':
    336         return Optional.of('r');
    337       case '':
    338         return Optional.of('r');
    339       case '':
    340         return Optional.of('r');
    341       case '':
    342         return Optional.of('r');
    343       case '':
    344         return Optional.of('r');
    345       case '':
    346         return Optional.of('s');
    347       case '':
    348         return Optional.of('s');
    349       case '':
    350         return Optional.of('s');
    351       case '':
    352         return Optional.of('s');
    353       case '':
    354         return Optional.of('s');
    355       case '':
    356         return Optional.of('s');
    357       case '':
    358         return Optional.of('s');
    359       case '':
    360         return Optional.of('s');
    361       case '':
    362         return Optional.of('t');
    363       case '':
    364         return Optional.of('t');
    365       case '':
    366         return Optional.of('t');
    367       case '':
    368         return Optional.of('t');
    369       case '':
    370         return Optional.of('t');
    371       case '':
    372         return Optional.of('t');
    373       case '':
    374         return Optional.of('u');
    375       case '':
    376         return Optional.of('u');
    377       case '':
    378         return Optional.of('u');
    379       case '':
    380         return Optional.of('u');
    381       case '':
    382         return Optional.of('u');
    383       case '':
    384         return Optional.of('u');
    385       case '':
    386         return Optional.of('u');
    387       case '':
    388         return Optional.of('u');
    389       case '':
    390         return Optional.of('u');
    391       case '':
    392         return Optional.of('u');
    393       case '':
    394         return Optional.of('u');
    395       case '':
    396         return Optional.of('u');
    397       case '':
    398         return Optional.of('w');
    399       case '':
    400         return Optional.of('w');
    401       case '':
    402         return Optional.of('y');
    403       case '':
    404         return Optional.of('y');
    405       case '':
    406         return Optional.of('y');
    407       case '':
    408         return Optional.of('z');
    409       case '':
    410         return Optional.of('z');
    411       case '':
    412         return Optional.of('z');
    413       case '':
    414         return Optional.of('z');
    415       case '':
    416         return Optional.of('z');
    417       case '':
    418         return Optional.of('z');
    419       case '':
    420         return Optional.of('s');
    421       case '':
    422         return Optional.of('b');
    423       case '':
    424         return Optional.of('b');
    425       case '':
    426         return Optional.of('b');
    427       case '':
    428         return Optional.of('b');
    429       case '':
    430         return Optional.of('o');
    431       case '':
    432         return Optional.of('c');
    433       case '':
    434         return Optional.of('c');
    435       case '':
    436         return Optional.of('d');
    437       case '':
    438         return Optional.of('d');
    439       case '':
    440         return Optional.of('d');
    441       case '':
    442         return Optional.of('d');
    443       case '':
    444         return Optional.of('d');
    445       case '':
    446         return Optional.of('e');
    447       case '':
    448         return Optional.of('f');
    449       case '':
    450         return Optional.of('f');
    451       case '':
    452         return Optional.of('g');
    453       case '':
    454         return Optional.of('g');
    455       case '':
    456         return Optional.of('i');
    457       case '':
    458         return Optional.of('i');
    459       case '':
    460         return Optional.of('k');
    461       case '':
    462         return Optional.of('k');
    463       case '':
    464         return Optional.of('l');
    465       case '':
    466         return Optional.of('l');
    467       case '':
    468         return Optional.of('w');
    469       case '':
    470         return Optional.of('n');
    471       case '':
    472         return Optional.of('n');
    473       case '':
    474         return Optional.of('o');
    475       case '':
    476         return Optional.of('o');
    477       case '':
    478         return Optional.of('o');
    479       case '':
    480         return Optional.of('p');
    481       case '':
    482         return Optional.of('p');
    483       case '':
    484         return Optional.of('t');
    485       case '':
    486         return Optional.of('t');
    487       case '':
    488         return Optional.of('t');
    489       case '':
    490         return Optional.of('t');
    491       case '':
    492         return Optional.of('u');
    493       case '':
    494         return Optional.of('u');
    495       case '':
    496         return Optional.of('y');
    497       case '':
    498         return Optional.of('v');
    499       case '':
    500         return Optional.of('y');
    501       case '':
    502         return Optional.of('y');
    503       case '':
    504         return Optional.of('z');
    505       case '':
    506         return Optional.of('z');
    507       case '':
    508         return Optional.of('w');
    509       case '':
    510         return Optional.of('a');
    511       case '':
    512         return Optional.of('a');
    513       case '':
    514         return Optional.of('i');
    515       case '':
    516         return Optional.of('i');
    517       case '':
    518         return Optional.of('o');
    519       case '':
    520         return Optional.of('o');
    521       case '':
    522         return Optional.of('u');
    523       case '':
    524         return Optional.of('u');
    525       case '':
    526         return Optional.of('u');
    527       case '':
    528         return Optional.of('u');
    529       case '':
    530         return Optional.of('u');
    531       case '':
    532         return Optional.of('u');
    533       case '':
    534         return Optional.of('u');
    535       case '':
    536         return Optional.of('u');
    537       case '':
    538         return Optional.of('u');
    539       case '':
    540         return Optional.of('u');
    541       case '':
    542         return Optional.of('a');
    543       case '':
    544         return Optional.of('a');
    545       case '':
    546         return Optional.of('a');
    547       case '':
    548         return Optional.of('a');
    549       case '':
    550         return Optional.of('g');
    551       case '':
    552         return Optional.of('g');
    553       case '':
    554         return Optional.of('g');
    555       case '':
    556         return Optional.of('g');
    557       case '':
    558         return Optional.of('k');
    559       case '':
    560         return Optional.of('k');
    561       case '':
    562         return Optional.of('o');
    563       case '':
    564         return Optional.of('o');
    565       case '':
    566         return Optional.of('o');
    567       case '':
    568         return Optional.of('o');
    569       case '':
    570         return Optional.of('j');
    571       case '':
    572         return Optional.of('d');
    573       case '':
    574         return Optional.of('g');
    575       case '':
    576         return Optional.of('g');
    577       case '':
    578         return Optional.of('w');
    579       case '':
    580         return Optional.of('n');
    581       case '':
    582         return Optional.of('n');
    583       case '':
    584         return Optional.of('a');
    585       case '':
    586         return Optional.of('a');
    587       case '':
    588         return Optional.of('o');
    589       case '':
    590         return Optional.of('o');
    591       case '':
    592         return Optional.of('a');
    593       case '':
    594         return Optional.of('a');
    595       case '':
    596         return Optional.of('a');
    597       case '':
    598         return Optional.of('a');
    599       case '':
    600         return Optional.of('e');
    601       case '':
    602         return Optional.of('e');
    603       case '':
    604         return Optional.of('e');
    605       case '':
    606         return Optional.of('e');
    607       case '':
    608         return Optional.of('i');
    609       case '':
    610         return Optional.of('i');
    611       case '':
    612         return Optional.of('i');
    613       case '':
    614         return Optional.of('i');
    615       case '':
    616         return Optional.of('o');
    617       case '':
    618         return Optional.of('o');
    619       case '':
    620         return Optional.of('o');
    621       case '':
    622         return Optional.of('o');
    623       case '':
    624         return Optional.of('r');
    625       case '':
    626         return Optional.of('r');
    627       case '':
    628         return Optional.of('r');
    629       case '':
    630         return Optional.of('r');
    631       case '':
    632         return Optional.of('u');
    633       case '':
    634         return Optional.of('u');
    635       case '':
    636         return Optional.of('u');
    637       case '':
    638         return Optional.of('u');
    639       case '':
    640         return Optional.of('s');
    641       case '':
    642         return Optional.of('s');
    643       case '':
    644         return Optional.of('t');
    645       case '':
    646         return Optional.of('t');
    647       case '':
    648         return Optional.of('y');
    649       case '':
    650         return Optional.of('y');
    651       case '':
    652         return Optional.of('h');
    653       case '':
    654         return Optional.of('h');
    655       case '':
    656         return Optional.of('z');
    657       case '':
    658         return Optional.of('z');
    659       case '':
    660         return Optional.of('a');
    661       case '':
    662         return Optional.of('a');
    663       case '':
    664         return Optional.of('e');
    665       case '':
    666         return Optional.of('e');
    667       case '':
    668         return Optional.of('o');
    669       case '':
    670         return Optional.of('o');
    671       case '':
    672         return Optional.of('o');
    673       case '':
    674         return Optional.of('o');
    675       case '':
    676         return Optional.of('o');
    677       case '':
    678         return Optional.of('o');
    679       case '':
    680         return Optional.of('o');
    681       case '':
    682         return Optional.of('o');
    683       case '':
    684         return Optional.of('y');
    685       case '':
    686         return Optional.of('y');
    687       case 'A':
    688         return Optional.of('a');
    689       case 'B':
    690         return Optional.of('b');
    691       case 'C':
    692         return Optional.of('c');
    693       case 'D':
    694         return Optional.of('d');
    695       case 'E':
    696         return Optional.of('e');
    697       case 'F':
    698         return Optional.of('f');
    699       case 'G':
    700         return Optional.of('g');
    701       case 'H':
    702         return Optional.of('h');
    703       case 'I':
    704         return Optional.of('i');
    705       case 'J':
    706         return Optional.of('j');
    707       case 'K':
    708         return Optional.of('k');
    709       case 'L':
    710         return Optional.of('l');
    711       case 'M':
    712         return Optional.of('m');
    713       case 'N':
    714         return Optional.of('n');
    715       case 'O':
    716         return Optional.of('o');
    717       case 'P':
    718         return Optional.of('p');
    719       case 'Q':
    720         return Optional.of('q');
    721       case 'R':
    722         return Optional.of('r');
    723       case 'S':
    724         return Optional.of('s');
    725       case 'T':
    726         return Optional.of('t');
    727       case 'U':
    728         return Optional.of('u');
    729       case 'V':
    730         return Optional.of('v');
    731       case 'W':
    732         return Optional.of('w');
    733       case 'X':
    734         return Optional.of('x');
    735       case 'Y':
    736         return Optional.of('y');
    737       case 'Z':
    738         return Optional.of('z');
    739       default:
    740         return Optional.absent();
    741     }
    742   }
    743 
    744   @Override
    745   SimpleArrayMap<Character, Character> getCharToKeyMap() {
    746     return DialpadCharMappings.getDefaultCharToKeyMap();
    747   }
    748 }
    749