13cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen/* 23cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * Copyright (C) 2014 The Android Open Source Project 33cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * 43cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * Licensed under the Apache License, Version 2.0 (the "License"); 53cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * you may not use this file except in compliance with the License. 63cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * You may obtain a copy of the License at 73cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * 83cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * http://www.apache.org/licenses/LICENSE-2.0 93cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * 103cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * Unless required by applicable law or agreed to in writing, software 113cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * distributed under the License is distributed on an "AS IS" BASIS, 123cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * See the License for the specific language governing permissions and 143cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * limitations under the License. 153cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen */ 163cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen 173cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wenpackage com.android.mms.service; 183cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen 193cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wenimport android.telephony.TelephonyManager; 203cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wenimport android.text.TextUtils; 213cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wenimport android.util.Log; 223cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wenimport com.android.i18n.phonenumbers.NumberParseException; 233cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wenimport com.android.i18n.phonenumbers.PhoneNumberUtil; 243cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wenimport com.android.i18n.phonenumbers.Phonenumber; 253cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen 263cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wenimport java.util.Locale; 273cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen 283cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen/** 293cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * Utility to handle phone numbers. 303cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen */ 313cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wenpublic class PhoneUtils { 323cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen 333cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen /** 343cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * Get a canonical national format phone number. If parsing fails, just return the 353cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * original number. 363cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * 373cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * @param telephonyManager 383cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * @param subId The SIM ID associated with this number 393cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * @param phoneText The input phone number text 403cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen * @return The formatted number or the original phone number if failed to parse 413cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen */ 423cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen public static String getNationalNumber(TelephonyManager telephonyManager, int subId, 433cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen String phoneText) { 443cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen final String country = getSimOrDefaultLocaleCountry(telephonyManager, subId); 453cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); 463cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen final Phonenumber.PhoneNumber parsed = getParsedNumber(phoneNumberUtil, phoneText, country); 473cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen if (parsed == null) { 483cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen return phoneText; 493cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } 503cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen return phoneNumberUtil 513cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen .format(parsed, PhoneNumberUtil.PhoneNumberFormat.NATIONAL) 523cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen .replaceAll("\\D", ""); 533cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } 543cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen 553cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen // Parse the input number into internal format 563cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen private static Phonenumber.PhoneNumber getParsedNumber(PhoneNumberUtil phoneNumberUtil, 573cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen String phoneText, String country) { 583cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen try { 593cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen final Phonenumber.PhoneNumber phoneNumber = phoneNumberUtil.parse(phoneText, country); 603cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen if (phoneNumberUtil.isValidNumber(phoneNumber)) { 613cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen return phoneNumber; 623cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } else { 638153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e("getParsedNumber: not a valid phone number" 643cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen + " for country " + country); 653cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen return null; 663cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } 673cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } catch (final NumberParseException e) { 688153aed48a84305533f26c06a07a51bd358cee41Ye Wen LogUtil.e("getParsedNumber: Not able to parse phone number", e); 693cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen return null; 703cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } 713cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } 723cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen 733cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen // Get the country/region either from the SIM ID or from locale 743cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen private static String getSimOrDefaultLocaleCountry(TelephonyManager telephonyManager, 753cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen int subId) { 763cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen String country = getSimCountry(telephonyManager, subId); 773cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen if (TextUtils.isEmpty(country)) { 783cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen country = Locale.getDefault().getCountry(); 793cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } 803cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen 813cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen return country; 823cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } 833cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen 843cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen // Get country/region from SIM ID 853cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen private static String getSimCountry(TelephonyManager telephonyManager, int subId) { 863cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen final String country = telephonyManager.getSimCountryIso(subId); 873cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen if (TextUtils.isEmpty(country)) { 883cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen return null; 893cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } 903cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen return country.toUpperCase(); 913cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen } 923cf9a9481b8e95d0fb654d083b06ee9a23a8e4e8Ye Wen} 93