10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 174918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savillepackage com.android.internal.telephony.dataconnection; 184918296afe1c667e9523cdfc799f558f7ebc2bfbWink Saville 194918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.PhoneConstants; 204918296afe1c667e9523cdfc799f558f7ebc2bfbWink Savilleimport com.android.internal.telephony.RILConstants; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This class represents a apn setting for create PDP link 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class ApnSetting { 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*"; 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String carrier; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String apn; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String proxy; 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String port; 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String mmsc; 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String mmsProxy; 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String mmsPort; 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String user; 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String password; 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final int authType; 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String[] types; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final int id; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String numeric; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String protocol; 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final String roamingProtocol; 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Current status of APN 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * true : enabled APN, false : disabled APN. 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final boolean carrierEnabled; 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Radio Access Technology info 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * To check what values can hold, refer to ServiceState.java. 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This should be spread to other technologies, 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * but currently only used for LTE(14) and EHRPD(13). 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public final int bearer; 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public ApnSetting(int id, String numeric, String carrier, String apn, 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String proxy, String port, 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String mmsc, String mmsProxy, String mmsPort, 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String user, String password, int authType, String[] types, 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String protocol, String roamingProtocol, boolean carrierEnabled, int bearer) { 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.id = id; 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.numeric = numeric; 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.carrier = carrier; 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.apn = apn; 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.proxy = proxy; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.port = port; 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.mmsc = mmsc; 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.mmsProxy = mmsProxy; 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.mmsPort = mmsPort; 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.user = user; 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.password = password; 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.authType = authType; 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.types = types; 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.protocol = protocol; 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.roamingProtocol = roamingProtocol; 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.carrierEnabled = carrierEnabled; 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.bearer = bearer; 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Creates an ApnSetting object from a string. 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param data the string to read. 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The string must be in one of two formats (newlines added for clarity, 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * spaces are optional): 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * v1 format: 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>, 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <type>[, <type>...] 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * v2 format: 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>, 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <mmsport>, <user>, <password>, <authtype>, <mcc>, <mnc>, 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearer> 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note that the strings generated by toString() do not contain the username 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and password and thus cannot be read by this method. 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static ApnSetting fromString(String data) { 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (data == null) return null; 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int version; 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // matches() operates on the whole string, so append .* to the regex. 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (data.matches(V2_FORMAT_REGEX + ".*")) { 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville version = 2; 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville data = data.replaceFirst(V2_FORMAT_REGEX, ""); 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville version = 1; 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String[] a = data.split("\\s*,\\s*"); 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (a.length < 14) { 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int authType; 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville authType = Integer.parseInt(a[12]); 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (Exception e) { 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville authType = 0; 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String[] typeArray; 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String protocol, roamingProtocol; 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean carrierEnabled; 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int bearer; 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (version == 1) { 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville typeArray = new String[a.length - 13]; 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville System.arraycopy(a, 13, typeArray, 0, a.length - 13); 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protocol = RILConstants.SETUP_DATA_PROTOCOL_IP; 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP; 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville carrierEnabled = true; 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bearer = 0; 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (a.length < 18) { 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville typeArray = a[13].split("\\s*\\|\\s*"); 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protocol = a[14]; 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville roamingProtocol = a[15]; 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville carrierEnabled = Boolean.parseBoolean(a[16]); 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (Exception e) { 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville carrierEnabled = true; 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bearer = Integer.parseInt(a[17]); 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8], 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol,carrierEnabled,bearer); 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 156cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String toString() { 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville StringBuilder sb = new StringBuilder(); 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append("[ApnSettingV2] ") 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .append(carrier) 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .append(", ").append(id) 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .append(", ").append(numeric) 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .append(", ").append(apn) 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .append(", ").append(proxy) 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .append(", ").append(mmsc) 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .append(", ").append(mmsProxy) 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .append(", ").append(mmsPort) 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .append(", ").append(port) 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .append(", ").append(authType).append(", "); 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < types.length; i++) { 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(types[i]); 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (i < types.length - 1) { 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(" | "); 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(", ").append(protocol); 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(", ").append(roamingProtocol); 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(", ").append(carrierEnabled); 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(", ").append(bearer); 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return sb.toString(); 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean canHandleType(String type) { 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (String t : types) { 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // DEFAULT handles all, and HIPRI is handled by DEFAULT 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (t.equalsIgnoreCase(type) || 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville t.equalsIgnoreCase(PhoneConstants.APN_TYPE_ALL) || 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (t.equalsIgnoreCase(PhoneConstants.APN_TYPE_DEFAULT) && 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville type.equalsIgnoreCase(PhoneConstants.APN_TYPE_HIPRI))) { 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // TODO - if we have this function we should also have hashCode. 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Also should handle changes in type order and perhaps case-insensitivity 198cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean equals(Object o) { 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (o instanceof ApnSetting == false) return false; 20122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return (toString().equals(o.toString())); 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 204