From 3c4e929cfdfe5573e1be3ee0331fc6029e45c382 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 29 Dec 2010 09:55:29 -0800 Subject: 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 --- .../telephony/cdma/CdmaDataConnectionTracker.java | 3 +- .../android/internal/telephony/gsm/ApnSetting.java | 103 +++++++++++++++------ .../internal/telephony/gsm/GsmDataConnection.java | 10 +- .../telephony/gsm/GsmDataConnectionTracker.java | 5 +- 4 files changed, 92 insertions(+), 29 deletions(-) (limited to 'telephony/java') 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: + * , , , , , , + * , , , , ,, + * [, ...] + * + * v2 format: + * [ApnSettingV2] , , , , , , + * , , , , , + * [| ...], , + * + * 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()); } -- cgit v1.1