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