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

Commit 8c00532e authored by Ping Sun's avatar Ping Sun Committed by takeshi tanigawa
Browse files

Prioritize to use a preferred APN for tethering if it can handle DUN

For DUN connection requesting, the list returned by fetchDunApns() is
used as waiting APNs of ApnContext. But, fetchDunApns() does not
prioritize preferred APN. It means that it may lead to user unexpected
DUN APN is connected or unnecessary DUN connection requests.
Therefore, if the preferred APN can handle the DUN type, it should be
set at the top of the list to use preferentially.

Test: manual
Test: auto - Passed DcTrackerTest
Bug: 184105189
Change-Id: I0cedb382e1aa1b806a67ca17f14a4110db4d9b7c
parent bab5dcdd
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -1924,14 +1924,21 @@ public class DcTracker extends Handler {
        }
        }


        int preferredApnSetId = getPreferredApnSetId();
        int preferredApnSetId = getPreferredApnSetId();
        ApnSetting preferredApn = getPreferredApnFromDB();
        for (ApnSetting dunSetting : dunCandidates) {
        for (ApnSetting dunSetting : dunCandidates) {
            if (dunSetting.canSupportNetworkType(
            if (dunSetting.canSupportNetworkType(
                    ServiceState.rilRadioTechnologyToNetworkType(bearer))) {
                    ServiceState.rilRadioTechnologyToNetworkType(bearer))) {
                if (preferredApnSetId == dunSetting.getApnSetId()) {
                if (preferredApnSetId == dunSetting.getApnSetId()) {
                    if (preferredApn != null && preferredApn.equals(dunSetting)) {
                        // If there is a preferred APN can handled DUN type, prepend it to list to
                        // use it preferred.
                        retDunSettings.add(0, dunSetting);
                    } else {
                        retDunSettings.add(dunSetting);
                        retDunSettings.add(dunSetting);
                    }
                    }
                }
                }
            }
            }
        }


        if (VDBG) log("fetchDunApns: dunSettings=" + retDunSettings);
        if (VDBG) log("fetchDunApns: dunSettings=" + retDunSettings);
        return retDunSettings;
        return retDunSettings;
+399 −321
Original line number Original line Diff line number Diff line
@@ -205,46 +205,8 @@ public class DcTrackerTest extends TelephonyTest {
    }
    }


    private class ApnSettingContentProvider extends MockContentProvider {
    private class ApnSettingContentProvider extends MockContentProvider {
        private int mPreferredApnSet = 0;
        public final String[] FAKE_APN_COLUMNS = new String[]{

                Telephony.Carriers._ID, Telephony.Carriers.NUMERIC,
        private String mFakeApn1Types = "default,supl";

        private int mNetworkTypeBitmask = NETWORK_TYPE_LTE_BITMASK;

        private int mRowIdOffset = 0;

        public void setFakeApn1Types(String apnTypes) {
            mFakeApn1Types = apnTypes;
        }

        public void setFakeApn1NetworkTypeBitmask(int bitmask) {
            mNetworkTypeBitmask = bitmask;
        }

        public void setRowIdOffset(int rowIdOffset) {
            mRowIdOffset = rowIdOffset;
        }

        @Override
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
                            String sortOrder) {
            logd("ApnSettingContentProvider: query");
            logd("   uri = " + uri);
            logd("   projection = " + Arrays.toString(projection));
            logd("   selection = " + selection);
            logd("   selectionArgs = " + Arrays.toString(selectionArgs));
            logd("   sortOrder = " + sortOrder);

            if (uri.compareTo(Telephony.Carriers.CONTENT_URI) == 0
                    || uri.toString().startsWith(Uri.withAppendedPath(
                            Telephony.Carriers.CONTENT_URI, "filtered").toString())
                    || uri.toString().startsWith(Uri.withAppendedPath(
                            Telephony.Carriers.SIM_APN_URI, "filtered").toString())) {
                if (projection == null) {

                    logd("Query '" + FAKE_PLMN + "' APN settings");
                    MatrixCursor mc = new MatrixCursor(
                            new String[]{Telephony.Carriers._ID, Telephony.Carriers.NUMERIC,
                Telephony.Carriers.NAME, Telephony.Carriers.APN,
                Telephony.Carriers.NAME, Telephony.Carriers.APN,
                Telephony.Carriers.PROXY, Telephony.Carriers.PORT,
                Telephony.Carriers.PROXY, Telephony.Carriers.PORT,
                Telephony.Carriers.MMSC, Telephony.Carriers.MMSPROXY,
                Telephony.Carriers.MMSC, Telephony.Carriers.MMSPROXY,
@@ -266,9 +228,43 @@ public class DcTrackerTest extends TelephonyTest {
                Telephony.Carriers.NETWORK_TYPE_BITMASK,
                Telephony.Carriers.NETWORK_TYPE_BITMASK,
                Telephony.Carriers.APN_SET_ID,
                Telephony.Carriers.APN_SET_ID,
                Telephony.Carriers.CARRIER_ID,
                Telephony.Carriers.CARRIER_ID,
                                    Telephony.Carriers.SKIP_464XLAT});
                Telephony.Carriers.SKIP_464XLAT
        };

        private int mPreferredApnSet = 0;

        private Object[] mPreferredApn = null;

        private String mFakeApn1Types = "default,supl";

        private String mFakeApn5Types = "dun";


                    mc.addRow(new Object[]{
        private int mNetworkTypeBitmask = NETWORK_TYPE_LTE_BITMASK;

        private int mRowIdOffset = 0;

        public void setFakeApn1Types(String apnTypes) {
            mFakeApn1Types = apnTypes;
        }

        public void setFakeApn5Types(String apnTypes) {
            mFakeApn5Types = apnTypes;
        }

        public void setFakeApn1NetworkTypeBitmask(int bitmask) {
            mNetworkTypeBitmask = bitmask;
        }

        public void setRowIdOffset(int rowIdOffset) {
            mRowIdOffset = rowIdOffset;
        }

        public void setFakePreferredApn(Object[] fakeApn) {
            mPreferredApn = fakeApn;
        }

        public Object[] getFakeApn1() {
            return new Object[]{
                    2163 + mRowIdOffset,    // id
                    2163 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    FAKE_PLMN,              // numeric
                    "sp-mode",              // name
                    "sp-mode",              // name
@@ -299,9 +295,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    -1                      // skip_464xlat
                    });
            };
        }


                    mc.addRow(new Object[]{
        public Object[] getFakeApn2() {
            return new Object[]{
                    2164 + mRowIdOffset,    // id
                    2164 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    FAKE_PLMN,              // numeric
                    "mopera U",             // name
                    "mopera U",             // name
@@ -332,9 +330,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    -1                      // skip_464xlat
                    });
            };
        }


                    mc.addRow(new Object[]{
        public Object[] getFakeApn3() {
            return new Object[]{
                    2165 + mRowIdOffset,    // id
                    2165 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    FAKE_PLMN,              // numeric
                    "b-mobile for Nexus",   // name
                    "b-mobile for Nexus",   // name
@@ -365,9 +365,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    -1                      // skip_464xlat
                    });
            };
        }


                    mc.addRow(new Object[]{
        public Object[] getFakeApn4() {
            return new Object[]{
                    2166 + mRowIdOffset,    // id
                    2166 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    FAKE_PLMN,              // numeric
                    "sp-mode ehrpd",        // name
                    "sp-mode ehrpd",        // name
@@ -398,9 +400,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    -1                      // skip_464xlat
                    });
            };
        }


                    mc.addRow(new Object[]{
        public Object[] getFakeApn5() {
            return new Object[]{
                    2167 + mRowIdOffset,    // id
                    2167 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    FAKE_PLMN,              // numeric
                    "b-mobile for Nexus",   // name
                    "b-mobile for Nexus",   // name
@@ -413,7 +417,7 @@ public class DcTrackerTest extends TelephonyTest {
                    "",                     // user
                    "",                     // user
                    "",                     // password
                    "",                     // password
                    -1,                     // authtype
                    -1,                     // authtype
                            "dun",                  // types
                    mFakeApn5Types,         // types
                    "IP",                   // protocol
                    "IP",                   // protocol
                    "IP",                   // roaming_protocol
                    "IP",                   // roaming_protocol
                    1,                      // carrier_enabled
                    1,                      // carrier_enabled
@@ -431,9 +435,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    -1                      // skip_464xlat
                    });
            };
        }


                    mc.addRow(new Object[]{
        public Object[] getFakeApn6() {
            return new Object[]{
                    2168 + mRowIdOffset,    // id
                    2168 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    FAKE_PLMN,              // numeric
                    "sp-mode",              // name
                    "sp-mode",              // name
@@ -464,9 +470,11 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    -1                      // skip_464xlat
                    });
            };
        }


                    mc.addRow(new Object[]{
        public Object[] getFakeApn7() {
            return new Object[]{
                    2169 + mRowIdOffset,    // id
                    2169 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    FAKE_PLMN,              // numeric
                    "sp-mode",              // name
                    "sp-mode",              // name
@@ -497,9 +505,11 @@ public class DcTrackerTest extends TelephonyTest {
                    1,                      // apn_set_id
                    1,                      // apn_set_id
                    -1,                     // carrier_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    -1                      // skip_464xlat
                    });
            };
        }


                    mc.addRow(new Object[]{
        public Object[] getFakeApn8() {
            return new Object[]{
                    2170 + mRowIdOffset,    // id
                    2170 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    FAKE_PLMN,              // numeric
                    "IMS",                  // name
                    "IMS",                  // name
@@ -530,9 +540,11 @@ public class DcTrackerTest extends TelephonyTest {
                    -1,                      // apn_set_id
                    -1,                      // apn_set_id
                    -1,                     // carrier_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    -1                      // skip_464xlat
                    });
            };
        }


                    mc.addRow(new Object[]{
        public Object[] getFakeApn9() {
            return new Object[]{
                    2171 + mRowIdOffset,    // id
                    2171 + mRowIdOffset,    // id
                    FAKE_PLMN,              // numeric
                    FAKE_PLMN,              // numeric
                    "sp-mode nr",           // name
                    "sp-mode nr",           // name
@@ -563,7 +575,37 @@ public class DcTrackerTest extends TelephonyTest {
                    0,                      // apn_set_id
                    0,                      // apn_set_id
                    -1,                     // carrier_id
                    -1,                     // carrier_id
                    -1                      // skip_464xlat
                    -1                      // skip_464xlat
                    });
            };
        }

        @Override
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
                            String sortOrder) {
            logd("ApnSettingContentProvider: query");
            logd("   uri = " + uri);
            logd("   projection = " + Arrays.toString(projection));
            logd("   selection = " + selection);
            logd("   selectionArgs = " + Arrays.toString(selectionArgs));
            logd("   sortOrder = " + sortOrder);

            if (uri.compareTo(Telephony.Carriers.CONTENT_URI) == 0
                    || uri.toString().startsWith(Uri.withAppendedPath(
                            Telephony.Carriers.CONTENT_URI, "filtered").toString())
                    || uri.toString().startsWith(Uri.withAppendedPath(
                            Telephony.Carriers.SIM_APN_URI, "filtered").toString())) {
                if (projection == null) {

                    logd("Query '" + FAKE_PLMN + "' APN settings");
                    MatrixCursor mc = new MatrixCursor(FAKE_APN_COLUMNS);
                    mc.addRow(getFakeApn1());
                    mc.addRow(getFakeApn2());
                    mc.addRow(getFakeApn3());
                    mc.addRow(getFakeApn4());
                    mc.addRow(getFakeApn5());
                    mc.addRow(getFakeApn6());
                    mc.addRow(getFakeApn7());
                    mc.addRow(getFakeApn8());
                    mc.addRow(getFakeApn9());


                    return mc;
                    return mc;
                }
                }
@@ -575,6 +617,15 @@ public class DcTrackerTest extends TelephonyTest {
                mc.addRow(new Object[]{ mPreferredApnSet });
                mc.addRow(new Object[]{ mPreferredApnSet });
                mc.addRow(new Object[]{ 0 });
                mc.addRow(new Object[]{ 0 });
                return mc;
                return mc;
            } else if (isPathPrefixMatch(uri,
                    Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "preferapn_no_update"))) {
                if (mPreferredApn == null) {
                    return null;
                } else {
                    MatrixCursor mc = new MatrixCursor(FAKE_APN_COLUMNS);
                    mc.addRow(mPreferredApn);
                    return mc;
                }
            }
            }


            return null;
            return null;
@@ -1583,6 +1634,33 @@ public class DcTrackerTest extends TelephonyTest {
                Settings.Global.TETHER_DUN_APN, null);
                Settings.Global.TETHER_DUN_APN, null);
    }
    }


    /**
     * Test that fetchDunApns() returns list that prioritize the preferred APN when the preferred
     * APN including DUN type.
     */
    @Test
    public void testFetchDunApnWithPreferredApn() {
        // Set support APN types of FAKE_APN1 and FAKE_APN5
        mApnSettingContentProvider.setFakeApn1Types("default,dun");
        mApnSettingContentProvider.setFakeApn5Types("default,dun");

        // Set prefer apn set id.
        ContentResolver cr = mContext.getContentResolver();
        ContentValues values = new ContentValues();
        values.put(Telephony.Carriers.APN_SET_ID, 0);
        cr.update(PREFERAPN_URI, values, null, null);
        // Set FAKE_APN5 as the preferred APN.
        mApnSettingContentProvider.setFakePreferredApn(mApnSettingContentProvider.getFakeApn5());

        sendInitializationEvents();

        // Return the APN list that set the preferred APN at the top.
        ArrayList<ApnSetting> dunApns = mDct.fetchDunApns();
        assertEquals(2, dunApns.size());
        assertEquals(FAKE_APN5, dunApns.get(0).getApnName());
        assertEquals(FAKE_APN1, dunApns.get(1).getApnName());
    }

    // This tests simulates the race case where the sim status change event is triggered, the
    // This tests simulates the race case where the sim status change event is triggered, the
    // default data connection is attached, and then the carrier config gets changed which bumps
    // default data connection is attached, and then the carrier config gets changed which bumps
    // the database id which we want to ignore when cleaning up connections and matching against
    // the database id which we want to ignore when cleaning up connections and matching against