| /* |
| * Copyright (C) 2014 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.mms.service; |
| |
| import android.telephony.TelephonyManager; |
| import android.text.TextUtils; |
| import android.util.Log; |
| import com.android.i18n.phonenumbers.NumberParseException; |
| import com.android.i18n.phonenumbers.PhoneNumberUtil; |
| import com.android.i18n.phonenumbers.Phonenumber; |
| |
| import java.util.Locale; |
| |
| /** |
| * Utility to handle phone numbers. |
| */ |
| public class PhoneUtils { |
| |
| /** |
| * Get a canonical national format phone number. If parsing fails, just return the |
| * original number. |
| * |
| * @param telephonyManager |
| * @param subId The SIM ID associated with this number |
| * @param phoneText The input phone number text |
| * @return The formatted number or the original phone number if failed to parse |
| */ |
| public static String getNationalNumber(TelephonyManager telephonyManager, int subId, |
| String phoneText) { |
| final String country = getSimOrDefaultLocaleCountry(telephonyManager, subId); |
| final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); |
| final Phonenumber.PhoneNumber parsed = getParsedNumber(phoneNumberUtil, phoneText, country); |
| if (parsed == null) { |
| return phoneText; |
| } |
| return phoneNumberUtil |
| .format(parsed, PhoneNumberUtil.PhoneNumberFormat.NATIONAL) |
| .replaceAll("\\D", ""); |
| } |
| |
| // Parse the input number into internal format |
| private static Phonenumber.PhoneNumber getParsedNumber(PhoneNumberUtil phoneNumberUtil, |
| String phoneText, String country) { |
| try { |
| final Phonenumber.PhoneNumber phoneNumber = phoneNumberUtil.parse(phoneText, country); |
| if (phoneNumberUtil.isValidNumber(phoneNumber)) { |
| return phoneNumber; |
| } else { |
| LogUtil.e("getParsedNumber: not a valid phone number" |
| + " for country " + country); |
| return null; |
| } |
| } catch (final NumberParseException e) { |
| LogUtil.e("getParsedNumber: Not able to parse phone number", e); |
| return null; |
| } |
| } |
| |
| // Get the country/region either from the SIM ID or from locale |
| private static String getSimOrDefaultLocaleCountry(TelephonyManager telephonyManager, |
| int subId) { |
| String country = getSimCountry(telephonyManager, subId); |
| if (TextUtils.isEmpty(country)) { |
| country = Locale.getDefault().getCountry(); |
| } |
| |
| return country; |
| } |
| |
| // Get country/region from SIM ID |
| private static String getSimCountry(TelephonyManager telephonyManager, int subId) { |
| final String country = telephonyManager.getSimCountryIso(subId); |
| if (TextUtils.isEmpty(country)) { |
| return null; |
| } |
| return country.toUpperCase(); |
| } |
| } |