19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17176935c6055fd652a6ab298a01d6377b928178cdWink Savillepackage com.android.internal.telephony; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class represents a apn setting for create PDP link 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ApnSetting { 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 248e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*"; 258e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti 26561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String carrier; 27561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String apn; 28561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String proxy; 29561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String port; 30561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String mmsc; 31561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String mmsProxy; 32561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String mmsPort; 33561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String user; 34561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String password; 35561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final int authType; 36561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String[] types; 37561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final int id; 38561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String numeric; 39561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String protocol; 40561538879bdec19cb0cd2306f1ecacff3ea7a199Robert Greenwalt public final String roamingProtocol; 41723facc20b6545b7ac4e65883be096d517fb3c10sinikang /** 42723facc20b6545b7ac4e65883be096d517fb3c10sinikang * Current status of APN 43723facc20b6545b7ac4e65883be096d517fb3c10sinikang * true : enabled APN, false : disabled APN. 44723facc20b6545b7ac4e65883be096d517fb3c10sinikang */ 45723facc20b6545b7ac4e65883be096d517fb3c10sinikang public final boolean carrierEnabled; 46723facc20b6545b7ac4e65883be096d517fb3c10sinikang /** 47723facc20b6545b7ac4e65883be096d517fb3c10sinikang * Radio Access Technology info 48723facc20b6545b7ac4e65883be096d517fb3c10sinikang * To check what values can hold, refer to ServiceState.java. 49723facc20b6545b7ac4e65883be096d517fb3c10sinikang * This should be spread to other technologies, 50723facc20b6545b7ac4e65883be096d517fb3c10sinikang * but currently only used for LTE(14) and EHRPD(13). 51723facc20b6545b7ac4e65883be096d517fb3c10sinikang */ 52723facc20b6545b7ac4e65883be096d517fb3c10sinikang public final int bearer; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 548e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti public ApnSetting(int id, String numeric, String carrier, String apn, 558e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti String proxy, String port, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mmsc, String mmsProxy, String mmsPort, 578e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti String user, String password, int authType, String[] types, 58723facc20b6545b7ac4e65883be096d517fb3c10sinikang String protocol, String roamingProtocol, boolean carrierEnabled, int bearer) { 59fe3492dde042cc6646e63f12a237773391806328John Huang this.id = id; 60fe3492dde042cc6646e63f12a237773391806328John Huang this.numeric = numeric; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.carrier = carrier; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.apn = apn; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.proxy = proxy; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.port = port; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mmsc = mmsc; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mmsProxy = mmsProxy; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mmsPort = mmsPort; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.user = user; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.password = password; 702811f1625ebdb7f7483b8b866694474f89112d8cJaikumar Ganesh this.authType = authType; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.types = types; 728e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti this.protocol = protocol; 738e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti this.roamingProtocol = roamingProtocol; 74723facc20b6545b7ac4e65883be096d517fb3c10sinikang this.carrierEnabled = carrierEnabled; 75723facc20b6545b7ac4e65883be096d517fb3c10sinikang this.bearer = bearer; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 788e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti /** 798e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * Creates an ApnSetting object from a string. 808e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * 818e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * @param data the string to read. 828e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * 838e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * The string must be in one of two formats (newlines added for clarity, 848e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * spaces are optional): 858e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * 868e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * v1 format: 878e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, 888e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>, 898e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * <type>[, <type>...] 908e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * 918e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * v2 format: 928e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, 93723facc20b6545b7ac4e65883be096d517fb3c10sinikang * <mmsport>, <user>, <password>, <authtype>, <mcc>, <mnc>, 94723facc20b6545b7ac4e65883be096d517fb3c10sinikang * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearer> 958e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * 968e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * Note that the strings generated by toString() do not contain the username 978e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * and password and thus cannot be read by this method. 988e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * 998e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti * @see ApnSettingTest 1008e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti */ 10177b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt public static ApnSetting fromString(String data) { 10277b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt if (data == null) return null; 1038e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti 1048e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti int version; 1058e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti // matches() operates on the whole string, so append .* to the regex. 1068e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti if (data.matches(V2_FORMAT_REGEX + ".*")) { 1078e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti version = 2; 1088e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti data = data.replaceFirst(V2_FORMAT_REGEX, ""); 1098e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti } else { 1108e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti version = 1; 1118e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti } 1128e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti 11377b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt String[] a = data.split("\\s*,\\s*"); 1148e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti if (a.length < 14) { 1158e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti return null; 1168e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti } 1178e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti 1188e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti int authType; 11977b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt try { 12077b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt authType = Integer.parseInt(a[12]); 12177b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt } catch (Exception e) { 1228e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti authType = 0; 12377b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt } 1248e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti 1258e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti String[] typeArray; 1268e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti String protocol, roamingProtocol; 127723facc20b6545b7ac4e65883be096d517fb3c10sinikang boolean carrierEnabled; 128723facc20b6545b7ac4e65883be096d517fb3c10sinikang int bearer; 1298e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti if (version == 1) { 1308e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti typeArray = new String[a.length - 13]; 1318e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti System.arraycopy(a, 13, typeArray, 0, a.length - 13); 1328e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti protocol = RILConstants.SETUP_DATA_PROTOCOL_IP; 1338e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP; 134723facc20b6545b7ac4e65883be096d517fb3c10sinikang carrierEnabled = true; 135723facc20b6545b7ac4e65883be096d517fb3c10sinikang bearer = 0; 1368e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti } else { 137723facc20b6545b7ac4e65883be096d517fb3c10sinikang if (a.length < 18) { 1388e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti return null; 1398e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti } 1408e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti typeArray = a[13].split("\\s*\\|\\s*"); 1418e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti protocol = a[14]; 1428e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti roamingProtocol = a[15]; 143723facc20b6545b7ac4e65883be096d517fb3c10sinikang try { 144723facc20b6545b7ac4e65883be096d517fb3c10sinikang carrierEnabled = Boolean.parseBoolean(a[16]); 145723facc20b6545b7ac4e65883be096d517fb3c10sinikang } catch (Exception e) { 146723facc20b6545b7ac4e65883be096d517fb3c10sinikang carrierEnabled = true; 147723facc20b6545b7ac4e65883be096d517fb3c10sinikang } 148723facc20b6545b7ac4e65883be096d517fb3c10sinikang bearer = Integer.parseInt(a[17]); 1498e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti } 1508e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti 15177b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8], 152723facc20b6545b7ac4e65883be096d517fb3c10sinikang a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol,carrierEnabled,bearer); 15377b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt } 15477b32ddbbeeb13a07b16f23af705567c75a8e3dfRobert Greenwalt 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 1578e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti sb.append("[ApnSettingV2] ") 1588e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti .append(carrier) 159fe3492dde042cc6646e63f12a237773391806328John Huang .append(", ").append(id) 160fe3492dde042cc6646e63f12a237773391806328John Huang .append(", ").append(numeric) 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .append(", ").append(apn) 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .append(", ").append(proxy) 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .append(", ").append(mmsc) 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .append(", ").append(mmsProxy) 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .append(", ").append(mmsPort) 1662811f1625ebdb7f7483b8b866694474f89112d8cJaikumar Ganesh .append(", ").append(port) 1678e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti .append(", ").append(authType).append(", "); 1688e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti for (int i = 0; i < types.length; i++) { 1698e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti sb.append(types[i]); 1708e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti if (i < types.length - 1) { 1718e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti sb.append(" | "); 1728e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1748e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti sb.append(", ").append(protocol); 1758e63c3e33b2dc8ed8020915ceee011b99cbad99fLorenzo Colitti sb.append(", ").append(roamingProtocol); 176723facc20b6545b7ac4e65883be096d517fb3c10sinikang sb.append(", ").append(carrierEnabled); 177723facc20b6545b7ac4e65883be096d517fb3c10sinikang sb.append(", ").append(bearer); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18178b6e899145b08bbb8ccf3f12ecf0a5bb792033bRobert Greenwalt public boolean canHandleType(String type) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String t : types) { 18342acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt // DEFAULT handles all, and HIPRI is handled by DEFAULT 184bcf1276830bfe44669fd4876a6ce933ae57de8fcRobert Greenwalt if (t.equalsIgnoreCase(type) || 185bcf1276830bfe44669fd4876a6ce933ae57de8fcRobert Greenwalt t.equalsIgnoreCase(Phone.APN_TYPE_ALL) || 186bcf1276830bfe44669fd4876a6ce933ae57de8fcRobert Greenwalt (t.equalsIgnoreCase(Phone.APN_TYPE_DEFAULT) && 187bcf1276830bfe44669fd4876a6ce933ae57de8fcRobert Greenwalt type.equalsIgnoreCase(Phone.APN_TYPE_HIPRI))) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1937cb88dda5b9ee7c19f0f6c3c7a240eb1674fe2f4Robert Greenwalt 1947cb88dda5b9ee7c19f0f6c3c7a240eb1674fe2f4Robert Greenwalt // TODO - if we have this function we should also have hashCode. 1957cb88dda5b9ee7c19f0f6c3c7a240eb1674fe2f4Robert Greenwalt // Also should handle changes in type order and perhaps case-insensitivity 1967cb88dda5b9ee7c19f0f6c3c7a240eb1674fe2f4Robert Greenwalt public boolean equals(Object o) { 1977cb88dda5b9ee7c19f0f6c3c7a240eb1674fe2f4Robert Greenwalt if (o instanceof ApnSetting == false) return false; 1987cb88dda5b9ee7c19f0f6c3c7a240eb1674fe2f4Robert Greenwalt return (this.toString().equals(o.toString())); 1997cb88dda5b9ee7c19f0f6c3c7a240eb1674fe2f4Robert Greenwalt } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 201