Home | History | Annotate | Download | only in map
      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.google.common.base.Optional;
     21 
     22 /** Definition for utilities that supports smart dial in different languages. */
     23 @SuppressWarnings("Guava")
     24 abstract class SmartDialMap {
     25 
     26   /**
     27    * Returns true if the provided character can be mapped to a key on the dialpad.
     28    *
     29    * <p>The provided character is expected to be a normalized character. See {@link
     30    * SmartDialMap#normalizeCharacter(char)} for details.
     31    */
     32   protected boolean isValidDialpadCharacter(char ch) {
     33     return isValidDialpadAlphabeticChar(ch) || isValidDialpadNumericChar(ch);
     34   }
     35 
     36   /**
     37    * Returns true if the provided character is a letter and can be mapped to a key on the dialpad.
     38    *
     39    * <p>The provided character is expected to be a normalized character. See {@link
     40    * SmartDialMap#normalizeCharacter(char)} for details.
     41    */
     42   protected boolean isValidDialpadAlphabeticChar(char ch) {
     43     return getCharToKeyMap().containsKey(ch);
     44   }
     45 
     46   /**
     47    * Returns true if the provided character is a digit, and can be mapped to a key on the dialpad.
     48    */
     49   protected boolean isValidDialpadNumericChar(char ch) {
     50     return '0' <= ch && ch <= '9';
     51   }
     52 
     53   /**
     54    * Get the index of the key on the dialpad which the character corresponds to.
     55    *
     56    * <p>The provided character is expected to be a normalized character. See {@link
     57    * SmartDialMap#normalizeCharacter(char)} for details.
     58    *
     59    * <p>An {@link Optional#absent()} is returned if the provided character can't be mapped to a key
     60    * on the dialpad.
     61    */
     62   protected Optional<Byte> getDialpadIndex(char ch) {
     63     if (isValidDialpadNumericChar(ch)) {
     64       return Optional.of((byte) (ch - '0'));
     65     }
     66 
     67     if (isValidDialpadAlphabeticChar(ch)) {
     68       return Optional.of((byte) (getCharToKeyMap().get(ch) - '0'));
     69     }
     70 
     71     return Optional.absent();
     72   }
     73 
     74   /**
     75    * Get the actual numeric character on the dialpad which the character corresponds to.
     76    *
     77    * <p>The provided character is expected to be a normalized character. See {@link
     78    * SmartDialMap#normalizeCharacter(char)} for details.
     79    *
     80    * <p>An {@link Optional#absent()} is returned if the provided character can't be mapped to a key
     81    * on the dialpad.
     82    */
     83   protected Optional<Character> getDialpadNumericCharacter(char ch) {
     84     return isValidDialpadAlphabeticChar(ch)
     85         ? Optional.of(getCharToKeyMap().get(ch))
     86         : Optional.absent();
     87   }
     88 
     89   /**
     90    * Converts uppercase characters to lower case ones, and on a best effort basis, strips accents
     91    * from accented characters.
     92    *
     93    * <p>An {@link Optional#absent()} is returned if the provided character can't be mapped to a key
     94    * on the dialpad.
     95    */
     96   abstract Optional<Character> normalizeCharacter(char ch);
     97 
     98   /**
     99    * Returns a map in which each key is a normalized character and the corresponding value is a
    100    * dialpad key.
    101    */
    102   abstract SimpleArrayMap<Character, Character> getCharToKeyMap();
    103 }
    104