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:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user