/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.dialer.dialpadview; import android.content.Context; import android.support.annotation.NonNull; import android.support.v4.util.SimpleArrayMap; import com.android.dialer.common.Assert; import com.android.dialer.i18n.LocaleUtils; /** A class containing character mappings for the dialpad. */ public class DialpadCharMappings { /** The character mapping for the Latin alphabet (the default mapping) */ private static class Latin { private static final String[] KEY_TO_CHARS = { "+" /* 0 */, "" /* 1 */, "ABC" /* 2 */, "DEF" /* 3 */, "GHI" /* 4 */, "JKL" /* 5 */, "MNO" /* 6 */, "PQRS" /* 7 */, "TUV" /* 8 */, "WXYZ" /* 9 */, "" /* * */, "" /* # */, }; private static final SimpleArrayMap CHAR_TO_KEY = getCharToKeyMap(KEY_TO_CHARS); } /** The character mapping for the Bulgarian alphabet */ private static class Bul { private static final String[] KEY_TO_CHARS = { "" /* 0 */, "" /* 1 */, "АБВГ" /* 2 */, "ДЕЖЗ" /* 3 */, "ИЙКЛ" /* 4 */, "МНО" /* 5 */, "ПРС" /* 6 */, "ТУФХ" /* 7 */, "ЦЧШЩ" /* 8 */, "ЪЬЮЯ" /* 9 */, "" /* * */, "" /* # */, }; private static final SimpleArrayMap CHAR_TO_KEY = getCharToKeyMap(KEY_TO_CHARS); } /** The character mapping for the Russian alphabet */ private static class Rus { private static final String[] KEY_TO_CHARS = { "" /* 0 */, "" /* 1 */, "АБВГ" /* 2 */, "ДЕЁЖЗ" /* 3 */, "ИЙКЛ" /* 4 */, "МНОП" /* 5 */, "РСТУ" /* 6 */, "ФХЦЧ" /* 7 */, "ШЩЪЫ" /* 8 */, "ЬЭЮЯ" /* 9 */, "" /* * */, "" /* # */, }; private static final SimpleArrayMap CHAR_TO_KEY = getCharToKeyMap(KEY_TO_CHARS); } /** The character mapping for the Ukrainian alphabet */ private static class Ukr { private static final String[] KEY_TO_CHARS = { "" /* 0 */, "" /* 1 */, "АБВГҐ" /* 2 */, "ДЕЄЖЗ" /* 3 */, "ИІЇЙКЛ" /* 4 */, "МНОП" /* 5 */, "РСТУ" /* 6 */, "ФХЦЧ" /* 7 */, "ШЩ" /* 8 */, "ЬЮЯ" /* 9 */, "" /* * */, "" /* # */, }; private static final SimpleArrayMap CHAR_TO_KEY = getCharToKeyMap(KEY_TO_CHARS); } // A map in which each key is an ISO 639-2 language code and the corresponding value is a // character-key map. private static final SimpleArrayMap> CHAR_TO_KEY_MAPS = new SimpleArrayMap<>(); // A map in which each key is an ISO 639-2 language code and the corresponding value is an array // defining a key-characters map. private static final SimpleArrayMap KEY_TO_CHAR_MAPS = new SimpleArrayMap<>(); static { CHAR_TO_KEY_MAPS.put("bul", Bul.CHAR_TO_KEY); CHAR_TO_KEY_MAPS.put("rus", Rus.CHAR_TO_KEY); CHAR_TO_KEY_MAPS.put("ukr", Ukr.CHAR_TO_KEY); KEY_TO_CHAR_MAPS.put("bul", Bul.KEY_TO_CHARS); KEY_TO_CHAR_MAPS.put("rus", Rus.KEY_TO_CHARS); KEY_TO_CHAR_MAPS.put("ukr", Ukr.KEY_TO_CHARS); } /** * Returns the character-key map of the ISO 639-2 language code of the 1st language preference or * null if no character-key map for the language code is defined. */ public static SimpleArrayMap getCharToKeyMap(@NonNull Context context) { return CHAR_TO_KEY_MAPS.get(LocaleUtils.getLocale(context).getISO3Language()); } /** * Returns the character-key map of the provided ISO 639-2 language code. * *

Note: this method is for implementations of {@link * com.android.dialer.smartdial.map.SmartDialMap} only. {@link #getCharToKeyMap(Context)} should * be used for all other purposes. * *

It is the caller's responsibility to ensure the language code is valid and a character * mapping is defined for that language. Otherwise, an exception will be thrown. */ public static SimpleArrayMap getCharToKeyMap(String languageCode) { SimpleArrayMap charToKeyMap = CHAR_TO_KEY_MAPS.get(languageCode); return Assert.isNotNull( charToKeyMap, "No character mappings can be found for language code '%s'", languageCode); } /** Returns the default character-key map (the one that uses the Latin alphabet). */ public static SimpleArrayMap getDefaultCharToKeyMap() { return Latin.CHAR_TO_KEY; } /** * Returns the key-characters map of the given ISO 639-2 language code of the 1st language * preference or null if no key-characters map for the language code is defined. */ static String[] getKeyToCharsMap(@NonNull Context context) { return KEY_TO_CHAR_MAPS.get(LocaleUtils.getLocale(context).getISO3Language()); } /** Returns the default key-characters map (the one that uses the Latin alphabet). */ public static String[] getDefaultKeyToCharsMap() { return Latin.KEY_TO_CHARS; } /** * Given a array representing a key-characters map, return its reverse map. * *

It is the caller's responsibility to ensure that * *

    *
  • the array contains only 12 elements, *
  • the 0th element ~ the 9th element are the mappings for keys "0" ~ "9", *
  • the 10th element is for key "*", and *
  • the 11th element is for key "#". *
* * @param keyToChars An array representing a key-characters map. It must satisfy the conditions * above. * @return A character-key map. */ private static SimpleArrayMap getCharToKeyMap( @NonNull String[] keyToChars) { Assert.checkArgument(keyToChars.length == 12); SimpleArrayMap charToKeyMap = new SimpleArrayMap<>(); for (int keyIndex = 0; keyIndex < keyToChars.length; keyIndex++) { String chars = keyToChars[keyIndex]; for (int j = 0; j < chars.length(); j++) { char c = chars.charAt(j); if (Character.isAlphabetic(c)) { charToKeyMap.put(Character.toLowerCase(c), getKeyChar(keyIndex)); } } } return charToKeyMap; } /** Given a key index of the dialpad, returns the corresponding character. */ private static char getKeyChar(int keyIndex) { Assert.checkArgument(0 <= keyIndex && keyIndex <= 11); switch (keyIndex) { case 10: return '*'; case 11: return '#'; default: return (char) ('0' + keyIndex); } } }