Merge "Add a protocol property to the APNs and use it." into gingerbread

This commit is contained in:
Lorenzo Colitti
2011-03-03 17:04:07 -08:00
committed by Android (Google) Code Review
6 changed files with 215 additions and 29 deletions

View File

@@ -1712,6 +1712,21 @@ public final class Telephony {
public static final String TYPE = "type";
/**
* The protocol to be used to connect to this APN.
*
* One of the PDP_type values in TS 27.007 section 10.1.1.
* For example, "IP", "IPV6", "IPV4V6", or "PPP".
*/
public static final String PROTOCOL = "protocol";
/**
* The protocol to be used to connect to this APN when roaming.
*
* The syntax is the same as protocol.
*/
public static final String ROAMING_PROTOCOL = "roaming_protocol";
public static final String CURRENT = "current";
}

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

View File

@@ -0,0 +1,108 @@
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony.gsm;
import junit.framework.TestCase;
import android.test.suitebuilder.annotation.SmallTest;
public class ApnSettingTest extends TestCase {
public static final String[] TYPES = {"default", "*"};
public static void assertApnSettingEqual(ApnSetting a1, ApnSetting a2) {
assertEquals(a1.carrier, a2.carrier);
assertEquals(a1.apn, a2.apn);
assertEquals(a1.proxy, a2.proxy);
assertEquals(a1.port, a2.port);
assertEquals(a1.mmsc, a2.mmsc);
assertEquals(a1.mmsProxy, a2.mmsProxy);
assertEquals(a1.mmsPort, a2.mmsPort);
assertEquals(a1.user, a2.user);
assertEquals(a1.password, a2.password);
assertEquals(a1.authType, a2.authType);
assertEquals(a1.id, a2.id);
assertEquals(a1.numeric, a2.numeric);
assertEquals(a1.protocol, a2.protocol);
assertEquals(a1.roamingProtocol, a2.roamingProtocol);
assertEquals(a1.types.length, a2.types.length);
int i;
for (i = 0; i < a1.types.length; i++) {
assertEquals(a1.types[i], a2.types[i]);
}
}
@SmallTest
public void testFromString() throws Exception {
String[] dunTypes = {"DUN"};
String[] mmsTypes = {"mms", "*"};
ApnSetting expected_apn;
String testString;
// A real-world v1 example string.
testString = "Vodafone IT,web.omnitel.it,,,,,,,,,222,10,,DUN";
expected_apn = new ApnSetting(
-1, "22210", "Vodafone IT", "web.omnitel.it", "", "",
"", "", "", "", "", 0, dunTypes, "IP", "IP");
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
// A v2 string.
testString = "[ApnSettingV2] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP";
expected_apn = new ApnSetting(
-1, "12345", "Name", "apn", "", "",
"", "", "", "", "", 0, mmsTypes, "IPV6", "IP");
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
// A v2 string with spaces.
testString = "[ApnSettingV2] Name,apn, ,,,,,,,,123,45,,mms|*,IPV4V6, IP";
expected_apn = new ApnSetting(
-1, "12345", "Name", "apn", "", "",
"", "", "", "", "", 0, mmsTypes, "IPV4V6", "IP");
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
// Return null if insufficient fields given.
testString = "[ApnSettingV2] Name,apn,,,,,,,,,123, 45,,mms|*";
assertEquals(null, ApnSetting.fromString(testString));
testString = "Name,apn,,,,,,,,,123, 45,";
assertEquals(null, ApnSetting.fromString(testString));
// Parse (incorrect) V2 format without the tag as V1.
testString = "Name,apn,,,,,,,,,123, 45,,mms|*,IPV6";
String[] incorrectTypes = {"mms|*", "IPV6"};
expected_apn = new ApnSetting(
-1, "12345", "Name", "apn", "", "",
"", "", "", "", "", 0, incorrectTypes, "IP", "IP");
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
}
@SmallTest
public void testToString() throws Exception {
String[] types = {"default", "*"};
ApnSetting apn = new ApnSetting(
99, "12345", "Name", "apn", "proxy", "port",
"mmsc", "mmsproxy", "mmsport", "user", "password", 0,
types, "IPV4V6", "IP");
String expected = "[ApnSettingV2] Name, 99, 12345, apn, proxy, " +
"mmsc, mmsproxy, mmsport, port, 0, default | *, " +
"IPV4V6, IP";
assertEquals(expected, apn.toString());
}
}