/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import android.util.Log; import android.content.Context; import android.content.ContentResolver; import android.database.Cursor; import com.android.internal.telephony.HbpcdLookup; import com.android.internal.telephony.HbpcdLookup.MccIdd; import com.android.internal.telephony.HbpcdLookup.MccLookup; import com.android.internal.telephony.HbpcdLookup.MccSidConflicts; import com.android.internal.telephony.HbpcdLookup.MccSidRange; import com.android.internal.telephony.HbpcdLookup.ArbitraryMccSidMatch; public final class HbpcdUtils { private static final String LOG_TAG = "HbpcdUtils"; private static final boolean DBG = false; private ContentResolver resolver = null; public HbpcdUtils(Context context) { resolver = context.getContentResolver(); } /** * Resolves the unknown MCC with SID and Timezone information. */ public int getMcc(int sid, int tz, int DSTflag, boolean isNitzTimeZone) { int tmpMcc = 0; // check if SID exists in arbitrary_mcc_sid_match table. // these SIDs are assigned to more than 1 operators, but they are known to // be used by a specific operator, other operators having the same SID are // not using it currently, if that SID is in this table, we don't need to // check other tables. String projection2[] = {ArbitraryMccSidMatch.MCC}; Cursor c2 = resolver.query(ArbitraryMccSidMatch.CONTENT_URI, projection2, ArbitraryMccSidMatch.SID + "=" + sid, null, null); if (c2 != null) { int c2Counter = c2.getCount(); if (DBG) { Log.d(LOG_TAG, "Query unresolved arbitrary table, entries are " + c2Counter); } if (c2Counter == 1) { if (DBG) { Log.d(LOG_TAG, "Query Unresolved arbitrary returned the cursor " + c2 ); } c2.moveToFirst(); tmpMcc = c2.getInt(0); if (DBG) { Log.d(LOG_TAG, "MCC found in arbitrary_mcc_sid_match: " + tmpMcc); } c2.close(); return tmpMcc; } c2.close(); } // Then check if SID exists in mcc_sid_conflict table. // and use the timezone in mcc_lookup table to check which MCC matches. String projection3[] = {MccSidConflicts.MCC}; Cursor c3 = resolver.query(MccSidConflicts.CONTENT_URI, projection3, MccSidConflicts.SID_CONFLICT + "=" + sid + " and (((" + MccLookup.GMT_OFFSET_LOW + "<=" + tz + ") and (" + tz + "<=" + MccLookup.GMT_OFFSET_HIGH + ") and (" + "0=" + DSTflag + ")) or ((" + MccLookup.GMT_DST_LOW + "<=" + tz + ") and (" + tz + "<=" + MccLookup.GMT_DST_HIGH + ") and (" + "1=" + DSTflag + ")))", null, null); if (c3 != null) { int c3Counter = c3.getCount(); if (c3Counter > 0) { if (c3Counter > 1) { Log.w(LOG_TAG, "something wrong, get more results for 1 conflict SID: " + c3); } if (DBG) Log.d(LOG_TAG, "Query conflict sid returned the cursor " + c3 ); c3.moveToFirst(); tmpMcc = c3.getInt(0); if (DBG) Log.d(LOG_TAG, "MCC found in mcc_lookup_table. Return tmpMcc = " + tmpMcc); c3.close(); if (isNitzTimeZone) { return tmpMcc; } else { // time zone is not accurate, it may get wrong mcc, ignore it. if (DBG) Log.d(LOG_TAG, "time zone is not accurate, mcc may be " + tmpMcc); return 0; } } } // if there is no conflict, then check if SID is in mcc_sid_range. String projection5[] = {MccSidRange.MCC}; Cursor c5 = resolver.query(MccSidRange.CONTENT_URI, projection5, MccSidRange.RANGE_LOW + "<=" + sid + " and " + MccSidRange.RANGE_HIGH + ">=" + sid, null, null); if (c5 != null) { if (c5.getCount() > 0) { if (DBG) Log.d(LOG_TAG, "Query Range returned the cursor " + c5 ); c5.moveToFirst(); tmpMcc = c5.getInt(0); if (DBG) Log.d(LOG_TAG, "SID found in mcc_sid_range. Return tmpMcc = " + tmpMcc); c5.close(); return tmpMcc; } c5.close(); } if (DBG) Log.d(LOG_TAG, "SID NOT found in mcc_sid_range."); if (DBG) Log.d(LOG_TAG, "Exit getMccByOtherFactors. Return tmpMcc = " + tmpMcc ); // If unknown MCC still could not be resolved, return tmpMcc; } /** * Gets country information with given MCC. */ public String getIddByMcc(int mcc) { if (DBG) Log.d(LOG_TAG, "Enter getHbpcdInfoByMCC."); String idd = ""; Cursor c = null; String projection[] = {MccIdd.IDD}; Cursor cur = resolver.query(MccIdd.CONTENT_URI, projection, MccIdd.MCC + "=" + mcc, null, null); if (cur != null) { if (cur.getCount() > 0) { if (DBG) Log.d(LOG_TAG, "Query Idd returned the cursor " + cur ); // TODO: for those country having more than 1 IDDs, need more information // to decide which IDD would be used. currently just use the first 1. cur.moveToFirst(); idd = cur.getString(0); if (DBG) Log.d(LOG_TAG, "IDD = " + idd); } cur.close(); } if (c != null) c.close(); if (DBG) Log.d(LOG_TAG, "Exit getHbpcdInfoByMCC."); return idd; } }