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