From 7f51f9fd5b3774fd2ef48757a2957a6e20cd8ae8 Mon Sep 17 00:00:00 2001 From: Jake McGinty Date: Thu, 14 Aug 2014 17:23:03 -0700 Subject: [PATCH] apntool and ApnDatabase // FREEBIE --- apntool/.gitignore | 2 + apntool/apns.xml | 2218 +++++++++++++++++ apntool/apntool.py | 76 + apntool/requirements.txt | 3 + assets/databases/apns.db | Bin 0 -> 327680 bytes .../securesms/database/ApnDatabase.java | 124 + .../securesms/mms/ApnDefaults.java | 519 ---- .../securesms/mms/MmsCommunication.java | 29 +- .../securesms/util/TelephonyUtil.java | 36 + 9 files changed, 2482 insertions(+), 525 deletions(-) create mode 100644 apntool/.gitignore create mode 100644 apntool/apns.xml create mode 100644 apntool/apntool.py create mode 100644 apntool/requirements.txt create mode 100644 assets/databases/apns.db create mode 100644 src/org/thoughtcrime/securesms/database/ApnDatabase.java delete mode 100644 src/org/thoughtcrime/securesms/mms/ApnDefaults.java create mode 100644 src/org/thoughtcrime/securesms/util/TelephonyUtil.java diff --git a/apntool/.gitignore b/apntool/.gitignore new file mode 100644 index 000000000..b174b7586 --- /dev/null +++ b/apntool/.gitignore @@ -0,0 +1,2 @@ +*.db +*.db.gz diff --git a/apntool/apns.xml b/apntool/apns.xml new file mode 100644 index 000000000..216acb10a --- /dev/null +++ b/apntool/apns.xml @@ -0,0 +1,2218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apntool/apntool.py b/apntool/apntool.py new file mode 100644 index 000000000..9116a3991 --- /dev/null +++ b/apntool/apntool.py @@ -0,0 +1,76 @@ +import sys +import argparse +import sqlite3 +import gzip +from progressbar import ProgressBar, Counter, Timer +from lxml import etree + +parser = argparse.ArgumentParser(prog='apntool', description="""Process Android's apn xml files and drop them into an easily + queryable SQLite db. Tested up to version 9 of their APN file.""") +parser.add_argument('-v', '--version', action='version', version='%(prog)s v1.0') +parser.add_argument('-i', '--input', help='the xml file to parse', default='apns.xml', required=False) +parser.add_argument('-o', '--output', help='the sqlite db output file', default='apns.db', required=False) +parser.add_argument('--quiet', help='do not show progress or verbose instructions', action='store_true', required=False) +parser.add_argument('--no-gzip', help="do not gzip after creation", action='store_true', required=False) +args = parser.parse_args() + +try: + connection = sqlite3.connect(args.output) + cursor = connection.cursor() + cursor.execute('SELECT SQLITE_VERSION()') + version = cursor.fetchone() + if not args.quiet: + print("SQLite version: %s" % version) + print("Opening %s" % args.input) + + cursor.execute("PRAGMA legacy_file_format=ON") + cursor.execute("PRAGMA journal_mode=DELETE") + cursor.execute("PRAGMA page_size=32768") + cursor.execute("VACUUM") + cursor.execute("DROP TABLE IF EXISTS apns") + cursor.execute("""CREATE TABLE apns(_id INTEGER PRIMARY KEY, mccmnc TEXT, mcc TEXT, mnc TEXT, carrier TEXT, apn TEXT, + mmsc TEXT, port INTEGER, type TEXT, protocol TEXT, bearer TEXT, roaming_protocol TEXT, + carrier_enabled INTEGER, mmsproxy TEXT, mmsport INTEGER, proxy TEXT, mvno_match_data TEXT, + mvno_type TEXT, authtype INTEGER, user TEXT, password TEXT, server TEXT)""") + + apns = etree.parse(args.input) + root = apns.getroot() + pbar = ProgressBar(widgets=['Processed: ', Counter(), ' apns (', Timer(), ')'], maxval=len(list(root))).start() if not args.quiet else None + + count = 0 + for apn in root.iter("apn"): + sqlvars = ["?" for x in apn.attrib.keys()] + ["?"] + values = [apn.get(attrib) for attrib in apn.attrib.keys()] + ["%s%s" % (apn.get("mcc"), apn.get("mnc"))] + keys = apn.attrib.keys() + ["mccmnc"] + + statement = "INSERT INTO apns (%s) VALUES (%s)" % (", ".join(keys), ", ".join(sqlvars)) + cursor.execute(statement, values) + + count += 1 + if not args.quiet: + pbar.update(count) + + if not args.quiet: + pbar.finish() + connection.commit() + print("Successfully written to %s" % args.output) + + if not args.no_gzip: + gzipped_file = "%s.gz" % (args.output,) + with open(args.output, 'rb') as orig: + with gzip.open(gzipped_file, 'wb') as gzipped: + gzipped.writelines(orig) + print("Successfully gzipped to %s" % gzipped_file) + + if not args.quiet: + print("\nTo include this in the distribution, copy it to the project's assets/databases/ directory.") + print("If you support API 10 or lower, you must use the gzipped version to avoid corruption.") + +except sqlite3.Error, e: + if connection: + connection.rollback() + print("Error: %s" % e.args[0]) + sys.exit(1) +finally: + if connection: + connection.close() diff --git a/apntool/requirements.txt b/apntool/requirements.txt new file mode 100644 index 000000000..4f7aa2836 --- /dev/null +++ b/apntool/requirements.txt @@ -0,0 +1,3 @@ +argparse>=1.2.1 +lxml>=3.3.3 +progressbar-latest>=2.4 diff --git a/assets/databases/apns.db b/assets/databases/apns.db new file mode 100644 index 0000000000000000000000000000000000000000..52d499ebbec4a1ebcd87229e44281db0a3949395 GIT binary patch literal 327680 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. + */ +package org.thoughtcrime.securesms.database; + +import android.content.Context; +import android.content.res.AssetManager; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import org.thoughtcrime.securesms.mms.MmsCommunication; +import org.thoughtcrime.securesms.mms.MmsCommunication.MmsConnectionParameters; +import org.whispersystems.textsecure.util.Util; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.security.InvalidParameterException; + +/** + * Database to query APN and MMSC information + */ +public class ApnDatabase { + private static final String TAG = ApnDatabase.class.getSimpleName(); + private final SQLiteDatabase db; + + private static final String DATABASE_NAME = "apns.db"; + private static final String ASSET_PATH = "databases" + File.separator + DATABASE_NAME; + + private static final String TABLE_NAME = "apns"; + private static final String ID_COLUMN = "_id"; + private static final String MCC_MNC_COLUMN = "mccmnc"; + private static final String MCC_COLUMN = "mcc"; + private static final String MNC_COLUMN = "mnc"; + private static final String CARRIER_COLUMN = "carrier"; + private static final String APN_COLUMN = "apn"; + private static final String MMSC_COLUMN = "mmsc"; + private static final String PORT_COLUMN = "port"; + private static final String TYPE_COLUMN = "type"; + private static final String PROTOCOL_COLUMN = "protocol"; + private static final String BEARER_COLUMN = "bearer"; + private static final String ROAMING_PROTOCOL_COLUMN = "roaming_protocol"; + private static final String CARRIER_ENABLED_COLUMN = "carrier_enabled"; + private static final String MMS_PROXY_COLUMN = "mmsproxy"; + private static final String MMS_PORT_COLUMN = "mmsport"; + private static final String PROXY_COLUMN = "proxy"; + private static final String MVNO_MATCH_DATA_COLUMN = "mvno_match_data"; + private static final String MVNO_TYPE_COLUMN = "mvno"; + private static final String AUTH_TYPE_COLUMN = "authtype"; + private static final String USER_COLUMN = "user"; + private static final String PASSWORD_COLUMN = "password"; + private static final String SERVER_COLUMN = "server"; + + private static final String BASE_SELECTION = MCC_MNC_COLUMN + " = ?"; + + private static ApnDatabase instance = null; + + public synchronized static ApnDatabase getInstance(Context context) throws IOException { + if (instance == null) instance = new ApnDatabase(context); + return instance; + } + + private ApnDatabase(final Context context) throws IOException { + File dbFile = context.getDatabasePath(DATABASE_NAME); + if (!dbFile.getParentFile().exists() && !dbFile.getParentFile().mkdir()) { + throw new IOException("couldn't make databases directory"); + } + + Util.copy(context.getAssets().open(ASSET_PATH, AssetManager.ACCESS_STREAMING), + new FileOutputStream(dbFile)); + + db = SQLiteDatabase.openDatabase(context.getDatabasePath(DATABASE_NAME).getPath(), + null, SQLiteDatabase.OPEN_READONLY); + } + + public MmsCommunication.MmsConnectionParameters getMmsConnectionParameters(final String mccmnc, final String apn) { + + if (mccmnc == null) throw new InvalidParameterException("mccmnc must not be null"); + + Cursor cursor = null; + + if (apn != null) { + Log.w(TAG, "Querying table for MCC+MNC " + mccmnc + " and APN name " + apn); + cursor = db.query(TABLE_NAME, null, + BASE_SELECTION + " AND " + APN_COLUMN + " = ?", + new String[]{ mccmnc, apn }, + null, null, null); + } + + if (cursor == null || !cursor.moveToFirst()) { + Log.w(TAG, "Querying table for MCC+MNC " + mccmnc + " without APN name"); + cursor = db.query(TABLE_NAME, null, + BASE_SELECTION, + new String[]{ mccmnc }, + null, null, null); + } + + if (cursor != null && cursor.moveToFirst()) { + MmsConnectionParameters params = new MmsConnectionParameters(cursor.getString(cursor.getColumnIndexOrThrow(MMSC_COLUMN)), + cursor.getString(cursor.getColumnIndexOrThrow(MMS_PROXY_COLUMN)), + cursor.getString(cursor.getColumnIndexOrThrow(MMS_PORT_COLUMN))); + Log.w(TAG, "returning preferred APN " + params.get().get(0)); + return params; + } + + Log.w(TAG, "No matching APNs found, returning null"); + return null; + } +} diff --git a/src/org/thoughtcrime/securesms/mms/ApnDefaults.java b/src/org/thoughtcrime/securesms/mms/ApnDefaults.java deleted file mode 100644 index 1f49c8bbc..000000000 --- a/src/org/thoughtcrime/securesms/mms/ApnDefaults.java +++ /dev/null @@ -1,519 +0,0 @@ -package org.thoughtcrime.securesms.mms; - -import android.content.Context; -import android.telephony.TelephonyManager; - -import java.util.HashMap; -import java.util.Map; - -import static org.thoughtcrime.securesms.mms.MmsCommunication.MmsConnectionParameters; - -/** - * This class provides an in-app source for APN MMSC info for use as a fallback in - * the event that the system APN DB is unavailable and the user has not provided - * local MMSC configuration details of their own. - */ -public class ApnDefaults { - - private static final Map paramMap = - new HashMap(){{ - - //T-Mobile USA - Tested: Works - put("310260", new MmsConnectionParameters("http://mms.msg.eng.t-mobile.com/mms/wapenc", null, null)); - - //T-Mobile UK - Untested (http://www.unlockme.co.uk/network-provider-codes.html) - put("23430", new MmsConnectionParameters("http://mmsc.t-mobile.co.uk:8002", "149.254.201.135","8080")); - put("23431", new MmsConnectionParameters("http://mmsc.t-mobile.co.uk:8002", "149.254.201.135","8080")); - put("23432", new MmsConnectionParameters("http://mmsc.t-mobile.co.uk:8002", "149.254.201.135","8080")); - - //AT&T - Testd - put("310410", (new MmsConnectionParameters("http://mmsc.cingular.com", "wireless.cingular.com", "80")) - .add("http://mmsc.mobile.att.net", "proxy.mobile.att.net", "80")); - - //Verizon - Untested - put("310004", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("310005", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("310012", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - - //Telenor Norway - Tested - put("24201", new MmsConnectionParameters("http://mmsc", "10.10.10.11", "8080")); - - // Rogers - Untested - put("302720", new MmsConnectionParameters("http://mms.gprs.rogers.com", "10.128.1.69", "80")); - - // Virgin Mobile US - Untested - put("310053", new MmsConnectionParameters("http://mmsc.vmobl.com:8080/mms", "205.239.233.136", "81")); - - // Slovenia MOBITEL - Untested - put("29341", new MmsConnectionParameters("http://mms.mobitel.si/servlets/mms", "213.229.249.40", "8080")); - - // Slovenia SI.MOBIL - Untested - put("29340", new MmsConnectionParameters("http://mmc", "80.95.224.46", "9201")); - - // Slovenia TUSMOBIL - Untested - put("29370", new MmsConnectionParameters("http://mms.tusmobil.si:8002", "91.185.221.85", "8002")); - - // Slovenia T-2 - Untested - put("29364", new MmsConnectionParameters("http://www.mms.t-2.net:8002", "172.20.18.137", "8080")); - - // UK giffgaff -Tested - put("23410", new MmsConnectionParameters("http://mmsc.mediamessaging.co.uk:8002", "193.113.200.195", "8080")); - - put("00000", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("000000", new MmsConnectionParameters("http://mms.plspictures.com", "68.28.31.7", "80")); - put("00011", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("007007", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("007038", new MmsConnectionParameters("http://mms.mycricket.com/servlets/mms", "wap.mycricket.com", "8080")); - put("007127", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("100000", new MmsConnectionParameters("http://mms.movilnet.com.ve", null, null)); - put("1023111", new MmsConnectionParameters("http://mms.plspictures.com", "68.28.31.7", "80")); - put("1023127", new MmsConnectionParameters("http://mms.mycricket.com/servlets/mms", "wap.mycricket.com", "8080")); - put("1023456", new MmsConnectionParameters("http://mms.mycricket.com/servlets/mms", "wap.mycricket.com", "8080")); - put("11100", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("111038", new MmsConnectionParameters("http://mmsc.vmobl.com:8088/mms?", "205.239.233.136", "81")); - put("11111", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("111111", new MmsConnectionParameters("http://mmsc.vmobl.com:8088/mms?", "205.239.233.136", "81")); - put("118038", new MmsConnectionParameters("http://mms.mycricket.com/servlets/mms", "wap.mycricket.com", "8080")); - put("123456", new MmsConnectionParameters("http://pix.cspire.com/servlets/mms", "66.175.144.91", "80")); - put("134038", new MmsConnectionParameters("http://mms.mycricket.com/servlets/mms", "wap.mycricket.com", "8080")); - put("13438", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("20201", new MmsConnectionParameters("http://mmsc.cosmote.gr:8002", "10.10.10.20", "8080")); - put("20205", new MmsConnectionParameters("http://mms.vodafone.gr", "213.249.19.49", "5080")); - put("20210", new MmsConnectionParameters("http://192.168.200.95/servlets/mms", "192.168.200.11", "9401")); - put("20404", new MmsConnectionParameters("http://mmsc.mms.vodafone.nl", "192.168.251.150", "8799")); - put("20408", new MmsConnectionParameters("http://mp.mobiel.kpn/mmsc", "10.10.100.20", "5080")); - put("20416", new MmsConnectionParameters("http://t-mobilemms", "10.10.10.11", "8080")); - put("20601", new MmsConnectionParameters("http://mmsc.proximus.be/mms", "10.55.14.75", "8080")); - put("20610", new MmsConnectionParameters("http://mmsc.mobistar.be", "212.65.63.143", "8080")); - put("20620", new MmsConnectionParameters("http://mmsc.base.be", "217.72.235.1", "8080")); - put("20801", new MmsConnectionParameters("http://mms.orange.fr/", "192.168.10.200", "8080")); - put("20802", new MmsConnectionParameters("http://mms.orange.fr/", "192.168.10.200", "8080")); - put("20810", new MmsConnectionParameters("http://mms1", "10.151.0.1", "8080")); - put("20811", new MmsConnectionParameters("http://mms1", "10.151.0.1", "8080")); - put("20813", new MmsConnectionParameters("http://mms1", "10.151.0.1", "8080")); - put("20815", new MmsConnectionParameters("http://212.27.40.225", null, null)); - put("20820", new MmsConnectionParameters("http://mms.bouyguestelecom.fr/mms/wapenc", "62.201.129.226", "8080")); - put("20888", new MmsConnectionParameters("http://mms.orange.fr/", "192.168.10.200", "8080")); - put("209088", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("209090", new MmsConnectionParameters("http://mms.mycricket.com/servlets/mms", "wap.mycricket.com", "8080")); - put("209099", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("21401", new MmsConnectionParameters("http://mmsc.vodafone.es/servlets/mms", "212.73.32.10", "80")); - put("21403", new MmsConnectionParameters("http://mms.orange.es", "172.22.188.25", "8080")); - put("21407", new MmsConnectionParameters("http://mms.movistar.com", "10.138.255.5", "8080")); - put("21601", new MmsConnectionParameters("http://mmsc.telenor.hu/", "84.225.255.1", "8080")); - put("21630", new MmsConnectionParameters("http://mms.t-mobile.hu/servlets/mms", "212.051.126.010", "8080")); - put("21670", new MmsConnectionParameters("http://mms.vodafone.hu/servlets/mms", "80.244.97.2", "8080")); - put("21901", new MmsConnectionParameters("http://mms.t-mobile.hr/servlets/mms", "10.12.0.4", "8080")); - put("21902", new MmsConnectionParameters("http://mmsc.tele2.hr", "193.12.40.66", "8080")); - put("21910", new MmsConnectionParameters("http://mms.vipnet.hr/servlets/mms", "212.91.99.91", "8080")); - put("22001", new MmsConnectionParameters("http://mms.telenor.rs/servlets/mms", "217.65.192.33", "8080")); - put("22003", new MmsConnectionParameters("http://mms.mts064.telekom.rs/mms/wapenc", "172.17.85.131", "8080")); - put("22005", new MmsConnectionParameters("http://mmsc.vipmobile.rs", "212.15.182.82", "8080")); - put("22201", new MmsConnectionParameters("http://mms.tim.it/servlets/mms", "213.230.130.89", "80")); - put("222038", new MmsConnectionParameters("http://mms.mycricket.com/servlets/mms", "wap.mycricket.com", "8080")); - put("22210", new MmsConnectionParameters("http://mms.vodafone.it/servlets/mms", "10.128.224.10", "80")); - put("22288", new MmsConnectionParameters("http://mms.wind.it", "212.245.244.100", "8080")); - put("22299", new MmsConnectionParameters("http://10.216.59.240:10021/mmsc", "62.13.171.3", "8799")); - put("22601", new MmsConnectionParameters("http://multimedia/servlets/mms", "193.230.161.231", "8080")); - put("22606", new MmsConnectionParameters("http://mmsc1.mms.cosmote.ro:8002", "10.252.1.62", "8080")); - put("22610", new MmsConnectionParameters("http://wap.mms.orange.ro:8002", "62.217.247.252", "8799")); - put("22801", new MmsConnectionParameters("http://mms.natel.ch:8079", "192.168.210.2", "8080")); - put("22802", new MmsConnectionParameters("http://mmsc.sunrise.ch", "212.35.34.75", "8080")); - put("22803", new MmsConnectionParameters("http://192.168.151.3:8002", "192.168.151.2", "8080")); - put("23001", new MmsConnectionParameters("http://mms", "10.0.0.10", "80")); - put("23002", new MmsConnectionParameters("http://mms.o2active.cz:8002", "160.218.160.218", "8080")); - put("23003", new MmsConnectionParameters("http://mms", "10.11.10.111", "80")); - put("23101", new MmsConnectionParameters("http://imms.orange.sk", "213.151.208.145", "8799")); - put("23102", new MmsConnectionParameters("http://mms", "192.168.1.1", "8080")); - put("23106", new MmsConnectionParameters("http://mms.o2world.sk:8002", "10.97.1.11", "8080")); - put("23201", new MmsConnectionParameters("http://mmsc.A1.net", "194.48.124.71", "8001")); - put("23203", new MmsConnectionParameters("http://mmsc.t-mobile.at/servlets/mms", "10.12.0.20", "80")); - put("23205", new MmsConnectionParameters("http://mmsc.orange.at/mms/wapenc", "194.24.128.118", "8080")); - put("23210", new MmsConnectionParameters("http://mmsc", "213.094.078.133", "8799")); - put("23410", new MmsConnectionParameters("http://mmsc.mms.o2.co.uk:8002", "82.132.254.1", "8080")); - put("23415", new MmsConnectionParameters("http://mms.vodafone.co.uk/servlets/mms", "212.183.137.12", "8799")); - put("23420", new MmsConnectionParameters("http://mms.um.three.co.uk:10021/mmsc", "mms.three.co.uk", "8799")); - put("23433", new MmsConnectionParameters("http://mms.orange.co.uk/", "192.168.224.10", "8080")); - put("23801", new MmsConnectionParameters("http://mmsc.tdc.dk:8002", "194.182.251.15", "8080")); - put("23802", new MmsConnectionParameters("http://mms.telenor.dk", "212.88.64.8", "8080")); - put("23806", new MmsConnectionParameters("http://mms.3.dk", "mmsproxy.3.dk", "8799")); - put("23820", new MmsConnectionParameters("http://mms.telia.dk", "193.209.134.131", "8080")); - put("24001", new MmsConnectionParameters("http://mmss", "193.209.134.132", "80")); - put("24002", new MmsConnectionParameters("http://mms.tre.se", "mmsproxy.tre.se", "8799")); - put("24004", new MmsConnectionParameters("http://mms.tre.se", "mmsproxy.tre.se", "8799")); - put("24005", new MmsConnectionParameters("http://mmsc.tele2.se", "130.244.202.30", "8080")); - put("24007", new MmsConnectionParameters("http://mmsc.tele2.se", "130.244.202.30", "8080")); - put("24008", new MmsConnectionParameters("http://mms", "172.30.253.241", "8799")); - put("24024", new MmsConnectionParameters("http://mmsc.tele2.se", "130.244.202.30", "8080")); - put("24201", new MmsConnectionParameters("http://mmsc/", "mms-proxy.telenor.no", "8080")); - put("24202", new MmsConnectionParameters("http://mm", "212.169.66.4", "8080")); - put("24205", new MmsConnectionParameters("http://mms.nwn.no", "188.149.250.10", "80")); - put("24405", new MmsConnectionParameters("http://mms.saunalahti.fi:8002", "62.142.4.197", "8080")); - put("24412", new MmsConnectionParameters("http://mmsc.dnafinland.fi", "10.1.1.2", "8080")); - put("24491", new MmsConnectionParameters("http://mms.sonera.fi:8002", "195.156.25.33", "80")); - put("24601", new MmsConnectionParameters("http://mms.omnitel.net:8002/", "194.176.32.149", "8080")); - put("24602", new MmsConnectionParameters("http://mmsc/servlets/mms", "192.168.150.2", "8080")); - put("24603", new MmsConnectionParameters("http://mmsc.tele2.lt", "193.012.040.029", "8080")); - put("24701", new MmsConnectionParameters("http://mmsc.lmt.lv/mmsc", "212.93.97.201", "8080")); - put("24702", new MmsConnectionParameters("http://mmsc.tele2.lv", "193.12.40.38", "8080")); - put("25001", new MmsConnectionParameters("http://mmsc", "192.168.192.192", "8080")); - put("25002", new MmsConnectionParameters("http://mmsc:8002", "10.10.10.10", "8080")); - put("25003", new MmsConnectionParameters("http://10.0.3.50", "10.0.3.20", "8080")); - put("25012", new MmsConnectionParameters("http://mmsc/mms", "10.10.17.2", "8080")); - put("25016", new MmsConnectionParameters("http://mmsc.vntc.ru/was", "80.243.64.68", "8080")); - put("25020", new MmsConnectionParameters("http://mmsc.tele2.ru", "193.12.40.65", "8080")); - put("25035", new MmsConnectionParameters("http://mms.ycc.ru", "172.16.2.10", "8080")); - put("25039", new MmsConnectionParameters("http://mms", "192.168.168.192", "8080")); - put("25099", new MmsConnectionParameters("http://mms/", "192.168.94.23", "8080")); - put("25501", new MmsConnectionParameters("http://mmsc:8002/", "192.168.10.10", "8080")); - put("25503", new MmsConnectionParameters("http://mms.kyivstar.net", "10.10.10.10", "8080")); - put("25506", new MmsConnectionParameters("http://mms.life.com.ua/cmmsc/post", "212.58.162.230", "8080")); - put("25701", new MmsConnectionParameters("http://mms.velcom.by/servlets/mms", "10.200.15.15", "8080")); - put("25702", new MmsConnectionParameters("http://mmsc", "192.168.192.168", "8080")); - put("25704", new MmsConnectionParameters("http://mms.life.com.by/mmsc", "10.10.10.20", "8080")); - put("26001", new MmsConnectionParameters("http://mms.plusgsm.pl:8002", "212.2.96.16", "8080")); - put("26002", new MmsConnectionParameters("http://mms/servlets/mms", "213.158.194.226", "8080")); - put("26003", new MmsConnectionParameters("http://mms.orange.pl", "192.168.6.104", "8080")); - put("26006", new MmsConnectionParameters("http://10.10.28.164/mms/wapenc", "10.10.25.5", "8080")); - put("26201", new MmsConnectionParameters("http://mms.t-mobile.de/servlets/mms", "172.28.23.131", "8008")); - put("26202", new MmsConnectionParameters("http://139.7.24.1/servlets/mms", "139.7.29.17", "80")); - put("26203", new MmsConnectionParameters("http://mms/eplus/", "212.23.97.153", "5080")); - put("26207", new MmsConnectionParameters("http://10.81.0.7:8002", "82.113.100.5", "8080")); - put("26801", new MmsConnectionParameters("http://mms.vodafone.pt/servlets/mms", "iproxy.vodafone.pt", "80")); - put("26803", new MmsConnectionParameters("http://mmsc:10021/mmsc", "62.169.66.5", "8799")); - put("26806", new MmsConnectionParameters("http://mmsc/", "10.111.2.16", "8080")); - put("27001", new MmsConnectionParameters("http://mmsc.pt.lu", "194.154.192.88", "8080")); - put("27077", new MmsConnectionParameters("http://mms.tango.lu", "212.66.75.3", "8080")); - put("27099", new MmsConnectionParameters("http://mms.orange.lu", "212.88.139.44", "8080")); - put("27201", new MmsConnectionParameters("http://www.vodafone.ie/mms", "10.24.59.200", "80")); - put("27202", new MmsConnectionParameters("http://mmsc.mms.o2.ie:8002", "62.40.32.40", "8080")); - put("27203", new MmsConnectionParameters("http://mms.mymeteor.ie", "10.85.85.85", "8799")); - put("27205", new MmsConnectionParameters("http://mms.um.3ireland.ie:10021/mmsc", "mms.3ireland.ie", "8799")); - put("27401", new MmsConnectionParameters("http://mms.simi.is/servlets/mms", "213.167.138.200", "8080")); - put("27402", new MmsConnectionParameters("http://mmsc.vodafone.is", "10.22.0.10", "8080")); - put("27411", new MmsConnectionParameters("http://mmsc.nova.is", "10.10.2.60", "8080")); - put("28310", new MmsConnectionParameters("http://mms/", "192.168.220.251", "3128")); - put("28401", new MmsConnectionParameters("http://mmsc/", "10.150.0.33", "8080")); - put("28405", new MmsConnectionParameters("http://mmsc1.mms.globul.bg:8002", "192.168.087.011", "8004")); - put("28601", new MmsConnectionParameters("http://mms.turkcell.com.tr/servlets/mms", "212.252.169.217", "8080")); - put("28602", new MmsConnectionParameters("http://217.31.233.18:6001/MM1Servlet", "217.31.233.18", "9401")); - put("28603", new MmsConnectionParameters("http://mms.avea.com.tr/servlets/mms", "213.161.151.201", "8080")); - put("29340", new MmsConnectionParameters("http://mmc", "80.95.224.46", "9201")); - put("29341", new MmsConnectionParameters("http://mms.mobitel.si/servlets/mms", "213.229.249.40", "8080")); - put("29370", new MmsConnectionParameters("http://mms.tusmobil.si:8002", "91.185.221.85", "8080")); - put("302065", new MmsConnectionParameters("http://mms01.publicmobile.clearmode.com/mms/", "74.200.29.50", "80")); - put("302220", new MmsConnectionParameters("http://aliasredirect.net/proxy/mmsc", "74.49.0.18", "80")); - put("302320", new MmsConnectionParameters("http://mms.mobilicity.net", "10.100.3.4", "8080")); - put("302490", new MmsConnectionParameters("http://mms.windmobile.ca", "74.115.197.70", "8080")); - put("302500", new MmsConnectionParameters("http://media.videotron.com", "10.208.89.17", "8080")); - put("302610", new MmsConnectionParameters("http://mms.bell.ca/mms/wapenc", "web.wireless.bell.ca", "80")); - put("302720", new MmsConnectionParameters("http://mms.gprs.rogers.com", "10.128.1.69", "80")); - put("302780", new MmsConnectionParameters("http://mms.sasktel.com", "mig.sasktel.com", "80")); - put("302880", new MmsConnectionParameters("http://aliasredirect.net/proxy/koodo/mmsc", "74.49.0.18", "80")); - put("31000", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("310000", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310001", new MmsConnectionParameters("http://mms.mycricket.com/servlets/mms", "wap.mycricket.com", "8080")); - put("310004", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("310007", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("31001", new MmsConnectionParameters("http://mms.sprintpcs.com", null, null)); - put("310012", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("310016", new MmsConnectionParameters("http://mms.mycricket.com/servlets/mms", "wap.mycricket.com", "8080")); - put("31002", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310020", new MmsConnectionParameters("http://mms.unionwireless.com", "166.230.4.83", "80")); - put("310027", new MmsConnectionParameters("http://mms.sprintpcs.com", null, null)); - put("31003", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310035", new MmsConnectionParameters("http://mmsi.etex.mobi", null, null)); - put("310038", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310050", new MmsConnectionParameters("http://mmsc1.acsalaska.net/servlets/mms", null, null)); - put("31006", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31007", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31008", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310080", new MmsConnectionParameters("http://m.iot1.com/corr/mms.php", "74.112.57.173", "9201")); - put("310088", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("31009", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310090", new MmsConnectionParameters("http://mms.mycricket.com/servlets/mms", "wap.mycricket.com", "8080")); - put("310099", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("310100", new MmsConnectionParameters("http://mms", "172.23.253.206", "8080")); - put("31012", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310120", new MmsConnectionParameters("http://mms.sprintpcs.com", null, null)); - put("310127", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("31013", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310150", new MmsConnectionParameters("http://mmsc.aiowireless.net/", "proxy.aiowireless.net", "80")); - put("31016", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31018", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310180", new MmsConnectionParameters("http://mms.wcc.net", "209.55.70.246", "80")); - put("31022", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31023", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31024", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31025", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31026", new MmsConnectionParameters("http://mms.msg.eng.t-mobile.com/mms/wapenc", null, null)); - put("310260", new MmsConnectionParameters("http://mms.msg.eng.t-mobile.com/mms/wapenc", null, null)); - put("31027", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31028", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31029", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31030", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310320", new MmsConnectionParameters("http://mmsc.c1neaz.csky.us:6672", "209.4.229.94", "9401")); - put("31033", new MmsConnectionParameters("http://mms.alltel.com/servlets/mms", "mms.alltel.com", "8080")); - put("310330", new MmsConnectionParameters("http://mms.alltel.com/servlets/mms", "mms.alltel.com", "8080")); - put("310340", new MmsConnectionParameters("http://mms2.westlinkcom.com/mms/", "199.221.134.43", "8080")); - put("31035", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310360", new MmsConnectionParameters("http://mms1.zsend.com", null, null)); - put("31038", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31039", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31040", new MmsConnectionParameters("http://mms.sprintpcs.com", "68.28.31.7", "80")); - put("31041", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31042", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310420", new MmsConnectionParameters("http://mms.gocbw.com:8088/mms", "216.68.79.202", "80")); - put("31043", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31045", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310450", new MmsConnectionParameters("http://mms.viaero.com", "10.168.3.23", "9401")); - put("31046", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31047", new MmsConnectionParameters("http://mms.ntelospcs.net/", null, null)); - put("310470", new MmsConnectionParameters("http://mms.ntelospcs.net/", null, null)); - put("31048", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310480", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("31051", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31053", new MmsConnectionParameters("http://mms.sprintpcs.com", null, null)); - put("31057", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310570", new MmsConnectionParameters("http://mmsc.mtpcs.csky.us:6672/", "209.4.229.229", "9201")); - put("31058", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31059", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310590", new MmsConnectionParameters("http://mmsc.cingular.com", "wireless.cingular.com", "80")); - put("31060", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310600", new MmsConnectionParameters("http://mms.cellcom.com/cellcom/mms.php", "66.255.055.023", "9201")); - put("31064", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310650", new MmsConnectionParameters("http://mms.unitedwireless.com/united/mms.php", null, null)); - put("31066", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31069", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31070", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31072", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("31073", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310730", new MmsConnectionParameters("http://mms.msg.eng.t-mobile.com/mms/wapenc", null, null)); - put("31074", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310750", new MmsConnectionParameters("http://interop.myawi.com/ekn/mms.php", "66.255.55.23", "9201")); - put("31076", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310770", new MmsConnectionParameters("http://mmsc.iwireless.dataonair.net:6672", "209.4.229.31", "9201")); - put("31078", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31079", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31080", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31081", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31083", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31087", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310870", new MmsConnectionParameters("http://mms.iot1.com/kaplan/mms.php", "10.10.0.97", "9201")); - put("310880", new MmsConnectionParameters("http://mmsdtcw.com", "192.168.20.42", "80")); - put("31089", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310890", new MmsConnectionParameters("http://mmsc.cingular.com", "wireless.cingular.com", "80")); - put("31092", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31095", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31096", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("310960", new MmsConnectionParameters("http://mms.rinawireless.com", null, null)); - put("31098", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("31099", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("31100", new MmsConnectionParameters("http://mmsc1.uscc.net/mmsc/MMS", null, null)); - put("311000", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("311030", new MmsConnectionParameters("http://mmsgprs.com", "10.213.2.68", "80")); - put("311040", new MmsConnectionParameters("http://mms.msg.eng.t-mobile.com/mms/wapenc", null, null)); - put("311080", new MmsConnectionParameters("http://69.8.34.146/mms/", "69.8.34.146", "9401")); - put("311090", new MmsConnectionParameters("http://mms.longlines.com/mms", "66.172.210.195", "8080")); - put("311100", new MmsConnectionParameters("http://mms.ntwls.net/nex-tech/mms.php", null, null)); - put("31111", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("311127", new MmsConnectionParameters("http://pix.cellularsouth.com/servlets/mms", null, null)); - put("311148", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("311190", new MmsConnectionParameters("http://mms.cellular1.net/ecit/mms.php", "10.10.0.97", "9201")); - put("31122", new MmsConnectionParameters("http://mmsc1.uscc.net/mmsc/MMS", null, null)); - put("311220", new MmsConnectionParameters("http://mmsc1.uscc.net/mmsc/MMS", null, null)); - put("31123", new MmsConnectionParameters("http://pix.cellularsouth.com/servlets/mms", null, null)); - put("311230", new MmsConnectionParameters("http://pix.cellularsouth.com/", null, null)); - put("311340", new MmsConnectionParameters("http://mms.iot1.com/ivc/mms.php", "66.255.55.23", "9201")); - put("31135", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("311370", new MmsConnectionParameters("http://mmsc.gci.csky.us:6672", "209.4.229.92", "9201")); - put("31144", new MmsConnectionParameters("http://mms.iot1.com/bluegrass/mms.php", "66.255.55.23", "9201")); - put("311440", new MmsConnectionParameters("http://mms.iot1.com/bluegrass/mms.php", null, null)); - put("311470", new MmsConnectionParameters("http://mms.innovativevi.net", null, null)); - put("311480", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("311490", new MmsConnectionParameters("http://mmsc.vmobl.com:8088/mms?", "205.239.233.136", "81")); - put("311580", new MmsConnectionParameters("http://mmsc1.uscc.net/mmsc/MMS", null, null)); - put("31165", new MmsConnectionParameters("http://mms.sprintpcs.com", "68.28.31.7", "80")); - put("311660", new MmsConnectionParameters("http://mms.metropcs.net:3128/mmsc", "proxy.metropcs.net", "3128")); - put("311700", new MmsConnectionParameters("http://mms.elementmobile.net", "69.147.217.001", "8080")); - put("31172", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("311870", new MmsConnectionParameters("http://mm.myboostmobile.com", "68.28.31.7", "80")); - put("31600", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("31638", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("3167", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("31672", new MmsConnectionParameters("http://mms.vtext.com/servlets/mms", null, null)); - put("33000", new MmsConnectionParameters("http://mms.sprintpcs.com", "68.28.31.7", "80")); - put("330000", new MmsConnectionParameters("http://mms.openmobilepr.com:1981/", null, null)); - put("330110", new MmsConnectionParameters("http://mmsg.claropr.com:10021/mmsc", "10.50.38.3", "8799")); - put("33038", new MmsConnectionParameters("http://mms.sprintpcs.com", "68.28.31.7", "80")); - put("3307", new MmsConnectionParameters("http://mm.myboostmobile.com", "68.28.31.7", "80")); - put("334020", new MmsConnectionParameters("http://mms.itelcel.com/servlets/mms", "148.233.151.240", "8080")); - put("33403", new MmsConnectionParameters("http://mms.movistar.mx", "10.2.20.1", "80")); - put("334050", new MmsConnectionParameters("http://mms.iusacell3g.com/", "192.200.1.110", "9201")); - put("34001", new MmsConnectionParameters("http://193.251.160.246/servlets/mms", "10.0.0.10", "8082")); - put("40001", new MmsConnectionParameters("http://mms.azercell.com/cMMSC/post", "10.0.154.101", "8080")); - put("40101", new MmsConnectionParameters("http://mms.beeline.kz/mms/wapenc", "172.27.6.93", "8080")); - put("40102", new MmsConnectionParameters("http://mms.kcell.kz/post", "195.47.255.7", "8080")); - put("40402", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("40405", new MmsConnectionParameters("http://mms1.live.vodafone.in/mms/", "10.10.1.100", "9401")); - put("40407", new MmsConnectionParameters("http://10.4.42.21:8002/", "10.4.42.15", "8080")); - put("40410", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("40411", new MmsConnectionParameters("http://mms1.live.vodafone.in/mms/", "10.10.1.100", "9401")); - put("40413", new MmsConnectionParameters("http://mms1.live.vodafone.in/mms/", "10.10.1.100", "9401")); - put("40419", new MmsConnectionParameters("http://10.4.42.21:8002/", "10.4.42.15", "8080")); - put("40420", new MmsConnectionParameters("http://mms1.live.vodafone.in/mms/", "10.10.1.100", "9401")); - put("40422", new MmsConnectionParameters("http://10.4.42.21:8002/", "10.4.42.15", "8080")); - put("40424", new MmsConnectionParameters("http://10.4.42.21:8002", "10.4.42.15", "8080")); - put("40427", new MmsConnectionParameters("http://mms1.live.vodafone.in/mms/", "10.10.1.100", "9401")); - put("40430", new MmsConnectionParameters("http://mms1.live.vodafone.in/mms/", "10.10.1.100", "9401")); - put("40440", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("40444", new MmsConnectionParameters("http://10.4.42.21:8002", "10.4.42.15", "8080")); - put("40445", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("40449", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("40456", new MmsConnectionParameters("http://10.4.42.21:8002/", "10.4.42.15", "8080")); - put("40464", new MmsConnectionParameters("http://bsnlmmsc.in:8514", "10.210.10.11", "8080")); - put("40466", new MmsConnectionParameters("http://bsnlmmsc.in", "10.210.10.11", "8080")); - put("40470", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("40478", new MmsConnectionParameters("http://10.4.42.21:8002/", "10.4.42.15", "8080")); - put("40486", new MmsConnectionParameters("http://mms1.live.vodafone.in/mms/", "10.10.1.100", "9401")); - put("40488", new MmsConnectionParameters("http://mms1.live.vodafone.in/mms/", "10.10.1.100", "9401")); - put("40490", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("40492", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("40494", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("40497", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("40498", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("405025", new MmsConnectionParameters("http://mmsc/", "10.124.26.94", "8799")); - put("405030", new MmsConnectionParameters("http://mmsc/", "10.124.26.94", "8799")); - put("405034", new MmsConnectionParameters("http://mmsc/", "10.124.26.94", "8799")); - put("405037", new MmsConnectionParameters("http://mmsc/", "10.124.26.94", "8799")); - put("405039", new MmsConnectionParameters("http://mmsc/", "10.124.26.94", "8799")); - put("405044", new MmsConnectionParameters("http://mmsc/", "10.124.26.94", "8799")); - put("40554", new MmsConnectionParameters("http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799")); - put("405751", new MmsConnectionParameters("http://mms1.live.vodafone.in/mms/", "10.10.1.100", "9401")); - put("405799", new MmsConnectionParameters("http://10.4.42.21:8002/", "10.4.42.15", "8080")); - put("405800", new MmsConnectionParameters("http://10.50.1.166/servlets/mms", "172.017.083.069", "8080")); - put("41001", new MmsConnectionParameters("http://mms/", "172.25.20.12", "8080")); - put("41003", new MmsConnectionParameters("http://www.ufonemms.com:80/", "172.16.13.27", "8080")); - put("41004", new MmsConnectionParameters("http://10.81.6.11:8080", "10.81.6.33", "8000")); - put("41006", new MmsConnectionParameters("http://mmstelenor", "172.18.19.11", "8080")); - put("41007", new MmsConnectionParameters("http://10.4.0.132/servlets/MMS", "10.4.2.1", "8080")); - put("41301", new MmsConnectionParameters("http://192.168.50.165", "192.168.50.163", "8080")); - put("41302", new MmsConnectionParameters("http://mms.dialog.lk:3130/mmsc", "192.168.122.2", "8080")); - put("41305", new MmsConnectionParameters("http://mmsc/", "10.200.184.86", "8080")); - put("41601", new MmsConnectionParameters("http://mms.jo.zain.com/", "192.168.55.10", "80")); - put("41603", new MmsConnectionParameters("http://mms.umniah.com/", "10.1.1.10", "8080")); - put("41677", new MmsConnectionParameters("http://172.16.1.96/servlets/mms", "172.16.1.2", "8080")); - put("41805", new MmsConnectionParameters("http://192.168.107.10:19090/was", "192.168.107.50", "8080")); - put("41902", new MmsConnectionParameters("http://mms.zain", "176.0.0.65", "8080")); - put("42001", new MmsConnectionParameters("http://mms.net.sa:8002", "10.1.1.1", "8080")); - put("42003", new MmsConnectionParameters("http://10.3.3.133:9090/was", "10.3.2.133", "8080")); - put("42202", new MmsConnectionParameters("http://mmsc.omanmobile.om:10021/mmsc", "192.168.203.35", "8080")); - put("42203", new MmsConnectionParameters("http://10.128.240.16/servlets/mms", "10.128.240.19", "8080")); - put("42402", new MmsConnectionParameters("http://mms/servlets/mms", "10.12.0.32", "8080")); - put("42403", new MmsConnectionParameters("http://mms.du.ae", "10.19.18.4", "8080")); - put("42501", new MmsConnectionParameters("http://192.168.220.15/servlets/mms", null, null)); - put("42502", new MmsConnectionParameters("http://mms.cellcom.co.il", "vwapm2.ain.co.il", "8080")); - put("42503", new MmsConnectionParameters("http://mmsu.pelephone.net.il", "10.170.252.104", "9093")); - put("42505", new MmsConnectionParameters("http://mms.jawwal.ps/servlets/mms", "213.244.118.129", "8080")); - put("42507", new MmsConnectionParameters("http://mms.hotmobile.co.il", "80.246.131.99", "80")); - put("42508", new MmsConnectionParameters("http://mmsc.golantelecom.co.il", "10.224.228.81", "80")); - put("42602", new MmsConnectionParameters("http://172.18.83.129", "172.18.85.34", "80")); - put("42701", new MmsConnectionParameters("http://mmsr.qtelmms.qa", "10.23.8.3", "8080")); - put("43235", new MmsConnectionParameters("http://mms:8002", "10.131.26.138", "8080")); - put("43404", new MmsConnectionParameters("http://mms", "172.30.30.166", "8080")); - put("43405", new MmsConnectionParameters("http://mmsc:8002/", "10.64.164.10", "8080")); - put("44010", new MmsConnectionParameters("http://mmsc.ktfwing.com:9082", null, null)); - put("44020", new MmsConnectionParameters("http://mms/", "smilemms.softbank.ne.jp", "8080")); - put("45005", new MmsConnectionParameters("http://omms.nate.com:9082/oma_mms", "smart.nate.com", "9093")); - put("45008", new MmsConnectionParameters("http://mmsc.ktfwing.com:9082", null, null)); - put("45201", new MmsConnectionParameters("http://203.162.21.114/mmsc", "203.162.21.114", "3130")); - put("45202", new MmsConnectionParameters("http://mms.vinaphone.com.vn", "10.1.10.46", "8000")); - put("45204", new MmsConnectionParameters("http://mms.viettelmobile.com.vn/mms/wapenc", "192.168.233.10", "8080")); - put("45400", new MmsConnectionParameters("http://192.168.58.171:8002/", "192.168.59.51", "8080")); - put("45403", new MmsConnectionParameters("http://mms.um.three.com.hk:10021/mmsc", "172.20.97.116", "8799")); - put("45406", new MmsConnectionParameters("http://mms.smartone.com/server", "10.9.9.9", "8080")); - put("45412", new MmsConnectionParameters("http://mms.hk.chinamobile.com/mms", "172.31.31.36", "8080")); - put("45419", new MmsConnectionParameters("http://3gmms.pccwmobile.com:8080/was", "10.140.14.10", "8080")); - put("46000", new MmsConnectionParameters("http://mmsc.monternet.com", "10.0.0.172", "80")); - put("460003", new MmsConnectionParameters("http://mmsc.vnet.mobi", "10.0.0.200", "80")); - put("46001", new MmsConnectionParameters("http://mmsc.myuni.com.cn", "10.0.0.172", "80")); - put("46003", new MmsConnectionParameters("http://mmsc.vnet.mobi", "10.0.0.200", "80")); - put("46601", new MmsConnectionParameters("http://mms", "210.241.199.199", "9201")); - put("46689", new MmsConnectionParameters("http://mms", "172.24.128.36", "8080")); - put("46692", new MmsConnectionParameters("http://mms.emome.net:8002", "10.1.1.1", "8080")); - put("46697", new MmsConnectionParameters("http://mms.catch.net.tw/", "10.1.1.2", "80")); - put("47001", new MmsConnectionParameters("http://mms.gpsurf.net/servlets/mms", "10.128.1.2", "8080")); - put("47201", new MmsConnectionParameters("http://mmsc.dhimobile.com.mv", "172.24.97.4", "8080")); - put("50212", new MmsConnectionParameters("http://172.16.74.100:10021/mmsc", "202.75.133.49", "80")); - put("50216", new MmsConnectionParameters("http://mms.digi.com.my/servlets/mms", "203.92.128.160", "80")); - put("50218", new MmsConnectionParameters("http://10.30.3.11/servlets/mms", "10.30.5.11", "8080")); - put("50219", new MmsConnectionParameters("http://mms.celcom.net.my", "10.128.1.242", "8080")); - put("50501", new MmsConnectionParameters("http://mmsc.telstra.com:8002", "10.1.1.180", "80")); - put("50502", new MmsConnectionParameters("http://mmsc.optus.com.au:8002/", "61.88.190.10", "8070")); - put("50503", new MmsConnectionParameters("http://pxt.vodafone.net.au/pxtsend", "10.202.2.60", "8080")); - put("51001", new MmsConnectionParameters("http://mmsc.indosat.com", "10.19.19.19", "8080")); - put("51008", new MmsConnectionParameters("http://mmsc.axis", "10.8.3.8", "8080")); - put("51009", new MmsConnectionParameters("http://10.17.93.103:8080", "10.17.27.250", "8080")); - put("51010", new MmsConnectionParameters("http://mms.telkomsel.com", "10.1.89.150", "8000")); - put("51011", new MmsConnectionParameters("http://mmc.xl.net.id/servlets/mms", "202.152.240.50", "8080")); - put("51089", new MmsConnectionParameters("http://mms.three.co.id", "10.4.0.10", "3128")); - put("51502", new MmsConnectionParameters("http://192.40.100.22:10021/mmsc", "203.177.42.214", "8080")); - put("51503", new MmsConnectionParameters("http://10.102.61.238:8002", "10.102.61.46", "8080")); - put("51505", new MmsConnectionParameters("http://mmscenter.suncellular.com.ph", "202.138.159.78", "8080")); - put("52000", new MmsConnectionParameters("http://mms.trueh.com:8002/", "10.4.7.39", "8080")); - put("52001", new MmsConnectionParameters("http://mms.mobilelife.co.th", "203.170.229.34", "8080")); - put("52018", new MmsConnectionParameters("http://mms.dtac.co.th:8002/", "203.155.200.133", "8080")); - put("52099", new MmsConnectionParameters("http://mms.trueh.com:8002/", "10.4.7.39", "8080")); - put("52501", new MmsConnectionParameters("http://mms.singtel.com:10021/mmsc", "165.21.42.84", "8080")); - put("52503", new MmsConnectionParameters("http://mmsgw:8002", "172.16.14.10", "8080")); - put("52505", new MmsConnectionParameters("http://mms.starhubgee.com.sg:8002/", "10.12.1.80", "80")); - put("53001", new MmsConnectionParameters("http://pxt.vodafone.net.nz/pxtsend", "172.30.38.3", "8080")); - put("53005", new MmsConnectionParameters("http://lsmmsc.xtra.co.nz", "210.55.11.73", "80")); - put("53024", new MmsConnectionParameters("http://mms.2degreesmobile.net.nz:48090", "118.148.1.118", "8080")); - put("60401", new MmsConnectionParameters("http://mms:8002", "10.16.35.50", "8080")); - put("60503", new MmsConnectionParameters("http://mmsc.tunisiana.com", "10.3.2.100", "80")); - put("63102", new MmsConnectionParameters("http://10.128.4.10/wapenc", "10.128.2.70", "8080")); - put("63401", new MmsConnectionParameters("http://mms.zain.sd", "172.20.2.124", "80")); - put("63902", new MmsConnectionParameters("http://mms.gprs.safaricom.com", "172.022.002.038", "8080")); - put("64700", new MmsConnectionParameters("http://mms.orange.re/", "192.168.10.200", "8080")); - put("64710", new MmsConnectionParameters("http://mms", "10.0.224.145", "8080")); - put("64901", new MmsConnectionParameters("http://www.mtcmobile.com.na/", "10.40.10.252", "80")); - put("65501", new MmsConnectionParameters("http://mmsc.vodacom4me.co.za", "196.6.128.13", "8080")); - put("65507", new MmsConnectionParameters("http://mms.cmobile.co.za", "196.31.116.250", "8080")); - put("65510", new MmsConnectionParameters("http://mms.mtn.co.za/mms/wapenc", "196.11.240.241", "8080")); - put("70401", new MmsConnectionParameters("http://mms.ideasclaro.com:8002", "216.230.133.66", "8080")); - put("70603", new MmsConnectionParameters("http://mms", "10.16.17.12", "8888")); - put("710300", new MmsConnectionParameters("http://mms.movistar.ni", "10.12.23.1", "80")); - put("71201", new MmsConnectionParameters("http://mmsice", "10.184.202.24", "8080")); - put("71203", new MmsConnectionParameters("http://mms.ideasclaro.com:8002", "216.230.133.66", "8080")); - put("71204", new MmsConnectionParameters("http://mms.movistar.cr", "10.221.79.83", "80")); - put("71610", new MmsConnectionParameters("http://claro/servlets/mms", "192.168.231.30", "80")); - put("72207", new MmsConnectionParameters("http://mms.movistar.com.ar", "200.68.32.239", "8080")); - put("722310", new MmsConnectionParameters("http://mms.ctimovil.com.ar", "170.51.255.240", "8080")); - put("72234", new MmsConnectionParameters("http://mms.personal.com", "172.25.7.31", "8080")); - put("72402", new MmsConnectionParameters("http://mms.tim.br", "200.179.66.242", "8080")); - put("72403", new MmsConnectionParameters("http://mms.tim.br", "200.179.66.242", "8080")); - put("72404", new MmsConnectionParameters("http://mms.tim.br", "200.179.66.242", "8080")); - put("72405", new MmsConnectionParameters("http://mms.claro.com.br", "200.169.126.10", "8799")); - put("72406", new MmsConnectionParameters("http://termnat.vivomms.com.br:8088/mms", "200.142.130.104", "80")); - put("72410", new MmsConnectionParameters("http://termnat.vivomms.com.br:8088/mms", "200.142.130.104", "80")); - put("72411", new MmsConnectionParameters("http://termnat.vivomms.com.br:8088/mms", "200.142.130.104", "80")); - put("72416", new MmsConnectionParameters("http://200.222.42.204:8002", "192.168.10.50", "3128")); - put("72423", new MmsConnectionParameters("http://termnat.vivomms.com.br:8088/mms", "200.142.130.104", "80")); - put("72431", new MmsConnectionParameters("http://200.222.42.204:8002", "192.168.10.50", "3128")); - put("73001", new MmsConnectionParameters("http://mmsc.entelpcs.cl", "10.99.0.10", "8080")); - put("73002", new MmsConnectionParameters("http://mms.movistar.cl", "172.17.8.10", "8080")); - put("73402", new MmsConnectionParameters("http://mms.412.com.ve/servlets/mms", "10.99.0.10", "8080")); - put("73404", new MmsConnectionParameters("http://mms.movistar.com.ve:8088/mms", "200.35.64.73", "9001")); - put("74402", new MmsConnectionParameters("http://mms.ctimovil.com.py", "170.51.255.240", "8080")); - put("74404", new MmsConnectionParameters("http://mms", "10.16.17.12", "8888")); - put("74801", new MmsConnectionParameters("http://mmsc.mms.ancelutil.com.uy", "200.40.246.2", "3128")); - put("74807", new MmsConnectionParameters("http://mmsc.movistar.com.uy", "10.0.2.29", "8080")); - put("74810", new MmsConnectionParameters("http://mms.ctimovil.com.uy", "170.51.255.240", "8080")); - }}; - - public static MmsConnectionParameters getMmsConnectionParameters(Context context) { - TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - return paramMap.get(tm.getSimOperator()); - } -} diff --git a/src/org/thoughtcrime/securesms/mms/MmsCommunication.java b/src/org/thoughtcrime/securesms/mms/MmsCommunication.java index e9c33ca0b..b629e383a 100644 --- a/src/org/thoughtcrime/securesms/mms/MmsCommunication.java +++ b/src/org/thoughtcrime/securesms/mms/MmsCommunication.java @@ -22,7 +22,9 @@ import android.database.sqlite.SQLiteException; import android.net.ConnectivityManager; import android.util.Log; +import org.thoughtcrime.securesms.database.ApnDatabase; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.util.TelephonyUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.textsecure.util.Conversions; import org.whispersystems.textsecure.util.Util; @@ -69,13 +71,19 @@ public class MmsCommunication { if (TextSecurePreferences.isUseLocalApnsEnabled(context)) { return getLocallyConfiguredMmsConnectionParameters(context); } else { - MmsConnectionParameters params = ApnDefaults.getMmsConnectionParameters(context); + try { + MmsConnectionParameters params = ApnDatabase.getInstance(context) + .getMmsConnectionParameters(TelephonyUtil.getMccMnc(context), + TelephonyUtil.getApn(context)); - if (params == null) { - throw new ApnUnavailableException("No parameters available from ApnDefaults."); + if (params == null) { + throw new ApnUnavailableException("No parameters available from ApnDefaults."); + } + + return params; + } catch (IOException ioe) { + throw new ApnUnavailableException("ApnDatabase threw an IOException", ioe); } - - return params; } } @@ -180,7 +188,8 @@ public class MmsCommunication { return urlConnection; } - protected static class MmsConnectionParameters { + public static class MmsConnectionParameters { + public class Apn { private final String mmsc; private final String proxy; @@ -213,6 +222,14 @@ public class MmsCommunication { return Integer.parseInt(port); } + + @Override + public String toString() { + return MmsConnectionParameters.class.getSimpleName() + + "{ mmsc: \"" + mmsc + "\"" + + ", proxy: " + (proxy == null ? "none" : '"' + proxy + '"') + + ", port: " + (port == null ? "none" : port) + " }"; + } } private List apn = new ArrayList(); diff --git a/src/org/thoughtcrime/securesms/util/TelephonyUtil.java b/src/org/thoughtcrime/securesms/util/TelephonyUtil.java new file mode 100644 index 000000000..9e3ee1db9 --- /dev/null +++ b/src/org/thoughtcrime/securesms/util/TelephonyUtil.java @@ -0,0 +1,36 @@ +package org.thoughtcrime.securesms.util; + +import android.content.Context; +import android.content.res.Configuration; +import android.net.ConnectivityManager; +import android.telephony.TelephonyManager; +import android.util.Log; + +public class TelephonyUtil { + private static final String TAG = TelephonyUtil.class.getSimpleName(); + + public static String getMccMnc(final Context context) { + final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + final int configMcc = context.getResources().getConfiguration().mcc; + final int configMnc = context.getResources().getConfiguration().mnc; + if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) { + Log.w(TAG, "Choosing MCC+MNC info from TelephonyManager.getSimOperator()"); + return tm.getSimOperator(); + } else if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) { + Log.w(TAG, "Choosing MCC+MNC info from TelephonyManager.getNetworkOperator()"); + return tm.getNetworkOperator(); + } else if (configMcc != 0 && configMnc != 0) { + Log.w(TAG, "Choosing MCC+MNC info from current context's Configuration"); + return String.format("%03d%d", + configMcc, + configMnc == Configuration.MNC_ZERO ? 0 : configMnc); + } else { + return null; + } + } + + public static String getApn(final Context context) { + final ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + return cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS).getExtraInfo(); + } +}