blob: 60127663727e3c69e5b0b41b1d941a0ee4448a50 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
* Copyright (C) 2023 The LineageOS 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 androidx.annotation.NonNull;
import androidx.collection.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);
}
}
}