blob: 2f1a5b0a0663e1d95a690bbd6f5824a82f5ef430 [file] [log] [blame]
/*
* Copyright (C) 2013 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.contacts.util;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
/**
* This class wraps several PhoneNumberUtil calls and TelephonyManager calls. Some of them are
* the same as the ones in the framework's code base. We can remove those once they are part of
* the public API.
*/
public class PhoneNumberHelper {
private static final String LOG_TAG = PhoneNumberHelper.class.getSimpleName();
private static final String KOREA_ISO_COUNTRY_CODE = "KR";
/**
* Determines if the specified number is actually a URI (i.e. a SIP address) rather than a
* regular PSTN phone number, based on whether or not the number contains an "@" character.
*
* @param number Phone number
* @return true if number contains @
*
* TODO: Remove if PhoneNumberUtils.isUriNumber(String number) is made public.
*/
public static boolean isUriNumber(String number) {
// Note we allow either "@" or "%40" to indicate a URI, in case
// the passed-in string is URI-escaped. (Neither "@" nor "%40"
// will ever be found in a legal PSTN number.)
return number != null && (number.contains("@") || number.contains("%40"));
}
/**
* Normalize a phone number by removing the characters other than digits. If
* the given number has keypad letters, the letters will be converted to
* digits first.
*
* @param phoneNumber The number to be normalized.
* @return The normalized number.
*
* TODO: Remove if PhoneNumberUtils.normalizeNumber(String phoneNumber) is made public.
*/
public static String normalizeNumber(String phoneNumber) {
StringBuilder sb = new StringBuilder();
int len = phoneNumber.length();
for (int i = 0; i < len; i++) {
char c = phoneNumber.charAt(i);
// Character.digit() supports ASCII and Unicode digits (fullwidth, Arabic-Indic, etc.)
int digit = Character.digit(c, 10);
if (digit != -1) {
sb.append(digit);
} else if (i == 0 && c == '+') {
sb.append(c);
} else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
return normalizeNumber(PhoneNumberUtils.convertKeypadLettersToDigits(phoneNumber));
}
}
return sb.toString();
}
/**
* @return the "username" part of the specified SIP address, i.e. the part before the "@"
* character (or "%40").
*
* @param number SIP address of the form "username@domainname" (or the URI-escaped equivalent
* "username%40domainname")
*
* TODO: Remove if PhoneNumberUtils.getUsernameFromUriNumber(String number) is made public.
*/
public static String getUsernameFromUriNumber(String number) {
// The delimiter between username and domain name can be
// either "@" or "%40" (the URI-escaped equivalent.)
int delimiterIndex = number.indexOf('@');
if (delimiterIndex < 0) {
delimiterIndex = number.indexOf("%40");
}
if (delimiterIndex < 0) {
Log.w(LOG_TAG,
"getUsernameFromUriNumber: no delimiter found in SIP addr '" + number + "'");
return number;
}
return number.substring(0, delimiterIndex);
}
/** Returns true if the given string is dialable by the user from Phone/Dialer app. */
public static boolean isDialablePhoneNumber(String str) {
if (TextUtils.isEmpty(str)) {
return false;
}
for (int i = 0, count = str.length(); i < count; i++) {
if (!(PhoneNumberUtils.isDialable(str.charAt(i))
|| str.charAt(i) == ' '
|| str.charAt(i) == '-'
|| str.charAt(i) == '('
|| str.charAt(i) == ')'
|| str.charAt(i) == '.'
|| str.charAt(i) == '/')) {
return false;
}
}
return true;
}
}