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
This commit is contained in:
Lorenzo Colitti
2010-12-29 09:55:29 -08:00
parent 93faa3239e
commit 3c4e929cfd
6 changed files with 215 additions and 29 deletions

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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());
}