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 17 public boolean isValidDialpadAlphabeticChar(char ch) { 18 return (ch >= 'a' && ch <= 'z'); 19 } 20 21 @Override 22 public boolean isValidDialpadNumericChar(char ch) { 23 return (ch >= '0' && ch <= '9'); 24 } 25 26 @Override 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 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 '': 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 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 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