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