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
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This class represents a apn setting for create PDP link
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class ApnSetting {
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*";
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String carrier;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String apn;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String proxy;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String port;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String mmsc;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String mmsProxy;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String mmsPort;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String user;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String password;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final int authType;
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String[] types;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final int id;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String numeric;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String protocol;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final String roamingProtocol;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville      * Current status of APN
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville      * true : enabled APN, false : disabled APN.
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville      */
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final boolean carrierEnabled;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville      * Radio Access Technology info
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville      * To check what values can hold, refer to ServiceState.java.
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville      * This should be spread to other technologies,
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville      * but currently only used for LTE(14) and EHRPD(13).
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville      */
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final int bearer;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ApnSetting(int id, String numeric, String carrier, String apn,
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String proxy, String port,
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String mmsc, String mmsProxy, String mmsPort,
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String user, String password, int authType, String[] types,
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String protocol, String roamingProtocol, boolean carrierEnabled, int bearer) {
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.id = id;
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.numeric = numeric;
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.carrier = carrier;
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.apn = apn;
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.proxy = proxy;
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.port = port;
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.mmsc = mmsc;
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.mmsProxy = mmsProxy;
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.mmsPort = mmsPort;
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.user = user;
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.password = password;
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.authType = authType;
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.types = types;
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.protocol = protocol;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.roamingProtocol = roamingProtocol;
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.carrierEnabled = carrierEnabled;
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.bearer = bearer;
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Creates an ApnSetting object from a string.
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param data the string to read.
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The string must be in one of two formats (newlines added for clarity,
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * spaces are optional):
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * v1 format:
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>,
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   <type>[, <type>...]
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * v2 format:
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   <mmsport>, <user>, <password>, <authtype>, <mcc>, <mnc>,
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearer>
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Note that the strings generated by toString() do not contain the username
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * and password and thus cannot be read by this method.
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @see ApnSettingTest
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static ApnSetting fromString(String data) {
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (data == null) return null;
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int version;
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // matches() operates on the whole string, so append .* to the regex.
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (data.matches(V2_FORMAT_REGEX + ".*")) {
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            version = 2;
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            data = data.replaceFirst(V2_FORMAT_REGEX, "");
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            version = 1;
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] a = data.split("\\s*,\\s*");
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (a.length < 14) {
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int authType;
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            authType = Integer.parseInt(a[12]);
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (Exception e) {
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            authType = 0;
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] typeArray;
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String protocol, roamingProtocol;
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean carrierEnabled;
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int bearer;
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (version == 1) {
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            typeArray = new String[a.length - 13];
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            System.arraycopy(a, 13, typeArray, 0, a.length - 13);
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            protocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            carrierEnabled = true;
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            bearer = 0;
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (a.length < 18) {
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return null;
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            typeArray = a[13].split("\\s*\\|\\s*");
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            protocol = a[14];
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            roamingProtocol = a[15];
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                carrierEnabled = Boolean.parseBoolean(a[16]);
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (Exception e) {
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                carrierEnabled = true;
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            bearer = Integer.parseInt(a[17]);
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8],
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol,carrierEnabled,bearer);
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String toString() {
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        StringBuilder sb = new StringBuilder();
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sb.append("[ApnSettingV2] ")
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        .append(carrier)
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        .append(", ").append(id)
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        .append(", ").append(numeric)
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        .append(", ").append(apn)
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        .append(", ").append(proxy)
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        .append(", ").append(mmsc)
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        .append(", ").append(mmsProxy)
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        .append(", ").append(mmsPort)
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        .append(", ").append(port)
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        .append(", ").append(authType).append(", ");
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < types.length; i++) {
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sb.append(types[i]);
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (i < types.length - 1) {
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                sb.append(" | ");
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sb.append(", ").append(protocol);
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sb.append(", ").append(roamingProtocol);
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sb.append(", ").append(carrierEnabled);
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sb.append(", ").append(bearer);
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return sb.toString();
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean canHandleType(String type) {
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (String t : types) {
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // DEFAULT handles all, and HIPRI is handled by DEFAULT
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (t.equalsIgnoreCase(type) ||
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    t.equalsIgnoreCase(PhoneConstants.APN_TYPE_ALL) ||
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    (t.equalsIgnoreCase(PhoneConstants.APN_TYPE_DEFAULT) &&
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    type.equalsIgnoreCase(PhoneConstants.APN_TYPE_HIPRI))) {
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return true;
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // TODO - if we have this function we should also have hashCode.
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Also should handle changes in type order and perhaps case-insensitivity
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean equals(Object o) {
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (o instanceof ApnSetting == false) return false;
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return (this.toString().equals(o.toString()));
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
201