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

Commit 29c29857 authored by Jordan Liu's avatar Jordan Liu Committed by Gerrit Code Review
Browse files

Merge "Update ApnSettings to include the apn-set-id"

parents f73ce141 5f1f078a
Loading
Loading
Loading
Loading
+54 −7
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.internal.telephony.dataconnection;
import android.content.Context;
import android.hardware.radio.V1_0.ApnTypes;
import android.os.PersistableBundle;
import android.provider.Telephony.Carriers;
import android.telephony.CarrierConfigManager;
import android.telephony.Rlog;
import android.telephony.ServiceState;
@@ -50,6 +51,7 @@ public class ApnSetting {
    static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*";
    static final String V3_FORMAT_REGEX = "^\\[ApnSettingV3\\]\\s*";
    static final String V4_FORMAT_REGEX = "^\\[ApnSettingV4\\]\\s*";
    static final String V5_FORMAT_REGEX = "^\\[ApnSettingV5\\]\\s*";
    static final String TAG = "ApnSetting";

    public final String carrier;
@@ -128,6 +130,16 @@ public class ApnSetting {
      */
    public final String mvnoMatchData;

    /**
     * The APN set id.
     *
     * APNs that are part of the same set should be preferred together, e.g. if the
     * user selects a default APN with apnSetId=1, then we will prefer all APNs with apnSetId=1.
     *
     * If the apnSetId=Carriers.NO_SET_SET (=0) then the APN is not part of a set.
     */
    public final int apnSetId;

    /**
     * Indicates this APN setting is permanently failed and cannot be
     * retried by the retry manager anymore.
@@ -179,10 +191,12 @@ public class ApnSetting {
        this.mtu = mtu;
        this.mvnoType = mvnoType;
        this.mvnoMatchData = mvnoMatchData;
        this.apnSetId = Carriers.NO_SET_SET;
        this.networkTypeBitmask = ServiceState.convertBearerBitmaskToNetworkTypeBitmask(
                this.bearerBitmask);
    }

    // Constructor with default apn set id
    public ApnSetting(int id, String numeric, String carrier, String apn,
                      String proxy, String port,
                      String mmsc, String mmsProxy, String mmsPort,
@@ -191,6 +205,20 @@ public class ApnSetting {
                      int networkTypeBitmask, int profileId, boolean modemCognitive, int maxConns,
                      int waitTime, int maxConnsTime, int mtu, String mvnoType,
                      String mvnoMatchData) {
        this(id, numeric, carrier, apn, proxy, port, mmsc, mmsProxy, mmsPort, user, password,
                authType, types, protocol, roamingProtocol, carrierEnabled, networkTypeBitmask,
                profileId, modemCognitive, maxConns, waitTime, maxConnsTime, mtu, mvnoType,
                mvnoMatchData, Carriers.NO_SET_SET);
    }

    public ApnSetting(int id, String numeric, String carrier, String apn,
                      String proxy, String port,
                      String mmsc, String mmsProxy, String mmsPort,
                      String user, String password, int authType, String[] types,
                      String protocol, String roamingProtocol, boolean carrierEnabled,
                      int networkTypeBitmask, int profileId, boolean modemCognitive, int maxConns,
                      int waitTime, int maxConnsTime, int mtu, String mvnoType,
                      String mvnoMatchData, int apnSetId) {
        this.id = id;
        this.numeric = numeric;
        this.carrier = carrier;
@@ -225,6 +253,7 @@ public class ApnSetting {
        this.mtu = mtu;
        this.mvnoType = mvnoType;
        this.mvnoMatchData = mvnoMatchData;
        this.apnSetId = apnSetId;
    }

    public ApnSetting(ApnSetting apn) {
@@ -232,7 +261,7 @@ public class ApnSetting {
                apn.mmsPort, apn.user, apn.password, apn.authType, apn.types, apn.protocol,
                apn.roamingProtocol, apn.carrierEnabled, apn.networkTypeBitmask, apn.profileId,
                apn.modemCognitive, apn.maxConns, apn.waitTime, apn.maxConnsTime,
                apn.mtu, apn.mvnoType, apn.mvnoMatchData);
                apn.mtu, apn.mvnoType, apn.mvnoMatchData, apn.apnSetId);
    }

    /**
@@ -267,6 +296,13 @@ public class ApnSetting {
     *   <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime>, <mtu>,
     *   <mvnoType>, <mvnoMatchData>, <networkTypeBitmask>
     *
     * v5 format:
     *   [ApnSettingV5] <carrier>, <apn>, <proxy>, <port>, <user>, <password>, <server>,
     *   <mmsc>, <mmsproxy>, <mmsport>, <mcc>, <mnc>, <authtype>,
     *   <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearerBitmask>,
     *   <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime>, <mtu>,
     *   <mvnoType>, <mvnoMatchData>, <networkTypeBitmask>, <apnSetId>
     *
     * Note that the strings generated by toString() do not contain the username
     * and password and thus cannot be read by this method.
     */
@@ -275,7 +311,10 @@ public class ApnSetting {

        int version;
        // matches() operates on the whole string, so append .* to the regex.
        if (data.matches(V4_FORMAT_REGEX + ".*")) {
        if (data.matches(V5_FORMAT_REGEX + ".*")) {
            version = 5;
            data = data.replaceFirst(V5_FORMAT_REGEX, "");
        } else if (data.matches(V4_FORMAT_REGEX + ".*")) {
            version = 4;
            data = data.replaceFirst(V4_FORMAT_REGEX, "");
        } else if (data.matches(V3_FORMAT_REGEX + ".*")) {
@@ -313,6 +352,7 @@ public class ApnSetting {
        int mtu = PhoneConstants.UNSET_MTU;
        String mvnoType = "";
        String mvnoMatchData = "";
        int apnSetId = Carriers.NO_SET_SET;
        if (version == 1) {
            typeArray = new String[a.length - 13];
            System.arraycopy(a, 13, typeArray, 0, a.length - 13);
@@ -353,6 +393,9 @@ public class ApnSetting {
            if (a.length > 26) {
                networkTypeBitmask = ServiceState.getBitmaskFromString(a[26]);
            }
            if (a.length > 27) {
                apnSetId = Integer.parseInt(a[27]);
            }
        }

        // If both bearerBitmask and networkTypeBitmask were specified, bearerBitmask would be
@@ -364,7 +407,7 @@ public class ApnSetting {
        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, protocol, roamingProtocol, carrierEnabled,
                networkTypeBitmask, profileId, modemCognitive, maxConns, waitTime, maxConnsTime,
                mtu, mvnoType, mvnoMatchData);
                mtu, mvnoType, mvnoMatchData, apnSetId);
    }

    /**
@@ -393,7 +436,7 @@ public class ApnSetting {
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[ApnSettingV4] ")
        sb.append("[ApnSettingV5] ")
        .append(carrier)
        .append(", ").append(id)
        .append(", ").append(numeric)
@@ -425,6 +468,7 @@ public class ApnSetting {
        sb.append(", ").append(mvnoMatchData);
        sb.append(", ").append(permanentFailed);
        sb.append(", ").append(networkTypeBitmask);
        sb.append(", ").append(apnSetId);
        return sb.toString();
    }

@@ -651,7 +695,8 @@ public class ApnSetting {
                && mtu == other.mtu
                && mvnoType.equals(other.mvnoType)
                && mvnoMatchData.equals(other.mvnoMatchData)
                && networkTypeBitmask == other.networkTypeBitmask;
                && networkTypeBitmask == other.networkTypeBitmask
                && apnSetId == other.apnSetId;
    }

    /**
@@ -696,7 +741,8 @@ public class ApnSetting {
                && maxConnsTime == other.maxConnsTime
                && mtu == other.mtu
                && mvnoType.equals(other.mvnoType)
                && mvnoMatchData.equals(other.mvnoMatchData);
                && mvnoMatchData.equals(other.mvnoMatchData)
                && apnSetId == other.apnSetId;
    }

    /**
@@ -722,7 +768,8 @@ public class ApnSetting {
                && xorEquals(this.mmsc, other.mmsc)
                && xorEquals(this.mmsProxy, other.mmsProxy)
                && xorEquals(this.mmsPort, other.mmsPort))
                && this.networkTypeBitmask == other.networkTypeBitmask;
                && this.networkTypeBitmask == other.networkTypeBitmask
                && this.apnSetId == other.apnSetId;
    }

    // check whether the types of two APN same (even only one type of each APN is same)
+3 −2
Original line number Diff line number Diff line
@@ -1859,7 +1859,8 @@ public class DcTracker extends Handler {
                cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MAX_CONNS_TIME)),
                cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MTU)),
                cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_TYPE)),
                cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_MATCH_DATA)));
                cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.MVNO_MATCH_DATA)),
                cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.APN_SET_ID)));
        return apn;
    }

@@ -3389,7 +3390,7 @@ public class DcTracker extends Handler {
                dest.authType, resultTypes.toArray(new String[0]), protocol,
                roamingProtocol, dest.carrierEnabled, networkTypeBitmask, dest.profileId,
                (dest.modemCognitive || src.modemCognitive), dest.maxConns, dest.waitTime,
                dest.maxConnsTime, dest.mtu, dest.mvnoType, dest.mvnoMatchData);
                dest.maxConnsTime, dest.mtu, dest.mvnoType, dest.mvnoMatchData, dest.apnSetId);
    }

    /** Return the DC AsyncChannel for the new data connection */
+37 −3
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ public class ApnSettingTest extends TelephonyTest {
        assertEquals(a1.mvnoType, a2.mvnoType);
        assertEquals(a1.mvnoMatchData, a2.mvnoMatchData);
        assertEquals(a1.networkTypeBitmask, a2.networkTypeBitmask);
        assertEquals(a1.apnSetId, a2.apnSetId);
    }

    @Test
@@ -230,6 +231,22 @@ public class ApnSettingTest extends TelephonyTest {
                "testspn");
        assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));

        // A v5 string with apnSetId=0
        testString =
                "[ApnSettingV5] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,0,0";
        expectedApn = new ApnSetting(
                -1, "12345", "Name", "apn", "", "", "", "", "", "", "", 0, mmsTypes, "IPV6",
                "IP", true, 0, 0, 0, false, 0, 0, 0, 0, "spn", "testspn");
        assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));

        // A v5 string with apnSetId=3
        testString =
                "[ApnSettingV5] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,0,,,,,,,spn,testspn,0,3";
        expectedApn = new ApnSetting(
                -1, "12345", "Name", "apn", "", "", "", "", "", "", "", 0, mmsTypes, "IPV6",
                "IP", true, 0, 0, false, 0, 0, 0, 0, "spn", "testspn", 3);
        assertApnSettingEqual(expectedApn, ApnSetting.fromString(testString));

        // Return no apn if insufficient fields given.
        testString = "[ApnSettingV3] Name,apn,,,,,,,,,123, 45,,mms|*";
        assertEquals(null, ApnSetting.fromString(testString));
@@ -248,6 +265,8 @@ public class ApnSettingTest extends TelephonyTest {
                " ;[ApnSettingV3] Name1,apn1,,,,,,,,,123,46,,mms,IPV6,IP,true,12,,,,,,,gid,testGid";
        testString +=
                " ;[ApnSettingV3] Name1,apn2,,,,,,,,,123,46,,mms,IPV6,IP,true,12,,,,,,,,";
        testString +=
                " ;[ApnSettingV5] Name1,apn2,,,,,,,,,123,46,,mms,IPV6,IP,true,0,,,,,,,,,,3";
        List<ApnSetting> expectedApns = new ArrayList<ApnSetting>();
        expectedApns.add(new ApnSetting(
                -1, "12345", "Name", "apn", "", "", "", "", "", "", "", 0, new String[]{"mms"}, "IPV6",
@@ -258,6 +277,9 @@ public class ApnSettingTest extends TelephonyTest {
        expectedApns.add(new ApnSetting(
                -1, "12346", "Name1", "apn2", "", "", "", "", "", "", "", 0, new String[]{"mms"}, "IPV6",
                "IP", true, 12, 0, 0, false, 0, 0, 0, 0, "", ""));
        expectedApns.add(new ApnSetting(
                -1, "12346", "Name1", "apn2", "", "", "", "", "", "", "", 0, new String[]{"mms"}, "IPV6",
                "IP", true, 0, 0, false, 0, 0, 0, 0, "", "", 3));
        assertApnSettingsEqual(expectedApns, ApnSetting.arrayFromString(testString));
    }

@@ -265,13 +287,25 @@ public class ApnSettingTest extends TelephonyTest {
    @SmallTest
    public void testToString() throws Exception {
        String[] types = {"default", "*"};
        // use default apn_set_id constructor
        ApnSetting apn = new ApnSetting(
                99, "12345", "Name", "apn", "proxy", "port",
                "mmsc", "mmsproxy", "mmsport", "user", "password", 0,
                types, "IPV6", "IP", true, 14, 0, 0, false, 0, 0, 0, 0, "", "");
        String expected = "[ApnSettingV4] Name, 99, 12345, apn, proxy, "
        String expected = "[ApnSettingV5] Name, 99, 12345, apn, proxy, "
                + "mmsc, mmsproxy, mmsport, port, 0, default | *, "
                + "IPV6, IP, true, 14, 8192, 0, false, 0, 0, 0, 0, , , false, 4096";
                + "IPV6, IP, true, 14, 8192, 0, false, 0, 0, 0, 0, , , false, 4096, 0";
        assertEquals(expected, apn.toString());

        int networkTypeBitmask = 1 << (14 - 1);
        int bearerBitmask =
                ServiceState.convertNetworkTypeBitmaskToBearerBitmask(networkTypeBitmask);
        apn = new ApnSetting(99, "12345", "Name", "apn", "proxy", "port",
                "mmsc", "mmsproxy", "mmsport", "user", "password", 0,
                types, "IPV6", "IP", true, networkTypeBitmask, 0, false, 0, 0, 0, 0, "", "", 3);
        expected = "[ApnSettingV5] Name, 99, 12345, apn, proxy, "
                + "mmsc, mmsproxy, mmsport, port, 0, default | *, IPV6, IP, true, 0, "
                + bearerBitmask + ", 0, false, 0, 0, 0, 0, , , false, 8192, 3";
        assertEquals(expected, apn.toString());
    }

+55 −7
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import static org.mockito.Mockito.verify;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -121,6 +122,9 @@ public class DcTrackerTest extends TelephonyTest {
            1 << (TelephonyManager.NETWORK_TYPE_LTE - 1);
    private static final int NETWORK_TYPE_EHRPD_BITMASK =
            1 << (TelephonyManager.NETWORK_TYPE_EHRPD - 1);
    private static final Uri PREFERAPN_URI = Uri.parse(
            Telephony.Carriers.CONTENT_URI + "/preferapn");


    @Mock
    ISub mIsub;
@@ -222,7 +226,8 @@ public class DcTrackerTest extends TelephonyTest {
                                    Telephony.Carriers.MAX_CONNS_TIME, Telephony.Carriers.MTU,
                                    Telephony.Carriers.MVNO_TYPE,
                                    Telephony.Carriers.MVNO_MATCH_DATA,
                                    Telephony.Carriers.NETWORK_TYPE_BITMASK});
                                    Telephony.Carriers.NETWORK_TYPE_BITMASK,
                                    Telephony.Carriers.APN_SET_ID});

                    mc.addRow(new Object[]{
                            2163,                   // id
@@ -251,7 +256,8 @@ public class DcTrackerTest extends TelephonyTest {
                            0,                      // mtu
                            "",                     // mvno_type
                            "",                     // mnvo_match_data
                            NETWORK_TYPE_LTE_BITMASK // network_type_bitmask
                            NETWORK_TYPE_LTE_BITMASK, // network_type_bitmask
                            0                       // apn_set_id
                    });

                    mc.addRow(new Object[]{
@@ -281,7 +287,8 @@ public class DcTrackerTest extends TelephonyTest {
                            0,                      // mtu
                            "",                     // mvno_type
                            "",                     // mnvo_match_data
                            NETWORK_TYPE_LTE_BITMASK // network_type_bitmask
                            NETWORK_TYPE_LTE_BITMASK, // network_type_bitmask
                            0                       // apn_set_id
                    });

                    mc.addRow(new Object[]{
@@ -311,7 +318,8 @@ public class DcTrackerTest extends TelephonyTest {
                            0,                      // mtu
                            "",                     // mvno_type
                            "",                     // mnvo_match_data
                            0                       // network_type_bitmask
                            0,                      // network_type_bitmask
                            0                       // apn_set_id
                    });

                    mc.addRow(new Object[]{
@@ -341,7 +349,8 @@ public class DcTrackerTest extends TelephonyTest {
                            0,                      // mtu
                            "",                     // mvno_type
                            "",                     // mnvo_match_data
                            NETWORK_TYPE_EHRPD_BITMASK // network_type_bitmask
                            NETWORK_TYPE_EHRPD_BITMASK, // network_type_bitmask
                            0                       // apn_set_id
                    });

                    mc.addRow(new Object[]{
@@ -371,7 +380,8 @@ public class DcTrackerTest extends TelephonyTest {
                            0,                      // mtu
                            "",                     // mvno_type
                            "",                     // mnvo_match_data
                            0                       // network_type_bitmask
                            0,                      // network_type_bitmask
                            0                       // apn_set_id
                    });
                    return mc;
                }
@@ -379,6 +389,11 @@ public class DcTrackerTest extends TelephonyTest {

            return null;
        }

        @Override
        public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
            return 0;
        }
    }

    @Before
@@ -1285,6 +1300,39 @@ public class DcTrackerTest extends TelephonyTest {
        dunApn = mDct.fetchDunApn();
        assertEquals(FAKE_APN5, dunApn.apn);
    }

    // Test for fetchDunApn() with apn set id
    @Test
    @SmallTest
    @Ignore
    public void testFetchDunApnWithPreferredApnSet() {
        logd("Sending EVENT_RECORDS_LOADED");
        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_RECORDS_LOADED, null));
        waitForMs(200);

        // apnSetId=1
        String dunApnString1 = "[ApnSettingV5]HOT mobile PC,pc.hotm,,,,,,,,,440,10,,DUN,,,true,"
                + "0,,,,,,,,,1";
        // apnSetId=2
        String dunApnString2 = "[ApnSettingV5]HOT mobile PC,pc.hotm,,,,,,,,,440,10,,DUN,,,true,"
                + "0,,,,,,,,,2";

        ApnSetting dunApnExpected = ApnSetting.fromString(dunApnString1);

        ContentResolver cr = mContext.getContentResolver();
        Settings.Global.putString(cr, Settings.Global.TETHER_DUN_APN,
                dunApnString1 + ";" + dunApnString2);

        // set that we prefer apn set 1
        ContentValues values = new ContentValues();
        values.put(Telephony.Carriers.APN_SET_ID, 1);
        cr.update(PREFERAPN_URI, values, null, null); // currently a noop

        // TODO(70172263) should return APN from Setting with apnSetId=1
        ApnSetting dunApn = mDct.fetchDunApn();
        assertTrue(dunApnExpected.equals(dunApn));
    }

    // Test oos
    @Test
    @SmallTest