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