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