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