Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e63c3e3 authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Add a protocol property to the APNs and use it.

1. Database changes:
   - Add a protocol and a roaming_protocol column to the
     carriers table in the telephony provider database.
   - Set the protocol and roaming_protocol fields when
     creating APN objects from the database.

2. ApnSetting class changes:
   - Add protocol and roamingProtocol fields to the
     ApnSetting class that encapsulates APN settings within
     the framework.
   - Add the fields to ApnSetting.toString and support a new
     syntax containing the fields in ApnSetting.fromString.
   - Add a unit test for ApnSetting.

3. Telephony changes:
   - Specify the APN protocol when setting up a data call,
     using protocol when not roaming and roaming_protocol
     when roaming.

This change depends on #94983 in the telephony provider,
which adds the new column to the database schema on
upgrades.

Change-Id: Ic4e3f02e48f17990f657187b9919d265671f0138
parent acdf50c4
Loading
Loading
Loading
Loading
+15 −0
Original line number Original line Diff line number Diff line
@@ -1723,6 +1723,21 @@ public final class Telephony {


        public static final String TYPE = "type";
        public static final String TYPE = "type";


        /**
         * The protocol to be used to connect to this APN.
         *
         * One of the PDP_type values in TS 27.007 section 10.1.1.
         * For example, "IP", "IPV6", "IPV4V6", or "PPP".
         */
        public static final String PROTOCOL = "protocol";

        /**
          * The protocol to be used to connect to this APN when roaming.
          *
          * The syntax is the same as protocol.
          */
        public static final String ROAMING_PROTOCOL = "roaming_protocol";

        public static final String CURRENT = "current";
        public static final String CURRENT = "current";
    }
    }


+77 −26
Original line number Original line Diff line number Diff line
@@ -21,6 +21,8 @@ package com.android.internal.telephony;
 */
 */
public class ApnSetting {
public class ApnSetting {


    static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*";

    public String carrier;
    public String carrier;
    public String apn;
    public String apn;
    public String proxy;
    public String proxy;
@@ -34,11 +36,14 @@ public class ApnSetting {
    public String[] types;
    public String[] types;
    public int id;
    public int id;
    public String numeric;
    public String numeric;
    public String protocol;
    public String roamingProtocol;



    public ApnSetting(int id, String numeric, String carrier, String apn,
    public ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port,
            String proxy, String port,
            String mmsc, String mmsProxy, String mmsPort,
            String mmsc, String mmsProxy, String mmsPort,
            String user, String password, int authType, String[] types) {
            String user, String password, int authType, String[] types,
            String protocol, String roamingProtocol) {
        this.id = id;
        this.id = id;
        this.numeric = numeric;
        this.numeric = numeric;
        this.carrier = carrier;
        this.carrier = carrier;
@@ -52,40 +57,81 @@ public class ApnSetting {
        this.password = password;
        this.password = password;
        this.authType = authType;
        this.authType = authType;
        this.types = types;
        this.types = types;
        this.protocol = protocol;
        this.roamingProtocol = roamingProtocol;
    }
    }


    // data[0] = name
    /**
    // data[1] = apn
     * Creates an ApnSetting object from a string.
    // data[2] = proxy
     *
    // data[3] = port
     * @param data the string to read.
    // data[4] = username
     *
    // data[5] = password
     * The string must be in one of two formats (newlines added for clarity,
    // data[6] = server
     * spaces are optional):
    // data[7] = mmsc
     *
    // data[8] = mmsproxy
     * v1 format:
    // data[9] = mmsport
     *   <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
    // data[10] = mcc
     *   <mmsport>, <user>, <password>, <authtype>, <mcc>,<mnc>,
    // data[11] = mnc
     *   <type>[, <type>...]
    // data[12] = auth
     *
    // data[13] = first type...
     * v2 format:
     *   [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
     *   <mmsport>, <user>, <password, <authtype>, <mcc>, <mnc>,
     *   <type>[| <type>...], <protocol>, <roaming_protocol>
     *
     * Note that the strings generated by toString() do not contain the username
     * and password and thus cannot be read by this method.
     *
     * @see ApnSettingTest
     */
    public static ApnSetting fromString(String data) {
    public static ApnSetting fromString(String data) {
        if (data == null) return null;
        if (data == null) return null;

        int version;
        // matches() operates on the whole string, so append .* to the regex.
        if (data.matches(V2_FORMAT_REGEX + ".*")) {
            version = 2;
            data = data.replaceFirst(V2_FORMAT_REGEX, "");
        } else {
            version = 1;
        }

        String[] a = data.split("\\s*,\\s*");
        String[] a = data.split("\\s*,\\s*");
        if (a.length < 14) return null;
        if (a.length < 14) {
        int authType = 0;
            return null;
        }

        int authType;
        try {
        try {
            authType = Integer.parseInt(a[12]);
            authType = Integer.parseInt(a[12]);
        } catch (Exception e) {
        } catch (Exception e) {
            authType = 0;
        }
        }
        String[] typeArray = new String[a.length - 13];

        String[] typeArray;
        String protocol, roamingProtocol;
        if (version == 1) {
            typeArray = new String[a.length - 13];
            System.arraycopy(a, 13, typeArray, 0, a.length - 13);
            System.arraycopy(a, 13, typeArray, 0, a.length - 13);
            protocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
            roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
        } else {
            if (a.length < 16) {
                return null;
            }
            typeArray = a[13].split("\\s*\\|\\s*");
            protocol = a[14];
            roamingProtocol = a[15];
        }

        return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8],
        return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8],
                a[9],a[4],a[5],authType,typeArray);
                a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol);
    }
    }


    public String toString() {
    public String toString() {
        StringBuilder sb = new StringBuilder();
        StringBuilder sb = new StringBuilder();
        sb.append(carrier)
        sb.append("[ApnSettingV2] ")
        .append(carrier)
        .append(", ").append(id)
        .append(", ").append(id)
        .append(", ").append(numeric)
        .append(", ").append(numeric)
        .append(", ").append(apn)
        .append(", ").append(apn)
@@ -94,10 +140,15 @@ public class ApnSetting {
        .append(", ").append(mmsProxy)
        .append(", ").append(mmsProxy)
        .append(", ").append(mmsPort)
        .append(", ").append(mmsPort)
        .append(", ").append(port)
        .append(", ").append(port)
        .append(", ").append(authType);
        .append(", ").append(authType).append(", ");
        for (String t : types) {
        for (int i = 0; i < types.length; i++) {
            sb.append(", ").append(t);
            sb.append(types[i]);
            if (i < types.length - 1) {
                sb.append(" | ");
            }
        }
        }
        sb.append(", ").append(protocol);
        sb.append(", ").append(roamingProtocol);
        return sb.toString();
        return sb.toString();
    }
    }


+2 −1
Original line number Original line Diff line number Diff line
@@ -336,7 +336,8 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
            types = mDefaultApnTypes;
            types = mDefaultApnTypes;
            apnId = mDefaultApnId;
            apnId = mDefaultApnId;
        }
        }
        mActiveApn = new ApnSetting(apnId, "", "", "", "", "", "", "", "", "", "", 0, types);
        mActiveApn = new ApnSetting(apnId, "", "", "", "", "", "", "", "", "",
                                    "", 0, types, "IP", "IP");
        if (DBG) log("setupData: mActiveApn=" + mActiveApn);
        if (DBG) log("setupData: mActiveApn=" + mActiveApn);


        Message msg = obtainMessage();
        Message msg = obtainMessage();
+10 −3
Original line number Original line Diff line number Diff line
@@ -92,12 +92,19 @@ public class GsmDataConnection extends DataConnection {
            authType = (apn.user != null) ? RILConstants.SETUP_DATA_AUTH_PAP_CHAP :
            authType = (apn.user != null) ? RILConstants.SETUP_DATA_AUTH_PAP_CHAP :
                RILConstants.SETUP_DATA_AUTH_NONE;
                RILConstants.SETUP_DATA_AUTH_NONE;
        }
        }

        String protocol;
        if (phone.getServiceState().getRoaming()) {
            protocol = apn.roamingProtocol;
        } else {
            protocol = apn.protocol;
        }

        phone.mCM.setupDataCall(
        phone.mCM.setupDataCall(
                Integer.toString(RILConstants.SETUP_DATA_TECH_GSM),
                Integer.toString(RILConstants.SETUP_DATA_TECH_GSM),
                Integer.toString(RILConstants.DATA_PROFILE_DEFAULT),
                Integer.toString(RILConstants.DATA_PROFILE_DEFAULT),
                apn.apn, apn.user, apn.password,
                apn.apn, apn.user, apn.password, Integer.toString(authType),
                Integer.toString(authType),
                protocol, msg);
                RILConstants.SETUP_DATA_PROTOCOL_IP, msg);
    }
    }


    @Override
    @Override
+4 −1
Original line number Original line Diff line number Diff line
@@ -432,7 +432,10 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
                        cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)),
                        cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)),
                        cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)),
                        cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)),
                        cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)),
                        cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)),
                        types);
                        types,
                        cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)),
                        cursor.getString(cursor.getColumnIndexOrThrow(
                                Telephony.Carriers.ROAMING_PROTOCOL)));
                result.add(apn);
                result.add(apn);
            } while (cursor.moveToNext());
            } while (cursor.moveToNext());
        }
        }
Loading