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