224 lines
7.2 KiB
Java
224 lines
7.2 KiB
Java
|
/*
|
|||
|
* 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<Character, Character> 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<Character, Character> 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<Character, Character> 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<Character, Character> 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<String, SimpleArrayMap<Character, Character>>
|
|||
|
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<String, String[]> 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<Character, Character> 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.
|
|||
|
*
|
|||
|
* <p>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.
|
|||
|
*
|
|||
|
* <p>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<Character, Character> getCharToKeyMap(String languageCode) {
|
|||
|
SimpleArrayMap<Character, Character> 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<Character, Character> 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.
|
|||
|
*
|
|||
|
* <p>It is the caller's responsibility to ensure that
|
|||
|
*
|
|||
|
* <ul>
|
|||
|
* <li>the array contains only 12 elements,
|
|||
|
* <li>the 0th element ~ the 9th element are the mappings for keys "0" ~ "9",
|
|||
|
* <li>the 10th element is for key "*", and
|
|||
|
* <li>the 11th element is for key "#".
|
|||
|
* </ul>
|
|||
|
*
|
|||
|
* @param keyToChars An array representing a key-characters map. It must satisfy the conditions
|
|||
|
* above.
|
|||
|
* @return A character-key map.
|
|||
|
*/
|
|||
|
private static SimpleArrayMap<Character, Character> getCharToKeyMap(
|
|||
|
@NonNull String[] keyToChars) {
|
|||
|
Assert.checkArgument(keyToChars.length == 12);
|
|||
|
|
|||
|
SimpleArrayMap<Character, Character> 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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|