1bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu/* 2bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * Copyright (C) 2014 The Android Open Source Project 3bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * 4bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * Licensed under the Apache License, Version 2.0 (the "License"); 5bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * you may not use this file except in compliance with the License. 6bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * You may obtain a copy of the License at 7bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * 8bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * http://www.apache.org/licenses/LICENSE-2.0 9bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * 10bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * Unless required by applicable law or agreed to in writing, software 11bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * distributed under the License is distributed on an "AS IS" BASIS, 12bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * See the License for the specific language governing permissions and 14bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * limitations under the License. 15bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu */ 16bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 17bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liupackage com.android.internal.telephony; 18bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 19bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport android.util.Log; 20bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport android.content.Context; 21bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport android.content.ContentResolver; 22bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport android.database.Cursor; 23bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 24bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport com.android.internal.telephony.HbpcdLookup; 25bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport com.android.internal.telephony.HbpcdLookup.MccIdd; 26bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport com.android.internal.telephony.HbpcdLookup.MccLookup; 27bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport com.android.internal.telephony.HbpcdLookup.MccSidConflicts; 28bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport com.android.internal.telephony.HbpcdLookup.MccSidRange; 29bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport com.android.internal.telephony.HbpcdLookup.ArbitraryMccSidMatch; 30bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 31bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liupublic final class HbpcdUtils { 32bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu private static final String LOG_TAG = "HbpcdUtils"; 33bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu private static final boolean DBG = false; 34bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu private ContentResolver resolver = null; 35bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 36bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu public HbpcdUtils(Context context) { 37bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu resolver = context.getContentResolver(); 38bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 39bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 40bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu /** 41bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * Resolves the unknown MCC with SID and Timezone information. 42bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu */ 43bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu public int getMcc(int sid, int tz, int DSTflag, boolean isNitzTimeZone) { 44bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu int tmpMcc = 0; 45bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 46bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // check if SID exists in arbitrary_mcc_sid_match table. 47bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // these SIDs are assigned to more than 1 operators, but they are known to 48bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // be used by a specific operator, other operators having the same SID are 49bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // not using it currently, if that SID is in this table, we don't need to 50bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // check other tables. 51bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu String projection2[] = {ArbitraryMccSidMatch.MCC}; 52bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Cursor c2 = resolver.query(ArbitraryMccSidMatch.CONTENT_URI, projection2, 53bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu ArbitraryMccSidMatch.SID + "=" + sid, null, null); 54bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 55bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c2 != null) { 56bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu int c2Counter = c2.getCount(); 57bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) { 58bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Log.d(LOG_TAG, "Query unresolved arbitrary table, entries are " + c2Counter); 59bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 60bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c2Counter == 1) { 61bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) { 62bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Log.d(LOG_TAG, "Query Unresolved arbitrary returned the cursor " + c2 ); 63bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 64bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c2.moveToFirst(); 65bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu tmpMcc = c2.getInt(0); 66bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) { 67bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Log.d(LOG_TAG, "MCC found in arbitrary_mcc_sid_match: " + tmpMcc); 68bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 69bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c2.close(); 70bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu return tmpMcc; 71bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 72bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c2.close(); 73bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 74bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 75bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // Then check if SID exists in mcc_sid_conflict table. 76bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // and use the timezone in mcc_lookup table to check which MCC matches. 77bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu String projection3[] = {MccSidConflicts.MCC}; 78bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Cursor c3 = resolver.query(MccSidConflicts.CONTENT_URI, projection3, 79bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccSidConflicts.SID_CONFLICT + "=" + sid + " and (((" + 80bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccLookup.GMT_OFFSET_LOW + "<=" + tz + ") and (" + tz + "<=" + 81bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccLookup.GMT_OFFSET_HIGH + ") and (" + "0=" + DSTflag + ")) or ((" + 82bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccLookup.GMT_DST_LOW + "<=" + tz + ") and (" + tz + "<=" + 83bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccLookup.GMT_DST_HIGH + ") and (" + "1=" + DSTflag + ")))", 84bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu null, null); 85bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c3 != null) { 86bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu int c3Counter = c3.getCount(); 87bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c3Counter > 0) { 88bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c3Counter > 1) { 89bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Log.w(LOG_TAG, "something wrong, get more results for 1 conflict SID: " + c3); 90bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 91bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, "Query conflict sid returned the cursor " + c3 ); 92bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c3.moveToFirst(); 93bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu tmpMcc = c3.getInt(0); 94bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, 95bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu "MCC found in mcc_lookup_table. Return tmpMcc = " + tmpMcc); 96bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c3.close(); 97bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (isNitzTimeZone) { 98bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu return tmpMcc; 99bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } else { 100bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // time zone is not accurate, it may get wrong mcc, ignore it. 101bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, "time zone is not accurate, mcc may be " 102bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu + tmpMcc); 103bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu return 0; 104bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 105bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 106bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 107bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 108bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // if there is no conflict, then check if SID is in mcc_sid_range. 109bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu String projection5[] = {MccSidRange.MCC}; 110bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Cursor c5 = resolver.query(MccSidRange.CONTENT_URI, projection5, 111bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccSidRange.RANGE_LOW + "<=" + sid + " and " + 112bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccSidRange.RANGE_HIGH + ">=" + sid, 113bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu null, null); 114bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c5 != null) { 115bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c5.getCount() > 0) { 116bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, "Query Range returned the cursor " + c5 ); 117bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c5.moveToFirst(); 118bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu tmpMcc = c5.getInt(0); 119bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, "SID found in mcc_sid_range. Return tmpMcc = " + tmpMcc); 120bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c5.close(); 121bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu return tmpMcc; 122bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 123bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c5.close(); 124bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 125bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, "SID NOT found in mcc_sid_range."); 126bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 127bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, "Exit getMccByOtherFactors. Return tmpMcc = " + tmpMcc ); 128bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // If unknown MCC still could not be resolved, 129bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu return tmpMcc; 130bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 131bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 132bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu /** 133bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * Gets country information with given MCC. 134bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu */ 135bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu public String getIddByMcc(int mcc) { 136bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, "Enter getHbpcdInfoByMCC."); 137bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu String idd = ""; 138bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 139bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Cursor c = null; 140bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 141bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu String projection[] = {MccIdd.IDD}; 142bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Cursor cur = resolver.query(MccIdd.CONTENT_URI, projection, 143bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccIdd.MCC + "=" + mcc, null, null); 144bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (cur != null) { 145bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (cur.getCount() > 0) { 146bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, "Query Idd returned the cursor " + cur ); 147bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // TODO: for those country having more than 1 IDDs, need more information 148bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // to decide which IDD would be used. currently just use the first 1. 149bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu cur.moveToFirst(); 150bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu idd = cur.getString(0); 151bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, "IDD = " + idd); 152bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 153bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 154bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu cur.close(); 155bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 156bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c != null) c.close(); 157bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 158bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) Log.d(LOG_TAG, "Exit getHbpcdInfoByMCC."); 159bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu return idd; 160bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 161bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu} 162