Revert "Revert "add apn setting parameters, and set apn parameters to bp""
[android/platform/frameworks/opt/telephony.git] / src / java / com / android / internal / telephony / dataconnection / ApnSetting.java
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.internal.telephony.dataconnection;
18
19 import com.android.internal.telephony.PhoneConstants;
20 import com.android.internal.telephony.RILConstants;
21
22 import java.util.Locale;
23
24 /**
25  * This class represents a apn setting for create PDP link
26  */
27 public class ApnSetting {
28
29     static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*";
30     static final String V3_FORMAT_REGEX = "^\\[ApnSettingV3\\]\\s*";
31
32     public final String carrier;
33     public final String apn;
34     public final String proxy;
35     public final String port;
36     public final String mmsc;
37     public final String mmsProxy;
38     public final String mmsPort;
39     public final String user;
40     public final String password;
41     public final int authType;
42     public final String[] types;
43     public final int id;
44     public final String numeric;
45     public final String protocol;
46     public final String roamingProtocol;
47     /**
48       * Current status of APN
49       * true : enabled APN, false : disabled APN.
50       */
51     public final boolean carrierEnabled;
52     /**
53       * Radio Access Technology info
54       * To check what values can hold, refer to ServiceState.java.
55       * This should be spread to other technologies,
56       * but currently only used for LTE(14) and EHRPD(13).
57       */
58     public final int bearer;
59
60     /* ID of the profile in the modem */
61     public final int profileId;
62     public final boolean modemCognitive;
63     public final int maxConns;
64     public final int waitTime;
65     public final int maxConnsTime;
66
67     public ApnSetting(int id, String numeric, String carrier, String apn,
68             String proxy, String port,
69             String mmsc, String mmsProxy, String mmsPort,
70             String user, String password, int authType, String[] types,
71             String protocol, String roamingProtocol, boolean carrierEnabled, int bearer,
72             int profileId, boolean modemCognitive, int maxConns, int waitTime, int maxConnsTime) {
73         this.id = id;
74         this.numeric = numeric;
75         this.carrier = carrier;
76         this.apn = apn;
77         this.proxy = proxy;
78         this.port = port;
79         this.mmsc = mmsc;
80         this.mmsProxy = mmsProxy;
81         this.mmsPort = mmsPort;
82         this.user = user;
83         this.password = password;
84         this.authType = authType;
85         this.types = new String[types.length];
86         for (int i = 0; i < types.length; i++) {
87             this.types[i] = types[i].toLowerCase(Locale.ROOT);
88         }
89         this.protocol = protocol;
90         this.roamingProtocol = roamingProtocol;
91         this.carrierEnabled = carrierEnabled;
92         this.bearer = bearer;
93         this.profileId = profileId;
94         this.modemCognitive = modemCognitive;
95         this.maxConns = maxConns;
96         this.waitTime = waitTime;
97         this.maxConnsTime = maxConnsTime;
98     }
99
100     /**
101      * Creates an ApnSetting object from a string.
102      *
103      * @param data the string to read.
104      *
105      * The string must be in one of two formats (newlines added for clarity,
106      * spaces are optional):
107      *
108      * v1 format:
109      *   <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
110      *   <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>,
111      *   <type>[, <type>...]
112      *
113      * v2 format:
114      *   [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
115      *   <mmsport>, <user>, <password>, <authtype>, <mcc>, <mnc>,
116      *   <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearer>
117      *
118      * v3 format:
119      *   [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
120      *   <mmsport>, <user>, <password>, <authtype>, <mcc>, <mnc>,
121      *   <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearer>,
122      *   <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime>
123      *
124      * Note that the strings generated by toString() do not contain the username
125      * and password and thus cannot be read by this method.
126      */
127     public static ApnSetting fromString(String data) {
128         if (data == null) return null;
129
130         int version;
131         // matches() operates on the whole string, so append .* to the regex.
132         if (data.matches(V3_FORMAT_REGEX + ".*")) {
133             version = 3;
134             data = data.replaceFirst(V3_FORMAT_REGEX, "");
135         } else if (data.matches(V2_FORMAT_REGEX + ".*")) {
136             version = 2;
137             data = data.replaceFirst(V2_FORMAT_REGEX, "");
138         } else {
139             version = 1;
140         }
141
142         String[] a = data.split("\\s*,\\s*");
143         if (a.length < 14) {
144             return null;
145         }
146
147         int authType;
148         try {
149             authType = Integer.parseInt(a[12]);
150         } catch (Exception e) {
151             authType = 0;
152         }
153
154         String[] typeArray;
155         String protocol, roamingProtocol;
156         boolean carrierEnabled;
157         int bearer;
158         int profileId = 0;
159         boolean modemCognitive = false;
160         int maxConns = 0;
161         int waitTime = 0;
162         int maxConnsTime = 0;
163         if (version == 1) {
164             typeArray = new String[a.length - 13];
165             System.arraycopy(a, 13, typeArray, 0, a.length - 13);
166             protocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
167             roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
168             carrierEnabled = true;
169             bearer = 0;
170         } else {
171             if (a.length < 18) {
172                 return null;
173             }
174             typeArray = a[13].split("\\s*\\|\\s*");
175             protocol = a[14];
176             roamingProtocol = a[15];
177             try {
178                 carrierEnabled = Boolean.parseBoolean(a[16]);
179             } catch (Exception e) {
180                 carrierEnabled = true;
181             }
182             bearer = Integer.parseInt(a[17]);
183             if(a.length > 22) {
184                 try {
185                     profileId = Integer.parseInt(a[18]);
186                     modemCognitive = Boolean.parseBoolean(a[19]);
187                     maxConns = Integer.parseInt(a[20]);
188                     waitTime = Integer.parseInt(a[21]);
189                     maxConnsTime = Integer.parseInt(a[22]);
190                 } catch (Exception e) {
191                 }
192             }
193         }
194
195         return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8],
196                 a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol,carrierEnabled,bearer,
197                 profileId, modemCognitive, maxConns, waitTime, maxConnsTime);
198     }
199
200     @Override
201     public String toString() {
202         StringBuilder sb = new StringBuilder();
203         sb.append("[ApnSettingV2] ")
204         .append(carrier)
205         .append(", ").append(id)
206         .append(", ").append(numeric)
207         .append(", ").append(apn)
208         .append(", ").append(proxy)
209         .append(", ").append(mmsc)
210         .append(", ").append(mmsProxy)
211         .append(", ").append(mmsPort)
212         .append(", ").append(port)
213         .append(", ").append(authType).append(", ");
214         for (int i = 0; i < types.length; i++) {
215             sb.append(types[i]);
216             if (i < types.length - 1) {
217                 sb.append(" | ");
218             }
219         }
220         sb.append(", ").append(protocol);
221         sb.append(", ").append(roamingProtocol);
222         sb.append(", ").append(carrierEnabled);
223         sb.append(", ").append(bearer);
224         sb.append(", ").append(profileId);
225         sb.append(", ").append(modemCognitive);
226         sb.append(", ").append(maxConns);
227         sb.append(", ").append(waitTime);
228         sb.append(", ").append(maxConnsTime);
229         return sb.toString();
230     }
231
232     public boolean canHandleType(String type) {
233         if (!carrierEnabled) return false;
234         for (String t : types) {
235             // DEFAULT handles all, and HIPRI is handled by DEFAULT
236             if (t.equalsIgnoreCase(type) ||
237                     t.equalsIgnoreCase(PhoneConstants.APN_TYPE_ALL) ||
238                     (t.equalsIgnoreCase(PhoneConstants.APN_TYPE_DEFAULT) &&
239                     type.equalsIgnoreCase(PhoneConstants.APN_TYPE_HIPRI))) {
240                 return true;
241             }
242         }
243         return false;
244     }
245
246     // TODO - if we have this function we should also have hashCode.
247     // Also should handle changes in type order and perhaps case-insensitivity
248     @Override
249     public boolean equals(Object o) {
250         if (o instanceof ApnSetting == false) return false;
251         return (toString().equals(o.toString()));
252     }
253 }