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