MccTable.java revision a8467dd0c524787104b1ccdddc5e8af10ba729ed
1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.internal.telephony;
18
19import android.app.ActivityManagerNative;
20import android.app.AlarmManager;
21import android.content.Context;
22import android.content.res.Configuration;
23import android.net.wifi.WifiManager;
24import android.os.Build;
25import android.os.RemoteException;
26import android.os.SystemProperties;
27import android.telephony.TelephonyManager;
28import android.text.TextUtils;
29import android.util.Slog;
30
31import java.util.ArrayList;
32import java.util.Collections;
33import java.util.Locale;
34import libcore.icu.TimeZoneNames;
35
36/**
37 * Mobile Country Code
38 *
39 * {@hide}
40 */
41public final class MccTable
42{
43    static final String LOG_TAG = "MccTable";
44
45    static ArrayList<MccEntry> sTable;
46
47    static class MccEntry implements Comparable<MccEntry>
48    {
49        int mMcc;
50        String mIso;
51        int mSmallestDigitsMnc;
52        String mLanguage;
53
54        MccEntry(int mnc, String iso, int smallestDigitsMCC) {
55            this(mnc, iso, smallestDigitsMCC, null);
56        }
57
58        MccEntry(int mnc, String iso, int smallestDigitsMCC, String language) {
59            mMcc = mnc;
60            mIso = iso;
61            mSmallestDigitsMnc = smallestDigitsMCC;
62            mLanguage = language;
63        }
64
65
66        @Override
67        public int compareTo(MccEntry o)
68        {
69            return mMcc - o.mMcc;
70        }
71    }
72
73    private static MccEntry
74    entryForMcc(int mcc)
75    {
76        int index;
77
78        MccEntry m;
79
80        m = new MccEntry(mcc, null, 0);
81
82        index = Collections.binarySearch(sTable, m);
83
84        if (index < 0) {
85            return null;
86        } else {
87            return sTable.get(index);
88        }
89    }
90
91    /**
92     * Returns a default time zone ID for the given MCC.
93     * @param mcc Mobile Country Code
94     * @return default TimeZone ID, or null if not specified
95     */
96    public static String defaultTimeZoneForMcc(int mcc) {
97        MccEntry entry;
98
99        entry = entryForMcc(mcc);
100        if (entry == null || entry.mIso == null) {
101            return null;
102        } else {
103            Locale locale;
104            if (entry.mLanguage == null) {
105                locale = new Locale(entry.mIso);
106            } else {
107                locale = new Locale(entry.mLanguage, entry.mIso);
108            }
109            String[] tz = TimeZoneNames.forLocale(locale);
110            if (tz.length == 0) return null;
111            return tz[0];
112        }
113    }
114
115    /**
116     * Given a GSM Mobile Country Code, returns
117     * an ISO two-character country code if available.
118     * Returns "" if unavailable.
119     */
120    public static String
121    countryCodeForMcc(int mcc)
122    {
123        MccEntry entry;
124
125        entry = entryForMcc(mcc);
126
127        if (entry == null) {
128            return "";
129        } else {
130            return entry.mIso;
131        }
132    }
133
134    /**
135     * Given a GSM Mobile Country Code, returns
136     * an ISO 2-3 character language code if available.
137     * Returns null if unavailable.
138     */
139    public static String defaultLanguageForMcc(int mcc) {
140        MccEntry entry;
141
142        entry = entryForMcc(mcc);
143
144        if (entry == null) {
145            return null;
146        } else {
147            return entry.mLanguage;
148        }
149    }
150
151    /**
152     * Given a GSM Mobile Country Code, returns
153     * the smallest number of digits that M if available.
154     * Returns 2 if unavailable.
155     */
156    public static int
157    smallestDigitsMccForMnc(int mcc)
158    {
159        MccEntry entry;
160
161        entry = entryForMcc(mcc);
162
163        if (entry == null) {
164            return 2;
165        } else {
166            return entry.mSmallestDigitsMnc;
167        }
168    }
169
170    /**
171     * Updates MCC and MNC device configuration information for application retrieving
172     * correct version of resources.  If MCC is 0, MCC and MNC will be ignored (not set).
173     * @param context Context to act on.
174     * @param mccmnc truncated imsi with just the MCC and MNC - MNC assumed to be from 4th to end
175     * @param fromServiceState true if coming from the radio service state, false if from SIM
176     */
177    public static void updateMccMncConfiguration(Context context, String mccmnc,
178            boolean fromServiceState) {
179        Slog.d(LOG_TAG, "updateMccMncConfiguration mccmnc='" + mccmnc + "' fromServiceState=" + fromServiceState);
180        if (!TextUtils.isEmpty(mccmnc)) {
181            int mcc, mnc;
182
183            String defaultMccMnc = TelephonyManager.getDefault().getSimOperator();
184            Slog.d(LOG_TAG, "updateMccMncConfiguration defaultMccMnc=" + defaultMccMnc);
185            //Update mccmnc only for default subscription in case of MultiSim.
186//            if (!defaultMccMnc.equals(mccmnc)) {
187//                Slog.d(LOG_TAG, "Not a Default subscription, ignoring mccmnc config update.");
188//                return;
189//            }
190
191            try {
192                mcc = Integer.parseInt(mccmnc.substring(0,3));
193                mnc = Integer.parseInt(mccmnc.substring(3));
194            } catch (NumberFormatException e) {
195                Slog.e(LOG_TAG, "Error parsing IMSI");
196                return;
197            }
198
199            Slog.d(LOG_TAG, "updateMccMncConfiguration: mcc=" + mcc + ", mnc=" + mnc);
200
201            Locale locale = null;
202            if (mcc != 0) {
203                setTimezoneFromMccIfNeeded(context, mcc);
204                locale = getLocaleFromMcc(context, mcc);
205            }
206            if (fromServiceState) {
207                setWifiCountryCodeFromMcc(context, mcc);
208            } else {
209                // from SIM
210                try {
211                    Configuration config = new Configuration();
212                    boolean updateConfig = false;
213                    if (mcc != 0) {
214                        config.mcc = mcc;
215                        config.mnc = mnc == 0 ? Configuration.MNC_ZERO : mnc;
216                        updateConfig = true;
217                    }
218                    if (locale != null) {
219                        config.setLocale(locale);
220                        updateConfig = true;
221                    }
222                    if (updateConfig) {
223                        Slog.d(LOG_TAG, "updateMccMncConfiguration updateConfig config=" + config);
224                        ActivityManagerNative.getDefault().updateConfiguration(config);
225                    } else {
226                        Slog.d(LOG_TAG, "updateMccMncConfiguration nothing to update");
227                    }
228                } catch (RemoteException e) {
229                    Slog.e(LOG_TAG, "Can't update configuration", e);
230                }
231            }
232        } else {
233            if (fromServiceState) {
234                // an empty mccmnc means no signal - tell wifi we don't know
235                setWifiCountryCodeFromMcc(context, 0);
236            }
237        }
238    }
239
240    /**
241     * Return Locale for the language and country or null if no good match.
242     *
243     * @param context Context to act on.
244     * @param language Two character language code desired
245     * @param country Two character country code desired
246     *
247     * @return Locale or null if no appropriate value
248     *  {@hide}
249     */
250    public static Locale getLocaleForLanguageCountry(Context context, String language,
251            String country) {
252        String l = SystemProperties.get("persist.sys.language");
253        String c = SystemProperties.get("persist.sys.country");
254
255        if (null == language) {
256            Slog.d(LOG_TAG, "getLocaleForLanguageCountry: skipping no language");
257            return null; // no match possible
258        }
259        language = language.toLowerCase(Locale.ROOT);
260        if (null == country) {
261            country = "";
262        }
263        country = country.toUpperCase(Locale.ROOT);
264
265        Locale locale;
266        boolean alwaysPersist = false;
267        if (Build.IS_DEBUGGABLE) {
268            alwaysPersist = SystemProperties.getBoolean("persist.always.persist.locale", false);
269        }
270        if (alwaysPersist || ((null == l || 0 == l.length()) && (null == c || 0 == c.length()))) {
271            try {
272                // try to find a good match
273                String[] locales = context.getAssets().getLocales();
274                final int N = locales.length;
275                String bestMatch = null;
276                for(int i = 0; i < N; i++) {
277                    // only match full (lang + country) locales
278                    if (locales[i]!=null && locales[i].length() >= 5 &&
279                            locales[i].substring(0,2).equals(language)) {
280                        if (locales[i].substring(3,5).equals(country)) {
281                            bestMatch = locales[i];
282                            break;
283                        } else if (null == bestMatch) {
284                            bestMatch = locales[i];
285                        }
286                    }
287                }
288                if (null != bestMatch) {
289                    locale = new Locale(bestMatch.substring(0,2),
290                                               bestMatch.substring(3,5));
291                    Slog.d(LOG_TAG, "getLocaleForLanguageCountry: got match");
292                } else {
293                    locale = null;
294                    Slog.d(LOG_TAG, "getLocaleForLanguageCountry: skip no match");
295                }
296            } catch (Exception e) {
297                locale = null;
298                Slog.d(LOG_TAG, "getLocaleForLanguageCountry: exception", e);
299            }
300        } else {
301            locale = null;
302            Slog.d(LOG_TAG, "getLocaleForLanguageCountry: skipping already persisted");
303        }
304        Slog.d(LOG_TAG, "getLocaleForLanguageCountry: X locale=" + locale);
305        return locale;
306    }
307
308    /**
309     * Utility code to set the system locale if it's not set already
310     * @param context Context to act on.
311     * @param language Two character language code desired
312     * @param country Two character country code desired
313     *
314     *  {@hide}
315     */
316    public static void setSystemLocale(Context context, String language, String country) {
317        Locale locale = getLocaleForLanguageCountry(context, language, country);
318        if (locale != null) {
319            Configuration config = new Configuration();
320            config.setLocale(locale);
321            Slog.d(LOG_TAG, "setSystemLocale: updateLocale config=" + config);
322            try {
323                ActivityManagerNative.getDefault().updateConfiguration(config);
324            } catch (RemoteException e) {
325                Slog.d(LOG_TAG, "setSystemLocale exception", e);
326            }
327        } else {
328            Slog.d(LOG_TAG, "setSystemLocale: no locale");
329        }
330    }
331
332    /**
333     * If the timezone is not already set, set it based on the MCC of the SIM.
334     * @param context Context to act on.
335     * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
336     */
337    private static void setTimezoneFromMccIfNeeded(Context context, int mcc) {
338        String timezone = SystemProperties.get(ServiceStateTracker.TIMEZONE_PROPERTY);
339        if (timezone == null || timezone.length() == 0) {
340            String zoneId = defaultTimeZoneForMcc(mcc);
341            if (zoneId != null && zoneId.length() > 0) {
342                // Set time zone based on MCC
343                AlarmManager alarm =
344                        (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
345                alarm.setTimeZone(zoneId);
346                Slog.d(LOG_TAG, "timezone set to "+zoneId);
347            }
348        }
349    }
350
351    /**
352     * Get Locale based on the MCC of the SIM.
353     * @param context Context to act on.
354     * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
355     *
356     * @return locale for the mcc or null if none
357     */
358    private static Locale getLocaleFromMcc(Context context, int mcc) {
359        String language = MccTable.defaultLanguageForMcc(mcc);
360        String country = MccTable.countryCodeForMcc(mcc);
361
362        Slog.d(LOG_TAG, "getLocaleFromMcc to " + language + "_" + country + " mcc=" + mcc);
363        return getLocaleForLanguageCountry(context, language, country);
364    }
365
366    /**
367     * Set the country code for wifi.  This sets allowed wifi channels based on the
368     * country of the carrier we see.  If we can't see any, reset to 0 so we don't
369     * broadcast on forbidden channels.
370     * @param context Context to act on.
371     * @param mcc Mobile Country Code of the operator.  0 if not known
372     */
373    private static void setWifiCountryCodeFromMcc(Context context, int mcc) {
374        String country = MccTable.countryCodeForMcc(mcc);
375        Slog.d(LOG_TAG, "WIFI_COUNTRY_CODE set to " + country);
376        WifiManager wM = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
377        //persist
378        wM.setCountryCode(country, true);
379    }
380
381    static {
382        sTable = new ArrayList<MccEntry>(240);
383
384
385        /*
386         * The table below is built from two resources:
387         *
388         * 1) ITU "Mobile Network Code (MNC) for the international
389         *   identification plan for mobile terminals and mobile users"
390         *   which is available as an annex to the ITU operational bulletin
391         *   available here: http://www.itu.int/itu-t/bulletin/annex.html
392         *
393         * 2) The ISO 3166 country codes list, available here:
394         *    http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/index.html
395         *
396         * This table has not been verified.
397         *
398         */
399
400		sTable.add(new MccEntry(202,"gr",2));	//Greece
401		sTable.add(new MccEntry(204,"nl",2,"nl"));	//Netherlands (Kingdom of the)
402		sTable.add(new MccEntry(206,"be",2));	//Belgium
403		sTable.add(new MccEntry(208,"fr",2,"fr"));	//France
404		sTable.add(new MccEntry(212,"mc",2));	//Monaco (Principality of)
405		sTable.add(new MccEntry(213,"ad",2));	//Andorra (Principality of)
406		sTable.add(new MccEntry(214,"es",2,"es"));	//Spain
407		sTable.add(new MccEntry(216,"hu",2));	//Hungary (Republic of)
408		sTable.add(new MccEntry(218,"ba",2));	//Bosnia and Herzegovina
409		sTable.add(new MccEntry(219,"hr",2));	//Croatia (Republic of)
410		sTable.add(new MccEntry(220,"rs",2));	//Serbia and Montenegro
411		sTable.add(new MccEntry(222,"it",2,"it"));	//Italy
412		sTable.add(new MccEntry(225,"va",2,"it"));	//Vatican City State
413		sTable.add(new MccEntry(226,"ro",2));	//Romania
414		sTable.add(new MccEntry(228,"ch",2,"de"));	//Switzerland (Confederation of)
415		sTable.add(new MccEntry(230,"cz",2,"cs"));	//Czech Republic
416		sTable.add(new MccEntry(231,"sk",2));	//Slovak Republic
417		sTable.add(new MccEntry(232,"at",2,"de"));	//Austria
418		sTable.add(new MccEntry(234,"gb",2,"en"));	//United Kingdom of Great Britain and Northern Ireland
419		sTable.add(new MccEntry(235,"gb",2,"en"));	//United Kingdom of Great Britain and Northern Ireland
420		sTable.add(new MccEntry(238,"dk",2));	//Denmark
421		sTable.add(new MccEntry(240,"se",2,"sv"));	//Sweden
422		sTable.add(new MccEntry(242,"no",2));	//Norway
423		sTable.add(new MccEntry(244,"fi",2));	//Finland
424		sTable.add(new MccEntry(246,"lt",2));	//Lithuania (Republic of)
425		sTable.add(new MccEntry(247,"lv",2));	//Latvia (Republic of)
426		sTable.add(new MccEntry(248,"ee",2));	//Estonia (Republic of)
427		sTable.add(new MccEntry(250,"ru",2));	//Russian Federation
428		sTable.add(new MccEntry(255,"ua",2));	//Ukraine
429		sTable.add(new MccEntry(257,"by",2));	//Belarus (Republic of)
430		sTable.add(new MccEntry(259,"md",2));	//Moldova (Republic of)
431		sTable.add(new MccEntry(260,"pl",2));	//Poland (Republic of)
432		sTable.add(new MccEntry(262,"de",2,"de"));	//Germany (Federal Republic of)
433		sTable.add(new MccEntry(266,"gi",2));	//Gibraltar
434		sTable.add(new MccEntry(268,"pt",2));	//Portugal
435		sTable.add(new MccEntry(270,"lu",2));	//Luxembourg
436		sTable.add(new MccEntry(272,"ie",2,"en"));	//Ireland
437		sTable.add(new MccEntry(274,"is",2));	//Iceland
438		sTable.add(new MccEntry(276,"al",2));	//Albania (Republic of)
439		sTable.add(new MccEntry(278,"mt",2));	//Malta
440		sTable.add(new MccEntry(280,"cy",2));	//Cyprus (Republic of)
441		sTable.add(new MccEntry(282,"ge",2));	//Georgia
442		sTable.add(new MccEntry(283,"am",2));	//Armenia (Republic of)
443		sTable.add(new MccEntry(284,"bg",2));	//Bulgaria (Republic of)
444		sTable.add(new MccEntry(286,"tr",2));	//Turkey
445		sTable.add(new MccEntry(288,"fo",2));	//Faroe Islands
446                sTable.add(new MccEntry(289,"ge",2));    //Abkhazia (Georgia)
447		sTable.add(new MccEntry(290,"gl",2));	//Greenland (Denmark)
448		sTable.add(new MccEntry(292,"sm",2));	//San Marino (Republic of)
449		sTable.add(new MccEntry(293,"si",2));	//Slovenia (Republic of)
450                sTable.add(new MccEntry(294,"mk",2));   //The Former Yugoslav Republic of Macedonia
451		sTable.add(new MccEntry(295,"li",2));	//Liechtenstein (Principality of)
452                sTable.add(new MccEntry(297,"me",2));    //Montenegro (Republic of)
453		sTable.add(new MccEntry(302,"ca",3,"en"));	//Canada
454		sTable.add(new MccEntry(308,"pm",2));	//Saint Pierre and Miquelon (Collectivit territoriale de la Rpublique franaise)
455		sTable.add(new MccEntry(310,"us",3,"en"));	//United States of America
456		sTable.add(new MccEntry(311,"us",3,"en"));	//United States of America
457		sTable.add(new MccEntry(312,"us",3,"en"));	//United States of America
458		sTable.add(new MccEntry(313,"us",3,"en"));	//United States of America
459		sTable.add(new MccEntry(314,"us",3,"en"));	//United States of America
460		sTable.add(new MccEntry(315,"us",3,"en"));	//United States of America
461		sTable.add(new MccEntry(316,"us",3,"en"));	//United States of America
462		sTable.add(new MccEntry(330,"pr",2));	//Puerto Rico
463		sTable.add(new MccEntry(332,"vi",2));	//United States Virgin Islands
464		sTable.add(new MccEntry(334,"mx",3));	//Mexico
465		sTable.add(new MccEntry(338,"jm",3));	//Jamaica
466		sTable.add(new MccEntry(340,"gp",2));	//Guadeloupe (French Department of)
467		sTable.add(new MccEntry(342,"bb",3));	//Barbados
468		sTable.add(new MccEntry(344,"ag",3));	//Antigua and Barbuda
469		sTable.add(new MccEntry(346,"ky",3));	//Cayman Islands
470		sTable.add(new MccEntry(348,"vg",3));	//British Virgin Islands
471		sTable.add(new MccEntry(350,"bm",2));	//Bermuda
472		sTable.add(new MccEntry(352,"gd",2));	//Grenada
473		sTable.add(new MccEntry(354,"ms",2));	//Montserrat
474		sTable.add(new MccEntry(356,"kn",2));	//Saint Kitts and Nevis
475		sTable.add(new MccEntry(358,"lc",2));	//Saint Lucia
476		sTable.add(new MccEntry(360,"vc",2));	//Saint Vincent and the Grenadines
477		sTable.add(new MccEntry(362,"ai",2));	//Netherlands Antilles
478		sTable.add(new MccEntry(363,"aw",2));	//Aruba
479		sTable.add(new MccEntry(364,"bs",2));	//Bahamas (Commonwealth of the)
480		sTable.add(new MccEntry(365,"ai",3));	//Anguilla
481		sTable.add(new MccEntry(366,"dm",2));	//Dominica (Commonwealth of)
482		sTable.add(new MccEntry(368,"cu",2));	//Cuba
483		sTable.add(new MccEntry(370,"do",2));	//Dominican Republic
484		sTable.add(new MccEntry(372,"ht",2));	//Haiti (Republic of)
485		sTable.add(new MccEntry(374,"tt",2));	//Trinidad and Tobago
486		sTable.add(new MccEntry(376,"tc",2));	//Turks and Caicos Islands
487		sTable.add(new MccEntry(400,"az",2));	//Azerbaijani Republic
488		sTable.add(new MccEntry(401,"kz",2));	//Kazakhstan (Republic of)
489		sTable.add(new MccEntry(402,"bt",2));	//Bhutan (Kingdom of)
490		sTable.add(new MccEntry(404,"in",2));	//India (Republic of)
491		sTable.add(new MccEntry(405,"in",2));	//India (Republic of)
492		sTable.add(new MccEntry(410,"pk",2));	//Pakistan (Islamic Republic of)
493		sTable.add(new MccEntry(412,"af",2));	//Afghanistan
494		sTable.add(new MccEntry(413,"lk",2));	//Sri Lanka (Democratic Socialist Republic of)
495		sTable.add(new MccEntry(414,"mm",2));	//Myanmar (Union of)
496		sTable.add(new MccEntry(415,"lb",2));	//Lebanon
497		sTable.add(new MccEntry(416,"jo",2));	//Jordan (Hashemite Kingdom of)
498		sTable.add(new MccEntry(417,"sy",2));	//Syrian Arab Republic
499		sTable.add(new MccEntry(418,"iq",2));	//Iraq (Republic of)
500		sTable.add(new MccEntry(419,"kw",2));	//Kuwait (State of)
501		sTable.add(new MccEntry(420,"sa",2));	//Saudi Arabia (Kingdom of)
502		sTable.add(new MccEntry(421,"ye",2));	//Yemen (Republic of)
503		sTable.add(new MccEntry(422,"om",2));	//Oman (Sultanate of)
504                sTable.add(new MccEntry(423,"ps",2));    //Palestine
505		sTable.add(new MccEntry(424,"ae",2));	//United Arab Emirates
506		sTable.add(new MccEntry(425,"il",2));	//Israel (State of)
507		sTable.add(new MccEntry(426,"bh",2));	//Bahrain (Kingdom of)
508		sTable.add(new MccEntry(427,"qa",2));	//Qatar (State of)
509		sTable.add(new MccEntry(428,"mn",2));	//Mongolia
510		sTable.add(new MccEntry(429,"np",2));	//Nepal
511		sTable.add(new MccEntry(430,"ae",2));	//United Arab Emirates
512		sTable.add(new MccEntry(431,"ae",2));	//United Arab Emirates
513		sTable.add(new MccEntry(432,"ir",2));	//Iran (Islamic Republic of)
514		sTable.add(new MccEntry(434,"uz",2));	//Uzbekistan (Republic of)
515		sTable.add(new MccEntry(436,"tj",2));	//Tajikistan (Republic of)
516		sTable.add(new MccEntry(437,"kg",2));	//Kyrgyz Republic
517		sTable.add(new MccEntry(438,"tm",2));	//Turkmenistan
518		sTable.add(new MccEntry(440,"jp",2,"ja"));	//Japan
519		sTable.add(new MccEntry(441,"jp",2,"ja"));	//Japan
520		sTable.add(new MccEntry(450,"kr",2,"ko"));	//Korea (Republic of)
521		sTable.add(new MccEntry(452,"vn",2));	//Viet Nam (Socialist Republic of)
522		sTable.add(new MccEntry(454,"hk",2));	//"Hong Kong, China"
523		sTable.add(new MccEntry(455,"mo",2));	//"Macao, China"
524		sTable.add(new MccEntry(456,"kh",2));	//Cambodia (Kingdom of)
525		sTable.add(new MccEntry(457,"la",2));	//Lao People's Democratic Republic
526		sTable.add(new MccEntry(460,"cn",2,"zh"));	//China (People's Republic of)
527		sTable.add(new MccEntry(461,"cn",2,"zh"));	//China (People's Republic of)
528		sTable.add(new MccEntry(466,"tw",2));	//"Taiwan, China"
529		sTable.add(new MccEntry(467,"kp",2));	//Democratic People's Republic of Korea
530		sTable.add(new MccEntry(470,"bd",2));	//Bangladesh (People's Republic of)
531		sTable.add(new MccEntry(472,"mv",2));	//Maldives (Republic of)
532		sTable.add(new MccEntry(502,"my",2));	//Malaysia
533		sTable.add(new MccEntry(505,"au",2,"en"));	//Australia
534		sTable.add(new MccEntry(510,"id",2));	//Indonesia (Republic of)
535		sTable.add(new MccEntry(514,"tl",2));	//Democratic Republic of Timor-Leste
536		sTable.add(new MccEntry(515,"ph",2));	//Philippines (Republic of the)
537		sTable.add(new MccEntry(520,"th",2));	//Thailand
538		sTable.add(new MccEntry(525,"sg",2,"en"));	//Singapore (Republic of)
539		sTable.add(new MccEntry(528,"bn",2));	//Brunei Darussalam
540		sTable.add(new MccEntry(530,"nz",2, "en"));	//New Zealand
541		sTable.add(new MccEntry(534,"mp",2));	//Northern Mariana Islands (Commonwealth of the)
542		sTable.add(new MccEntry(535,"gu",2));	//Guam
543		sTable.add(new MccEntry(536,"nr",2));	//Nauru (Republic of)
544		sTable.add(new MccEntry(537,"pg",2));	//Papua New Guinea
545		sTable.add(new MccEntry(539,"to",2));	//Tonga (Kingdom of)
546		sTable.add(new MccEntry(540,"sb",2));	//Solomon Islands
547		sTable.add(new MccEntry(541,"vu",2));	//Vanuatu (Republic of)
548		sTable.add(new MccEntry(542,"fj",2));	//Fiji (Republic of)
549		sTable.add(new MccEntry(543,"wf",2));	//Wallis and Futuna (Territoire franais d'outre-mer)
550		sTable.add(new MccEntry(544,"as",2));	//American Samoa
551		sTable.add(new MccEntry(545,"ki",2));	//Kiribati (Republic of)
552		sTable.add(new MccEntry(546,"nc",2));	//New Caledonia (Territoire franais d'outre-mer)
553		sTable.add(new MccEntry(547,"pf",2));	//French Polynesia (Territoire franais d'outre-mer)
554		sTable.add(new MccEntry(548,"ck",2));	//Cook Islands
555		sTable.add(new MccEntry(549,"ws",2));	//Samoa (Independent State of)
556		sTable.add(new MccEntry(550,"fm",2));	//Micronesia (Federated States of)
557		sTable.add(new MccEntry(551,"mh",2));	//Marshall Islands (Republic of the)
558		sTable.add(new MccEntry(552,"pw",2));	//Palau (Republic of)
559		sTable.add(new MccEntry(602,"eg",2));	//Egypt (Arab Republic of)
560		sTable.add(new MccEntry(603,"dz",2));	//Algeria (People's Democratic Republic of)
561		sTable.add(new MccEntry(604,"ma",2));	//Morocco (Kingdom of)
562		sTable.add(new MccEntry(605,"tn",2));	//Tunisia
563		sTable.add(new MccEntry(606,"ly",2));	//Libya (Socialist People's Libyan Arab Jamahiriya)
564		sTable.add(new MccEntry(607,"gm",2));	//Gambia (Republic of the)
565		sTable.add(new MccEntry(608,"sn",2));	//Senegal (Republic of)
566		sTable.add(new MccEntry(609,"mr",2));	//Mauritania (Islamic Republic of)
567		sTable.add(new MccEntry(610,"ml",2));	//Mali (Republic of)
568		sTable.add(new MccEntry(611,"gn",2));	//Guinea (Republic of)
569		sTable.add(new MccEntry(612,"ci",2));	//Cte d'Ivoire (Republic of)
570		sTable.add(new MccEntry(613,"bf",2));	//Burkina Faso
571		sTable.add(new MccEntry(614,"ne",2));	//Niger (Republic of the)
572		sTable.add(new MccEntry(615,"tg",2));	//Togolese Republic
573		sTable.add(new MccEntry(616,"bj",2));	//Benin (Republic of)
574		sTable.add(new MccEntry(617,"mu",2));	//Mauritius (Republic of)
575		sTable.add(new MccEntry(618,"lr",2));	//Liberia (Republic of)
576		sTable.add(new MccEntry(619,"sl",2));	//Sierra Leone
577		sTable.add(new MccEntry(620,"gh",2));	//Ghana
578		sTable.add(new MccEntry(621,"ng",2));	//Nigeria (Federal Republic of)
579		sTable.add(new MccEntry(622,"td",2));	//Chad (Republic of)
580		sTable.add(new MccEntry(623,"cf",2));	//Central African Republic
581		sTable.add(new MccEntry(624,"cm",2));	//Cameroon (Republic of)
582		sTable.add(new MccEntry(625,"cv",2));	//Cape Verde (Republic of)
583		sTable.add(new MccEntry(626,"st",2));	//Sao Tome and Principe (Democratic Republic of)
584		sTable.add(new MccEntry(627,"gq",2));	//Equatorial Guinea (Republic of)
585		sTable.add(new MccEntry(628,"ga",2));	//Gabonese Republic
586		sTable.add(new MccEntry(629,"cg",2));	//Congo (Republic of the)
587		sTable.add(new MccEntry(630,"cg",2));	//Democratic Republic of the Congo
588		sTable.add(new MccEntry(631,"ao",2));	//Angola (Republic of)
589		sTable.add(new MccEntry(632,"gw",2));	//Guinea-Bissau (Republic of)
590		sTable.add(new MccEntry(633,"sc",2));	//Seychelles (Republic of)
591		sTable.add(new MccEntry(634,"sd",2));	//Sudan (Republic of the)
592		sTable.add(new MccEntry(635,"rw",2));	//Rwanda (Republic of)
593		sTable.add(new MccEntry(636,"et",2));	//Ethiopia (Federal Democratic Republic of)
594		sTable.add(new MccEntry(637,"so",2));	//Somali Democratic Republic
595		sTable.add(new MccEntry(638,"dj",2));	//Djibouti (Republic of)
596		sTable.add(new MccEntry(639,"ke",2));	//Kenya (Republic of)
597		sTable.add(new MccEntry(640,"tz",2));	//Tanzania (United Republic of)
598		sTable.add(new MccEntry(641,"ug",2));	//Uganda (Republic of)
599		sTable.add(new MccEntry(642,"bi",2));	//Burundi (Republic of)
600		sTable.add(new MccEntry(643,"mz",2));	//Mozambique (Republic of)
601		sTable.add(new MccEntry(645,"zm",2));	//Zambia (Republic of)
602		sTable.add(new MccEntry(646,"mg",2));	//Madagascar (Republic of)
603		sTable.add(new MccEntry(647,"re",2));	//Reunion (French Department of)
604		sTable.add(new MccEntry(648,"zw",2));	//Zimbabwe (Republic of)
605		sTable.add(new MccEntry(649,"na",2));	//Namibia (Republic of)
606		sTable.add(new MccEntry(650,"mw",2));	//Malawi
607		sTable.add(new MccEntry(651,"ls",2));	//Lesotho (Kingdom of)
608		sTable.add(new MccEntry(652,"bw",2));	//Botswana (Republic of)
609		sTable.add(new MccEntry(653,"sz",2));	//Swaziland (Kingdom of)
610		sTable.add(new MccEntry(654,"km",2));	//Comoros (Union of the)
611		sTable.add(new MccEntry(655,"za",2,"en"));	//South Africa (Republic of)
612		sTable.add(new MccEntry(657,"er",2));	//Eritrea
613		sTable.add(new MccEntry(702,"bz",2));	//Belize
614		sTable.add(new MccEntry(704,"gt",2));	//Guatemala (Republic of)
615		sTable.add(new MccEntry(706,"sv",2));	//El Salvador (Republic of)
616		sTable.add(new MccEntry(708,"hn",3));	//Honduras (Republic of)
617		sTable.add(new MccEntry(710,"ni",2));	//Nicaragua
618		sTable.add(new MccEntry(712,"cr",2));	//Costa Rica
619		sTable.add(new MccEntry(714,"pa",2));	//Panama (Republic of)
620		sTable.add(new MccEntry(716,"pe",2));	//Peru
621		sTable.add(new MccEntry(722,"ar",3));	//Argentine Republic
622		sTable.add(new MccEntry(724,"br",2));	//Brazil (Federative Republic of)
623		sTable.add(new MccEntry(730,"cl",2));	//Chile
624		sTable.add(new MccEntry(732,"co",3));	//Colombia (Republic of)
625		sTable.add(new MccEntry(734,"ve",2));	//Venezuela (Bolivarian Republic of)
626		sTable.add(new MccEntry(736,"bo",2));	//Bolivia (Republic of)
627		sTable.add(new MccEntry(738,"gy",2));	//Guyana
628		sTable.add(new MccEntry(740,"ec",2));	//Ecuador
629		sTable.add(new MccEntry(742,"gf",2));	//French Guiana (French Department of)
630		sTable.add(new MccEntry(744,"py",2));	//Paraguay (Republic of)
631		sTable.add(new MccEntry(746,"sr",2));	//Suriname (Republic of)
632		sTable.add(new MccEntry(748,"uy",2));	//Uruguay (Eastern Republic of)
633		sTable.add(new MccEntry(750,"fk",2));	//Falkland Islands (Malvinas)
634        //table.add(new MccEntry(901,"",2));	//"International Mobile, shared code"
635
636        Collections.sort(sTable);
637    }
638}
639