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