10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.ActivityManagerNative;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.AlarmManager;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.IActivityManager;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.res.Configuration;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.wifi.WifiManager;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RemoteException;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.TelephonyManager;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Collections;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Locale;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport libcore.icu.TimeZones;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Mobile Country Code
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic final class MccTable
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville{
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final String LOG_TAG = "MccTable";
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static ArrayList<MccEntry> table;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static class MccEntry implements Comparable<MccEntry>
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    {
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int mcc;
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String iso;
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int smallestDigitsMnc;
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String language;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        MccEntry(int mnc, String iso, int smallestDigitsMCC) {
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this(mnc, iso, smallestDigitsMCC, null);
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        MccEntry(int mnc, String iso, int smallestDigitsMCC, String language) {
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.mcc = mnc;
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.iso = iso;
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.smallestDigitsMnc = smallestDigitsMCC;
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            this.language = language;
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public int compareTo(MccEntry o)
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        {
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return mcc - o.mcc;
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static MccEntry
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    entryForMcc(int mcc)
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    {
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int index;
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        MccEntry m;
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        m = new MccEntry(mcc, null, 0);
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        index = Collections.binarySearch(table, m);
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (index < 0) {
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return table.get(index);
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns a default time zone ID for the given MCC.
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param mcc Mobile Country Code
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return default TimeZone ID, or null if not specified
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static String defaultTimeZoneForMcc(int mcc) {
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        MccEntry entry;
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        entry = entryForMcc(mcc);
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (entry == null || entry.iso == null) {
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Locale locale;
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (entry.language == null) {
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                locale = new Locale(entry.iso);
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                locale = new Locale(entry.language, entry.iso);
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String[] tz = TimeZones.forLocale(locale);
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (tz.length == 0) return null;
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return tz[0];
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Given a GSM Mobile Country Code, returns
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * an ISO two-character country code if available.
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns "" if unavailable.
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static String
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    countryCodeForMcc(int mcc)
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    {
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        MccEntry entry;
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        entry = entryForMcc(mcc);
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (entry == null) {
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return "";
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return entry.iso;
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Given a GSM Mobile Country Code, returns
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * an ISO 2-3 character language code if available.
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns null if unavailable.
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static String defaultLanguageForMcc(int mcc) {
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        MccEntry entry;
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        entry = entryForMcc(mcc);
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (entry == null) {
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return entry.language;
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Given a GSM Mobile Country Code, returns
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the smallest number of digits that M if available.
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns 2 if unavailable.
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static int
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    smallestDigitsMccForMnc(int mcc)
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    {
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        MccEntry entry;
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        entry = entryForMcc(mcc);
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (entry == null) {
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 2;
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return entry.smallestDigitsMnc;
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Updates MCC and MNC device configuration information for application retrieving
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * correct version of resources.  If either MCC or MNC is 0, they will be ignored (not set).
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param context Context to act on.
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param mccmnc truncated imsi with just the MCC and MNC - MNC assumed to be from 4th to end
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static void updateMccMncConfiguration(Context context, String mccmnc) {
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!TextUtils.isEmpty(mccmnc)) {
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int mcc, mnc;
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mcc = Integer.parseInt(mccmnc.substring(0,3));
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mnc = Integer.parseInt(mccmnc.substring(3));
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (NumberFormatException e) {
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Log.e(LOG_TAG, "Error parsing IMSI");
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return;
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.d(LOG_TAG, "updateMccMncConfiguration: mcc=" + mcc + ", mnc=" + mnc);
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (mcc != 0) {
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                setTimezoneFromMccIfNeeded(context, mcc);
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                setLocaleFromMccIfNeeded(context, mcc);
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                setWifiCountryCodeFromMcc(context, mcc);
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Configuration config = ActivityManagerNative.getDefault().getConfiguration();
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (mcc != 0) {
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    config.mcc = mcc;
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (mnc != 0) {
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    config.mnc = mnc;
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ActivityManagerNative.getDefault().updateConfiguration(config);
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (RemoteException e) {
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Log.e(LOG_TAG, "Can't update configuration", e);
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Utility code to set the system locale if it's not set already
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param context Context to act on.
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param language Two character language code desired
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param country Two character country code desired
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  {@hide}
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static void setSystemLocale(Context context, String language, String country) {
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String l = SystemProperties.get("persist.sys.language");
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String c = SystemProperties.get("persist.sys.country");
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (null == language) {
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return; // no match possible
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        language = language.toLowerCase();
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (null == country) {
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            country = "";
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        country = country.toUpperCase();
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if((null == l || 0 == l.length()) && (null == c || 0 == c.length())) {
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // try to find a good match
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String[] locales = context.getAssets().getLocales();
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                final int N = locales.length;
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String bestMatch = null;
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                for(int i = 0; i < N; i++) {
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // only match full (lang + country) locales
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (locales[i]!=null && locales[i].length() >= 5 &&
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            locales[i].substring(0,2).equals(language)) {
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (locales[i].substring(3,5).equals(country)) {
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            bestMatch = locales[i];
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            break;
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        } else if (null == bestMatch) {
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            bestMatch = locales[i];
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (null != bestMatch) {
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    IActivityManager am = ActivityManagerNative.getDefault();
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    Configuration config = am.getConfiguration();
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    config.locale = new Locale(bestMatch.substring(0,2),
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                               bestMatch.substring(3,5));
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    config.userSetLocale = true;
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    am.updateConfiguration(config);
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (Exception e) {
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Intentionally left blank
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If the timezone is not already set, set it based on the MCC of the SIM.
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param context Context to act on.
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static void setTimezoneFromMccIfNeeded(Context context, int mcc) {
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String timezone = SystemProperties.get(ServiceStateTracker.TIMEZONE_PROPERTY);
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (timezone == null || timezone.length() == 0) {
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String zoneId = defaultTimeZoneForMcc(mcc);
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (zoneId != null && zoneId.length() > 0) {
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Set time zone based on MCC
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                AlarmManager alarm =
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                alarm.setTimeZone(zoneId);
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Log.d(LOG_TAG, "timezone set to "+zoneId);
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If the locale is not already set, set it based on the MCC of the SIM.
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param context Context to act on.
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static void setLocaleFromMccIfNeeded(Context context, int mcc) {
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (TelephonyManager.getLteOnCdmaModeStatic() == PhoneConstants.LTE_ON_CDMA_TRUE) {
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Avoid system locale is set from MCC table if CDMALTEPhone is used.
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // The locale will be picked up based on EFpl/EFli once CSIM records are loaded.
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String language = MccTable.defaultLanguageForMcc(mcc);
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String country = MccTable.countryCodeForMcc(mcc);
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.d(LOG_TAG, "locale set to "+language+"_"+country);
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setSystemLocale(context, language, country);
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If the number of allowed wifi channels has not been set, set it based on
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the MCC of the SIM.
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param context Context to act on.
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static void setWifiCountryCodeFromMcc(Context context, int mcc) {
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String country = MccTable.countryCodeForMcc(mcc);
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!country.isEmpty()) {
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.d(LOG_TAG, "WIFI_COUNTRY_CODE set to " + country);
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            WifiManager wM = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //persist
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            wM.setCountryCode(country, true);
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static {
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        table = new ArrayList<MccEntry>(240);
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /*
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * The table below is built from two resources:
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * 1) ITU "Mobile Network Code (MNC) for the international
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *   identification plan for mobile terminals and mobile users"
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *   which is available as an annex to the ITU operational bulletin
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *   available here: http://www.itu.int/itu-t/bulletin/annex.html
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * 2) The ISO 3166 country codes list, available here:
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *    http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/index.html
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * This table has not been verified.
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(202,"gr",2));	//Greece
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(204,"nl",2,"nl"));	//Netherlands (Kingdom of the)
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(206,"be",2));	//Belgium
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(208,"fr",2,"fr"));	//France
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(212,"mc",2));	//Monaco (Principality of)
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(213,"ad",2));	//Andorra (Principality of)
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(214,"es",2,"es"));	//Spain
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(216,"hu",2));	//Hungary (Republic of)
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(218,"ba",2));	//Bosnia and Herzegovina
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(219,"hr",2));	//Croatia (Republic of)
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(220,"rs",2));	//Serbia and Montenegro
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(222,"it",2,"it"));	//Italy
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(225,"va",2,"it"));	//Vatican City State
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(226,"ro",2));	//Romania
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(228,"ch",2,"de"));	//Switzerland (Confederation of)
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(230,"cz",2,"cs"));	//Czech Republic
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(231,"sk",2));	//Slovak Republic
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(232,"at",2,"de"));	//Austria
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(234,"gb",2,"en"));	//United Kingdom of Great Britain and Northern Ireland
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(235,"gb",2,"en"));	//United Kingdom of Great Britain and Northern Ireland
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(238,"dk",2));	//Denmark
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(240,"se",2));	//Sweden
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(242,"no",2));	//Norway
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(244,"fi",2));	//Finland
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(246,"lt",2));	//Lithuania (Republic of)
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(247,"lv",2));	//Latvia (Republic of)
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(248,"ee",2));	//Estonia (Republic of)
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(250,"ru",2));	//Russian Federation
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(255,"ua",2));	//Ukraine
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(257,"by",2));	//Belarus (Republic of)
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(259,"md",2));	//Moldova (Republic of)
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(260,"pl",2));	//Poland (Republic of)
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(262,"de",2,"de"));	//Germany (Federal Republic of)
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(266,"gi",2));	//Gibraltar
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(268,"pt",2));	//Portugal
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(270,"lu",2));	//Luxembourg
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(272,"ie",2,"en"));	//Ireland
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(274,"is",2));	//Iceland
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(276,"al",2));	//Albania (Republic of)
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(278,"mt",2));	//Malta
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(280,"cy",2));	//Cyprus (Republic of)
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(282,"ge",2));	//Georgia
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(283,"am",2));	//Armenia (Republic of)
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(284,"bg",2));	//Bulgaria (Republic of)
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(286,"tr",2));	//Turkey
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(288,"fo",2));	//Faroe Islands
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                table.add(new MccEntry(289,"ge",2));    //Abkhazia (Georgia)
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(290,"gl",2));	//Greenland (Denmark)
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(292,"sm",2));	//San Marino (Republic of)
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(293,"si",2));	//Slovenia (Republic of)
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                table.add(new MccEntry(294,"mk",2));   //The Former Yugoslav Republic of Macedonia
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(295,"li",2));	//Liechtenstein (Principality of)
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                table.add(new MccEntry(297,"me",2));    //Montenegro (Republic of)
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(302,"ca",3,""));	//Canada
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(308,"pm",2));	//Saint Pierre and Miquelon (Collectivit territoriale de la Rpublique franaise)
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(310,"us",3,"en"));	//United States of America
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(311,"us",3,"en"));	//United States of America
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(312,"us",3,"en"));	//United States of America
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(313,"us",3,"en"));	//United States of America
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(314,"us",3,"en"));	//United States of America
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(315,"us",3,"en"));	//United States of America
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(316,"us",3,"en"));	//United States of America
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(330,"pr",2));	//Puerto Rico
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(332,"vi",2));	//United States Virgin Islands
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(334,"mx",3));	//Mexico
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(338,"jm",3));	//Jamaica
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(340,"gp",2));	//Guadeloupe (French Department of)
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(342,"bb",3));	//Barbados
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(344,"ag",3));	//Antigua and Barbuda
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(346,"ky",3));	//Cayman Islands
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(348,"vg",3));	//British Virgin Islands
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(350,"bm",2));	//Bermuda
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(352,"gd",2));	//Grenada
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(354,"ms",2));	//Montserrat
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(356,"kn",2));	//Saint Kitts and Nevis
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(358,"lc",2));	//Saint Lucia
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(360,"vc",2));	//Saint Vincent and the Grenadines
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(362,"ai",2));	//Netherlands Antilles
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(363,"aw",2));	//Aruba
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(364,"bs",2));	//Bahamas (Commonwealth of the)
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(365,"ai",3));	//Anguilla
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(366,"dm",2));	//Dominica (Commonwealth of)
4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(368,"cu",2));	//Cuba
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(370,"do",2));	//Dominican Republic
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(372,"ht",2));	//Haiti (Republic of)
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(374,"tt",2));	//Trinidad and Tobago
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(376,"tc",2));	//Turks and Caicos Islands
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(400,"az",2));	//Azerbaijani Republic
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(401,"kz",2));	//Kazakhstan (Republic of)
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(402,"bt",2));	//Bhutan (Kingdom of)
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(404,"in",2));	//India (Republic of)
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(405,"in",2));	//India (Republic of)
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(410,"pk",2));	//Pakistan (Islamic Republic of)
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(412,"af",2));	//Afghanistan
4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(413,"lk",2));	//Sri Lanka (Democratic Socialist Republic of)
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(414,"mm",2));	//Myanmar (Union of)
4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(415,"lb",2));	//Lebanon
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(416,"jo",2));	//Jordan (Hashemite Kingdom of)
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(417,"sy",2));	//Syrian Arab Republic
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(418,"iq",2));	//Iraq (Republic of)
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(419,"kw",2));	//Kuwait (State of)
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(420,"sa",2));	//Saudi Arabia (Kingdom of)
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(421,"ye",2));	//Yemen (Republic of)
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(422,"om",2));	//Oman (Sultanate of)
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                table.add(new MccEntry(423,"ps",2));    //Palestine
4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(424,"ae",2));	//United Arab Emirates
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(425,"il",2));	//Israel (State of)
4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(426,"bh",2));	//Bahrain (Kingdom of)
4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(427,"qa",2));	//Qatar (State of)
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(428,"mn",2));	//Mongolia
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(429,"np",2));	//Nepal
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(430,"ae",2));	//United Arab Emirates
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(431,"ae",2));	//United Arab Emirates
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(432,"ir",2));	//Iran (Islamic Republic of)
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(434,"uz",2));	//Uzbekistan (Republic of)
4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(436,"tj",2));	//Tajikistan (Republic of)
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(437,"kg",2));	//Kyrgyz Republic
4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(438,"tm",2));	//Turkmenistan
4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(440,"jp",2,"ja"));	//Japan
4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(441,"jp",2,"ja"));	//Japan
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(450,"kr",2,"ko"));	//Korea (Republic of)
4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(452,"vn",2));	//Viet Nam (Socialist Republic of)
4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(454,"hk",2));	//"Hong Kong, China"
4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(455,"mo",2));	//"Macao, China"
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(456,"kh",2));	//Cambodia (Kingdom of)
4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(457,"la",2));	//Lao People's Democratic Republic
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(460,"cn",2,"zh"));	//China (People's Republic of)
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(461,"cn",2,"zh"));	//China (People's Republic of)
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(466,"tw",2));	//"Taiwan, China"
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(467,"kp",2));	//Democratic People's Republic of Korea
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(470,"bd",2));	//Bangladesh (People's Republic of)
4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(472,"mv",2));	//Maldives (Republic of)
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(502,"my",2));	//Malaysia
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(505,"au",2,"en"));	//Australia
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(510,"id",2));	//Indonesia (Republic of)
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(514,"tl",2));	//Democratic Republic of Timor-Leste
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(515,"ph",2));	//Philippines (Republic of the)
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(520,"th",2));	//Thailand
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(525,"sg",2,"en"));	//Singapore (Republic of)
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(528,"bn",2));	//Brunei Darussalam
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(530,"nz",2, "en"));	//New Zealand
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(534,"mp",2));	//Northern Mariana Islands (Commonwealth of the)
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(535,"gu",2));	//Guam
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(536,"nr",2));	//Nauru (Republic of)
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(537,"pg",2));	//Papua New Guinea
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(539,"to",2));	//Tonga (Kingdom of)
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(540,"sb",2));	//Solomon Islands
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(541,"vu",2));	//Vanuatu (Republic of)
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(542,"fj",2));	//Fiji (Republic of)
4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(543,"wf",2));	//Wallis and Futuna (Territoire franais d'outre-mer)
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(544,"as",2));	//American Samoa
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(545,"ki",2));	//Kiribati (Republic of)
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(546,"nc",2));	//New Caledonia (Territoire franais d'outre-mer)
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(547,"pf",2));	//French Polynesia (Territoire franais d'outre-mer)
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(548,"ck",2));	//Cook Islands
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(549,"ws",2));	//Samoa (Independent State of)
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(550,"fm",2));	//Micronesia (Federated States of)
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(551,"mh",2));	//Marshall Islands (Republic of the)
4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(552,"pw",2));	//Palau (Republic of)
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(602,"eg",2));	//Egypt (Arab Republic of)
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(603,"dz",2));	//Algeria (People's Democratic Republic of)
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(604,"ma",2));	//Morocco (Kingdom of)
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(605,"tn",2));	//Tunisia
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(606,"ly",2));	//Libya (Socialist People's Libyan Arab Jamahiriya)
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(607,"gm",2));	//Gambia (Republic of the)
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(608,"sn",2));	//Senegal (Republic of)
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(609,"mr",2));	//Mauritania (Islamic Republic of)
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(610,"ml",2));	//Mali (Republic of)
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(611,"gn",2));	//Guinea (Republic of)
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(612,"ci",2));	//Cte d'Ivoire (Republic of)
5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(613,"bf",2));	//Burkina Faso
5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(614,"ne",2));	//Niger (Republic of the)
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(615,"tg",2));	//Togolese Republic
5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(616,"bj",2));	//Benin (Republic of)
5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(617,"mu",2));	//Mauritius (Republic of)
5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(618,"lr",2));	//Liberia (Republic of)
5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(619,"sl",2));	//Sierra Leone
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(620,"gh",2));	//Ghana
5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(621,"ng",2));	//Nigeria (Federal Republic of)
5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(622,"td",2));	//Chad (Republic of)
5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(623,"cf",2));	//Central African Republic
5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(624,"cm",2));	//Cameroon (Republic of)
5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(625,"cv",2));	//Cape Verde (Republic of)
5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(626,"st",2));	//Sao Tome and Principe (Democratic Republic of)
5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(627,"gq",2));	//Equatorial Guinea (Republic of)
5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(628,"ga",2));	//Gabonese Republic
5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(629,"cg",2));	//Congo (Republic of the)
5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(630,"cg",2));	//Democratic Republic of the Congo
5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(631,"ao",2));	//Angola (Republic of)
5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(632,"gw",2));	//Guinea-Bissau (Republic of)
5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(633,"sc",2));	//Seychelles (Republic of)
5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(634,"sd",2));	//Sudan (Republic of the)
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(635,"rw",2));	//Rwanda (Republic of)
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(636,"et",2));	//Ethiopia (Federal Democratic Republic of)
5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(637,"so",2));	//Somali Democratic Republic
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(638,"dj",2));	//Djibouti (Republic of)
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(639,"ke",2));	//Kenya (Republic of)
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(640,"tz",2));	//Tanzania (United Republic of)
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(641,"ug",2));	//Uganda (Republic of)
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(642,"bi",2));	//Burundi (Republic of)
5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(643,"mz",2));	//Mozambique (Republic of)
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(645,"zm",2));	//Zambia (Republic of)
5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(646,"mg",2));	//Madagascar (Republic of)
5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(647,"re",2));	//Reunion (French Department of)
5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(648,"zw",2));	//Zimbabwe (Republic of)
5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(649,"na",2));	//Namibia (Republic of)
5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(650,"mw",2));	//Malawi
5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(651,"ls",2));	//Lesotho (Kingdom of)
5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(652,"bw",2));	//Botswana (Republic of)
5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(653,"sz",2));	//Swaziland (Kingdom of)
5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(654,"km",2));	//Comoros (Union of the)
5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(655,"za",2,"en"));	//South Africa (Republic of)
5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(657,"er",2));	//Eritrea
5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(702,"bz",2));	//Belize
5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(704,"gt",2));	//Guatemala (Republic of)
5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(706,"sv",2));	//El Salvador (Republic of)
5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(708,"hn",3));	//Honduras (Republic of)
5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(710,"ni",2));	//Nicaragua
5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(712,"cr",2));	//Costa Rica
5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(714,"pa",2));	//Panama (Republic of)
5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(716,"pe",2));	//Peru
5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(722,"ar",3));	//Argentine Republic
5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(724,"br",2));	//Brazil (Federative Republic of)
5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(730,"cl",2));	//Chile
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(732,"co",3));	//Colombia (Republic of)
5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(734,"ve",2));	//Venezuela (Bolivarian Republic of)
5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(736,"bo",2));	//Bolivia (Republic of)
5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(738,"gy",2));	//Guyana
5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(740,"ec",2));	//Ecuador
5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(742,"gf",2));	//French Guiana (French Department of)
5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(744,"py",2));	//Paraguay (Republic of)
5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(746,"sr",2));	//Suriname (Republic of)
5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(748,"uy",2));	//Uruguay (Eastern Republic of)
5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville		table.add(new MccEntry(750,"fk",2));	//Falkland Islands (Malvinas)
5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //table.add(new MccEntry(901,"",2));	//"International Mobile, shared code"
5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Collections.sort(table);
5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
573