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";
|
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";
|
public static final String CURRENT = "current";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -432,7 +432,8 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
|
|||||||
} else {
|
} else {
|
||||||
types = mDefaultApnTypes;
|
types = mDefaultApnTypes;
|
||||||
}
|
}
|
||||||
mActiveApn = new ApnSetting(0, "", "", "", "", "", "", "", "", "", "", 0, types);
|
mActiveApn = new ApnSetting(0, "", "", "", "", "", "", "", "", "", "",
|
||||||
|
0, types, "IP", "IP");
|
||||||
|
|
||||||
Message msg = obtainMessage();
|
Message msg = obtainMessage();
|
||||||
msg.what = EVENT_DATA_SETUP_COMPLETE;
|
msg.what = EVENT_DATA_SETUP_COMPLETE;
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import com.android.internal.telephony.*;
|
|||||||
*/
|
*/
|
||||||
public class ApnSetting {
|
public class ApnSetting {
|
||||||
|
|
||||||
|
static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*";
|
||||||
|
|
||||||
String carrier;
|
String carrier;
|
||||||
String apn;
|
String apn;
|
||||||
String proxy;
|
String proxy;
|
||||||
@@ -35,11 +37,14 @@ public class ApnSetting {
|
|||||||
public String[] types;
|
public String[] types;
|
||||||
int id;
|
int id;
|
||||||
String numeric;
|
String numeric;
|
||||||
|
String protocol;
|
||||||
|
String roamingProtocol;
|
||||||
|
|
||||||
|
public ApnSetting(int id, String numeric, String carrier, String apn,
|
||||||
public ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port,
|
String proxy, String port,
|
||||||
String mmsc, String mmsProxy, String mmsPort,
|
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.id = id;
|
||||||
this.numeric = numeric;
|
this.numeric = numeric;
|
||||||
this.carrier = carrier;
|
this.carrier = carrier;
|
||||||
@@ -53,40 +58,81 @@ public class ApnSetting {
|
|||||||
this.password = password;
|
this.password = password;
|
||||||
this.authType = authType;
|
this.authType = authType;
|
||||||
this.types = types;
|
this.types = types;
|
||||||
|
this.protocol = protocol;
|
||||||
|
this.roamingProtocol = roamingProtocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
// data[0] = name
|
/**
|
||||||
// data[1] = apn
|
* Creates an ApnSetting object from a string.
|
||||||
// data[2] = proxy
|
*
|
||||||
// data[3] = port
|
* @param data the string to read.
|
||||||
// data[4] = username
|
*
|
||||||
// data[5] = password
|
* The string must be in one of two formats (newlines added for clarity,
|
||||||
// data[6] = server
|
* spaces are optional):
|
||||||
// data[7] = mmsc
|
*
|
||||||
// data[8] = mmsproxy
|
* v1 format:
|
||||||
// data[9] = mmsport
|
* <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
|
||||||
// data[10] = mcc
|
* <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>,
|
||||||
// data[11] = mnc
|
* <type>[, <type>...]
|
||||||
// data[12] = auth
|
*
|
||||||
// data[13] = first 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) {
|
public static ApnSetting fromString(String data) {
|
||||||
if (data == null) return null;
|
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*");
|
String[] a = data.split("\\s*,\\s*");
|
||||||
if (a.length < 14) return null;
|
if (a.length < 14) {
|
||||||
int authType = 0;
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int authType;
|
||||||
try {
|
try {
|
||||||
authType = Integer.parseInt(a[12]);
|
authType = Integer.parseInt(a[12]);
|
||||||
} catch (Exception e) {
|
} 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],
|
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() {
|
public String toString() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append(carrier)
|
sb.append("[ApnSettingV2] ")
|
||||||
|
.append(carrier)
|
||||||
.append(", ").append(id)
|
.append(", ").append(id)
|
||||||
.append(", ").append(numeric)
|
.append(", ").append(numeric)
|
||||||
.append(", ").append(apn)
|
.append(", ").append(apn)
|
||||||
@@ -95,10 +141,15 @@ public class ApnSetting {
|
|||||||
.append(", ").append(mmsProxy)
|
.append(", ").append(mmsProxy)
|
||||||
.append(", ").append(mmsPort)
|
.append(", ").append(mmsPort)
|
||||||
.append(", ").append(port)
|
.append(", ").append(port)
|
||||||
.append(", ").append(authType);
|
.append(", ").append(authType).append(", ");
|
||||||
for (String t : types) {
|
for (int i = 0; i < types.length; i++) {
|
||||||
sb.append(", ").append(t);
|
sb.append(types[i]);
|
||||||
|
if (i < types.length - 1) {
|
||||||
|
sb.append(" | ");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
sb.append(", ").append(protocol);
|
||||||
|
sb.append(", ").append(roamingProtocol);
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,11 +104,19 @@ public class GsmDataConnection extends DataConnection {
|
|||||||
authType = (apn.user != null) ? RILConstants.SETUP_DATA_AUTH_PAP_CHAP :
|
authType = (apn.user != null) ? RILConstants.SETUP_DATA_AUTH_PAP_CHAP :
|
||||||
RILConstants.SETUP_DATA_AUTH_NONE;
|
RILConstants.SETUP_DATA_AUTH_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String protocol;
|
||||||
|
if (phone.getServiceState().getRoaming()) {
|
||||||
|
protocol = apn.roamingProtocol;
|
||||||
|
} else {
|
||||||
|
protocol = apn.protocol;
|
||||||
|
}
|
||||||
|
|
||||||
phone.mCM.setupDataCall(
|
phone.mCM.setupDataCall(
|
||||||
Integer.toString(RILConstants.SETUP_DATA_TECH_GSM),
|
Integer.toString(RILConstants.SETUP_DATA_TECH_GSM),
|
||||||
Integer.toString(RILConstants.DATA_PROFILE_DEFAULT),
|
Integer.toString(RILConstants.DATA_PROFILE_DEFAULT),
|
||||||
apn.apn, apn.user, apn.password, Integer.toString(authType),
|
apn.apn, apn.user, apn.password, Integer.toString(authType),
|
||||||
RILConstants.SETUP_DATA_PROTOCOL_IP, msg);
|
protocol, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -559,7 +559,10 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)),
|
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)),
|
||||||
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)),
|
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)),
|
||||||
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)),
|
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);
|
result.add(apn);
|
||||||
} while (cursor.moveToNext());
|
} 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