170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying/*
270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * Copyright (C) 2014 The Android Open Source Project
370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying *
470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * Licensed under the Apache License, Version 2.0 (the "License");
570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * you may not use this file except in compliance with the License.
670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * You may obtain a copy of the License at
770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying *
870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying *      http://www.apache.org/licenses/LICENSE-2.0
970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying *
1070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * Unless required by applicable law or agreed to in writing, software
1170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * distributed under the License is distributed on an "AS IS" BASIS,
1270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * See the License for the specific language governing permissions and
1470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * limitations under the License.
1570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying */
1670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
1770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingpackage com.android.internal.telephony;
1870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
1970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingimport java.util.ArrayList;
2070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingimport java.util.HashMap;
2170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
2270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingimport android.content.Context;
233c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Yingimport android.os.Build;
243c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Yingimport android.text.TextUtils;
2570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingimport android.database.Cursor;
2670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingimport android.database.SQLException;
2770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingimport android.telephony.PhoneNumberUtils;
2870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingimport android.telephony.TelephonyManager;
2970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingimport android.telephony.Rlog;
3076ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu
3170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingimport com.android.internal.telephony.HbpcdLookup.MccIdd;
3270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingimport com.android.internal.telephony.HbpcdLookup.MccLookup;
3370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
3470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
3570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying /**
3670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * This class implements handle the MO SMS target address before sending.
3776ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu * This is special for VZW requirement. Follow the specifications of assisted dialing
3870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * of MO SMS while traveling on VZW CDMA, international CDMA or GSM markets.
3970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying * {@hide}
4070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying */
4170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Yingpublic class SmsNumberUtils {
4270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final String TAG = "SmsNumberUtils";
433c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying    private static final boolean DBG = Build.IS_DEBUGGABLE;
4470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
4570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final String PLUS_SIGN = "+";
4670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
4770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NANP_SHORT_LENGTH = 7;
4870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NANP_MEDIUM_LENGTH = 10;
4970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NANP_LONG_LENGTH = 11;
5070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
5170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NANP_CC = 1;
5270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final String NANP_NDD = "1";
5370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final String NANP_IDD = "011";
5470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
5570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int MIN_COUNTRY_AREA_LOCAL_LENGTH = 10;
5670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
5770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int GSM_UMTS_NETWORK = 0;
5870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int CDMA_HOME_NETWORK = 1;
5970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int CDMA_ROAMING_NETWORK = 2;
6070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
6170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_NONE = 0;
6270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_NANP_BEGIN = 1;
6370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
6470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <Phone Number>, <NXX>-<XXXX> N[2-9] */
6570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_NANP_LOCAL = NP_NANP_BEGIN;
6670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
6770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <Area_code>-<Phone Number>, <NXX>-<NXX>-<XXXX> N[2-9] */
6870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_NANP_AREA_LOCAL = NP_NANP_BEGIN + 1;
6970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
7070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <1>-<Area_code>-<Phone Number>, 1-<NXX>-<NXX>-<XXXX> N[2-9] */
7170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_NANP_NDD_AREA_LOCAL = NP_NANP_BEGIN + 2;
7270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
7370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <+><U.S.Country_code><Area_code><Phone Number>, +1-<NXX>-<NXX>-<XXXX> N[2-9] */
7470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_NANP_NBPCD_CC_AREA_LOCAL = NP_NANP_BEGIN + 3;
7570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
7670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <Local_IDD><Country_code><Area_code><Phone Number>, 001-1-<NXX>-<NXX>-<XXXX> N[2-9] */
7770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_NANP_LOCALIDD_CC_AREA_LOCAL = NP_NANP_BEGIN + 4;
7870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
7970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <+><Home_IDD><Country_code><Area_code><Phone Number>, +011-1-<NXX>-<NXX>-<XXXX> N[2-9] */
8070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_NANP_NBPCD_HOMEIDD_CC_AREA_LOCAL = NP_NANP_BEGIN + 5;
8170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
8270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_INTERNATIONAL_BEGIN = 100;
8370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <+>-<Home_IDD>-<Country_code>-<Area_code>-<Phone Number>, +011-86-25-86281234 */
8470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_NBPCD_HOMEIDD_CC_AREA_LOCAL = NP_INTERNATIONAL_BEGIN;
8570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
8670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <Home_IDD>-<Country_code>-<Area_code>-<Phone Number>, 011-86-25-86281234 */
8770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_HOMEIDD_CC_AREA_LOCAL = NP_INTERNATIONAL_BEGIN + 1;
8870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
8970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <NBPCD>-<Country_code>-<Area_code>-<Phone Number>, +1-86-25-86281234 */
9070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_NBPCD_CC_AREA_LOCAL = NP_INTERNATIONAL_BEGIN + 2;
9170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
9270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <Local_IDD>-<Country_code>-<Area_code>-<Phone Number>, 00-86-25-86281234 */
9370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_LOCALIDD_CC_AREA_LOCAL = NP_INTERNATIONAL_BEGIN + 3;
9470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
9570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* <Country_code>-<Area_code>-<Phone Number>, 86-25-86281234*/
9670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static final int NP_CC_AREA_LOCAL = NP_INTERNATIONAL_BEGIN + 4;
9770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
9870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static int[] ALL_COUNTRY_CODES = null;
9970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static int MAX_COUNTRY_CODES_LENGTH;
10070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static HashMap<String, ArrayList<String>> IDDS_MAPS =
10170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            new HashMap<String, ArrayList<String>>();
10270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
10370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static class NumberEntry {
10470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        public String number;
10570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        public String IDD;
10670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        public int countryCode;
10770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        public NumberEntry(String number) {
10870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            this.number = number;
10970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
11070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
11170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
11270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* Breaks the given number down and formats it according to the rules
11376ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu     * for different number plans and different network.
11470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *
11576ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu     * @param number destination number which need to be format
11670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * @param activeMcc current network's mcc
11770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * @param networkType current network type
11870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *
11976ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu     * @return the number after formatting.
12070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     */
12170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static String formatNumber(Context context, String number,
12270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                               String activeMcc,
12370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                               int networkType) {
12470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (number == null ) {
12570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            throw new IllegalArgumentException("number is null");
12670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
12770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
12870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (activeMcc == null || activeMcc.trim().length() == 0) {
12970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            throw new IllegalArgumentException("activeMcc is null or empty!");
13070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
13170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
13270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        String networkPortionNumber = PhoneNumberUtils.extractNetworkPortion(number);
13370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (networkPortionNumber == null || networkPortionNumber.length() == 0) {
13470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            throw new IllegalArgumentException("Number is invalid!");
13570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
13670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
13770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        NumberEntry numberEntry = new NumberEntry(networkPortionNumber);
13870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        ArrayList<String> allIDDs = getAllIDDs(context, activeMcc);
13970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
14070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        // First check whether the number is a NANP number.
14170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        int nanpState = checkNANP(numberEntry, allIDDs);
14270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (DBG) Rlog.d(TAG, "NANP type: " + getNumberPlanType(nanpState));
14370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
14470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if ((nanpState == NP_NANP_LOCAL)
14570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            || (nanpState == NP_NANP_AREA_LOCAL)
14670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            || (nanpState == NP_NANP_NDD_AREA_LOCAL)) {
14770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            return networkPortionNumber;
14870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (nanpState == NP_NANP_NBPCD_CC_AREA_LOCAL) {
14970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (networkType == CDMA_HOME_NETWORK
15070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    || networkType == CDMA_ROAMING_NETWORK) {
15170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // Remove "+"
15270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return networkPortionNumber.substring(1);
15370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            } else {
15470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return networkPortionNumber;
15570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
15670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (nanpState == NP_NANP_LOCALIDD_CC_AREA_LOCAL) {
15770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (networkType == CDMA_HOME_NETWORK) {
15870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return networkPortionNumber;
15970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            } else if (networkType == GSM_UMTS_NETWORK) {
16070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // Remove the local IDD and replace with "+"
16170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                int iddLength  =  numberEntry.IDD != null ? numberEntry.IDD.length() : 0;
16270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return PLUS_SIGN + networkPortionNumber.substring(iddLength);
16370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            } else if (networkType == CDMA_ROAMING_NETWORK) {
16470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // Remove the local IDD
16570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                int iddLength  =  numberEntry.IDD != null ? numberEntry.IDD.length() : 0;
16670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return  networkPortionNumber.substring(iddLength);
16770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
16870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
16970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
17070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        int internationalState = checkInternationalNumberPlan(context, numberEntry, allIDDs,
17170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                NANP_IDD);
17270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (DBG) Rlog.d(TAG, "International type: " + getNumberPlanType(internationalState));
17370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        String returnNumber = null;
17470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
17570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        switch (internationalState) {
17670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            case NP_NBPCD_HOMEIDD_CC_AREA_LOCAL:
17770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                if (networkType == GSM_UMTS_NETWORK) {
17870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    // Remove "+"
17970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    returnNumber = networkPortionNumber.substring(1);
18070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
18170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                break;
18270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
18370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            case NP_NBPCD_CC_AREA_LOCAL:
18470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // Replace "+" with "011"
18570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                returnNumber = NANP_IDD + networkPortionNumber.substring(1);
18670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                break;
18770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
18870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            case NP_LOCALIDD_CC_AREA_LOCAL:
18970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                if (networkType == GSM_UMTS_NETWORK || networkType == CDMA_ROAMING_NETWORK) {
19070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    int iddLength  =  numberEntry.IDD != null ? numberEntry.IDD.length() : 0;
19170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    // Replace <Local IDD> to <Home IDD>("011")
19270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    returnNumber = NANP_IDD + networkPortionNumber.substring(iddLength);
19370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
19470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                break;
19570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
19670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            case NP_CC_AREA_LOCAL:
19770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                int countryCode = numberEntry.countryCode;
19870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
19970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                if (!inExceptionListForNpCcAreaLocal(numberEntry)
20070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    && networkPortionNumber.length() >= 11 && countryCode != NANP_CC) {
20170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    // Add "011"
20270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    returnNumber = NANP_IDD + networkPortionNumber;
20370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
20470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                break;
20570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
20670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            case NP_HOMEIDD_CC_AREA_LOCAL:
20770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                returnNumber = networkPortionNumber;
20870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                break;
20970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
21070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            default:
21170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // Replace "+" with 011 in CDMA network if the number's country
21270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // code is not in the HbpcdLookup database.
21370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                if (networkPortionNumber.startsWith(PLUS_SIGN)
21470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    && (networkType == CDMA_HOME_NETWORK || networkType == CDMA_ROAMING_NETWORK)) {
21570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    if (networkPortionNumber.startsWith(PLUS_SIGN + NANP_IDD)) {
21670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        // Only remove "+"
21770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        returnNumber = networkPortionNumber.substring(1);
21870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    } else {
21970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        // Replace "+" with "011"
22070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        returnNumber = NANP_IDD + networkPortionNumber.substring(1);
22170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    }
22270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
22370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
22470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
22570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (returnNumber == null) {
22670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            returnNumber = networkPortionNumber;
22770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
22870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return returnNumber;
22970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
23070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
23170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* Query International direct dialing from HbpcdLookup.db
23270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * for specified country code
23370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *
23470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * @param mcc current network's country code
23570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *
23670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * @return the IDD array list.
23770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     */
23870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static ArrayList<String> getAllIDDs(Context context, String mcc) {
23970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        ArrayList<String> allIDDs = IDDS_MAPS.get(mcc);
24070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (allIDDs != null) {
24170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            return allIDDs;
24270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else {
24370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            allIDDs = new ArrayList<String>();
24470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
24570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
24670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        String projection[] = {MccIdd.IDD, MccIdd.MCC};
24770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        String where = null;
24870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
24970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        // if mcc is null         : return all rows
25070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        // if mcc is empty-string : return those rows whose mcc is emptry-string
25170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        String[] selectionArgs = null;
25270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (mcc != null) {
25370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            where = MccIdd.MCC + "=?";
25470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            selectionArgs = new String[] {mcc};
25570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
25670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
25770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        Cursor cursor = null;
25870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        try {
25970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            cursor = context.getContentResolver().query(MccIdd.CONTENT_URI, projection,
26070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    where, selectionArgs, null);
26170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (cursor.getCount() > 0) {
26270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                while (cursor.moveToNext()) {
26370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    String idd = cursor.getString(0);
26470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    if (!allIDDs.contains(idd)) {
26570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        allIDDs.add(idd);
26670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    }
26770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
26870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
26970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } catch (SQLException e) {
27070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            Rlog.e(TAG, "Can't access HbpcdLookup database", e);
27170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } finally {
27270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (cursor != null) {
27370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                cursor.close();
27470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
27570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
27670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
27770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        IDDS_MAPS.put(mcc, allIDDs);
27870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
27970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (DBG) Rlog.d(TAG, "MCC = " + mcc + ", all IDDs = " + allIDDs);
28070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return allIDDs;
28170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
28270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
28370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
28470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* Verify if the the destination number is a NANP number
28570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *
28670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * @param numberEntry including number and IDD array
28770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * @param allIDDs the IDD array list of the current network's country code
28870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *
28970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * @return the number plan type related NANP
29070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     */
29170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static int checkNANP(NumberEntry numberEntry, ArrayList<String> allIDDs) {
29270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        boolean isNANP = false;
29370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        String number = numberEntry.number;
29470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
29570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (number.length() == NANP_SHORT_LENGTH) {
29670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            // 7 digits - Seven digit phone numbers
29770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            char firstChar = number.charAt(0);
29870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (firstChar >= '2' && firstChar <= '9') {
29970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                isNANP = true;
30070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                for (int i=1; i< NANP_SHORT_LENGTH; i++ ) {
30170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    char c= number.charAt(i);
30270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    if (!PhoneNumberUtils.isISODigit(c)) {
30370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        isNANP = false;
30470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        break;
30570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    }
30670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
30770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
30870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (isNANP) {
30970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return NP_NANP_LOCAL;
31070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
31170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (number.length() == NANP_MEDIUM_LENGTH) {
31270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            // 10 digits - Three digit area code followed by seven digit phone numbers/
31370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (isNANP(number)) {
31470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return NP_NANP_AREA_LOCAL;
31570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
31670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (number.length() == NANP_LONG_LENGTH) {
31770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            // 11 digits - One digit U.S. NDD(National Direct Dial) prefix '1',
31870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            // followed by three digit area code and seven digit phone numbers
31970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (isNANP(number)) {
32070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return NP_NANP_NDD_AREA_LOCAL;
32170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
32270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (number.startsWith(PLUS_SIGN)) {
32370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            number = number.substring(1);
32470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (number.length() == NANP_LONG_LENGTH) {
32570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // '+' and 11 digits -'+', followed by NANP CC prefix '1' followed by
32670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // three digit area code and seven digit phone numbers
32770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                if (isNANP(number)) {
32870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    return NP_NANP_NBPCD_CC_AREA_LOCAL;
32970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
33070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            } else if (number.startsWith(NANP_IDD) && number.length() == NANP_LONG_LENGTH + 3) {
33170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // '+' and 14 digits -'+', followed by NANP IDD "011" followed by NANP CC
33270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // prefix '1' followed by three digit area code and seven digit phone numbers
33370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                number = number.substring(3);
33470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                if (isNANP(number)) {
33570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    return NP_NANP_NBPCD_HOMEIDD_CC_AREA_LOCAL;
33670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
33770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
33870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else {
33970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            // Check whether it's NP_NANP_LOCALIDD_CC_AREA_LOCAL
34070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            for (String idd : allIDDs) {
34170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                if (number.startsWith(idd)) {
34270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    String number2 = number.substring(idd.length());
34370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    if(number2 !=null && number2.startsWith(String.valueOf(NANP_CC))){
34470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        if (isNANP(number2)) {
34570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                            numberEntry.IDD = idd;
34670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                            return NP_NANP_LOCALIDD_CC_AREA_LOCAL;
34770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        }
34870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    }
34970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
35070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
35170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
35270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
35370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return NP_NONE;
35470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
35570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
35670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static boolean isNANP(String number) {
35770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (number.length() == NANP_MEDIUM_LENGTH
35870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            || (number.length() == NANP_LONG_LENGTH  && number.startsWith(NANP_NDD))) {
35970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (number.length() == NANP_LONG_LENGTH) {
36070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                number = number.substring(1);
36170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
36270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            return (PhoneNumberUtils.isNanp(number));
36370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
36470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return false;
36570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
36670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
36770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /* Verify if the the destination number is an internal number
36870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *
36970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * @param numberEntry including number and IDD array
37070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * @param allIDDs the IDD array list of the current network's country code
37170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *
37270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * @return the number plan type related international number
37370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     */
37470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static int checkInternationalNumberPlan(Context context, NumberEntry numberEntry,
37570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            ArrayList<String> allIDDs,String homeIDD) {
37670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        String number = numberEntry.number;
37770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        int countryCode = -1;
37870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
37970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (number.startsWith(PLUS_SIGN)) {
38070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            // +xxxxxxxxxx
38170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            String numberNoNBPCD = number.substring(1);
38270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (numberNoNBPCD.startsWith(homeIDD)) {
38370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                // +011xxxxxxxx
38470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                String numberCountryAreaLocal = numberNoNBPCD.substring(homeIDD.length());
38570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                if ((countryCode = getCountryCode(context, numberCountryAreaLocal)) > 0) {
38670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    numberEntry.countryCode = countryCode;
38770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    return NP_NBPCD_HOMEIDD_CC_AREA_LOCAL;
38870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
38970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            } else if ((countryCode = getCountryCode(context, numberNoNBPCD)) > 0) {
39070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                numberEntry.countryCode = countryCode;
39170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return NP_NBPCD_CC_AREA_LOCAL;
39270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
39370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
39470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (number.startsWith(homeIDD)) {
39570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            // 011xxxxxxxxx
39670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            String numberCountryAreaLocal = number.substring(homeIDD.length());
39770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if ((countryCode = getCountryCode(context, numberCountryAreaLocal)) > 0) {
39870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                numberEntry.countryCode = countryCode;
39970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return NP_HOMEIDD_CC_AREA_LOCAL;
40070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
40170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else {
40270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            for (String exitCode : allIDDs) {
40370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                if (number.startsWith(exitCode)) {
40470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    String numberNoIDD = number.substring(exitCode.length());
40570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    if ((countryCode = getCountryCode(context, numberNoIDD)) > 0) {
40670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        numberEntry.countryCode = countryCode;
40770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        numberEntry.IDD = exitCode;
40870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        return NP_LOCALIDD_CC_AREA_LOCAL;
40970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    }
41070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
41170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
41270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
41370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (!number.startsWith("0") && (countryCode = getCountryCode(context, number)) > 0) {
41470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                numberEntry.countryCode = countryCode;
41570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return NP_CC_AREA_LOCAL;
41670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
41770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
41870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return NP_NONE;
41970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
42070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
42170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /**
42270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *  Returns the country code from the given number.
42370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     */
42470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static int getCountryCode(Context context, String number) {
42570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        int countryCode = -1;
42670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (number.length() >= MIN_COUNTRY_AREA_LOCAL_LENGTH) {
42770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            // Check Country code
42870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            int[] allCCs = getAllCountryCodes(context);
42970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (allCCs == null) {
43070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                return countryCode;
43170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
43270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
43370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            int[] ccArray = new int[MAX_COUNTRY_CODES_LENGTH];
43470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            for (int i = 0; i < MAX_COUNTRY_CODES_LENGTH; i ++) {
435fc240dcd9b7f40b78913f18663809d683c6dbe65Narayan Kamath                ccArray[i] = Integer.parseInt(number.substring(0, i+1));
43670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
43770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
43870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            for (int i = 0; i < allCCs.length; i ++) {
43970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                int tempCC = allCCs[i];
44070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                for (int j = 0; j < MAX_COUNTRY_CODES_LENGTH; j ++) {
44170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    if (tempCC == ccArray[j]) {
44270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        if (DBG) Rlog.d(TAG, "Country code = " + tempCC);
44370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        return tempCC;
44470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    }
44570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
44670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
44770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
44870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
44970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return countryCode;
45070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
45170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
45270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /**
45370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *  Gets all country Codes information with given MCC.
45470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     */
45570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static int[] getAllCountryCodes(Context context) {
45670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (ALL_COUNTRY_CODES != null) {
45770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            return ALL_COUNTRY_CODES;
45870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
45970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
46070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        Cursor cursor = null;
46170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        try {
46270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            String projection[] = {MccLookup.COUNTRY_CODE};
46370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            cursor = context.getContentResolver().query(MccLookup.CONTENT_URI,
46470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    projection, null, null, null);
46570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
46670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (cursor.getCount() > 0) {
46770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                ALL_COUNTRY_CODES = new int[cursor.getCount()];
46870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                int i = 0;
46970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                while (cursor.moveToNext()) {
47070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    int countryCode = cursor.getInt(0);
47170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    ALL_COUNTRY_CODES[i++] = countryCode;
47270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    int length = String.valueOf(countryCode).trim().length();
47370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    if (length > MAX_COUNTRY_CODES_LENGTH) {
47470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                        MAX_COUNTRY_CODES_LENGTH = length;
47570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                    }
47670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
47770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
47870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } catch (SQLException e) {
47970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            Rlog.e(TAG, "Can't access HbpcdLookup database", e);
48070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } finally {
48170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (cursor != null) {
48270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                cursor.close();
48370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
48470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
48570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return ALL_COUNTRY_CODES;
48670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
48770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
48870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static boolean inExceptionListForNpCcAreaLocal(NumberEntry numberEntry) {
48970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        int countryCode = numberEntry.countryCode;
49070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        boolean result = (numberEntry.number.length() == 12
49170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                          && (countryCode == 7 || countryCode == 20
49270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                              || countryCode == 65 || countryCode == 90));
49370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return result;
49470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
49570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
49670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    private static String getNumberPlanType(int state) {
49770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        String numberPlanType = "Number Plan type (" + state + "): ";
49870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
49970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (state == NP_NANP_LOCAL) {
50070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            numberPlanType = "NP_NANP_LOCAL";
50170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (state == NP_NANP_AREA_LOCAL) {
50270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            numberPlanType = "NP_NANP_AREA_LOCAL";
50370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (state  == NP_NANP_NDD_AREA_LOCAL) {
50470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            numberPlanType = "NP_NANP_NDD_AREA_LOCAL";
50570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (state == NP_NANP_NBPCD_CC_AREA_LOCAL) {
50670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            numberPlanType = "NP_NANP_NBPCD_CC_AREA_LOCAL";
50770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (state == NP_NANP_LOCALIDD_CC_AREA_LOCAL) {
50870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            numberPlanType = "NP_NANP_LOCALIDD_CC_AREA_LOCAL";
50970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (state == NP_NANP_NBPCD_HOMEIDD_CC_AREA_LOCAL) {
51070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            numberPlanType = "NP_NANP_NBPCD_HOMEIDD_CC_AREA_LOCAL";
51170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (state == NP_NBPCD_HOMEIDD_CC_AREA_LOCAL) {
51276ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu            numberPlanType = "NP_NBPCD_HOMEIDD_CC_AREA_LOCAL";
51370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (state == NP_HOMEIDD_CC_AREA_LOCAL) {
51476ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu            numberPlanType = "NP_HOMEIDD_CC_AREA_LOCAL";
51570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (state == NP_NBPCD_CC_AREA_LOCAL) {
51670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            numberPlanType = "NP_NBPCD_CC_AREA_LOCAL";
51770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (state == NP_LOCALIDD_CC_AREA_LOCAL) {
51876ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu            numberPlanType = "NP_LOCALIDD_CC_AREA_LOCAL";
51970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else if (state == NP_CC_AREA_LOCAL) {
52070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            numberPlanType = "NP_CC_AREA_LOCAL";
52170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else {
52270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            numberPlanType = "Unknown type";
52370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
52470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return numberPlanType;
52570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
52670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
52770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /**
52870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     *  Filter the destination number if using VZW sim card.
52970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     */
5301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    public static String filterDestAddr(Phone phone, String destAddr) {
53170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (DBG) Rlog.d(TAG, "enter filterDestAddr. destAddr=\"" + destAddr + "\"" );
53270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
53370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        if (destAddr == null || !PhoneNumberUtils.isGlobalPhoneNumber(destAddr)) {
534efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            Rlog.w(TAG, "destAddr" + destAddr + " is not a global phone number! Nothing changed.");
53570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            return destAddr;
53670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
53770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
53876ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu        final String networkOperator = TelephonyManager.from(phone.getContext()).
53976ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu                getNetworkOperator(phone.getSubId());
54070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        String result = null;
54170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
5421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (needToConvert(phone)) {
5431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            final int networkType = getNetworkType(phone);
544d0d53c0abda36e56e883f3db76330cca03d2fcf1Xia Ying            if (networkType != -1 && !TextUtils.isEmpty(networkOperator)) {
54570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                String networkMcc = networkOperator.substring(0, 3);
54670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                if (networkMcc != null && networkMcc.trim().length() > 0) {
5471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    result = formatNumber(phone.getContext(), destAddr, networkMcc, networkType);
54870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                }
54970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
55070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
55170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
552efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu        if (DBG) {
553efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            Rlog.d(TAG, "destAddr is " + ((result != null)?"formatted.":"not formatted."));
554efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            Rlog.d(TAG, "leave filterDestAddr, new destAddr=\"" + (result != null ? result : destAddr) + "\"" );
555efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu        }
55670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return result != null ? result : destAddr;
55770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
55870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
55970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    /**
56070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     * Returns the current network type
56170dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying     */
5621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private static int getNetworkType(Phone phone) {
56370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        int networkType = -1;
56476ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu        int phoneType = phone.getPhoneType();
56570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
56676ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu        if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
56770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            networkType = GSM_UMTS_NETWORK;
56876ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu        } else if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
5691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (isInternationalRoaming(phone)) {
57070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying                networkType = CDMA_ROAMING_NETWORK;
5713c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying            } else {
5723c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                networkType = CDMA_HOME_NETWORK;
57370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            }
57470dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        } else {
57570dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying            if (DBG) Rlog.w(TAG, "warning! unknown mPhoneType value=" + phoneType);
57670dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        }
57770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
57870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying        return networkType;
57970dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
58070dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
5811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private static boolean isInternationalRoaming(Phone phone) {
58276ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu        String operatorIsoCountry = TelephonyManager.from(phone.getContext()).
58376ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu                getNetworkCountryIsoForPhone(phone.getPhoneId());
58476ab58dd7f833c4cf275f778abae8bf3ed9227c0Jack Yu        String simIsoCountry = TelephonyManager.from(phone.getContext()).getSimCountryIsoForPhone(
5851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                phone.getPhoneId());
5863c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        boolean internationalRoaming = !TextUtils.isEmpty(operatorIsoCountry)
5873c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                && !TextUtils.isEmpty(simIsoCountry)
5883c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                && !simIsoCountry.equals(operatorIsoCountry);
5893c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        if (internationalRoaming) {
5903c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying            if ("us".equals(simIsoCountry)) {
5913c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                internationalRoaming = !"vi".equals(operatorIsoCountry);
5923c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying            } else if ("vi".equals(simIsoCountry)) {
5933c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                internationalRoaming = !"us".equals(operatorIsoCountry);
5943c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying            }
5953c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        }
5963c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        return internationalRoaming;
59770dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
59870dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
5991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private static boolean needToConvert(Phone phone) {
6003c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        boolean bNeedToConvert  = false;
6011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        String[] listArray = phone.getContext().getResources()
6023c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                .getStringArray(com.android.internal.R.array
6033c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                .config_sms_convert_destination_number_support);
6043c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        if (listArray != null && listArray.length > 0) {
6053c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying            for (int i=0; i<listArray.length; i++) {
6063c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                if (!TextUtils.isEmpty(listArray[i])) {
6073c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                    String[] needToConvertArray = listArray[i].split(";");
6083c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                    if (needToConvertArray != null && needToConvertArray.length > 0) {
6093c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                        if (needToConvertArray.length == 1) {
6103c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                            bNeedToConvert = "true".equalsIgnoreCase(needToConvertArray[0]);
6113c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                        } else if (needToConvertArray.length == 2 &&
6123c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                                !TextUtils.isEmpty(needToConvertArray[1]) &&
6131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                compareGid1(phone, needToConvertArray[1])) {
6143c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                            bNeedToConvert = "true".equalsIgnoreCase(needToConvertArray[0]);
6153c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                            break;
6163c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                        }
6173c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                    }
6183c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                }
6193c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying            }
6203c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        }
6213c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        return bNeedToConvert;
62270dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying    }
62370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying
6241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private static boolean compareGid1(Phone phone, String serviceGid1) {
6251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        String gid1 = phone.getGroupIdLevel1();
6263c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        boolean ret = true;
6273c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying
6283c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        if (TextUtils.isEmpty(serviceGid1)) {
6293c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying            if (DBG) Rlog.d(TAG, "compareGid1 serviceGid is empty, return " + ret);
6303c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying            return ret;
6313c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        }
6323c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying
6333c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        int gid_length = serviceGid1.length();
6343c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        // Check if gid1 match service GID1
6353c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        if (!((gid1 != null) && (gid1.length() >= gid_length) &&
6363c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying                gid1.substring(0, gid_length).equalsIgnoreCase(serviceGid1))) {
6373c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying            if (DBG) Rlog.d(TAG, " gid1 " + gid1 + " serviceGid1 " + serviceGid1);
6383c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying            ret = false;
6393c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        }
6403c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        if (DBG) Rlog.d(TAG, "compareGid1 is " + (ret?"Same":"Different"));
6413c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying        return ret;
6423c36d8029ea2c92e0339cd0cbe26511e5478da09Xia Ying    }
64370dad6e7c56847c91bc55755c645680ea6c6fac3Xia Ying}
644