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