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 #94983 in the telephony provider,
which adds the new column to the database schema on
upgrades.
Change-Id: Ic4e3f02e48f17990f657187b9919d265671f0138
167 lines
5.3 KiB
Java
167 lines
5.3 KiB
Java
/*
|
|
* Copyright (C) 2006 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;
|
|
|
|
/**
|
|
* This class represents a apn setting for create PDP link
|
|
*/
|
|
public class ApnSetting {
|
|
|
|
static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*";
|
|
|
|
public String carrier;
|
|
public String apn;
|
|
public String proxy;
|
|
public String port;
|
|
public String mmsc;
|
|
public String mmsProxy;
|
|
public String mmsPort;
|
|
public String user;
|
|
public String password;
|
|
public int authType;
|
|
public String[] types;
|
|
public int id;
|
|
public String numeric;
|
|
public String protocol;
|
|
public String roamingProtocol;
|
|
|
|
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 protocol, String roamingProtocol) {
|
|
this.id = id;
|
|
this.numeric = numeric;
|
|
this.carrier = carrier;
|
|
this.apn = apn;
|
|
this.proxy = proxy;
|
|
this.port = port;
|
|
this.mmsc = mmsc;
|
|
this.mmsProxy = mmsProxy;
|
|
this.mmsPort = mmsPort;
|
|
this.user = user;
|
|
this.password = password;
|
|
this.authType = authType;
|
|
this.types = types;
|
|
this.protocol = protocol;
|
|
this.roamingProtocol = roamingProtocol;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
try {
|
|
authType = Integer.parseInt(a[12]);
|
|
} catch (Exception e) {
|
|
authType = 0;
|
|
}
|
|
|
|
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,protocol,roamingProtocol);
|
|
}
|
|
|
|
public String toString() {
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("[ApnSettingV2] ")
|
|
.append(carrier)
|
|
.append(", ").append(id)
|
|
.append(", ").append(numeric)
|
|
.append(", ").append(apn)
|
|
.append(", ").append(proxy)
|
|
.append(", ").append(mmsc)
|
|
.append(", ").append(mmsProxy)
|
|
.append(", ").append(mmsPort)
|
|
.append(", ").append(port)
|
|
.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();
|
|
}
|
|
|
|
public boolean canHandleType(String type) {
|
|
for (String t : types) {
|
|
// DEFAULT handles all, and HIPRI is handled by DEFAULT
|
|
if (t.equals(type) || t.equals(Phone.APN_TYPE_ALL) ||
|
|
(t.equals(Phone.APN_TYPE_DEFAULT) &&
|
|
type.equals(Phone.APN_TYPE_HIPRI))) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|