Merge "Add a protocol property to the APNs and use it." into gingerbread
This commit is contained in:
committed by
Android (Google) Code Review
commit
b028ce55ca
@@ -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";
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user