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.content.ContentResolver; 20ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yuimport android.content.Context; 21bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liuimport android.database.Cursor; 22ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yuimport android.telephony.Rlog; 23bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 24ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yuimport com.android.internal.telephony.HbpcdLookup.ArbitraryMccSidMatch; 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 Liu 30bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liupublic final class HbpcdUtils { 31bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu private static final String LOG_TAG = "HbpcdUtils"; 32bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu private static final boolean DBG = false; 33bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu private ContentResolver resolver = null; 34bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 35bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu public HbpcdUtils(Context context) { 36bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu resolver = context.getContentResolver(); 37bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 38bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 39bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu /** 40bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * Resolves the unknown MCC with SID and Timezone information. 41bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu */ 42bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu public int getMcc(int sid, int tz, int DSTflag, boolean isNitzTimeZone) { 43bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu int tmpMcc = 0; 44bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 45bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // check if SID exists in arbitrary_mcc_sid_match table. 46bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // these SIDs are assigned to more than 1 operators, but they are known to 47bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // be used by a specific operator, other operators having the same SID are 48bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // not using it currently, if that SID is in this table, we don't need to 49bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // check other tables. 50bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu String projection2[] = {ArbitraryMccSidMatch.MCC}; 51bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Cursor c2 = resolver.query(ArbitraryMccSidMatch.CONTENT_URI, projection2, 52bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu ArbitraryMccSidMatch.SID + "=" + sid, null, null); 53bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 54bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c2 != null) { 55bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu int c2Counter = c2.getCount(); 56bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) { 57ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu Rlog.d(LOG_TAG, "Query unresolved arbitrary table, entries are " + c2Counter); 58bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 59bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c2Counter == 1) { 60bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) { 61ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu Rlog.d(LOG_TAG, "Query Unresolved arbitrary returned the cursor " + c2); 62bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 63bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c2.moveToFirst(); 64bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu tmpMcc = c2.getInt(0); 65bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (DBG) { 66ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu Rlog.d(LOG_TAG, "MCC found in arbitrary_mcc_sid_match: " + tmpMcc); 67bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 68bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c2.close(); 69bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu return tmpMcc; 70bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 71bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c2.close(); 72bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 73bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 74bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // Then check if SID exists in mcc_sid_conflict table. 75bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // and use the timezone in mcc_lookup table to check which MCC matches. 76bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu String projection3[] = {MccSidConflicts.MCC}; 77bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Cursor c3 = resolver.query(MccSidConflicts.CONTENT_URI, projection3, 78bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccSidConflicts.SID_CONFLICT + "=" + sid + " and (((" + 79bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccLookup.GMT_OFFSET_LOW + "<=" + tz + ") and (" + tz + "<=" + 80bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccLookup.GMT_OFFSET_HIGH + ") and (" + "0=" + DSTflag + ")) or ((" + 81bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccLookup.GMT_DST_LOW + "<=" + tz + ") and (" + tz + "<=" + 82bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccLookup.GMT_DST_HIGH + ") and (" + "1=" + DSTflag + ")))", 83bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu null, null); 84bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c3 != null) { 85bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu int c3Counter = c3.getCount(); 86bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c3Counter > 0) { 87bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c3Counter > 1) { 88ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu Rlog.w(LOG_TAG, "something wrong, get more results for 1 conflict SID: " + c3); 89bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 90ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) Rlog.d(LOG_TAG, "Query conflict sid returned the cursor " + c3); 91bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c3.moveToFirst(); 92bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu tmpMcc = c3.getInt(0); 93ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) { 94ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu Rlog.d(LOG_TAG, "MCC found in mcc_lookup_table. Return tmpMcc = " + tmpMcc); 95ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu } 96ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (!isNitzTimeZone) { 97bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // time zone is not accurate, it may get wrong mcc, ignore it. 98ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) { 99ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu Rlog.d(LOG_TAG, "time zone is not accurate, mcc may be " + tmpMcc); 100ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu } 101ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu tmpMcc = 0; 102bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 103ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu c3.close(); 104ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu return tmpMcc; 105ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu } else { 106ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu c3.close(); 107bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 108bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 109bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 110bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // if there is no conflict, then check if SID is in mcc_sid_range. 111bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu String projection5[] = {MccSidRange.MCC}; 112bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Cursor c5 = resolver.query(MccSidRange.CONTENT_URI, projection5, 113bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccSidRange.RANGE_LOW + "<=" + sid + " and " + 114bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccSidRange.RANGE_HIGH + ">=" + sid, 115bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu null, null); 116bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c5 != null) { 117bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c5.getCount() > 0) { 118ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) Rlog.d(LOG_TAG, "Query Range returned the cursor " + c5); 119bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c5.moveToFirst(); 120bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu tmpMcc = c5.getInt(0); 121ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) Rlog.d(LOG_TAG, "SID found in mcc_sid_range. Return tmpMcc = " + tmpMcc); 122bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c5.close(); 123bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu return tmpMcc; 124bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 125bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu c5.close(); 126bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 127ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) Rlog.d(LOG_TAG, "SID NOT found in mcc_sid_range."); 128bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 129ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) Rlog.d(LOG_TAG, "Exit getMccByOtherFactors. Return tmpMcc = " + tmpMcc); 130bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // If unknown MCC still could not be resolved, 131bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu return tmpMcc; 132bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 133bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 134bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu /** 135bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu * Gets country information with given MCC. 136bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu */ 137bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu public String getIddByMcc(int mcc) { 138ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) Rlog.d(LOG_TAG, "Enter getHbpcdInfoByMCC."); 139bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu String idd = ""; 140bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 141bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Cursor c = null; 142bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 143bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu String projection[] = {MccIdd.IDD}; 144bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu Cursor cur = resolver.query(MccIdd.CONTENT_URI, projection, 145bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu MccIdd.MCC + "=" + mcc, null, null); 146bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (cur != null) { 147bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (cur.getCount() > 0) { 148ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) Rlog.d(LOG_TAG, "Query Idd returned the cursor " + cur); 149bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // TODO: for those country having more than 1 IDDs, need more information 150bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu // to decide which IDD would be used. currently just use the first 1. 151bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu cur.moveToFirst(); 152bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu idd = cur.getString(0); 153ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) Rlog.d(LOG_TAG, "IDD = " + idd); 154bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 155bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 156bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu cur.close(); 157bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 158bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu if (c != null) c.close(); 159bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu 160ef5867a3d255d46160d21af3a2140ca58227c4e5Jack Yu if (DBG) Rlog.d(LOG_TAG, "Exit getHbpcdInfoByMCC."); 161bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu return idd; 162bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu } 163bb1c968287bd746a93036ca41f5b46d4ad6a3977Steven Liu} 164