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