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