1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2016 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License. 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 17bf4bb0555ca827e660ad05b4caf982a030211c03linyuhpackage com.android.dialer.smartdial.map; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ab146531c0710ad46ac347d280b14c798f732a12linyuhimport android.support.v4.util.SimpleArrayMap; 20ab146531c0710ad46ac347d280b14c798f732a12linyuhimport com.google.common.base.Optional; 21ab146531c0710ad46ac347d280b14c798f732a12linyuh 22ab146531c0710ad46ac347d280b14c798f732a12linyuh/** Definition for utilities that supports smart dial in different languages. */ 23ab146531c0710ad46ac347d280b14c798f732a12linyuh@SuppressWarnings("Guava") 24ab146531c0710ad46ac347d280b14c798f732a12linyuhabstract class SmartDialMap { 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 26ab146531c0710ad46ac347d280b14c798f732a12linyuh /** 27ab146531c0710ad46ac347d280b14c798f732a12linyuh * Returns true if the provided character can be mapped to a key on the dialpad. 28ab146531c0710ad46ac347d280b14c798f732a12linyuh * 29ab146531c0710ad46ac347d280b14c798f732a12linyuh * <p>The provided character is expected to be a normalized character. See {@link 30ab146531c0710ad46ac347d280b14c798f732a12linyuh * SmartDialMap#normalizeCharacter(char)} for details. 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 32ab146531c0710ad46ac347d280b14c798f732a12linyuh protected boolean isValidDialpadCharacter(char ch) { 33ab146531c0710ad46ac347d280b14c798f732a12linyuh return isValidDialpadAlphabeticChar(ch) || isValidDialpadNumericChar(ch); 34ab146531c0710ad46ac347d280b14c798f732a12linyuh } 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 36ab146531c0710ad46ac347d280b14c798f732a12linyuh /** 37ab146531c0710ad46ac347d280b14c798f732a12linyuh * Returns true if the provided character is a letter and can be mapped to a key on the dialpad. 38ab146531c0710ad46ac347d280b14c798f732a12linyuh * 39ab146531c0710ad46ac347d280b14c798f732a12linyuh * <p>The provided character is expected to be a normalized character. See {@link 40ab146531c0710ad46ac347d280b14c798f732a12linyuh * SmartDialMap#normalizeCharacter(char)} for details. 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 42ab146531c0710ad46ac347d280b14c798f732a12linyuh protected boolean isValidDialpadAlphabeticChar(char ch) { 43ab146531c0710ad46ac347d280b14c798f732a12linyuh return getCharToKeyMap().containsKey(ch); 44ab146531c0710ad46ac347d280b14c798f732a12linyuh } 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 46ab146531c0710ad46ac347d280b14c798f732a12linyuh /** 47ab146531c0710ad46ac347d280b14c798f732a12linyuh * Returns true if the provided character is a digit, and can be mapped to a key on the dialpad. 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 49ab146531c0710ad46ac347d280b14c798f732a12linyuh protected boolean isValidDialpadNumericChar(char ch) { 50ab146531c0710ad46ac347d280b14c798f732a12linyuh return '0' <= ch && ch <= '9'; 51ab146531c0710ad46ac347d280b14c798f732a12linyuh } 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 53ab146531c0710ad46ac347d280b14c798f732a12linyuh /** 54ab146531c0710ad46ac347d280b14c798f732a12linyuh * Get the index of the key on the dialpad which the character corresponds to. 55ab146531c0710ad46ac347d280b14c798f732a12linyuh * 56ab146531c0710ad46ac347d280b14c798f732a12linyuh * <p>The provided character is expected to be a normalized character. See {@link 57ab146531c0710ad46ac347d280b14c798f732a12linyuh * SmartDialMap#normalizeCharacter(char)} for details. 58ab146531c0710ad46ac347d280b14c798f732a12linyuh * 59ab146531c0710ad46ac347d280b14c798f732a12linyuh * <p>An {@link Optional#absent()} is returned if the provided character can't be mapped to a key 60ab146531c0710ad46ac347d280b14c798f732a12linyuh * on the dialpad. 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 62ab146531c0710ad46ac347d280b14c798f732a12linyuh protected Optional<Byte> getDialpadIndex(char ch) { 63ab146531c0710ad46ac347d280b14c798f732a12linyuh if (isValidDialpadNumericChar(ch)) { 64ab146531c0710ad46ac347d280b14c798f732a12linyuh return Optional.of((byte) (ch - '0')); 65ab146531c0710ad46ac347d280b14c798f732a12linyuh } 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 67ab146531c0710ad46ac347d280b14c798f732a12linyuh if (isValidDialpadAlphabeticChar(ch)) { 68ab146531c0710ad46ac347d280b14c798f732a12linyuh return Optional.of((byte) (getCharToKeyMap().get(ch) - '0')); 69ab146531c0710ad46ac347d280b14c798f732a12linyuh } 70ab146531c0710ad46ac347d280b14c798f732a12linyuh 71ab146531c0710ad46ac347d280b14c798f732a12linyuh return Optional.absent(); 72ab146531c0710ad46ac347d280b14c798f732a12linyuh } 73ab146531c0710ad46ac347d280b14c798f732a12linyuh 74ab146531c0710ad46ac347d280b14c798f732a12linyuh /** 75ab146531c0710ad46ac347d280b14c798f732a12linyuh * Get the actual numeric character on the dialpad which the character corresponds to. 76ab146531c0710ad46ac347d280b14c798f732a12linyuh * 77ab146531c0710ad46ac347d280b14c798f732a12linyuh * <p>The provided character is expected to be a normalized character. See {@link 78ab146531c0710ad46ac347d280b14c798f732a12linyuh * SmartDialMap#normalizeCharacter(char)} for details. 79ab146531c0710ad46ac347d280b14c798f732a12linyuh * 80ab146531c0710ad46ac347d280b14c798f732a12linyuh * <p>An {@link Optional#absent()} is returned if the provided character can't be mapped to a key 81ab146531c0710ad46ac347d280b14c798f732a12linyuh * on the dialpad. 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 83ab146531c0710ad46ac347d280b14c798f732a12linyuh protected Optional<Character> getDialpadNumericCharacter(char ch) { 84ab146531c0710ad46ac347d280b14c798f732a12linyuh return isValidDialpadAlphabeticChar(ch) 85ab146531c0710ad46ac347d280b14c798f732a12linyuh ? Optional.of(getCharToKeyMap().get(ch)) 86ab146531c0710ad46ac347d280b14c798f732a12linyuh : Optional.absent(); 87ab146531c0710ad46ac347d280b14c798f732a12linyuh } 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 89ab146531c0710ad46ac347d280b14c798f732a12linyuh /** 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Converts uppercase characters to lower case ones, and on a best effort basis, strips accents 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * from accented characters. 92ab146531c0710ad46ac347d280b14c798f732a12linyuh * 93ab146531c0710ad46ac347d280b14c798f732a12linyuh * <p>An {@link Optional#absent()} is returned if the provided character can't be mapped to a key 94ab146531c0710ad46ac347d280b14c798f732a12linyuh * on the dialpad. 95ab146531c0710ad46ac347d280b14c798f732a12linyuh */ 96ab146531c0710ad46ac347d280b14c798f732a12linyuh abstract Optional<Character> normalizeCharacter(char ch); 97ab146531c0710ad46ac347d280b14c798f732a12linyuh 98ab146531c0710ad46ac347d280b14c798f732a12linyuh /** 99ab146531c0710ad46ac347d280b14c798f732a12linyuh * Returns a map in which each key is a normalized character and the corresponding value is a 100ab146531c0710ad46ac347d280b14c798f732a12linyuh * dialpad key. 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 102ab146531c0710ad46ac347d280b14c798f732a12linyuh abstract SimpleArrayMap<Character, Character> getCharToKeyMap(); 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 104