diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2010-12-29 09:55:29 -0800 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2011-02-28 11:17:05 -0800 |
commit | 3c4e929cfdfe5573e1be3ee0331fc6029e45c382 (patch) | |
tree | 3533e3560c4e1d895a927bb4bf072674d0c3a06a /telephony/java | |
parent | 93faa3239e4bd8d70efb85405bc9c8849ab77897 (diff) | |
download | frameworks_base-3c4e929cfdfe5573e1be3ee0331fc6029e45c382.zip frameworks_base-3c4e929cfdfe5573e1be3ee0331fc6029e45c382.tar.gz frameworks_base-3c4e929cfdfe5573e1be3ee0331fc6029e45c382.tar.bz2 |
Add a protocol property to the APNs and use it.
1. Database changes:
- Add a protocol and a roaming_protocol column to the
carriers table in the telephony provider database.
- Set the protocol and roaming_protocol fields when
creating APN objects from the database.
2. ApnSetting class changes:
- Add protocol and roamingProtocol fields to the
ApnSetting class that encapsulates APN settings within
the framework.
- Add the fields to ApnSetting.toString and support a new
syntax containing the fields in ApnSetting.fromString.
- Add a unit test for ApnSetting.
3. Telephony changes:
- Specify the APN protocol when setting up a data call,
using protocol when not roaming and roaming_protocol
when roaming.
This change depends on #86896 in the telephony provider,
which adds the new column to the database schema on
upgrades.
Bug: 3333633
Change-Id: If3d9ed4c851d0192849df0d64581db03b066e052
Diffstat (limited to 'telephony/java')
4 files changed, 92 insertions, 29 deletions
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java index 9f2a44b..fa80063 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java @@ -432,7 +432,8 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { } else { types = mDefaultApnTypes; } - mActiveApn = new ApnSetting(0, "", "", "", "", "", "", "", "", "", "", 0, types); + mActiveApn = new ApnSetting(0, "", "", "", "", "", "", "", "", "", "", + 0, types, "IP", "IP"); Message msg = obtainMessage(); msg.what = EVENT_DATA_SETUP_COMPLETE; diff --git a/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java b/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java index 05527af..e96ad72 100644 --- a/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java +++ b/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java @@ -22,6 +22,8 @@ import com.android.internal.telephony.*; */ public class ApnSetting { + static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*"; + String carrier; String apn; String proxy; @@ -35,11 +37,14 @@ public class ApnSetting { public String[] types; int id; String numeric; + String protocol; + String roamingProtocol; - - public ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port, + public ApnSetting(int id, String numeric, String carrier, String apn, + String proxy, String port, String mmsc, String mmsProxy, String mmsPort, - String user, String password, int authType, String[] types) { + String user, String password, int authType, String[] types, + String protocol, String roamingProtocol) { this.id = id; this.numeric = numeric; this.carrier = carrier; @@ -53,40 +58,81 @@ public class ApnSetting { this.password = password; this.authType = authType; this.types = types; + this.protocol = protocol; + this.roamingProtocol = roamingProtocol; } - // data[0] = name - // data[1] = apn - // data[2] = proxy - // data[3] = port - // data[4] = username - // data[5] = password - // data[6] = server - // data[7] = mmsc - // data[8] = mmsproxy - // data[9] = mmsport - // data[10] = mcc - // data[11] = mnc - // data[12] = auth - // data[13] = first type... + /** + * Creates an ApnSetting object from a string. + * + * @param data the string to read. + * + * The string must be in one of two formats (newlines added for clarity, + * spaces are optional): + * + * v1 format: + * <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, + * <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>, + * <type>[, <type>...] + * + * v2 format: + * [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, + * <mmsport>, <user>, <password, <authtype>, <mcc>, <mnc>, + * <type>[| <type>...], <protocol>, <roaming_protocol> + * + * Note that the strings generated by toString() do not contain the username + * and password and thus cannot be read by this method. + * + * @see ApnSettingTest + */ public static ApnSetting fromString(String data) { if (data == null) return null; + + int version; + // matches() operates on the whole string, so append .* to the regex. + if (data.matches(V2_FORMAT_REGEX + ".*")) { + version = 2; + data = data.replaceFirst(V2_FORMAT_REGEX, ""); + } else { + version = 1; + } + String[] a = data.split("\\s*,\\s*"); - if (a.length < 14) return null; - int authType = 0; + if (a.length < 14) { + return null; + } + + int authType; try { authType = Integer.parseInt(a[12]); } catch (Exception e) { + authType = 0; } - String[] typeArray = new String[a.length - 13]; - System.arraycopy(a, 13, typeArray, 0, a.length - 13); + + String[] typeArray; + String protocol, roamingProtocol; + if (version == 1) { + typeArray = new String[a.length - 13]; + System.arraycopy(a, 13, typeArray, 0, a.length - 13); + protocol = RILConstants.SETUP_DATA_PROTOCOL_IP; + roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP; + } else { + if (a.length < 16) { + return null; + } + typeArray = a[13].split("\\s*\\|\\s*"); + protocol = a[14]; + roamingProtocol = a[15]; + } + return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8], - a[9],a[4],a[5],authType,typeArray); + a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol); } public String toString() { StringBuilder sb = new StringBuilder(); - sb.append(carrier) + sb.append("[ApnSettingV2] ") + .append(carrier) .append(", ").append(id) .append(", ").append(numeric) .append(", ").append(apn) @@ -95,10 +141,15 @@ public class ApnSetting { .append(", ").append(mmsProxy) .append(", ").append(mmsPort) .append(", ").append(port) - .append(", ").append(authType); - for (String t : types) { - sb.append(", ").append(t); + .append(", ").append(authType).append(", "); + for (int i = 0; i < types.length; i++) { + sb.append(types[i]); + if (i < types.length - 1) { + sb.append(" | "); + } } + sb.append(", ").append(protocol); + sb.append(", ").append(roamingProtocol); return sb.toString(); } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java index 7437ba9..3de4c27 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java @@ -104,11 +104,19 @@ public class GsmDataConnection extends DataConnection { authType = (apn.user != null) ? RILConstants.SETUP_DATA_AUTH_PAP_CHAP : RILConstants.SETUP_DATA_AUTH_NONE; } + + String protocol; + if (phone.getServiceState().getRoaming()) { + protocol = apn.roamingProtocol; + } else { + protocol = apn.protocol; + } + phone.mCM.setupDataCall( Integer.toString(RILConstants.SETUP_DATA_TECH_GSM), Integer.toString(RILConstants.DATA_PROFILE_DEFAULT), apn.apn, apn.user, apn.password, Integer.toString(authType), - RILConstants.SETUP_DATA_PROTOCOL_IP, msg); + protocol, msg); } @Override diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index ab9cf2a..10988b1 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -559,7 +559,10 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)), cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)), cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)), - types); + types, + cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)), + cursor.getString(cursor.getColumnIndexOrThrow( + Telephony.Carriers.ROAMING_PROTOCOL))); result.add(apn); } while (cursor.moveToNext()); } |